diff options
author | Simon Hausmann <simon.hausmann@nokia.com> | 2012-09-10 19:10:20 +0200 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@nokia.com> | 2012-09-10 19:10:20 +0200 |
commit | 284837daa07b29d6a63a748544a90b1f5842ac5c (patch) | |
tree | ecd258180bde91fe741e0cfd2638beb3c6da7e8e /Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp | |
parent | 2e2ba8ff45915f40ed3e014101269c175f2a89a0 (diff) | |
download | qtwebkit-284837daa07b29d6a63a748544a90b1f5842ac5c.tar.gz |
Imported WebKit commit 68645295d2e3e09af2c942f092556f06aa5f8b0d (http://svn.webkit.org/repository/webkit/trunk@128073)
New snapshot
Diffstat (limited to 'Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp')
-rw-r--r-- | Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp | 411 |
1 files changed, 361 insertions, 50 deletions
diff --git a/Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp b/Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp index 921586d1b..490b9ba7c 100644 --- a/Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp +++ b/Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp @@ -23,9 +23,9 @@ #include "DownloadProxy.h" #include "DrawingAreaProxyImpl.h" +#include "PageViewportControllerClientQt.h" #include "QtDialogRunner.h" #include "QtDownloadManager.h" -#include "QtViewportHandler.h" #include "QtWebContext.h" #include "QtWebError.h" #include "QtWebIconDatabaseClient.h" @@ -272,6 +272,7 @@ QQuickWebViewPrivate::QQuickWebViewPrivate(QQuickWebView* viewport) , m_navigatorQtObjectEnabled(false) , m_renderToOffscreenBuffer(false) , m_allowAnyHTTPSCertificateForLocalHost(false) + , m_customDevicePixelRatio(0) , m_loadProgress(0) { viewport->setClip(true); @@ -325,8 +326,9 @@ void QQuickWebViewPrivate::initialize(WKContextRef contextRef, WKPageGroupRef pa void QQuickWebViewPrivate::onComponentComplete() { Q_Q(QQuickWebView); - m_viewportHandler.reset(new QtViewportHandler(webPageProxy.get(), q, pageView.data())); - pageView->eventHandler()->setViewportHandler(m_viewportHandler.data()); + m_pageViewportControllerClient.reset(new PageViewportControllerClientQt(q, pageView.data())); + m_pageViewportController.reset(new PageViewportController(webPageProxy.get(), m_pageViewportControllerClient.data())); + pageView->eventHandler()->setViewportController(m_pageViewportControllerClient.data()); } void QQuickWebViewPrivate::setTransparentBackground(bool enable) @@ -473,7 +475,10 @@ void QQuickWebViewPrivate::didRelaunchProcess() { qWarning("WARNING: The web process has been successfully restarted."); + // Reset to default so that the later update can reach the web process. + webPageProxy->setCustomDeviceScaleFactor(0); webPageProxy->drawingArea()->setSize(viewSize(), IntSize()); + updateViewportSize(); updateUserScripts(); } @@ -789,6 +794,20 @@ void QQuickWebViewPrivate::didReceiveMessageFromNavigatorQtObject(const String& emit q_ptr->experimental()->messageReceived(variantMap); } +void QQuickWebViewPrivate::didChangeContentsSize(const QSize& newSize) +{ + if (newSize.isEmpty() || !m_customDevicePixelRatio || webPageProxy->deviceScaleFactor() == m_customDevicePixelRatio) + return; + + // DrawingAreaProxy returns early if the page size is empty + // and the device pixel ratio property is propagated from QML + // before the QML page item has a valid size yet, thus the + // information would not reach the web process. + // Set the custom device pixel ratio requested from QML as soon + // as the content item has a valid size. + webPageProxy->setCustomDeviceScaleFactor(m_customDevicePixelRatio); +} + QQuickWebViewLegacyPrivate::QQuickWebViewLegacyPrivate(QQuickWebView* viewport) : QQuickWebViewPrivate(viewport) { @@ -836,11 +855,6 @@ QQuickWebViewFlickablePrivate::QQuickWebViewFlickablePrivate(QQuickWebView* view viewport->setAcceptHoverEvents(false); } -QQuickWebViewFlickablePrivate::~QQuickWebViewFlickablePrivate() -{ - m_viewportHandler->disconnect(); -} - void QQuickWebViewFlickablePrivate::initialize(WKContextRef contextRef, WKPageGroupRef pageGroupRef) { QQuickWebViewPrivate::initialize(contextRef, pageGroupRef); @@ -856,28 +870,29 @@ void QQuickWebViewFlickablePrivate::onComponentComplete() void QQuickWebViewFlickablePrivate::didChangeViewportProperties(const WebCore::ViewportAttributes& newAttributes) { - if (m_viewportHandler) - m_viewportHandler->viewportAttributesChanged(newAttributes); + if (m_pageViewportController) + m_pageViewportController->didChangeViewportAttributes(newAttributes); } void QQuickWebViewFlickablePrivate::updateViewportSize() { - // FIXME: Examine why there is not an viewportHandler here in the beginning. - if (m_viewportHandler) - m_viewportHandler->viewportItemSizeChanged(); + Q_Q(QQuickWebView); + + if (m_pageViewportController) + m_pageViewportController->setViewportSize(QSizeF(q->width(), q->height())); } void QQuickWebViewFlickablePrivate::pageDidRequestScroll(const QPoint& pos) { - m_viewportHandler->pageContentPositionRequested(pos); + if (m_pageViewportController) + m_pageViewportController->pageDidRequestScroll(pos); } void QQuickWebViewFlickablePrivate::didChangeContentsSize(const QSize& newSize) { - Q_Q(QQuickWebView); - pageView->setContentsSize(newSize); // emits contentsSizeChanged() - m_viewportHandler->pageContentsSizeChanged(newSize, q->boundingRect().size().toSize()); + QQuickWebViewPrivate::didChangeContentsSize(newSize); + m_pageViewportController->didChangeContentsSize(newSize); } void QQuickWebViewFlickablePrivate::handleMouseEvent(QMouseEvent* event) @@ -889,22 +904,6 @@ void QQuickWebViewFlickablePrivate::handleMouseEvent(QMouseEvent* event) pageView->eventHandler()->handleInputEvent(event); } -/*! - \qmlsignal WebView::onNavigationRequested(WebNavigationRequest request) - - This signal is emitted for every navigation request. The request object contains url, - button and modifiers properties describing the navigation action, e.g. "a middle click - with shift key pressed to 'http://qt-project.org'". - - The navigation will be accepted by default. To change that, one can set the action - property to WebView.IgnoreRequest to reject the request or WebView.DownloadRequest to - trigger a download instead of navigating to the url. - - The request object cannot be used after the signal handler function ends. - - \sa WebNavigationRequest -*/ - QQuickWebViewExperimental::QQuickWebViewExperimental(QQuickWebView *webView) : QObject(webView) , q_ptr(webView) @@ -1233,19 +1232,23 @@ void QQuickWebViewExperimental::setUserAgent(const QString& userAgent) down but still provide a better looking image. */ -double QQuickWebViewExperimental::devicePixelRatio() const +qreal QQuickWebViewExperimental::devicePixelRatio() const { Q_D(const QQuickWebView); + + if (d->m_customDevicePixelRatio) + return d->m_customDevicePixelRatio; + return d->webPageProxy->deviceScaleFactor(); } -void QQuickWebViewExperimental::setDevicePixelRatio(double devicePixelRatio) +void QQuickWebViewExperimental::setDevicePixelRatio(qreal devicePixelRatio) { Q_D(QQuickWebView); - if (devicePixelRatio == this->devicePixelRatio()) + if (0 >= devicePixelRatio || devicePixelRatio == this->devicePixelRatio()) return; - d->webPageProxy->setCustomDeviceScaleFactor(devicePixelRatio); + d->m_customDevicePixelRatio = devicePixelRatio; emit devicePixelRatioChanged(); } @@ -1427,13 +1430,55 @@ QQuickWebPage* QQuickWebViewExperimental::page() } /*! - \qmlclass WebView QWebView - \inqmlmodule QtWebKit 3.0 + \page index.html + + \title QtWebKit: QML WebView version 3.0 + + The WebView API allows QML applications to render regions of dynamic + web content. A \e{WebView} component may share the screen with other + QML components or encompass the full screen as specified within the + QML application. + + QML WebView version 3.0 is incompatible with previous QML WebView API + versions. It allows an application to load pages into the WebView, + either by URL or with an HTML string, and navigate within session + history. By default, links to different pages load within the same + WebView, but applications may intercept requests to delegate links to + other functions. + + This sample QML application loads a web page, responds to session + history context, and intercepts requests for external links: + + \code + import QtQuick 2.0 + import QtWebKit 3.0 + + Page { + WebView { + id: webview + url: "http://qt-project.org" + width: parent.width + height: parent.height + onNavigationRequested: { + // detect URL scheme prefix, most likely an external link + var schemaRE = /^\w+:/; + if (schemaRE.test(request.url)) { + request.action = WebView.AcceptRequest; + } else { + request.action = WebView.IgnoreRequest; + // delegate request.url here + } + } + } + } + \endcode */ + /*! - \qmlmethod WebView(Item parent) - \brief Constructs a WebView with a parent. + \qmltype WebView + \inqmlmodule QtWebKit 3.0 + \brief A WebView renders web content within a QML application */ QQuickWebView::QQuickWebView(QQuickItem* parent) @@ -1464,24 +1509,49 @@ QQuickWebPage* QQuickWebView::page() return d->pageView.data(); } +/*! + \qmlmethod void WebView::goBack() + + Go backward within the browser's session history, if possible. + (Equivalent to the \c{window.history.back()} DOM method.) + + \sa WebView::canGoBack +*/ void QQuickWebView::goBack() { Q_D(QQuickWebView); d->webPageProxy->goBack(); } +/*! + \qmlmethod void WebView::goForward() + + Go forward within the browser's session history, if possible. + (Equivalent to the \c{window.history.forward()} DOM method.) +*/ void QQuickWebView::goForward() { Q_D(QQuickWebView); d->webPageProxy->goForward(); } +/*! + \qmlmethod void WebView::stop() + + Stop loading the current page. +*/ void QQuickWebView::stop() { Q_D(QQuickWebView); d->webPageProxy->stopLoading(); } +/*! + \qmlmethod void WebView::reload() + + Reload the current page. (Equivalent to the + \c{window.location.reload()} DOM method.) +*/ void QQuickWebView::reload() { Q_D(QQuickWebView); @@ -1502,6 +1572,15 @@ void QQuickWebView::reload() d->webPageProxy->reload(reloadFromOrigin); } +/*! + \qmlproperty url WebView::url + + The location of the currently displaying HTML page. This writable + property offers the main interface to load a page into a web view. + It functions the same as the \c{window.location} DOM property. + + \sa WebView::loadHtml() +*/ QUrl QQuickWebView::url() const { Q_D(const QQuickWebView); @@ -1535,6 +1614,24 @@ void QQuickWebView::emitUrlChangeIfNeeded() } } +/*! + \qmlproperty url WebView::icon + + The location of the currently displaying Web site icon, also known as favicon + or shortcut icon. This read-only URL corresponds to the image used within a + mobile browser application to represent a bookmarked page on the device's home + screen. + + This example uses the \c{icon} property to build an \c{Image} element: + + \code + Image { + id: appIcon + source: webView.icon != "" ? webView.icon : "fallbackFavIcon.png"; + ... + } + \endcode +*/ QUrl QQuickWebView::icon() const { Q_D(const QQuickWebView); @@ -1543,23 +1640,34 @@ QUrl QQuickWebView::icon() const /*! \qmlproperty int WebView::loadProgress - \brief The progress of loading the current web page. - The range is from 0 to 100. + The amount of the page that has been loaded, expressed as an integer + percentage in the range from \c{0} to \c{100}. */ - int QQuickWebView::loadProgress() const { Q_D(const QQuickWebView); return d->loadProgress(); } +/*! + \qmlproperty bool WebView::canGoBack + + Returns \c{true} if there are prior session history entries, \c{false} + otherwise. +*/ bool QQuickWebView::canGoBack() const { Q_D(const QQuickWebView); return d->webPageProxy->canGoBack(); } +/*! + \qmlproperty bool WebView::canGoForward + + Returns \c{true} if there are subsequent session history entries, + \c{false} otherwise. +*/ bool QQuickWebView::canGoForward() const { Q_D(const QQuickWebView); @@ -1568,9 +1676,9 @@ bool QQuickWebView::canGoForward() const /*! \qmlproperty bool WebView::loading - \brief True if the web view is currently loading a web page, false otherwise. -*/ + Returns \c{true} if the HTML page is currently loading, \c{false} otherwise. +*/ bool QQuickWebView::loading() const { Q_D(const QQuickWebView); @@ -1619,9 +1727,10 @@ QRectF QQuickWebView::mapRectFromWebContent(const QRectF& rectInCSSCoordinates) /*! \qmlproperty string WebView::title - \brief The title of the loaded page. -*/ + The title of the currently displaying HTML page, a read-only value + that reflects the contents of the \c{<title>} tag. +*/ QString QQuickWebView::title() const { Q_D(const QQuickWebView); @@ -1657,7 +1766,7 @@ QVariant QQuickWebView::inputMethodQuery(Qt::InputMethodQuery property) const } /*! - \preliminary + internal The experimental module consisting on experimental API which will break from version to version. @@ -1901,8 +2010,14 @@ void QQuickWebView::handleFlickableMouseRelease(const QPointF& position, qint64 \qmlmethod void WebView::loadHtml(string html, url baseUrl, url unreachableUrl) \brief Loads the specified \a html as the content of the web view. + (This method offers a lower-level alternative to the \c{url} property, + which references HTML pages via URL.) + External objects such as stylesheets or images referenced in the HTML - document are located relative to \a baseUrl. + document are located relative to \a baseUrl. For example if provided \a html + was originally retrieved from \c http://www.example.com/documents/overview.html + and that was the base url, then an image referenced with the relative url \c diagram.png + would be looked for at \c{http://www.example.com/documents/diagram.png}. If an \a unreachableUrl is passed it is used as the url for the loaded content. This is typically used to display error pages for a failed @@ -1955,5 +2070,201 @@ void QQuickWebView::setAllowAnyHTTPSCertificateForLocalHost(bool allow) d->m_allowAnyHTTPSCertificateForLocalHost = allow; } +/*! + \qmlsignal WebView::onLoadingChanged(loadRequest) + + Occurs when any page load begins, ends, or fails. Various read-only + parameters are available on the \a loadRequest: + + \list + + \li \c{url}: the location of the resource that is loading. + + \li \c{status}: Reflects one of three load states: + \c{LoadStartedStatus}, \c{LoadSucceededStatus}, or + \c{LoadFailedStatus}. See \c{WebView::LoadStatus}. + + \li \c{errorString}: description of load error. + + \li \c{errorCode}: HTTP error code. + + \li \c{errorDomain}: high-level error types, one of + \c{NetworkErrorDomain}, \c{HttpErrorDomain}, \c{InternalErrorDomain}, + \c{DownloadErrorDomain}, or \c{NoErrorDomain}. See + \l{WebView::ErrorDomain}. + + \endlist + + \sa WebView::loading +*/ + +/*! + \qmlsignal WebView::onLinkHovered(hoveredUrl, hoveredTitle) + + Within a mouse-driven interface, this signal is emitted when a mouse + pointer passes over a link, corresponding to the \c{mouseover} DOM + event. (May also occur in touch interfaces for \c{mouseover} events + that are not cancelled with \c{preventDefault()}.) The \a{hoveredUrl} + provides the link's location, and the \a{hoveredTitle} is any avalable + link text. +*/ + +/*! + \qmlsignal WebView::onNavigationRequested(request) + + Occurs for various kinds of navigation. If the application listens + for this signal, it must set the \c{request.action} to either of the + following \l{WebView::NavigationRequestAction} enum values: + + \list + + \li \c{AcceptRequest}: Allow navigation to external pages within the + web view. This represents the default behavior when no listener is + active. + + \li \c{IgnoreRequest}: Suppress navigation to new pages within the web + view. (The listener may then delegate navigation externally to + the browser application.) + + \endlist + + The \a{request} also provides the following read-only values: + + \list + + \li \c{url}: The location of the requested page. + + \li \c{navigationType}: contextual information, one of + \c{LinkClickedNavigation}, \c{BackForwardNavigation}, + \c{ReloadNavigation}, \c{FormSubmittedNavigation}, + \c{FormResubmittedNavigation}, or \c{OtherNavigation} enum values. + See \l{WebView::NavigationType}. + + \li \c{keyboardModifiers}: potential states for \l{Qt::KeyboardModifier}. + + \li \c{mouseButton}: potential states for \l{Qt::MouseButton}. + + \endlist +*/ + +/*! + \qmlproperty enumeration WebView::ErrorDomain + + Details various high-level error types. + + \table + + \header + \li Constant + \li Description + + \row + \li InternalErrorDomain + \li Content fails to be interpreted by QtWebKit. + + \row + \li NetworkErrorDomain + \li Error results from faulty network connection. + + \row + \li HttpErrorDomain + \li Error is produced by server. + + \row + \li DownloadErrorDomain + \li Error in saving file. + + \row + \li NoErrorDomain + \li Unspecified fallback error. + + \endtable +*/ + +/*! + \qmlproperty enumeration WebView::NavigationType + + Distinguishes context for various navigation actions. + + \table + + \header + \li Constant + \li Description + + \row + \li LinkClickedNavigation + \li Navigation via link. + + \row + \li FormSubmittedNavigation + \li Form data is posted. + + \row + \li BackForwardNavigation + \li Navigation back and forth within session history. + + \row + \li ReloadNavigation + \li The current page is reloaded. + + \row + \li FormResubmittedNavigation + \li Form data is re-posted. + + \row + \li OtherNavigation + \li Unspecified fallback method of navigation. + + \endtable +*/ + +/*! + \qmlproperty enumeration WebView::LoadStatus + + Reflects a page's load status. + + \table + + \header + \li Constant + \li Description + + \row + \li LoadStartedStatus + \li Page is currently loading. + + \row + \li LoadSucceededStatus + \li Page has successfully loaded, and is not currently loading. + + \row + \li LoadFailedStatus + \li Page has failed to load, and is not currently loading. + + \endtable +*/ + +/*! + \qmlproperty enumeration WebView::NavigationRequestAction + + Specifies a policy when navigating a link to an external page. + + \table + + \header + \li Constant + \li Description + + \row + \li AcceptRequest + \li Allow navigation to external pages within the web view. + + \row + \li IgnoreRequest + \li Suppress navigation to new pages within the web view. + + \endtable +*/ #include "moc_qquickwebview_p.cpp" |