summaryrefslogtreecommitdiffstats
path: root/WebKit/qt/WebCoreSupport
diff options
context:
space:
mode:
Diffstat (limited to 'WebKit/qt/WebCoreSupport')
-rw-r--r--WebKit/qt/WebCoreSupport/ChromeClientQt.cpp45
-rw-r--r--WebKit/qt/WebCoreSupport/ChromeClientQt.h3
-rw-r--r--WebKit/qt/WebCoreSupport/DumpRenderTreeSupportQt.cpp78
-rw-r--r--WebKit/qt/WebCoreSupport/DumpRenderTreeSupportQt.h5
-rw-r--r--WebKit/qt/WebCoreSupport/EditorClientQt.cpp2
-rw-r--r--WebKit/qt/WebCoreSupport/FrameLoaderClientQt.cpp159
-rw-r--r--WebKit/qt/WebCoreSupport/FrameLoaderClientQt.h24
-rw-r--r--WebKit/qt/WebCoreSupport/InspectorClientQt.cpp22
-rw-r--r--WebKit/qt/WebCoreSupport/NotificationPresenterClientQt.cpp51
-rw-r--r--WebKit/qt/WebCoreSupport/NotificationPresenterClientQt.h4
-rw-r--r--WebKit/qt/WebCoreSupport/QtFallbackWebPopup.cpp1
-rw-r--r--WebKit/qt/WebCoreSupport/WebPlatformStrategies.cpp675
-rw-r--r--WebKit/qt/WebCoreSupport/WebPlatformStrategies.h141
13 files changed, 1122 insertions, 88 deletions
diff --git a/WebKit/qt/WebCoreSupport/ChromeClientQt.cpp b/WebKit/qt/WebCoreSupport/ChromeClientQt.cpp
index 8b01d4d..a5dfdc7 100644
--- a/WebKit/qt/WebCoreSupport/ChromeClientQt.cpp
+++ b/WebKit/qt/WebCoreSupport/ChromeClientQt.cpp
@@ -44,6 +44,7 @@
#include "GeolocationPermissionClientQt.h"
#include "HitTestResult.h"
#include "Icon.h"
+#include "NetworkingContext.h"
#include "NotImplemented.h"
#include "NotificationPresenterClientQt.h"
#include "PageClientQt.h"
@@ -74,6 +75,8 @@
namespace WebCore {
+bool ChromeClientQt::dumpVisitedLinksCallbacks = false;
+
ChromeClientQt::ChromeClientQt(QWebPage* webPage)
: m_webPage(webPage)
, m_eventLoop(0)
@@ -294,22 +297,22 @@ void ChromeClientQt::closeWindowSoon()
void ChromeClientQt::runJavaScriptAlert(Frame* f, const String& msg)
{
QString x = msg;
- FrameLoaderClientQt* fl = static_cast<FrameLoaderClientQt*>(f->loader()->client());
- m_webPage->javaScriptAlert(fl->webFrame(), x);
+ QWebFrame* webFrame = qobject_cast<QWebFrame*>(f->loader()->networkingContext()->originatingObject());
+ m_webPage->javaScriptAlert(webFrame, x);
}
bool ChromeClientQt::runJavaScriptConfirm(Frame* f, const String& msg)
{
QString x = msg;
- FrameLoaderClientQt* fl = static_cast<FrameLoaderClientQt*>(f->loader()->client());
- return m_webPage->javaScriptConfirm(fl->webFrame(), x);
+ QWebFrame* webFrame = qobject_cast<QWebFrame*>(f->loader()->networkingContext()->originatingObject());
+ return m_webPage->javaScriptConfirm(webFrame, x);
}
bool ChromeClientQt::runJavaScriptPrompt(Frame* f, const String& message, const String& defaultValue, String& result)
{
QString x = result;
- FrameLoaderClientQt* fl = static_cast<FrameLoaderClientQt*>(f->loader()->client());
- bool rc = m_webPage->javaScriptPrompt(fl->webFrame(), (QString)message, (QString)defaultValue, &x);
+ QWebFrame* webFrame = qobject_cast<QWebFrame*>(f->loader()->networkingContext()->originatingObject());
+ bool rc = m_webPage->javaScriptPrompt(webFrame, (QString)message, (QString)defaultValue, &x);
// Fix up a quirk in the QInputDialog class. If no input happened the string should be empty
// but it is null. See https://bugs.webkit.org/show_bug.cgi?id=30914.
@@ -444,7 +447,8 @@ PlatformPageClient ChromeClientQt::platformPageClient() const
void ChromeClientQt::contentsSizeChanged(Frame* frame, const IntSize& size) const
{
- emit QWebFramePrivate::kit(frame)->contentsSizeChanged(size);
+ if (frame->loader()->networkingContext())
+ QWebFramePrivate::kit(frame)->contentsSizeChanged(size);
}
void ChromeClientQt::mouseDidMoveOverElement(const HitTestResult& result, unsigned)
@@ -640,22 +644,9 @@ QWebSelectMethod* ChromeClientQt::createSelectPopup() const
void ChromeClientQt::didReceiveViewportArguments(Frame* frame, const ViewportArguments& arguments) const
{
- if (m_webPage->mainFrame()->d->initialLayoutComplete)
- return;
-
- QSize viewportSize(arguments.width, arguments.height);
- bool isUserScalable = arguments.userScalable == 1;
-
- QWebPage::ViewportHints hints;
- hints.m_isValid = true;
- hints.m_size = viewportSize;
- hints.m_initialScaleFactor = arguments.initialScale;
- hints.m_minimumScaleFactor = arguments.minimumScale;
- hints.m_maximumScaleFactor = arguments.maximumScale;
- hints.m_targetDensityDpi = arguments.targetDensityDpi;
- hints.m_isUserScalable = isUserScalable;
+ m_webPage->mainFrame()->d->viewportArguments = arguments;
- emit m_webPage->viewportChangeRequested(hints);
+ emit m_webPage->viewportChangeRequested();
}
bool ChromeClientQt::selectItemWritingDirectionIsNatural()
@@ -673,4 +664,14 @@ PassRefPtr<SearchPopupMenu> ChromeClientQt::createSearchPopupMenu(PopupMenuClien
return adoptRef(new SearchPopupMenuQt(createPopupMenu(client)));
}
+void ChromeClientQt::populateVisitedLinks()
+{
+ // We don't need to do anything here because history is tied to QWebPage rather than stored
+ // in a separate database
+ if (dumpVisitedLinksCallbacks) {
+ printf("Asked to populate visited links for WebView \"%s\"\n",
+ qPrintable(m_webPage->mainFrame()->url().toString()));
+ }
+}
+
} // namespace WebCore
diff --git a/WebKit/qt/WebCoreSupport/ChromeClientQt.h b/WebKit/qt/WebCoreSupport/ChromeClientQt.h
index d18f993..56801aa 100644
--- a/WebKit/qt/WebCoreSupport/ChromeClientQt.h
+++ b/WebKit/qt/WebCoreSupport/ChromeClientQt.h
@@ -173,6 +173,7 @@ namespace WebCore {
virtual bool selectItemWritingDirectionIsNatural();
virtual PassRefPtr<PopupMenu> createPopupMenu(PopupMenuClient*) const;
virtual PassRefPtr<SearchPopupMenu> createSearchPopupMenu(PopupMenuClient*) const;
+ virtual void populateVisitedLinks();
QWebSelectMethod* createSelectPopup() const;
@@ -188,6 +189,8 @@ namespace WebCore {
bool menuBarVisible;
QEventLoop* m_eventLoop;
+ static bool dumpVisitedLinksCallbacks;
+
mutable QtPlatformPlugin m_platformPlugin;
};
}
diff --git a/WebKit/qt/WebCoreSupport/DumpRenderTreeSupportQt.cpp b/WebKit/qt/WebCoreSupport/DumpRenderTreeSupportQt.cpp
index c1be131..ed7ac32 100644
--- a/WebKit/qt/WebCoreSupport/DumpRenderTreeSupportQt.cpp
+++ b/WebKit/qt/WebCoreSupport/DumpRenderTreeSupportQt.cpp
@@ -24,6 +24,7 @@
#include "DumpRenderTreeSupportQt.h"
#include "CSSComputedStyleDeclaration.h"
+#include "ChromeClientQt.h"
#include "ContextMenu.h"
#include "ContextMenuClientQt.h"
#include "ContextMenuController.h"
@@ -34,7 +35,12 @@
#include "Frame.h"
#include "FrameLoaderClientQt.h"
#include "FrameView.h"
+#if USE(JSC)
#include "GCController.h"
+#elif USE(V8)
+#include "V8GCController.h"
+#include "V8Proxy.h"
+#endif
#include "Geolocation.h"
#include "GeolocationServiceMock.h"
#include "Geoposition.h"
@@ -296,17 +302,31 @@ void DumpRenderTreeSupportQt::clearFrameName(QWebFrame* frame)
int DumpRenderTreeSupportQt::javaScriptObjectsCount()
{
+#if USE(JSC)
return JSDOMWindowBase::commonJSGlobalData()->heap.globalObjectCount();
+#elif USE(V8)
+ // FIXME: Find a way to do this using V8.
+ return 1;
+#endif
}
void DumpRenderTreeSupportQt::garbageCollectorCollect()
{
+#if USE(JSC)
gcController().garbageCollectNow();
+#elif USE(V8)
+ v8::V8::LowMemoryNotification();
+#endif
}
void DumpRenderTreeSupportQt::garbageCollectorCollectOnAlternateThread(bool waitUntilDone)
{
+#if USE(JSC)
gcController().garbageCollectOnAlternateThreadForDebugging(waitUntilDone);
+#elif USE(V8)
+ // FIXME: Find a way to do this using V8.
+ garbageCollectorCollect();
+#endif
}
// Returns the value of counter in the element specified by \a id.
@@ -347,7 +367,9 @@ void DumpRenderTreeSupportQt::suspendActiveDOMObjects(QWebFrame* frame)
{
Frame* coreFrame = QWebFramePrivate::core(frame);
if (coreFrame->document())
- coreFrame->document()->suspendActiveDOMObjects();
+ // FIXME: This function should be changed take a ReasonForSuspension parameter
+ // https://bugs.webkit.org/show_bug.cgi?id=45732
+ coreFrame->document()->suspendActiveDOMObjects(ActiveDOMObject::JavaScriptDebuggerPaused);
}
// Resume active DOM objects in this frame.
@@ -511,9 +533,7 @@ bool DumpRenderTreeSupportQt::elementDoesAutoCompleteForElementWithId(QWebFrame*
if (!inputElement)
return false;
- return (inputElement->isTextField()
- && inputElement->inputType() != HTMLInputElement::PASSWORD
- && inputElement->autoComplete());
+ return inputElement->isTextField() && !inputElement->isPasswordField() && inputElement->autoComplete();
}
void DumpRenderTreeSupportQt::setEditingBehavior(QWebPage* page, const QString& editingBehavior)
@@ -582,6 +602,16 @@ void DumpRenderTreeSupportQt::setCustomPolicyDelegate(bool enabled, bool permiss
FrameLoaderClientQt::policyDelegatePermissive = permissive;
}
+void DumpRenderTreeSupportQt::dumpHistoryCallbacks(bool b)
+{
+ FrameLoaderClientQt::dumpHistoryCallbacks = b;
+}
+
+void DumpRenderTreeSupportQt::dumpVisitedLinksCallbacks(bool b)
+{
+ ChromeClientQt::dumpVisitedLinksCallbacks = b;
+}
+
void DumpRenderTreeSupportQt::dumpEditingCallbacks(bool b)
{
EditorClientQt::dumpEditingCallbacks = b;
@@ -599,6 +629,27 @@ void DumpRenderTreeSupportQt::dumpNotification(bool b)
#endif
}
+QString DumpRenderTreeSupportQt::viewportAsText(QWebPage* page, const QSize& availableSize)
+{
+ WebCore::ViewportArguments args = page->mainFrame()->d->viewportArguments;
+ WebCore::ViewportConfiguration conf = WebCore::findConfigurationForViewportData(args,
+ /* desktop-width */ 980,
+ /* device-width */ 320,
+ /* device-height */ 480,
+ /* device-dpi */ 160,
+ availableSize);
+
+ QString res;
+ res = res.sprintf("viewport size %dx%d scale %f with limits [%f, %f]\n",
+ conf.layoutViewport.width(),
+ conf.layoutViewport.height(),
+ conf.initialScale,
+ conf.minimumScale,
+ conf.maximumScale);
+
+ return res;
+}
+
void DumpRenderTreeSupportQt::setMockGeolocationPosition(double latitude, double longitude, double accuracy)
{
#if ENABLE(GEOLOCATION)
@@ -670,8 +721,16 @@ void DumpRenderTreeSupportQt::evaluateScriptInIsolatedWorld(QWebFrame* frame, in
ScriptController* proxy = coreFrame->script();
- if (proxy)
- proxy->executeScriptInWorld(scriptWorld->world(), script, true);
+ if (!proxy)
+ return;
+#if USE(JSC)
+ proxy->executeScriptInWorld(scriptWorld->world(), script, true);
+#elif USE(V8)
+ ScriptSourceCode source(script);
+ Vector<ScriptSourceCode> sources;
+ sources.append(source);
+ proxy->evaluateInIsolatedWorld(0, sources, true);
+#endif
}
bool DumpRenderTreeSupportQt::isPageBoxVisible(QWebFrame* frame, int pageIndex)
@@ -698,6 +757,13 @@ void DumpRenderTreeSupportQt::addUserStyleSheet(QWebPage* page, const QString& s
page->handle()->page->group().addUserStyleSheetToWorld(mainThreadNormalWorld(), sourceCode, QUrl(), 0, 0, WebCore::InjectInAllFrames);
}
+void DumpRenderTreeSupportQt::simulateDesktopNotificationClick(const QString& title)
+{
+#if ENABLE(NOTIFICATIONS)
+ NotificationPresenterClientQt::notificationPresenter()->notificationClicked(title);
+#endif
+}
+
// Provide a backward compatibility with previously exported private symbols as of QtWebKit 4.6 release
void QWEBKIT_EXPORT qt_resumeActiveDOMObjects(QWebFrame* frame)
diff --git a/WebKit/qt/WebCoreSupport/DumpRenderTreeSupportQt.h b/WebKit/qt/WebCoreSupport/DumpRenderTreeSupportQt.h
index 2069114..5a59475 100644
--- a/WebKit/qt/WebCoreSupport/DumpRenderTreeSupportQt.h
+++ b/WebKit/qt/WebCoreSupport/DumpRenderTreeSupportQt.h
@@ -106,6 +106,8 @@ public:
static void setWillSendRequestReturnsNullOnRedirect(bool b);
static void setWillSendRequestReturnsNull(bool b);
static void setWillSendRequestClearHeaders(const QStringList& headers);
+ static void dumpHistoryCallbacks(bool b);
+ static void dumpVisitedLinksCallbacks(bool b);
static void setDeferMainResourceDataLoad(bool b);
@@ -127,7 +129,8 @@ public:
static QString pageSizeAndMarginsInPixels(QWebFrame* frame, int pageIndex, int width, int height, int marginTop, int marginRight, int marginBottom, int marginLeft);
static QString pageProperty(QWebFrame* frame, const QString& propertyName, int pageNumber);
static void addUserStyleSheet(QWebPage* page, const QString& sourceCode);
-
+ static void simulateDesktopNotificationClick(const QString& title);
+ static QString viewportAsText(QWebPage*, const QSize&);
};
#endif
diff --git a/WebKit/qt/WebCoreSupport/EditorClientQt.cpp b/WebKit/qt/WebCoreSupport/EditorClientQt.cpp
index 0a9a0ea..080c459 100644
--- a/WebKit/qt/WebCoreSupport/EditorClientQt.cpp
+++ b/WebKit/qt/WebCoreSupport/EditorClientQt.cpp
@@ -612,7 +612,7 @@ void EditorClientQt::setInputMethodState(bool active)
hints |= Qt::ImhDigitsOnly;
if (inputElement->isEmailField())
hints |= Qt::ImhEmailCharactersOnly;
- if (inputElement->isUrlField())
+ if (inputElement->isURLField())
hints |= Qt::ImhUrlCharactersOnly;
// Setting the Qt::WA_InputMethodEnabled attribute true and Qt::ImhHiddenText flag
// for password fields. The Qt platform is responsible for determining which widget
diff --git a/WebKit/qt/WebCoreSupport/FrameLoaderClientQt.cpp b/WebKit/qt/WebCoreSupport/FrameLoaderClientQt.cpp
index 2d73f7f..4aadeb0 100644
--- a/WebKit/qt/WebCoreSupport/FrameLoaderClientQt.cpp
+++ b/WebKit/qt/WebCoreSupport/FrameLoaderClientQt.cpp
@@ -40,7 +40,11 @@
#include "FrameView.h"
#include "DocumentLoader.h"
#include "HitTestResult.h"
+#if USE(JSC)
#include "JSDOMWindowBase.h"
+#elif USE(V8)
+#include "V8DOMWindow.h"
+#endif
#include "MIMETypeRegistry.h"
#include "MouseEvent.h"
#include "ResourceResponse.h"
@@ -63,6 +67,7 @@
#include "ScriptString.h"
#include "Settings.h"
#include "QWebPageClient.h"
+#include "ViewportArguments.h"
#include "qwebpage.h"
#include "qwebpage_p.h"
@@ -160,6 +165,7 @@ bool FrameLoaderClientQt::sendRequestReturnsNullOnRedirect = false;
bool FrameLoaderClientQt::sendRequestReturnsNull = false;
bool FrameLoaderClientQt::dumpResourceResponseMIMETypes = false;
bool FrameLoaderClientQt::deferMainResourceDataLoad = true;
+bool FrameLoaderClientQt::dumpHistoryCallbacks = false;
QStringList FrameLoaderClientQt::sendRequestClearHeaders;
QString FrameLoaderClientQt::dumpResourceLoadCallbacksPath;
@@ -189,10 +195,10 @@ static const char* navigationTypeToString(NavigationType type)
FrameLoaderClientQt::FrameLoaderClientQt()
: m_frame(0)
, m_webFrame(0)
- , m_firstData(false)
, m_pluginView(0)
, m_hasSentResponseToPlugin(false)
- , m_loadError (ResourceError())
+ , m_hasRepresentation(false)
+ , m_loadError(ResourceError())
{
}
@@ -225,11 +231,6 @@ void FrameLoaderClientQt::setFrame(QWebFrame* webFrame, Frame* frame)
m_webFrame, SIGNAL(titleChanged(QString)));
}
-QWebFrame* FrameLoaderClientQt::webFrame() const
-{
- return m_webFrame;
-}
-
void FrameLoaderClientQt::callPolicyFunction(FramePolicyFunction function, PolicyAction action)
{
(m_frame->loader()->policyChecker()->*function)(action);
@@ -277,7 +278,7 @@ void FrameLoaderClientQt::transitionToCommittedForNewPage()
void FrameLoaderClientQt::makeRepresentation(DocumentLoader*)
{
- // don't need this for now I think.
+ m_hasRepresentation = true;
}
@@ -357,6 +358,18 @@ void FrameLoaderClientQt::dispatchDidChangeLocationWithinPage()
m_webFrame->page()->d->updateNavigationActions();
}
+#if USE(V8)
+void FrameLoaderClientQt::didCreateScriptContextForFrame()
+{
+}
+void FrameLoaderClientQt::didDestroyScriptContextForFrame()
+{
+}
+void FrameLoaderClientQt::didCreateIsolatedScriptContext()
+{
+}
+#endif
+
void FrameLoaderClientQt::dispatchDidPushStateWithinPage()
{
if (dumpFrameLoaderCallbacks)
@@ -429,7 +442,8 @@ void FrameLoaderClientQt::dispatchDidCommitLoad()
if (m_frame->tree()->parent() || !m_webFrame)
return;
- m_webFrame->d->initialLayoutComplete = false;
+ // Clear the viewport arguments.
+ m_webFrame->d->viewportArguments = WebCore::ViewportArguments();
emit m_webFrame->urlChanged(m_webFrame->url());
m_webFrame->page()->d->updateNavigationActions();
@@ -443,7 +457,7 @@ void FrameLoaderClientQt::dispatchDidCommitLoad()
if (!isMainFrame)
return;
- emit m_webFrame->page()->viewportChangeRequested(QWebPage::ViewportHints());
+ emit m_webFrame->page()->viewportChangeRequested();
}
@@ -481,7 +495,6 @@ void FrameLoaderClientQt::dispatchDidFinishLoad()
void FrameLoaderClientQt::dispatchDidFirstLayout()
{
- m_webFrame->d->initialLayoutComplete = true;
}
void FrameLoaderClientQt::dispatchDidFirstVisuallyNonEmptyLayout()
@@ -518,7 +531,7 @@ void FrameLoaderClientQt::dispatchDidLoadMainResource(DocumentLoader*)
void FrameLoaderClientQt::revertToProvisionalState(DocumentLoader*)
{
- notImplemented();
+ m_hasRepresentation = true;
}
@@ -582,21 +595,25 @@ void FrameLoaderClientQt::didChangeTitle(DocumentLoader*)
void FrameLoaderClientQt::finishedLoading(DocumentLoader* loader)
{
if (!m_pluginView) {
- if(m_firstData) {
- FrameLoader *fl = loader->frameLoader();
- fl->writer()->setEncoding(m_response.textEncodingName(), false);
- m_firstData = false;
- }
- }
- else {
- if (m_pluginView->isPluginView())
- m_pluginView->didFinishLoading();
- m_pluginView = 0;
- m_hasSentResponseToPlugin = false;
+ // This is necessary to create an empty document. See bug 634004.
+ // However, we only want to do this if makeRepresentation has been called, to
+ // match the behavior on the Mac.
+ if (m_hasRepresentation)
+ loader->frameLoader()->writer()->setEncoding("", false);
+ return;
}
+ if (m_pluginView->isPluginView())
+ m_pluginView->didFinishLoading();
+ m_pluginView = 0;
+ m_hasSentResponseToPlugin = false;
}
-
+bool FrameLoaderClientQt::canShowMIMETypeAsHTML(const String& MIMEType) const
+{
+ notImplemented();
+ return false;
+}
+
bool FrameLoaderClientQt::canShowMIMEType(const String& MIMEType) const
{
String type = MIMEType;
@@ -657,9 +674,17 @@ void FrameLoaderClientQt::prepareForDataSourceReplacement()
{
}
-void FrameLoaderClientQt::setTitle(const String&, const KURL&)
+void FrameLoaderClientQt::setTitle(const String& title, const KURL& url)
{
- // no need for, dispatchDidReceiveTitle is the right callback
+ // Used by Apple WebKit to update the title of an existing history item.
+ // QtWebKit doesn't accomodate this on history items. If it ever does,
+ // it should be privateBrowsing-aware.For now, we are just passing
+ // globalhistory layout tests.
+ if (dumpHistoryCallbacks) {
+ printf("WebView updated the title for history URL \"%s\" to \"%s\".\n",
+ qPrintable(drtDescriptionSuitableForTestResult(url)),
+ qPrintable(QString(title)));
+ }
}
@@ -722,12 +747,48 @@ void FrameLoaderClientQt::registerForIconNotification(bool)
void FrameLoaderClientQt::updateGlobalHistory()
{
QWebHistoryInterface *history = QWebHistoryInterface::defaultInterface();
+ WebCore::DocumentLoader* loader = m_frame->loader()->documentLoader();
if (history)
- history->addHistoryEntry(m_frame->loader()->documentLoader()->urlForHistory().prettyURL());
+ history->addHistoryEntry(loader->urlForHistory().prettyURL());
+
+ if (dumpHistoryCallbacks) {
+ printf("WebView navigated to url \"%s\" with title \"%s\" with HTTP equivalent method \"%s\". The navigation was %s and was %s%s.\n",
+ qPrintable(drtDescriptionSuitableForTestResult(loader->urlForHistory())),
+ qPrintable(QString(loader->title())),
+ qPrintable(QString(loader->request().httpMethod())),
+ ((loader->substituteData().isValid() || (loader->response().httpStatusCode() >= 400)) ? "a failure" : "successful"),
+ ((!loader->clientRedirectSourceForHistory().isEmpty()) ? "a client redirect from " : "not a client redirect"),
+ (!loader->clientRedirectSourceForHistory().isEmpty()) ? qPrintable(drtDescriptionSuitableForTestResult(loader->clientRedirectSourceForHistory())) : "");
+ }
}
void FrameLoaderClientQt::updateGlobalHistoryRedirectLinks()
{
+ // Apple WebKit is the only port that makes use of this callback. It calls
+ // WebCore::HistoryItem::addRedirectURL() with the contents of
+ // loader->[server|client]RedirectDestinationForHistory().
+ // WebCore can associate a bunch of redirect URLs with a particular
+ // item in the history, presumably this allows Safari to skip the redirections
+ // when navigating to that history item. That might be a feature Qt wants to
+ // offer through QWebHistoryInterface in the future. For now, we're just
+ // passing tests in LayoutTests/http/tests/globalhistory.
+ WebCore::DocumentLoader* loader = m_frame->loader()->documentLoader();
+
+ if (!loader->clientRedirectSourceForHistory().isNull()) {
+ if (dumpHistoryCallbacks) {
+ printf("WebView performed a client redirect from \"%s\" to \"%s\".\n",
+ qPrintable(QString(loader->clientRedirectSourceForHistory())),
+ qPrintable(QString(loader->clientRedirectDestinationForHistory())));
+ }
+ }
+
+ if (!loader->serverRedirectSourceForHistory().isNull()) {
+ if (dumpHistoryCallbacks) {
+ printf("WebView performed a server redirect from \"%s\" to \"%s\".\n",
+ qPrintable(QString(loader->serverRedirectSourceForHistory())),
+ qPrintable(QString(loader->serverRedirectDestinationForHistory())));
+ }
+ }
}
bool FrameLoaderClientQt::shouldGoToHistoryItem(WebCore::HistoryItem *) const
@@ -776,31 +837,19 @@ bool FrameLoaderClientQt::canCachePage() const
void FrameLoaderClientQt::setMainDocumentError(WebCore::DocumentLoader* loader, const WebCore::ResourceError& error)
{
- if (!m_pluginView) {
- if (m_firstData) {
- loader->frameLoader()->writer()->setEncoding(m_response.textEncodingName(), false);
- m_firstData = false;
- }
- } else {
- if (m_pluginView->isPluginView())
- m_pluginView->didFail(error);
- m_pluginView = 0;
- m_hasSentResponseToPlugin = false;
- }
+ if (!m_pluginView)
+ return;
+ if (m_pluginView->isPluginView())
+ m_pluginView->didFail(error);
+ m_pluginView = 0;
+ m_hasSentResponseToPlugin = false;
}
+// FIXME: This function should be moved into WebCore.
void FrameLoaderClientQt::committedLoad(WebCore::DocumentLoader* loader, const char* data, int length)
{
- if (!m_pluginView) {
- if (!m_frame)
- return;
- FrameLoader *fl = loader->frameLoader();
- if (m_firstData) {
- fl->writer()->setEncoding(m_response.textEncodingName(), false);
- m_firstData = false;
- }
- fl->addData(data, length);
- }
+ if (!m_pluginView)
+ loader->commitData(data, length);
// We re-check here as the plugin can have been created
if (m_pluginView && m_pluginView->isPluginView()) {
@@ -887,7 +936,12 @@ WTF::PassRefPtr<WebCore::DocumentLoader> FrameLoaderClientQt::createDocumentLoad
// Use the default timeout interval for JS as the HTML tokenizer delay. This ensures
// that long-running JavaScript will still allow setHtml() to be synchronous, while
// still giving a reasonable timeout to prevent deadlock.
+#if USE(JSC)
double delay = JSDOMWindowBase::commonJSGlobalData()->timeoutChecker.timeoutInterval() / 1000.0f;
+#elif USE(V8)
+ // FIXME: Hard coded for now.
+ double delay = 10000 / 1000.0f;
+#endif
m_frame->page()->setCustomHTMLTokenizerTimeDelay(delay);
} else
m_frame->page()->setCustomHTMLTokenizerTimeDelay(-1);
@@ -961,7 +1015,6 @@ void FrameLoaderClientQt::dispatchDidReceiveResponse(WebCore::DocumentLoader*, u
{
m_response = response;
- m_firstData = true;
if (dumpResourceLoadCallbacks)
printf("%s - didReceiveResponse %s\n",
qPrintable(dumpAssignedUrls[identifier]),
@@ -991,12 +1044,6 @@ void FrameLoaderClientQt::dispatchDidFailLoading(WebCore::DocumentLoader* loader
printf("%s - didFailLoadingWithError: %s\n",
(dumpAssignedUrls.contains(identifier) ? qPrintable(dumpAssignedUrls[identifier]) : "<unknown>"),
qPrintable(drtDescriptionSuitableForTestResult(error)));
-
- if (m_firstData) {
- FrameLoader *fl = loader->frameLoader();
- fl->writer()->setEncoding(m_response.textEncodingName(), false);
- m_firstData = false;
- }
}
bool FrameLoaderClientQt::dispatchDidLoadResourceFromMemoryCache(WebCore::DocumentLoader*, const WebCore::ResourceRequest&, const WebCore::ResourceResponse&, int)
@@ -1518,7 +1565,7 @@ String FrameLoaderClientQt::overrideMediaType() const
QString FrameLoaderClientQt::chooseFile(const QString& oldFile)
{
- return webFrame()->page()->chooseFile(webFrame(), oldFile);
+ return m_webFrame->page()->chooseFile(m_webFrame, oldFile);
}
PassRefPtr<FrameNetworkingContext> FrameLoaderClientQt::createNetworkingContext()
diff --git a/WebKit/qt/WebCoreSupport/FrameLoaderClientQt.h b/WebKit/qt/WebCoreSupport/FrameLoaderClientQt.h
index e506900..fffda58 100644
--- a/WebKit/qt/WebCoreSupport/FrameLoaderClientQt.h
+++ b/WebKit/qt/WebCoreSupport/FrameLoaderClientQt.h
@@ -75,7 +75,6 @@ public:
virtual void frameLoaderDestroyed();
void setFrame(QWebFrame* webFrame, Frame* frame);
- QWebFrame* webFrame() const;
virtual bool hasWebView() const; // mainly for assertions
@@ -174,6 +173,7 @@ public:
virtual bool canHandleRequest(const WebCore::ResourceRequest&) const;
virtual bool canShowMIMEType(const String& MIMEType) const;
+ virtual bool canShowMIMETypeAsHTML(const String& MIMEType) const;
virtual bool representationExistsForURLScheme(const String& URLScheme) const;
virtual String generatedMIMETypeForURLScheme(const String& URLScheme) const;
@@ -211,6 +211,21 @@ public:
virtual void documentElementAvailable();
virtual void didPerformFirstNavigation() const;
+#if USE(V8)
+ // A frame's V8 context was created or destroyed.
+ virtual void didCreateScriptContextForFrame();
+ virtual void didDestroyScriptContextForFrame();
+
+ // A context untied to a frame was created (through evaluateInIsolatedWorld).
+ // This context is not tied to the lifetime of its frame, and is destroyed
+ // in garbage collection.
+ virtual void didCreateIsolatedScriptContext();
+
+ // Returns true if we should allow the given V8 extension to be added to
+ // the script context at the currently loading page and given extension group.
+ virtual bool allowScriptExtension(const String& extensionName, int extensionGroup) { return false; }
+#endif
+
virtual void registerForIconNotification(bool);
QString chooseFile(const QString& oldFile);
@@ -227,17 +242,22 @@ public:
static bool policyDelegateEnabled;
static bool policyDelegatePermissive;
static bool deferMainResourceDataLoad;
+ static bool dumpHistoryCallbacks;
private:
Frame *m_frame;
QWebFrame *m_webFrame;
ResourceResponse m_response;
- bool m_firstData;
// Plugin view to redirect data to
WebCore::PluginView* m_pluginView;
bool m_hasSentResponseToPlugin;
+ // True if makeRepresentation was called. We don't actually have a concept
+ // of a "representation", but we need to know when we're expected to have one.
+ // See finishedLoading().
+ bool m_hasRepresentation;
+
ResourceError m_loadError;
};
diff --git a/WebKit/qt/WebCoreSupport/InspectorClientQt.cpp b/WebKit/qt/WebCoreSupport/InspectorClientQt.cpp
index 55aca7f..e6e6fde 100644
--- a/WebKit/qt/WebCoreSupport/InspectorClientQt.cpp
+++ b/WebKit/qt/WebCoreSupport/InspectorClientQt.cpp
@@ -37,12 +37,14 @@
#include "Page.h"
#include "PlatformString.h"
#include "ScriptController.h"
+#include "ScriptDebugServer.h"
#include "qwebinspector.h"
#include "qwebinspector_p.h"
#include "qwebpage.h"
#include "qwebpage_p.h"
#include "qwebview.h"
#include <QtCore/QCoreApplication>
+#include <QtCore/QFile>
#include <QtCore/QSettings>
#include <QtCore/QVariant>
@@ -93,6 +95,22 @@ public slots:
}
};
+#if USE(V8)
+static void ensureDebuggerScriptLoaded()
+{
+ static bool scriptLoaded = false;
+ if (scriptLoaded)
+ return;
+
+ QFile debuggerScriptFile(":/webkit/inspector/DebuggerScript.js");
+ if (debuggerScriptFile.open(QIODevice::ReadOnly)) {
+ QByteArray ba = debuggerScriptFile.readAll();
+ ScriptDebugServer::shared().setDebuggerScriptSource(String(ba.constData(), ba.length()));
+ scriptLoaded = true;
+ }
+}
+#endif
+
InspectorClientQt::InspectorClientQt(QWebPage* page)
: m_inspectedWebPage(page)
, m_frontendWebPage(0)
@@ -109,6 +127,10 @@ void InspectorClientQt::inspectorDestroyed()
void InspectorClientQt::openInspectorFrontend(WebCore::InspectorController*)
{
+#if USE(V8)
+ ensureDebuggerScriptLoaded();
+#endif
+
QWebView* inspectorView = new QWebView;
InspectorClientWebPage* inspectorPage = new InspectorClientWebPage(inspectorView);
inspectorView->setPage(inspectorPage);
diff --git a/WebKit/qt/WebCoreSupport/NotificationPresenterClientQt.cpp b/WebKit/qt/WebCoreSupport/NotificationPresenterClientQt.cpp
index c24c4d5..7b33d9e 100644
--- a/WebKit/qt/WebCoreSupport/NotificationPresenterClientQt.cpp
+++ b/WebKit/qt/WebCoreSupport/NotificationPresenterClientQt.cpp
@@ -118,6 +118,26 @@ const QByteArray NotificationWrapper::iconData() const
return iconData;
}
+const QUrl NotificationWrapper::openerPageUrl() const
+{
+ QUrl url;
+#if ENABLE(NOTIFICATIONS)
+ Notification* notification = NotificationPresenterClientQt::notificationPresenter()->notificationForWrapper(this);
+ if (notification) {
+ if (notification->scriptExecutionContext())
+ url = static_cast<Document*>(notification->scriptExecutionContext())->page()->mainFrame()->document()->url();
+ }
+#endif
+ return url;
+}
+
+void NotificationWrapper::notificationClicked()
+{
+#if ENABLE(NOTIFICATIONS)
+ NotificationPresenterClientQt::notificationPresenter()->notificationClicked(this);
+#endif
+}
+
void NotificationWrapper::notificationClosed()
{
#if ENABLE(NOTIFICATIONS)
@@ -204,11 +224,13 @@ void NotificationPresenterClientQt::displayNotification(Notification* notificati
if (wrapper->m_presenter) {
wrapper->connect(wrapper->m_presenter.get(), SIGNAL(notificationClosed()), wrapper, SLOT(notificationClosed()), Qt::QueuedConnection);
+ wrapper->connect(wrapper->m_presenter.get(), SIGNAL(notificationClicked()), wrapper, SLOT(notificationClicked()));
wrapper->m_presenter->showNotification(wrapper);
return;
}
#ifndef QT_NO_SYSTEMTRAYICON
+ wrapper->connect(wrapper->m_notificationIcon.get(), SIGNAL(messageClicked()), wrapper, SLOT(notificationClicked()));
wrapper->m_notificationIcon->show();
wrapper->m_notificationIcon->showMessage(notification->contents().title(), notification->contents().body());
#endif
@@ -237,6 +259,35 @@ void NotificationPresenterClientQt::cancel(NotificationWrapper* wrapper)
cancel(notification);
}
+void NotificationPresenterClientQt::notificationClicked(NotificationWrapper* wrapper)
+{
+ Notification* notification = notificationForWrapper(wrapper);
+ if (notification)
+ sendEvent(notification, eventNames().clickEvent);
+}
+
+void NotificationPresenterClientQt::notificationClicked(const QString& title)
+{
+ if (!dumpNotification)
+ return;
+ NotificationsQueue::ConstIterator end = m_notifications.end();
+ NotificationsQueue::ConstIterator iter = m_notifications.begin();
+ Notification* notification = 0;
+ while (iter != end) {
+ notification = iter.key();
+ QString notificationTitle;
+ if (notification->isHTML())
+ notificationTitle = notification->url().string();
+ else
+ notificationTitle = notification->contents().title();
+ if (notificationTitle == title)
+ break;
+ iter++;
+ }
+ if (notification)
+ sendEvent(notification, eventNames().clickEvent);
+}
+
Notification* NotificationPresenterClientQt::notificationForWrapper(const NotificationWrapper* wrapper) const
{
NotificationsQueue::ConstIterator end = m_notifications.end();
diff --git a/WebKit/qt/WebCoreSupport/NotificationPresenterClientQt.h b/WebKit/qt/WebCoreSupport/NotificationPresenterClientQt.h
index e8481d4..2520f6c 100644
--- a/WebKit/qt/WebCoreSupport/NotificationPresenterClientQt.h
+++ b/WebKit/qt/WebCoreSupport/NotificationPresenterClientQt.h
@@ -61,9 +61,11 @@ public:
const QString title() const;
const QString message() const;
const QByteArray iconData() const;
+ const QUrl openerPageUrl() const;
public Q_SLOTS:
void notificationClosed();
+ void notificationClicked();
public:
#ifndef QT_NO_SYSTEMTRAYICON
@@ -102,6 +104,8 @@ public:
static NotificationPresenterClientQt* notificationPresenter();
Notification* notificationForWrapper(const NotificationWrapper*) const;
+ void notificationClicked(NotificationWrapper*);
+ void notificationClicked(const QString& title);
private:
void sendEvent(Notification*, const AtomicString& eventName);
diff --git a/WebKit/qt/WebCoreSupport/QtFallbackWebPopup.cpp b/WebKit/qt/WebCoreSupport/QtFallbackWebPopup.cpp
index 3b53476..3f69a47 100644
--- a/WebKit/qt/WebCoreSupport/QtFallbackWebPopup.cpp
+++ b/WebKit/qt/WebCoreSupport/QtFallbackWebPopup.cpp
@@ -232,6 +232,7 @@ void QtFallbackWebPopup::populate(const QWebSelectData& data)
case QWebSelectData::Option:
m_combo->insertItem(i, data.itemText(i));
model->item(i)->setEnabled(data.itemIsEnabled(i));
+ model->item(i)->setToolTip(data.itemToolTip(i));
if (data.itemIsSelected(i))
currentIndex = i;
break;
diff --git a/WebKit/qt/WebCoreSupport/WebPlatformStrategies.cpp b/WebKit/qt/WebCoreSupport/WebPlatformStrategies.cpp
new file mode 100644
index 0000000..948e0cd
--- /dev/null
+++ b/WebKit/qt/WebCoreSupport/WebPlatformStrategies.cpp
@@ -0,0 +1,675 @@
+/*
+ * Copyright (C) 2007 Staikos Computing Services Inc. <info@staikos.net>
+ * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)
+ * Copyright (C) 2008 Collabora Ltd. All rights reserved.
+ * Copyright (C) 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2010 INdT - Instituto Nokia de Tecnologia
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "WebPlatformStrategies.h"
+
+#include "NotImplemented.h"
+#include <IntSize.h>
+#include <Page.h>
+#include <PageGroup.h>
+#include <PluginDatabase.h>
+#include <QCoreApplication>
+#include <QLocale>
+#include <qwebpage.h>
+#include <qwebpluginfactory.h>
+#include <wtf/MathExtras.h>
+
+using namespace WebCore;
+
+void WebPlatformStrategies::initialize(QWebPage* webPage)
+{
+ DEFINE_STATIC_LOCAL(WebPlatformStrategies, platformStrategies, (webPage));
+ Q_UNUSED(platformStrategies);
+}
+
+WebPlatformStrategies::WebPlatformStrategies(QWebPage* webPage)
+ : m_page(webPage)
+{
+ setPlatformStrategies(this);
+}
+
+
+// PluginStrategy
+
+PluginStrategy* WebPlatformStrategies::createPluginStrategy()
+{
+ return this;
+}
+
+LocalizationStrategy* WebPlatformStrategies::createLocalizationStrategy()
+{
+ return this;
+}
+
+VisitedLinkStrategy* WebPlatformStrategies::createVisitedLinkStrategy()
+{
+ return this;
+}
+
+void WebPlatformStrategies::refreshPlugins()
+{
+ PluginDatabase::installedPlugins()->refresh();
+}
+
+void WebPlatformStrategies::getPluginInfo(Vector<WebCore::PluginInfo>& outPlugins)
+{
+ QWebPluginFactory* factory = m_page->pluginFactory();
+ if (factory) {
+
+ QList<QWebPluginFactory::Plugin> qplugins = factory->plugins();
+ for (int i = 0; i < qplugins.count(); ++i) {
+ const QWebPluginFactory::Plugin& qplugin = qplugins.at(i);
+ PluginInfo info;
+ info.name = qplugin.name;
+ info.desc = qplugin.description;
+
+ for (int j = 0; j < qplugin.mimeTypes.count(); ++j) {
+ const QWebPluginFactory::MimeType& mimeType = qplugin.mimeTypes.at(j);
+
+ MimeClassInfo mimeInfo;
+ mimeInfo.type = mimeType.name;
+ mimeInfo.desc = mimeType.description;
+ for (int k = 0; k < mimeType.fileExtensions.count(); ++k)
+ mimeInfo.extensions.append(mimeType.fileExtensions.at(k));
+
+ info.mimes.append(mimeInfo);
+ }
+ outPlugins.append(info);
+ }
+ }
+
+ PluginDatabase* db = PluginDatabase::installedPlugins();
+ const Vector<PluginPackage*> &plugins = db->plugins();
+
+ outPlugins.resize(plugins.size());
+
+ for (unsigned int i = 0; i < plugins.size(); ++i) {
+ PluginInfo info;
+ PluginPackage* package = plugins[i];
+
+ info.name = package->name();
+ info.file = package->fileName();
+ info.desc = package->description();
+
+ const MIMEToDescriptionsMap& mimeToDescriptions = package->mimeToDescriptions();
+ MIMEToDescriptionsMap::const_iterator end = mimeToDescriptions.end();
+ for (MIMEToDescriptionsMap::const_iterator it = mimeToDescriptions.begin(); it != end; ++it) {
+ MimeClassInfo mime;
+
+ mime.type = it->first;
+ mime.desc = it->second;
+ mime.extensions = package->mimeToExtensions().get(mime.type);
+
+ info.mimes.append(mime);
+ }
+
+ outPlugins.append(info);
+ }
+
+}
+
+
+// LocalizationStrategy
+
+String WebPlatformStrategies::inputElementAltText()
+{
+ return QCoreApplication::translate("QWebPage", "Submit", "Submit (input element) alt text for <input> elements with no alt, title, or value");
+}
+
+String WebPlatformStrategies::resetButtonDefaultLabel()
+{
+ return QCoreApplication::translate("QWebPage", "Reset", "default label for Reset buttons in forms on web pages");
+}
+
+String WebPlatformStrategies::searchableIndexIntroduction()
+{
+ return QCoreApplication::translate("QWebPage", "This is a searchable index. Enter search keywords: ", "text that appears at the start of nearly-obsolete web pages in the form of a 'searchable index'");
+}
+
+String WebPlatformStrategies::submitButtonDefaultLabel()
+{
+ return QCoreApplication::translate("QWebPage", "Submit", "default label for Submit buttons in forms on web pages");
+}
+
+String WebPlatformStrategies::fileButtonChooseFileLabel()
+{
+ return QCoreApplication::translate("QWebPage", "Choose File", "title for file button used in HTML forms");
+}
+
+String WebPlatformStrategies::fileButtonNoFileSelectedLabel()
+{
+ return QCoreApplication::translate("QWebPage", "No file selected", "text to display in file button used in HTML forms when no file is selected");
+}
+
+String WebPlatformStrategies::contextMenuItemTagOpenLinkInNewWindow()
+{
+ return QCoreApplication::translate("QWebPage", "Open in New Window", "Open in New Window context menu item");
+}
+
+String WebPlatformStrategies::contextMenuItemTagDownloadLinkToDisk()
+{
+ return QCoreApplication::translate("QWebPage", "Save Link...", "Download Linked File context menu item");
+}
+
+String WebPlatformStrategies::contextMenuItemTagCopyLinkToClipboard()
+{
+ return QCoreApplication::translate("QWebPage", "Copy Link", "Copy Link context menu item");
+}
+
+String WebPlatformStrategies::contextMenuItemTagOpenImageInNewWindow()
+{
+ return QCoreApplication::translate("QWebPage", "Open Image", "Open Image in New Window context menu item");
+}
+
+String WebPlatformStrategies::contextMenuItemTagDownloadImageToDisk()
+{
+ return QCoreApplication::translate("QWebPage", "Save Image", "Download Image context menu item");
+}
+
+String WebPlatformStrategies::contextMenuItemTagCopyImageToClipboard()
+{
+ return QCoreApplication::translate("QWebPage", "Copy Image", "Copy Link context menu item");
+}
+
+String WebPlatformStrategies::contextMenuItemTagOpenFrameInNewWindow()
+{
+ return QCoreApplication::translate("QWebPage", "Open Frame", "Open Frame in New Window context menu item");
+}
+
+String WebPlatformStrategies::contextMenuItemTagCopy()
+{
+ return QCoreApplication::translate("QWebPage", "Copy", "Copy context menu item");
+}
+
+String WebPlatformStrategies::contextMenuItemTagGoBack()
+{
+ return QCoreApplication::translate("QWebPage", "Go Back", "Back context menu item");
+}
+
+String WebPlatformStrategies::contextMenuItemTagGoForward()
+{
+ return QCoreApplication::translate("QWebPage", "Go Forward", "Forward context menu item");
+}
+
+String WebPlatformStrategies::contextMenuItemTagStop()
+{
+ return QCoreApplication::translate("QWebPage", "Stop", "Stop context menu item");
+}
+
+String WebPlatformStrategies::contextMenuItemTagReload()
+{
+ return QCoreApplication::translate("QWebPage", "Reload", "Reload context menu item");
+}
+
+String WebPlatformStrategies::contextMenuItemTagCut()
+{
+ return QCoreApplication::translate("QWebPage", "Cut", "Cut context menu item");
+}
+
+String WebPlatformStrategies::contextMenuItemTagPaste()
+{
+ return QCoreApplication::translate("QWebPage", "Paste", "Paste context menu item");
+}
+
+String WebPlatformStrategies::contextMenuItemTagNoGuessesFound()
+{
+ return QCoreApplication::translate("QWebPage", "No Guesses Found", "No Guesses Found context menu item");
+}
+
+String WebPlatformStrategies::contextMenuItemTagIgnoreSpelling()
+{
+ return QCoreApplication::translate("QWebPage", "Ignore", "Ignore Spelling context menu item");
+}
+
+String WebPlatformStrategies::contextMenuItemTagLearnSpelling()
+{
+ return QCoreApplication::translate("QWebPage", "Add To Dictionary", "Learn Spelling context menu item");
+}
+
+String WebPlatformStrategies::contextMenuItemTagSearchWeb()
+{
+ return QCoreApplication::translate("QWebPage", "Search The Web", "Search The Web context menu item");
+}
+
+String WebPlatformStrategies::contextMenuItemTagLookUpInDictionary()
+{
+ return QCoreApplication::translate("QWebPage", "Look Up In Dictionary", "Look Up in Dictionary context menu item");
+}
+
+String WebPlatformStrategies::contextMenuItemTagOpenLink()
+{
+ return QCoreApplication::translate("QWebPage", "Open Link", "Open Link context menu item");
+}
+
+String WebPlatformStrategies::contextMenuItemTagIgnoreGrammar()
+{
+ return QCoreApplication::translate("QWebPage", "Ignore", "Ignore Grammar context menu item");
+}
+
+String WebPlatformStrategies::contextMenuItemTagSpellingMenu()
+{
+ return QCoreApplication::translate("QWebPage", "Spelling", "Spelling and Grammar context sub-menu item");
+}
+
+String WebPlatformStrategies::contextMenuItemTagShowSpellingPanel(bool show)
+{
+ return show ? QCoreApplication::translate("QWebPage", "Show Spelling and Grammar", "menu item title") :
+ QCoreApplication::translate("QWebPage", "Hide Spelling and Grammar", "menu item title");
+}
+
+String WebPlatformStrategies::contextMenuItemTagCheckSpelling()
+{
+ return QCoreApplication::translate("QWebPage", "Check Spelling", "Check spelling context menu item");
+}
+
+String WebPlatformStrategies::contextMenuItemTagCheckSpellingWhileTyping()
+{
+ return QCoreApplication::translate("QWebPage", "Check Spelling While Typing", "Check spelling while typing context menu item");
+}
+
+String WebPlatformStrategies::contextMenuItemTagCheckGrammarWithSpelling()
+{
+ return QCoreApplication::translate("QWebPage", "Check Grammar With Spelling", "Check grammar with spelling context menu item");
+}
+
+String WebPlatformStrategies::contextMenuItemTagFontMenu()
+{
+ return QCoreApplication::translate("QWebPage", "Fonts", "Font context sub-menu item");
+}
+
+String WebPlatformStrategies::contextMenuItemTagBold()
+{
+ return QCoreApplication::translate("QWebPage", "Bold", "Bold context menu item");
+}
+
+String WebPlatformStrategies::contextMenuItemTagItalic()
+{
+ return QCoreApplication::translate("QWebPage", "Italic", "Italic context menu item");
+}
+
+String WebPlatformStrategies::contextMenuItemTagUnderline()
+{
+ return QCoreApplication::translate("QWebPage", "Underline", "Underline context menu item");
+}
+
+String WebPlatformStrategies::contextMenuItemTagOutline()
+{
+ return QCoreApplication::translate("QWebPage", "Outline", "Outline context menu item");
+}
+
+String WebPlatformStrategies::contextMenuItemTagWritingDirectionMenu()
+{
+ return QCoreApplication::translate("QWebPage", "Direction", "Writing direction context sub-menu item");
+}
+
+String WebPlatformStrategies::contextMenuItemTagTextDirectionMenu()
+{
+ return QCoreApplication::translate("QWebPage", "Text Direction", "Text direction context sub-menu item");
+}
+
+String WebPlatformStrategies::contextMenuItemTagDefaultDirection()
+{
+ return QCoreApplication::translate("QWebPage", "Default", "Default writing direction context menu item");
+}
+
+String WebPlatformStrategies::contextMenuItemTagLeftToRight()
+{
+ return QCoreApplication::translate("QWebPage", "Left to Right", "Left to Right context menu item");
+}
+
+String WebPlatformStrategies::contextMenuItemTagRightToLeft()
+{
+ return QCoreApplication::translate("QWebPage", "Right to Left", "Right to Left context menu item");
+}
+
+String WebPlatformStrategies::contextMenuItemTagInspectElement()
+{
+ return QCoreApplication::translate("QWebPage", "Inspect", "Inspect Element context menu item");
+}
+
+String WebPlatformStrategies::searchMenuNoRecentSearchesText()
+{
+ return QCoreApplication::translate("QWebPage", "No recent searches", "Label for only item in menu that appears when clicking on the search field image, when no searches have been performed");
+}
+
+String WebPlatformStrategies::searchMenuRecentSearchesText()
+{
+ return QCoreApplication::translate("QWebPage", "Recent searches", "label for first item in the menu that appears when clicking on the search field image, used as embedded menu title");
+}
+
+String WebPlatformStrategies::searchMenuClearRecentSearchesText()
+{
+ return QCoreApplication::translate("QWebPage", "Clear recent searches", "menu item in Recent Searches menu that empties menu's contents");
+}
+
+String WebPlatformStrategies::AXWebAreaText()
+{
+ notImplemented();
+ return String();
+}
+
+String WebPlatformStrategies::AXLinkText()
+{
+ notImplemented();
+ return String();
+}
+
+String WebPlatformStrategies::AXListMarkerText()
+{
+ notImplemented();
+ return String();
+}
+
+String WebPlatformStrategies::AXImageMapText()
+{
+ notImplemented();
+ return String();
+}
+
+String WebPlatformStrategies::AXHeadingText()
+{
+ notImplemented();
+ return String();
+}
+
+String WebPlatformStrategies::AXDefinitionListTermText()
+{
+ notImplemented();
+ return String();
+}
+
+String WebPlatformStrategies::AXDefinitionListDefinitionText()
+{
+ notImplemented();
+ return String();
+}
+
+String WebPlatformStrategies::AXButtonActionVerb()
+{
+ notImplemented();
+ return String();
+}
+
+String WebPlatformStrategies::AXRadioButtonActionVerb()
+{
+ notImplemented();
+ return String();
+}
+
+String WebPlatformStrategies::AXTextFieldActionVerb()
+{
+ notImplemented();
+ return String();
+}
+
+String WebPlatformStrategies::AXCheckedCheckBoxActionVerb()
+{
+ notImplemented();
+ return String();
+}
+
+String WebPlatformStrategies::AXUncheckedCheckBoxActionVerb()
+{
+ notImplemented();
+ return String();
+}
+
+String WebPlatformStrategies::AXMenuListActionVerb()
+{
+ notImplemented();
+ return String();
+}
+
+String WebPlatformStrategies::AXMenuListPopupActionVerb()
+{
+ notImplemented();
+ return String();
+}
+
+String WebPlatformStrategies::AXLinkActionVerb()
+{
+ notImplemented();
+ return String();
+}
+
+String WebPlatformStrategies::missingPluginText()
+{
+ return QCoreApplication::translate("QWebPage", "Missing Plug-in", "Label text to be used when a plug-in is missing");
+}
+
+String WebPlatformStrategies::crashedPluginText()
+{
+ notImplemented();
+ return String();
+}
+
+String WebPlatformStrategies::multipleFileUploadText(unsigned)
+{
+ notImplemented();
+ return String();
+}
+
+String WebPlatformStrategies::unknownFileSizeText()
+{
+ return QCoreApplication::translate("QWebPage", "Unknown", "Unknown filesize FTP directory listing item");
+}
+
+String WebPlatformStrategies::imageTitle(const String& filename, const IntSize& size)
+{
+ return QCoreApplication::translate("QWebPage", "%1 (%2x%3 pixels)", "Title string for images").arg(filename).arg(size.width()).arg(size.height());
+}
+
+String WebPlatformStrategies::mediaElementLoadingStateText()
+{
+ return QCoreApplication::translate("QWebPage", "Loading...", "Media controller status message when the media is loading");
+}
+
+String WebPlatformStrategies::mediaElementLiveBroadcastStateText()
+{
+ return QCoreApplication::translate("QWebPage", "Live Broadcast", "Media controller status message when watching a live broadcast");
+}
+
+#if ENABLE(VIDEO)
+
+String WebPlatformStrategies::localizedMediaControlElementString(const String& name)
+{
+ if (name == "AudioElement")
+ return QCoreApplication::translate("QWebPage", "Audio Element", "Media controller element");
+ if (name == "VideoElement")
+ return QCoreApplication::translate("QWebPage", "Video Element", "Media controller element");
+ if (name == "MuteButton")
+ return QCoreApplication::translate("QWebPage", "Mute Button", "Media controller element");
+ if (name == "UnMuteButton")
+ return QCoreApplication::translate("QWebPage", "Unmute Button", "Media controller element");
+ if (name == "PlayButton")
+ return QCoreApplication::translate("QWebPage", "Play Button", "Media controller element");
+ if (name == "PauseButton")
+ return QCoreApplication::translate("QWebPage", "Pause Button", "Media controller element");
+ if (name == "Slider")
+ return QCoreApplication::translate("QWebPage", "Slider", "Media controller element");
+ if (name == "SliderThumb")
+ return QCoreApplication::translate("QWebPage", "Slider Thumb", "Media controller element");
+ if (name == "RewindButton")
+ return QCoreApplication::translate("QWebPage", "Rewind Button", "Media controller element");
+ if (name == "ReturnToRealtimeButton")
+ return QCoreApplication::translate("QWebPage", "Return to Real-time Button", "Media controller element");
+ if (name == "CurrentTimeDisplay")
+ return QCoreApplication::translate("QWebPage", "Elapsed Time", "Media controller element");
+ if (name == "TimeRemainingDisplay")
+ return QCoreApplication::translate("QWebPage", "Remaining Time", "Media controller element");
+ if (name == "StatusDisplay")
+ return QCoreApplication::translate("QWebPage", "Status Display", "Media controller element");
+ if (name == "FullscreenButton")
+ return QCoreApplication::translate("QWebPage", "Fullscreen Button", "Media controller element");
+ if (name == "SeekForwardButton")
+ return QCoreApplication::translate("QWebPage", "Seek Forward Button", "Media controller element");
+ if (name == "SeekBackButton")
+ return QCoreApplication::translate("QWebPage", "Seek Back Button", "Media controller element");
+
+ return String();
+}
+
+String WebPlatformStrategies::localizedMediaControlElementHelpText(const String& name)
+{
+ if (name == "AudioElement")
+ return QCoreApplication::translate("QWebPage", "Audio element playback controls and status display", "Media controller element");
+ if (name == "VideoElement")
+ return QCoreApplication::translate("QWebPage", "Video element playback controls and status display", "Media controller element");
+ if (name == "MuteButton")
+ return QCoreApplication::translate("QWebPage", "Mute audio tracks", "Media controller element");
+ if (name == "UnMuteButton")
+ return QCoreApplication::translate("QWebPage", "Unmute audio tracks", "Media controller element");
+ if (name == "PlayButton")
+ return QCoreApplication::translate("QWebPage", "Begin playback", "Media controller element");
+ if (name == "PauseButton")
+ return QCoreApplication::translate("QWebPage", "Pause playback", "Media controller element");
+ if (name == "Slider")
+ return QCoreApplication::translate("QWebPage", "Movie time scrubber", "Media controller element");
+ if (name == "SliderThumb")
+ return QCoreApplication::translate("QWebPage", "Movie time scrubber thumb", "Media controller element");
+ if (name == "RewindButton")
+ return QCoreApplication::translate("QWebPage", "Rewind movie", "Media controller element");
+ if (name == "ReturnToRealtimeButton")
+ return QCoreApplication::translate("QWebPage", "Return streaming movie to real-time", "Media controller element");
+ if (name == "CurrentTimeDisplay")
+ return QCoreApplication::translate("QWebPage", "Current movie time", "Media controller element");
+ if (name == "TimeRemainingDisplay")
+ return QCoreApplication::translate("QWebPage", "Remaining movie time", "Media controller element");
+ if (name == "StatusDisplay")
+ return QCoreApplication::translate("QWebPage", "Current movie status", "Media controller element");
+ if (name == "FullscreenButton")
+ return QCoreApplication::translate("QWebPage", "Play movie in full-screen mode", "Media controller element");
+ if (name == "SeekForwardButton")
+ return QCoreApplication::translate("QWebPage", "Seek quickly back", "Media controller element");
+ if (name == "SeekBackButton")
+ return QCoreApplication::translate("QWebPage", "Seek quickly forward", "Media controller element");
+
+ ASSERT_NOT_REACHED();
+ return String();
+}
+
+String WebPlatformStrategies::localizedMediaTimeDescription(float time)
+{
+ if (!isfinite(time))
+ return QCoreApplication::translate("QWebPage", "Indefinite time", "Media time description");
+
+ int seconds = (int)fabsf(time);
+ int days = seconds / (60 * 60 * 24);
+ int hours = seconds / (60 * 60);
+ int minutes = (seconds / 60) % 60;
+ seconds %= 60;
+
+ if (days)
+ return QCoreApplication::translate("QWebPage", "%1 days %2 hours %3 minutes %4 seconds", "Media time description").arg(days).arg(hours).arg(minutes).arg(seconds);
+
+ if (hours)
+ return QCoreApplication::translate("QWebPage", "%1 hours %2 minutes %3 seconds", "Media time description").arg(hours).arg(minutes).arg(seconds);
+
+ if (minutes)
+ return QCoreApplication::translate("QWebPage", "%1 minutes %2 seconds", "Media time description").arg(minutes).arg(seconds);
+
+ return QCoreApplication::translate("QWebPage", "%1 seconds", "Media time description").arg(seconds);
+}
+
+#else // ENABLE(VIDEO)
+// FIXME: #if ENABLE(VIDEO) should be in the base class
+
+String WebPlatformStrategies::localizedMediaControlElementString(const String& name)
+{
+ return String();
+}
+
+String WebPlatformStrategies::localizedMediaControlElementHelpText(const String& name)
+{
+ return String();
+}
+
+String WebPlatformStrategies::localizedMediaTimeDescription(float time)
+{
+ return String();
+}
+
+#endif // ENABLE(VIDEO)
+
+
+String WebPlatformStrategies::validationMessageValueMissingText()
+{
+ notImplemented();
+ return String();
+}
+
+String WebPlatformStrategies::validationMessageTypeMismatchText()
+{
+ notImplemented();
+ return String();
+}
+
+String WebPlatformStrategies::validationMessagePatternMismatchText()
+{
+ notImplemented();
+ return String();
+}
+
+String WebPlatformStrategies::validationMessageTooLongText()
+{
+ notImplemented();
+ return String();
+}
+
+String WebPlatformStrategies::validationMessageRangeUnderflowText()
+{
+ notImplemented();
+ return String();
+}
+
+String WebPlatformStrategies::validationMessageRangeOverflowText()
+{
+ notImplemented();
+ return String();
+}
+
+String WebPlatformStrategies::validationMessageStepMismatchText()
+{
+ notImplemented();
+ return String();
+}
+
+
+// VisitedLinkStrategy
+
+bool WebPlatformStrategies::isLinkVisited(Page* page, LinkHash hash)
+{
+ return page->group().isLinkVisited(hash);
+}
+
+void WebPlatformStrategies::addVisitedLink(Page* page, LinkHash hash)
+{
+ page->group().addVisitedLinkHash(hash);
+}
diff --git a/WebKit/qt/WebCoreSupport/WebPlatformStrategies.h b/WebKit/qt/WebCoreSupport/WebPlatformStrategies.h
new file mode 100644
index 0000000..8ea60d9
--- /dev/null
+++ b/WebKit/qt/WebCoreSupport/WebPlatformStrategies.h
@@ -0,0 +1,141 @@
+/*
+ * Copyright (C) 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2010 INdT - Instituto Nokia de Tecnologia
+ * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef WebPlatformStrategies_h
+#define WebPlatformStrategies_h
+
+#include <LocalizationStrategy.h>
+#include <PlatformStrategies.h>
+#include <PluginStrategy.h>
+#include <VisitedLinkStrategy.h>
+
+class QWebPage;
+
+class WebPlatformStrategies : public WebCore::PlatformStrategies, private WebCore::PluginStrategy, private WebCore::LocalizationStrategy, private WebCore::VisitedLinkStrategy {
+public:
+ static void initialize(QWebPage* webPage);
+
+private:
+ WebPlatformStrategies(QWebPage* webPage);
+
+ // WebCore::PlatformStrategies
+ virtual WebCore::PluginStrategy* createPluginStrategy();
+ virtual WebCore::LocalizationStrategy* createLocalizationStrategy();
+ virtual WebCore::VisitedLinkStrategy* createVisitedLinkStrategy();
+
+ // WebCore::PluginStrategy
+ virtual void refreshPlugins();
+ virtual void getPluginInfo(Vector<WebCore::PluginInfo>&);
+
+ // WebCore::LocalizationStrategy
+ virtual WTF::String inputElementAltText();
+ virtual WTF::String resetButtonDefaultLabel();
+ virtual WTF::String searchableIndexIntroduction();
+ virtual WTF::String submitButtonDefaultLabel();
+ virtual WTF::String fileButtonChooseFileLabel();
+ virtual WTF::String fileButtonNoFileSelectedLabel();
+ virtual WTF::String contextMenuItemTagOpenLinkInNewWindow();
+ virtual WTF::String contextMenuItemTagDownloadLinkToDisk();
+ virtual WTF::String contextMenuItemTagCopyLinkToClipboard();
+ virtual WTF::String contextMenuItemTagOpenImageInNewWindow();
+ virtual WTF::String contextMenuItemTagDownloadImageToDisk();
+ virtual WTF::String contextMenuItemTagCopyImageToClipboard();
+ virtual WTF::String contextMenuItemTagOpenFrameInNewWindow();
+ virtual WTF::String contextMenuItemTagCopy();
+ virtual WTF::String contextMenuItemTagGoBack();
+ virtual WTF::String contextMenuItemTagGoForward();
+ virtual WTF::String contextMenuItemTagStop();
+ virtual WTF::String contextMenuItemTagReload();
+ virtual WTF::String contextMenuItemTagCut();
+ virtual WTF::String contextMenuItemTagPaste();
+ virtual WTF::String contextMenuItemTagNoGuessesFound();
+ virtual WTF::String contextMenuItemTagIgnoreSpelling();
+ virtual WTF::String contextMenuItemTagLearnSpelling();
+ virtual WTF::String contextMenuItemTagSearchWeb();
+ virtual WTF::String contextMenuItemTagLookUpInDictionary();
+ virtual WTF::String contextMenuItemTagOpenLink();
+ virtual WTF::String contextMenuItemTagIgnoreGrammar();
+ virtual WTF::String contextMenuItemTagSpellingMenu();
+ virtual WTF::String contextMenuItemTagShowSpellingPanel(bool show);
+ virtual WTF::String contextMenuItemTagCheckSpelling();
+ virtual WTF::String contextMenuItemTagCheckSpellingWhileTyping();
+ virtual WTF::String contextMenuItemTagCheckGrammarWithSpelling();
+ virtual WTF::String contextMenuItemTagFontMenu();
+ virtual WTF::String contextMenuItemTagBold();
+ virtual WTF::String contextMenuItemTagItalic();
+ virtual WTF::String contextMenuItemTagUnderline();
+ virtual WTF::String contextMenuItemTagOutline();
+ virtual WTF::String contextMenuItemTagWritingDirectionMenu();
+ virtual WTF::String contextMenuItemTagTextDirectionMenu();
+ virtual WTF::String contextMenuItemTagDefaultDirection();
+ virtual WTF::String contextMenuItemTagLeftToRight();
+ virtual WTF::String contextMenuItemTagRightToLeft();
+ virtual WTF::String contextMenuItemTagInspectElement();
+ virtual WTF::String searchMenuNoRecentSearchesText();
+ virtual WTF::String searchMenuRecentSearchesText();
+ virtual WTF::String searchMenuClearRecentSearchesText();
+ virtual WTF::String AXWebAreaText();
+ virtual WTF::String AXLinkText();
+ virtual WTF::String AXListMarkerText();
+ virtual WTF::String AXImageMapText();
+ virtual WTF::String AXHeadingText();
+ virtual WTF::String AXDefinitionListTermText();
+ virtual WTF::String AXDefinitionListDefinitionText();
+ virtual WTF::String AXButtonActionVerb();
+ virtual WTF::String AXRadioButtonActionVerb();
+ virtual WTF::String AXTextFieldActionVerb();
+ virtual WTF::String AXCheckedCheckBoxActionVerb();
+ virtual WTF::String AXUncheckedCheckBoxActionVerb();
+ virtual WTF::String AXMenuListActionVerb();
+ virtual WTF::String AXMenuListPopupActionVerb();
+ virtual WTF::String AXLinkActionVerb();
+ virtual WTF::String missingPluginText();
+ virtual WTF::String crashedPluginText();
+ virtual WTF::String multipleFileUploadText(unsigned numberOfFiles);
+ virtual WTF::String unknownFileSizeText();
+ virtual WTF::String imageTitle(const WTF::String& filename, const WebCore::IntSize&);
+ virtual WTF::String mediaElementLoadingStateText();
+ virtual WTF::String mediaElementLiveBroadcastStateText();
+ virtual WTF::String localizedMediaControlElementString(const WTF::String&);
+ virtual WTF::String localizedMediaControlElementHelpText(const WTF::String&);
+ virtual WTF::String localizedMediaTimeDescription(float);
+ virtual WTF::String validationMessageValueMissingText();
+ virtual WTF::String validationMessageTypeMismatchText();
+ virtual WTF::String validationMessagePatternMismatchText();
+ virtual WTF::String validationMessageTooLongText();
+ virtual WTF::String validationMessageRangeUnderflowText();
+ virtual WTF::String validationMessageRangeOverflowText();
+ virtual WTF::String validationMessageStepMismatchText();
+
+ // WebCore::VisitedLinkStrategy
+ virtual bool isLinkVisited(WebCore::Page*, WebCore::LinkHash);
+ virtual void addVisitedLink(WebCore::Page*, WebCore::LinkHash);
+
+ QWebPage* m_page;
+};
+
+#endif // WebPlatformStrategies_h