diff options
Diffstat (limited to 'Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp')
-rw-r--r-- | Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp | 799 |
1 files changed, 475 insertions, 324 deletions
diff --git a/Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp b/Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp index 657a25dcc..00828dde6 100644 --- a/Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp +++ b/Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp @@ -28,16 +28,18 @@ #include "AuthenticationManager.h" #include "DataReference.h" +#include "DrawingArea.h" #include "InjectedBundle.h" #include "InjectedBundleBackForwardListItem.h" #include "InjectedBundleDOMWindowExtension.h" #include "InjectedBundleNavigationAction.h" -#include "InjectedBundleUserMessageCoders.h" -#include "PlatformCertificateInfo.h" +#include "NavigationActionData.h" #include "PluginView.h" +#include "UserData.h" +#include "WKBundleAPICast.h" #include "WebBackForwardListProxy.h" -#include "WebContextMessages.h" #include "WebCoreArgumentCoders.h" +#include "WebDocumentLoader.h" #include "WebErrors.h" #include "WebEvent.h" #include "WebFrame.h" @@ -46,16 +48,17 @@ #include "WebIconDatabaseMessages.h" #include "WebNavigationDataStore.h" #include "WebPage.h" +#include "WebPageGroupProxy.h" #include "WebPageProxyMessages.h" #include "WebProcess.h" -#include "WebProcessProxyMessages.h" +#include "WebProcessPoolMessages.h" #include <JavaScriptCore/APICast.h> #include <JavaScriptCore/JSObject.h> +#include <WebCore/CertificateInfo.h> #include <WebCore/Chrome.h> #include <WebCore/DOMWrapperWorld.h> #include <WebCore/DocumentLoader.h> #include <WebCore/FormState.h> -#include <WebCore/Frame.h> #include <WebCore/FrameLoadRequest.h> #include <WebCore/FrameLoader.h> #include <WebCore/FrameView.h> @@ -64,27 +67,32 @@ #include <WebCore/HistoryController.h> #include <WebCore/HistoryItem.h> #include <WebCore/MIMETypeRegistry.h> +#include <WebCore/MainFrame.h> #include <WebCore/MouseEvent.h> #include <WebCore/NotImplemented.h> #include <WebCore/Page.h> #include <WebCore/PluginData.h> #include <WebCore/PluginDocument.h> #include <WebCore/ProgressTracker.h> -#include <WebCore/ResourceBuffer.h> #include <WebCore/ResourceError.h> +#include <WebCore/ScriptController.h> +#include <WebCore/SecurityOriginData.h> #include <WebCore/Settings.h> +#include <WebCore/SubframeLoader.h> #include <WebCore/UIEventWithKeyState.h> #include <WebCore/Widget.h> #include <WebCore/WindowFeatures.h> +#include <wtf/NeverDestroyed.h> using namespace WebCore; namespace WebKit { -WebFrameLoaderClient::WebFrameLoaderClient(WebFrame* frame) - : m_frame(frame) +WebFrameLoaderClient::WebFrameLoaderClient() + : m_frame(0) , m_hasSentResponseToPluginView(false) - , m_didCompletePageTransitionAlready(false) + , m_didCompletePageTransition(false) + , m_frameHasCustomContentProvider(false) , m_frameCameFromPageCache(false) { } @@ -97,21 +105,21 @@ void WebFrameLoaderClient::frameLoaderDestroyed() { m_frame->invalidate(); - // Balances explicit ref() in WebFrame::createMainFrame and WebFrame::createSubframe. + // Balances explicit ref() in WebFrame::create(). m_frame->deref(); } -bool WebFrameLoaderClient::hasWebView() const +bool WebFrameLoaderClient::hasHTMLView() const { - return m_frame->page(); + return !m_frameHasCustomContentProvider; } -void WebFrameLoaderClient::makeRepresentation(DocumentLoader*) +bool WebFrameLoaderClient::hasWebView() const { - notImplemented(); + return m_frame->page(); } -void WebFrameLoaderClient::forceLayout() +void WebFrameLoaderClient::makeRepresentation(DocumentLoader*) { notImplemented(); } @@ -132,14 +140,10 @@ void WebFrameLoaderClient::detachedFromParent2() if (!webPage) return; - RefPtr<APIObject> userData; + RefPtr<API::Object> userData; // Notify the bundle client. webPage->injectedBundleLoaderClient().didRemoveFrameFromHierarchy(webPage, m_frame, userData); - - // Notify the UIProcess. - webPage->send(Messages::WebPageProxy::DidRemoveFrameFromHierarchy(m_frame->frameID(), InjectedBundleUserMessageEncoder(userData.get()))); - } void WebFrameLoaderClient::detachedFromParent3() @@ -158,6 +162,7 @@ void WebFrameLoaderClient::assignIdentifierToInitialRequest(unsigned long identi pageIsProvisionallyLoading = frameLoader->provisionalDocumentLoader() == loader; webPage->injectedBundleResourceLoadClient().didInitiateLoadForResource(webPage, m_frame, identifier, request, pageIsProvisionallyLoading); + webPage->addResourceRequest(identifier, request); } void WebFrameLoaderClient::dispatchWillSendRequest(DocumentLoader*, unsigned long identifier, ResourceRequest& request, const ResourceResponse& redirectResponse) @@ -187,7 +192,7 @@ void WebFrameLoaderClient::dispatchDidReceiveAuthenticationChallenge(DocumentLoa if (!webPage) return; - WebProcess::shared().supplement<AuthenticationManager>()->didReceiveAuthenticationChallenge(m_frame, challenge); + WebProcess::singleton().supplement<AuthenticationManager>()->didReceiveAuthenticationChallenge(m_frame, challenge); } void WebFrameLoaderClient::dispatchDidCancelAuthenticationChallenge(DocumentLoader*, unsigned long /*identifier*/, const AuthenticationChallenge&) @@ -231,6 +236,16 @@ void WebFrameLoaderClient::dispatchDidReceiveContentLength(DocumentLoader*, unsi webPage->injectedBundleResourceLoadClient().didReceiveContentLengthForResource(webPage, m_frame, identifier, dataLength); } +#if ENABLE(DATA_DETECTION) +void WebFrameLoaderClient::dispatchDidFinishDataDetection(NSArray *detectionResults) +{ + WebPage* webPage = m_frame->page(); + if (!webPage) + return; + webPage->setDataDetectionResults(detectionResults); +} +#endif + void WebFrameLoaderClient::dispatchDidFinishLoading(DocumentLoader*, unsigned long identifier) { WebPage* webPage = m_frame->page(); @@ -238,6 +253,7 @@ void WebFrameLoaderClient::dispatchDidFinishLoading(DocumentLoader*, unsigned lo return; webPage->injectedBundleResourceLoadClient().didFinishLoadForResource(webPage, m_frame, identifier); + webPage->removeResourceRequest(identifier); } void WebFrameLoaderClient::dispatchDidFailLoading(DocumentLoader*, unsigned long identifier, const ResourceError& error) @@ -247,6 +263,7 @@ void WebFrameLoaderClient::dispatchDidFailLoading(DocumentLoader*, unsigned long return; webPage->injectedBundleResourceLoadClient().didFailLoadForResource(webPage, m_frame, identifier, error); + webPage->removeResourceRequest(identifier); } bool WebFrameLoaderClient::dispatchDidLoadResourceFromMemoryCache(DocumentLoader*, const ResourceRequest&, const ResourceResponse&, int /*length*/) @@ -255,7 +272,7 @@ bool WebFrameLoaderClient::dispatchDidLoadResourceFromMemoryCache(DocumentLoader return false; } -void WebFrameLoaderClient::dispatchDidHandleOnloadEvents() +void WebFrameLoaderClient::dispatchDidDispatchOnloadEvents() { WebPage* webPage = m_frame->page(); if (!webPage) @@ -271,15 +288,25 @@ void WebFrameLoaderClient::dispatchDidReceiveServerRedirectForProvisionalLoad() if (!webPage) return; - DocumentLoader* provisionalLoader = m_frame->coreFrame()->loader()->provisionalDocumentLoader(); - const String& url = provisionalLoader->url().string(); - RefPtr<APIObject> userData; + WebDocumentLoader& documentLoader = static_cast<WebDocumentLoader&>(*m_frame->coreFrame()->loader().provisionalDocumentLoader()); + const String& url = documentLoader.url().string(); + RefPtr<API::Object> userData; // Notify the bundle client. webPage->injectedBundleLoaderClient().didReceiveServerRedirectForProvisionalLoadForFrame(webPage, m_frame, userData); // Notify the UIProcess. - webPage->send(Messages::WebPageProxy::DidReceiveServerRedirectForProvisionalLoadForFrame(m_frame->frameID(), url, InjectedBundleUserMessageEncoder(userData.get()))); + webPage->send(Messages::WebPageProxy::DidReceiveServerRedirectForProvisionalLoadForFrame(m_frame->frameID(), documentLoader.navigationID(), url, UserData(WebProcess::singleton().transformObjectsToHandles(userData.get()).get()))); +} + +void WebFrameLoaderClient::dispatchDidChangeProvisionalURL() +{ + WebPage* webPage = m_frame->page(); + if (!webPage) + return; + + WebDocumentLoader& documentLoader = static_cast<WebDocumentLoader&>(*m_frame->coreFrame()->loader().provisionalDocumentLoader()); + webPage->send(Messages::WebPageProxy::DidChangeProvisionalURLForFrame(m_frame->frameID(), documentLoader.navigationID(), documentLoader.url().string())); } void WebFrameLoaderClient::dispatchDidCancelClientRedirect() @@ -292,7 +319,7 @@ void WebFrameLoaderClient::dispatchDidCancelClientRedirect() webPage->injectedBundleLoaderClient().didCancelClientRedirectForFrame(webPage, m_frame); } -void WebFrameLoaderClient::dispatchWillPerformClientRedirect(const KURL& url, double interval, double fireDate) +void WebFrameLoaderClient::dispatchWillPerformClientRedirect(const URL& url, double interval, double fireDate) { WebPage* webPage = m_frame->page(); if (!webPage) @@ -308,13 +335,15 @@ void WebFrameLoaderClient::dispatchDidChangeLocationWithinPage() if (!webPage) return; - RefPtr<APIObject> userData; + RefPtr<API::Object> userData; + + auto navigationID = static_cast<WebDocumentLoader&>(*m_frame->coreFrame()->loader().documentLoader()).navigationID(); // Notify the bundle client. webPage->injectedBundleLoaderClient().didSameDocumentNavigationForFrame(webPage, m_frame, SameDocumentNavigationAnchorNavigation, userData); // Notify the UIProcess. - webPage->send(Messages::WebPageProxy::DidSameDocumentNavigationForFrame(m_frame->frameID(), SameDocumentNavigationAnchorNavigation, m_frame->coreFrame()->document()->url().string(), InjectedBundleUserMessageEncoder(userData.get()))); + webPage->send(Messages::WebPageProxy::DidSameDocumentNavigationForFrame(m_frame->frameID(), navigationID, SameDocumentNavigationAnchorNavigation, m_frame->coreFrame()->document()->url().string(), UserData(WebProcess::singleton().transformObjectsToHandles(userData.get()).get()))); } void WebFrameLoaderClient::dispatchDidPushStateWithinPage() @@ -323,13 +352,15 @@ void WebFrameLoaderClient::dispatchDidPushStateWithinPage() if (!webPage) return; - RefPtr<APIObject> userData; + RefPtr<API::Object> userData; + + auto navigationID = static_cast<WebDocumentLoader&>(*m_frame->coreFrame()->loader().documentLoader()).navigationID(); // Notify the bundle client. webPage->injectedBundleLoaderClient().didSameDocumentNavigationForFrame(webPage, m_frame, SameDocumentNavigationSessionStatePush, userData); // Notify the UIProcess. - webPage->send(Messages::WebPageProxy::DidSameDocumentNavigationForFrame(m_frame->frameID(), SameDocumentNavigationSessionStatePush, m_frame->coreFrame()->document()->url().string(), InjectedBundleUserMessageEncoder(userData.get()))); + webPage->send(Messages::WebPageProxy::DidSameDocumentNavigationForFrame(m_frame->frameID(), navigationID, SameDocumentNavigationSessionStatePush, m_frame->coreFrame()->document()->url().string(), UserData(WebProcess::singleton().transformObjectsToHandles(userData.get()).get()))); } void WebFrameLoaderClient::dispatchDidReplaceStateWithinPage() @@ -338,13 +369,15 @@ void WebFrameLoaderClient::dispatchDidReplaceStateWithinPage() if (!webPage) return; - RefPtr<APIObject> userData; + RefPtr<API::Object> userData; + + auto navigationID = static_cast<WebDocumentLoader&>(*m_frame->coreFrame()->loader().documentLoader()).navigationID(); // Notify the bundle client. webPage->injectedBundleLoaderClient().didSameDocumentNavigationForFrame(webPage, m_frame, SameDocumentNavigationSessionStateReplace, userData); // Notify the UIProcess. - webPage->send(Messages::WebPageProxy::DidSameDocumentNavigationForFrame(m_frame->frameID(), SameDocumentNavigationSessionStateReplace, m_frame->coreFrame()->document()->url().string(), InjectedBundleUserMessageEncoder(userData.get()))); + webPage->send(Messages::WebPageProxy::DidSameDocumentNavigationForFrame(m_frame->frameID(), navigationID, SameDocumentNavigationSessionStateReplace, m_frame->coreFrame()->document()->url().string(), UserData(WebProcess::singleton().transformObjectsToHandles(userData.get()).get()))); } void WebFrameLoaderClient::dispatchDidPopStateWithinPage() @@ -353,13 +386,15 @@ void WebFrameLoaderClient::dispatchDidPopStateWithinPage() if (!webPage) return; - RefPtr<APIObject> userData; + RefPtr<API::Object> userData; + + auto navigationID = static_cast<WebDocumentLoader&>(*m_frame->coreFrame()->loader().documentLoader()).navigationID(); // Notify the bundle client. webPage->injectedBundleLoaderClient().didSameDocumentNavigationForFrame(webPage, m_frame, SameDocumentNavigationSessionStatePop, userData); // Notify the UIProcess. - webPage->send(Messages::WebPageProxy::DidSameDocumentNavigationForFrame(m_frame->frameID(), SameDocumentNavigationSessionStatePop, m_frame->coreFrame()->document()->url().string(), InjectedBundleUserMessageEncoder(userData.get()))); + webPage->send(Messages::WebPageProxy::DidSameDocumentNavigationForFrame(m_frame->frameID(), navigationID, SameDocumentNavigationSessionStatePop, m_frame->coreFrame()->document()->url().string(), UserData(WebProcess::singleton().transformObjectsToHandles(userData.get()).get()))); } void WebFrameLoaderClient::dispatchWillClose() @@ -369,7 +404,7 @@ void WebFrameLoaderClient::dispatchWillClose() void WebFrameLoaderClient::dispatchDidReceiveIcon() { - WebProcess::shared().parentProcessConnection()->send(Messages::WebIconDatabase::DidReceiveIconForPageURL(m_frame->url()), 0); + WebProcess::singleton().parentProcessConnection()->send(Messages::WebIconDatabase::DidReceiveIconForPageURL(m_frame->url()), 0); } void WebFrameLoaderClient::dispatchDidStartProvisionalLoad() @@ -387,17 +422,17 @@ void WebFrameLoaderClient::dispatchDidStartProvisionalLoad() webPage->findController().hideFindUI(); webPage->sandboxExtensionTracker().didStartProvisionalLoad(m_frame); - DocumentLoader* provisionalLoader = m_frame->coreFrame()->loader()->provisionalDocumentLoader(); - const String& url = provisionalLoader->url().string(); - RefPtr<APIObject> userData; + WebDocumentLoader& provisionalLoader = static_cast<WebDocumentLoader&>(*m_frame->coreFrame()->loader().provisionalDocumentLoader()); + const String& url = provisionalLoader.url().string(); + RefPtr<API::Object> userData; // Notify the bundle client. webPage->injectedBundleLoaderClient().didStartProvisionalLoadForFrame(webPage, m_frame, userData); - String unreachableURL = provisionalLoader->unreachableURL().string(); + String unreachableURL = provisionalLoader.unreachableURL().string(); // Notify the UIProcess. - webPage->send(Messages::WebPageProxy::DidStartProvisionalLoadForFrame(m_frame->frameID(), url, unreachableURL, InjectedBundleUserMessageEncoder(userData.get()))); + webPage->send(Messages::WebPageProxy::DidStartProvisionalLoadForFrame(m_frame->frameID(), provisionalLoader.navigationID(), url, unreachableURL, UserData(WebProcess::singleton().transformObjectsToHandles(userData.get()).get()))); } void WebFrameLoaderClient::dispatchDidReceiveTitle(const StringWithDirection& title) @@ -406,14 +441,14 @@ void WebFrameLoaderClient::dispatchDidReceiveTitle(const StringWithDirection& ti if (!webPage) return; - RefPtr<APIObject> userData; + RefPtr<API::Object> userData; // Notify the bundle client. // FIXME: use direction of title. webPage->injectedBundleLoaderClient().didReceiveTitleForFrame(webPage, title.string(), m_frame, userData); // Notify the UIProcess. - webPage->send(Messages::WebPageProxy::DidReceiveTitleForFrame(m_frame->frameID(), title.string(), InjectedBundleUserMessageEncoder(userData.get()))); + webPage->send(Messages::WebPageProxy::DidReceiveTitleForFrame(m_frame->frameID(), title.string(), UserData(WebProcess::singleton().transformObjectsToHandles(userData.get()).get()))); } void WebFrameLoaderClient::dispatchDidChangeIcons(WebCore::IconType) @@ -427,8 +462,8 @@ void WebFrameLoaderClient::dispatchDidCommitLoad() if (!webPage) return; - const ResourceResponse& response = m_frame->coreFrame()->loader()->documentLoader()->response(); - RefPtr<APIObject> userData; + WebDocumentLoader& documentLoader = static_cast<WebDocumentLoader&>(*m_frame->coreFrame()->loader().documentLoader()); + RefPtr<API::Object> userData; // Notify the bundle client. webPage->injectedBundleLoaderClient().didCommitLoadForFrame(webPage, m_frame, userData); @@ -437,8 +472,7 @@ void WebFrameLoaderClient::dispatchDidCommitLoad() // Notify the UIProcess. - webPage->send(Messages::WebPageProxy::DidCommitLoadForFrame(m_frame->frameID(), response.mimeType(), m_frame->coreFrame()->loader()->loadType(), PlatformCertificateInfo(response), InjectedBundleUserMessageEncoder(userData.get()))); - + webPage->send(Messages::WebPageProxy::DidCommitLoadForFrame(m_frame->frameID(), documentLoader.navigationID(), documentLoader.response().mimeType(), m_frameHasCustomContentProvider, m_frame->handlesPageScaleGesture(), static_cast<uint32_t>(m_frame->coreFrame()->loader().loadType()), documentLoader.response().certificateInfo(), m_frame->coreFrame()->document()->isPluginDocument(), UserData(WebProcess::singleton().transformObjectsToHandles(userData.get()).get()))); webPage->didCommitLoad(m_frame); } @@ -448,16 +482,29 @@ void WebFrameLoaderClient::dispatchDidFailProvisionalLoad(const ResourceError& e if (!webPage) return; - RefPtr<APIObject> userData; + RefPtr<API::Object> userData; // Notify the bundle client. webPage->injectedBundleLoaderClient().didFailProvisionalLoadWithErrorForFrame(webPage, m_frame, error, userData); webPage->sandboxExtensionTracker().didFailProvisionalLoad(m_frame); + // FIXME: This is gross. This is necessary because if the client calls WKBundlePageStopLoading() from within the didFailProvisionalLoadWithErrorForFrame + // injected bundle client call, that will cause the provisional DocumentLoader to be disconnected from the Frame, and didDistroyNavigation message + // to be sent to the UIProcess (and the destruction of the DocumentLoader). If that happens, and we had captured the navigationID before injected bundle + // client call, the DidFailProvisionalLoadForFrame would send a navigationID of a destroyed Navigation, and the UIProcess would not be able to find it + // in its table. + // + // A better solution to this problem would be find a clean way to postpone the disconnection of the DocumentLoader from the Frame until + // the entire FrameLoaderClient function was complete. + uint64_t navigationID = 0; + if (auto documentLoader = m_frame->coreFrame()->loader().provisionalDocumentLoader()) + navigationID = static_cast<WebDocumentLoader*>(documentLoader)->navigationID(); + // Notify the UIProcess. - webPage->send(Messages::WebPageProxy::DidFailProvisionalLoadForFrame(m_frame->frameID(), error, InjectedBundleUserMessageEncoder(userData.get()))); - + WebCore::Frame* coreFrame = m_frame ? m_frame->coreFrame() : nullptr; + webPage->send(Messages::WebPageProxy::DidFailProvisionalLoadForFrame(m_frame->frameID(), SecurityOriginData::fromFrame(coreFrame), navigationID, m_frame->coreFrame()->loader().provisionalLoadErrorBeingHandledURL(), error, UserData(WebProcess::singleton().transformObjectsToHandles(userData.get()).get()))); + // If we have a load listener, notify it. if (WebFrame::LoadListener* loadListener = m_frame->loadListener()) loadListener->didFailLoad(m_frame, error.isCancellation()); @@ -469,13 +516,15 @@ void WebFrameLoaderClient::dispatchDidFailLoad(const ResourceError& error) if (!webPage) return; - RefPtr<APIObject> userData; + RefPtr<API::Object> userData; + + auto navigationID = static_cast<WebDocumentLoader&>(*m_frame->coreFrame()->loader().documentLoader()).navigationID(); // Notify the bundle client. webPage->injectedBundleLoaderClient().didFailLoadWithErrorForFrame(webPage, m_frame, error, userData); // Notify the UIProcess. - webPage->send(Messages::WebPageProxy::DidFailLoadForFrame(m_frame->frameID(), error, InjectedBundleUserMessageEncoder(userData.get()))); + webPage->send(Messages::WebPageProxy::DidFailLoadForFrame(m_frame->frameID(), navigationID, error, UserData(WebProcess::singleton().transformObjectsToHandles(userData.get()).get()))); // If we have a load listener, notify it. if (WebFrame::LoadListener* loadListener = m_frame->loadListener()) @@ -488,13 +537,15 @@ void WebFrameLoaderClient::dispatchDidFinishDocumentLoad() if (!webPage) return; - RefPtr<APIObject> userData; + RefPtr<API::Object> userData; + + auto navigationID = static_cast<WebDocumentLoader&>(*m_frame->coreFrame()->loader().documentLoader()).navigationID(); // Notify the bundle client. webPage->injectedBundleLoaderClient().didFinishDocumentLoadForFrame(webPage, m_frame, userData); // Notify the UIProcess. - webPage->send(Messages::WebPageProxy::DidFinishDocumentLoadForFrame(m_frame->frameID(), InjectedBundleUserMessageEncoder(userData.get()))); + webPage->send(Messages::WebPageProxy::DidFinishDocumentLoadForFrame(m_frame->frameID(), navigationID, UserData(WebProcess::singleton().transformObjectsToHandles(userData.get()).get()))); } void WebFrameLoaderClient::dispatchDidFinishLoad() @@ -503,13 +554,15 @@ void WebFrameLoaderClient::dispatchDidFinishLoad() if (!webPage) return; - RefPtr<APIObject> userData; + RefPtr<API::Object> userData; + + auto navigationID = static_cast<WebDocumentLoader&>(*m_frame->coreFrame()->loader().documentLoader()).navigationID(); // Notify the bundle client. webPage->injectedBundleLoaderClient().didFinishLoadForFrame(webPage, m_frame, userData); // Notify the UIProcess. - webPage->send(Messages::WebPageProxy::DidFinishLoadForFrame(m_frame->frameID(), InjectedBundleUserMessageEncoder(userData.get()))); + webPage->send(Messages::WebPageProxy::DidFinishLoadForFrame(m_frame->frameID(), navigationID, UserData(WebProcess::singleton().transformObjectsToHandles(userData.get()).get()))); // If we have a load listener, notify it. if (WebFrame::LoadListener* loadListener = m_frame->loadListener()) @@ -520,7 +573,7 @@ void WebFrameLoaderClient::dispatchDidFinishLoad() void WebFrameLoaderClient::forcePageTransitionIfNeeded() { - if (m_didCompletePageTransitionAlready) + if (m_didCompletePageTransition) return; WebPage* webPage = m_frame->page(); @@ -528,7 +581,7 @@ void WebFrameLoaderClient::forcePageTransitionIfNeeded() return; webPage->didCompletePageTransition(); - m_didCompletePageTransitionAlready = true; + m_didCompletePageTransition = true; } void WebFrameLoaderClient::dispatchDidLayout(LayoutMilestones milestones) @@ -537,41 +590,41 @@ void WebFrameLoaderClient::dispatchDidLayout(LayoutMilestones milestones) if (!webPage) return; - RefPtr<APIObject> userData; - - webPage->injectedBundleLoaderClient().didLayout(webPage, milestones, userData); - webPage->send(Messages::WebPageProxy::DidLayout(milestones, InjectedBundleUserMessageEncoder(userData.get()))); + RefPtr<API::Object> userData; if (milestones & DidFirstLayout) { // FIXME: We should consider removing the old didFirstLayout API since this is doing double duty with the // new didLayout API. webPage->injectedBundleLoaderClient().didFirstLayoutForFrame(webPage, m_frame, userData); - webPage->send(Messages::WebPageProxy::DidFirstLayoutForFrame(m_frame->frameID(), InjectedBundleUserMessageEncoder(userData.get()))); + webPage->send(Messages::WebPageProxy::DidFirstLayoutForFrame(m_frame->frameID(), UserData(WebProcess::singleton().transformObjectsToHandles(userData.get()).get()))); - if (m_frame == m_frame->page()->mainWebFrame()) { - if (!webPage->corePage()->settings()->suppressesIncrementalRendering() && !m_didCompletePageTransitionAlready) { - webPage->didCompletePageTransition(); - m_didCompletePageTransitionAlready = true; - } +#if PLATFORM(MAC) + // FIXME: Do this on DidFirstVisuallyNonEmptyLayout when Mac Safari is able to handle it (<rdar://problem/17580021>) + if (m_frame->isMainFrame() && !m_didCompletePageTransition && !webPage->corePage()->settings().suppressesIncrementalRendering()) { + webPage->didCompletePageTransition(); + m_didCompletePageTransition = true; } - -#if USE(TILED_BACKING_STORE) +#endif + +#if USE(COORDINATED_GRAPHICS) // Make sure viewport properties are dispatched on the main frame by the time the first layout happens. ASSERT(!webPage->useFixedLayout() || m_frame != m_frame->page()->mainWebFrame() || m_frame->coreFrame()->document()->didDispatchViewportPropertiesChanged()); #endif } + // Send this after DidFirstLayout-specific calls since some clients expect to get those messages first. + webPage->dispatchDidLayout(milestones); + if (milestones & DidFirstVisuallyNonEmptyLayout) { + if (m_frame->isMainFrame() && !m_didCompletePageTransition && !webPage->corePage()->settings().suppressesIncrementalRendering()) { + webPage->didCompletePageTransition(); + m_didCompletePageTransition = true; + } + // FIXME: We should consider removing the old didFirstVisuallyNonEmptyLayoutForFrame API since this is doing // double duty with the new didLayout API. webPage->injectedBundleLoaderClient().didFirstVisuallyNonEmptyLayoutForFrame(webPage, m_frame, userData); - webPage->send(Messages::WebPageProxy::DidFirstVisuallyNonEmptyLayoutForFrame(m_frame->frameID(), InjectedBundleUserMessageEncoder(userData.get()))); - } - - if (milestones & DidHitRelevantRepaintedObjectsAreaThreshold) { - // FIXME: This can go away when we remove didNewFirstVisuallyNonEmptyLayout. - webPage->injectedBundleLoaderClient().didNewFirstVisuallyNonEmptyLayout(webPage, userData); - webPage->send(Messages::WebPageProxy::DidNewFirstVisuallyNonEmptyLayout(InjectedBundleUserMessageEncoder(userData.get()))); + webPage->send(Messages::WebPageProxy::DidFirstVisuallyNonEmptyLayoutForFrame(m_frame->frameID(), UserData(WebProcess::singleton().transformObjectsToHandles(userData.get()).get()))); } } @@ -586,6 +639,10 @@ void WebFrameLoaderClient::dispatchDidLayout() webPage->recomputeShortCircuitHorizontalWheelEventsState(); +#if PLATFORM(IOS) + webPage->updateSelectionAppearance(); +#endif + // NOTE: Unlike the other layout notifications, this does not notify the // the UIProcess for every call. @@ -603,11 +660,12 @@ Frame* WebFrameLoaderClient::dispatchCreatePage(const NavigationAction& navigati return 0; // Just call through to the chrome client. - Page* newPage = webPage->corePage()->chrome().createWindow(m_frame->coreFrame(), FrameLoadRequest(m_frame->coreFrame()->document()->securityOrigin()), WindowFeatures(), navigationAction); + FrameLoadRequest request(m_frame->coreFrame()->document()->securityOrigin(), navigationAction.resourceRequest(), LockHistory::No, LockBackForwardList::No, MaybeSendReferrer, AllowNavigationToInvalidURL::Yes, NewFrameOpenerPolicy::Allow, navigationAction.shouldOpenExternalURLsPolicy()); + Page* newPage = webPage->corePage()->chrome().createWindow(m_frame->coreFrame(), request, WindowFeatures(), navigationAction); if (!newPage) return 0; - return newPage->mainFrame(); + return &newPage->mainFrame(); } void WebFrameLoaderClient::dispatchShow() @@ -619,99 +677,158 @@ void WebFrameLoaderClient::dispatchShow() webPage->show(); } -void WebFrameLoaderClient::dispatchDecidePolicyForResponse(FramePolicyFunction function, const ResourceResponse& response, const ResourceRequest& request) +void WebFrameLoaderClient::dispatchDecidePolicyForResponse(const ResourceResponse& response, const ResourceRequest& request, FramePolicyFunction function) { WebPage* webPage = m_frame->page(); - if (!webPage) + if (!webPage) { + function(PolicyIgnore); return; + } if (!request.url().string()) { - (m_frame->coreFrame()->loader()->policyChecker()->*function)(PolicyUse); + function(PolicyUse); return; } - RefPtr<APIObject> userData; + RefPtr<API::Object> userData; // Notify the bundle client. WKBundlePagePolicyAction policy = webPage->injectedBundlePolicyClient().decidePolicyForResponse(webPage, m_frame, response, request, userData); if (policy == WKBundlePagePolicyActionUse) { - (m_frame->coreFrame()->loader()->policyChecker()->*function)(PolicyUse); + function(PolicyUse); return; } - uint64_t listenerID = m_frame->setUpPolicyListener(function); + bool canShowMIMEType = webPage->canShowMIMEType(response.mimeType()); + + uint64_t listenerID = m_frame->setUpPolicyListener(WTFMove(function)); bool receivedPolicyAction; uint64_t policyAction; - uint64_t downloadID; + DownloadID downloadID; - // Notify the UIProcess. - if (!webPage->sendSync(Messages::WebPageProxy::DecidePolicyForResponseSync(m_frame->frameID(), response, request, listenerID, InjectedBundleUserMessageEncoder(userData.get())), Messages::WebPageProxy::DecidePolicyForResponseSync::Reply(receivedPolicyAction, policyAction, downloadID))) + Ref<WebFrame> protect(*m_frame); + WebCore::Frame* coreFrame = m_frame->coreFrame(); + if (!webPage->sendSync(Messages::WebPageProxy::DecidePolicyForResponseSync(m_frame->frameID(), SecurityOriginData::fromFrame(coreFrame), response, request, canShowMIMEType, listenerID, UserData(WebProcess::singleton().transformObjectsToHandles(userData.get()).get())), Messages::WebPageProxy::DecidePolicyForResponseSync::Reply(receivedPolicyAction, policyAction, downloadID), std::chrono::milliseconds::max(), IPC::InformPlatformProcessWillSuspend)) { + m_frame->didReceivePolicyDecision(listenerID, PolicyIgnore, 0, { }); return; + } // We call this synchronously because CFNetwork can only convert a loading connection to a download from its didReceiveResponse callback. if (receivedPolicyAction) - m_frame->didReceivePolicyDecision(listenerID, static_cast<PolicyAction>(policyAction), downloadID); + m_frame->didReceivePolicyDecision(listenerID, static_cast<PolicyAction>(policyAction), 0, downloadID); } -void WebFrameLoaderClient::dispatchDecidePolicyForNewWindowAction(FramePolicyFunction function, const NavigationAction& navigationAction, const ResourceRequest& request, PassRefPtr<FormState> formState, const String& frameName) +void WebFrameLoaderClient::dispatchDecidePolicyForNewWindowAction(const NavigationAction& navigationAction, const ResourceRequest& request, PassRefPtr<FormState> formState, const String& frameName, FramePolicyFunction function) { WebPage* webPage = m_frame->page(); - if (!webPage) + if (!webPage) { + function(PolicyIgnore); return; + } - RefPtr<APIObject> userData; + RefPtr<API::Object> userData; RefPtr<InjectedBundleNavigationAction> action = InjectedBundleNavigationAction::create(m_frame, navigationAction, formState); // Notify the bundle client. WKBundlePagePolicyAction policy = webPage->injectedBundlePolicyClient().decidePolicyForNewWindowAction(webPage, m_frame, action.get(), request, frameName, userData); if (policy == WKBundlePagePolicyActionUse) { - (m_frame->coreFrame()->loader()->policyChecker()->*function)(PolicyUse); + function(PolicyUse); return; } - uint64_t listenerID = m_frame->setUpPolicyListener(function); + uint64_t listenerID = m_frame->setUpPolicyListener(WTFMove(function)); - // Notify the UIProcess. - webPage->send(Messages::WebPageProxy::DecidePolicyForNewWindowAction(m_frame->frameID(), action->navigationType(), action->modifiers(), action->mouseButton(), request, frameName, listenerID, InjectedBundleUserMessageEncoder(userData.get()))); + NavigationActionData navigationActionData; + navigationActionData.navigationType = action->navigationType(); + navigationActionData.modifiers = action->modifiers(); + navigationActionData.mouseButton = action->mouseButton(); + navigationActionData.isProcessingUserGesture = navigationAction.processingUserGesture(); + navigationActionData.canHandleRequest = webPage->canHandleRequest(request); + navigationActionData.shouldOpenExternalURLsPolicy = navigationAction.shouldOpenExternalURLsPolicy(); + + WebCore::Frame* coreFrame = m_frame ? m_frame->coreFrame() : nullptr; + webPage->send(Messages::WebPageProxy::DecidePolicyForNewWindowAction(m_frame->frameID(), SecurityOriginData::fromFrame(coreFrame), navigationActionData, request, frameName, listenerID, UserData(WebProcess::singleton().transformObjectsToHandles(userData.get()).get()))); } -void WebFrameLoaderClient::dispatchDecidePolicyForNavigationAction(FramePolicyFunction function, const NavigationAction& navigationAction, const ResourceRequest& request, PassRefPtr<FormState> formState) +void WebFrameLoaderClient::dispatchDecidePolicyForNavigationAction(const NavigationAction& navigationAction, const ResourceRequest& request, PassRefPtr<FormState> prpFormState, FramePolicyFunction function) { WebPage* webPage = m_frame->page(); - if (!webPage) + if (!webPage) { + function(PolicyIgnore); return; + } // Always ignore requests with empty URLs. - if (request.isEmpty()) { - (m_frame->coreFrame()->loader()->policyChecker()->*function)(PolicyIgnore); - return; + if (request.isEmpty()) { + function(PolicyIgnore); + return; } - RefPtr<APIObject> userData; + RefPtr<API::Object> userData; + RefPtr<FormState> formState = prpFormState; RefPtr<InjectedBundleNavigationAction> action = InjectedBundleNavigationAction::create(m_frame, navigationAction, formState); // Notify the bundle client. WKBundlePagePolicyAction policy = webPage->injectedBundlePolicyClient().decidePolicyForNavigationAction(webPage, m_frame, action.get(), request, userData); if (policy == WKBundlePagePolicyActionUse) { - (m_frame->coreFrame()->loader()->policyChecker()->*function)(PolicyUse); + function(PolicyUse); return; } - uint64_t listenerID = m_frame->setUpPolicyListener(function); + uint64_t listenerID = m_frame->setUpPolicyListener(WTFMove(function)); bool receivedPolicyAction; + uint64_t newNavigationID; uint64_t policyAction; - uint64_t downloadID; + DownloadID downloadID; + + RefPtr<WebFrame> originatingFrame; + switch (action->navigationType()) { + case NavigationType::LinkClicked: + if (EventTarget* target = navigationAction.event()->target()) { + if (Node* node = target->toNode()) { + if (Frame* frame = node->document().frame()) + originatingFrame = WebFrame::fromCoreFrame(*frame); + } + } + break; + case NavigationType::FormSubmitted: + case NavigationType::FormResubmitted: + if (formState) + originatingFrame = WebFrame::fromCoreFrame(*formState->sourceDocument()->frame()); + break; + case NavigationType::BackForward: + case NavigationType::Reload: + case NavigationType::Other: + break; + } + + NavigationActionData navigationActionData; + navigationActionData.navigationType = action->navigationType(); + navigationActionData.modifiers = action->modifiers(); + navigationActionData.mouseButton = action->mouseButton(); + navigationActionData.isProcessingUserGesture = navigationAction.processingUserGesture(); + navigationActionData.canHandleRequest = webPage->canHandleRequest(request); + navigationActionData.shouldOpenExternalURLsPolicy = navigationAction.shouldOpenExternalURLsPolicy(); + + WebCore::Frame* coreFrame = m_frame->coreFrame(); + WebDocumentLoader* documentLoader = static_cast<WebDocumentLoader*>(coreFrame->loader().policyDocumentLoader()); + if (!documentLoader) + documentLoader = static_cast<WebDocumentLoader*>(coreFrame->loader().documentLoader()); // Notify the UIProcess. - if (!webPage->sendSync(Messages::WebPageProxy::DecidePolicyForNavigationAction(m_frame->frameID(), action->navigationType(), action->modifiers(), action->mouseButton(), request, listenerID, InjectedBundleUserMessageEncoder(userData.get())), Messages::WebPageProxy::DecidePolicyForNavigationAction::Reply(receivedPolicyAction, policyAction, downloadID))) + Ref<WebFrame> protect(*m_frame); + WebCore::Frame* originatingCoreFrame = originatingFrame ? originatingFrame->coreFrame() : nullptr; + if (!webPage->sendSync(Messages::WebPageProxy::DecidePolicyForNavigationAction(m_frame->frameID(), SecurityOriginData::fromFrame(coreFrame), documentLoader->navigationID(), navigationActionData, originatingFrame ? originatingFrame->frameID() : 0, SecurityOriginData::fromFrame(originatingCoreFrame), navigationAction.resourceRequest(), request, listenerID, UserData(WebProcess::singleton().transformObjectsToHandles(userData.get()).get())), Messages::WebPageProxy::DecidePolicyForNavigationAction::Reply(receivedPolicyAction, newNavigationID, policyAction, downloadID))) { + m_frame->didReceivePolicyDecision(listenerID, PolicyIgnore, 0, { }); return; + } // We call this synchronously because WebCore cannot gracefully handle a frame load without a synchronous navigation policy reply. if (receivedPolicyAction) - m_frame->didReceivePolicyDecision(listenerID, static_cast<PolicyAction>(policyAction), downloadID); + m_frame->didReceivePolicyDecision(listenerID, static_cast<PolicyAction>(policyAction), newNavigationID, downloadID); } void WebFrameLoaderClient::cancelPolicyCheck() @@ -725,13 +842,13 @@ void WebFrameLoaderClient::dispatchUnableToImplementPolicy(const ResourceError& if (!webPage) return; - RefPtr<APIObject> userData; + RefPtr<API::Object> userData; // Notify the bundle client. webPage->injectedBundlePolicyClient().unableToImplementPolicy(webPage, m_frame, error, userData); // Notify the UIProcess. - webPage->send(Messages::WebPageProxy::UnableToImplementPolicy(m_frame->frameID(), error, InjectedBundleUserMessageEncoder(userData.get()))); + webPage->send(Messages::WebPageProxy::UnableToImplementPolicy(m_frame->frameID(), error, UserData(WebProcess::singleton().transformObjectsToHandles(userData.get()).get()))); } void WebFrameLoaderClient::dispatchWillSendSubmitEvent(PassRefPtr<FormState> prpFormState) @@ -743,14 +860,13 @@ void WebFrameLoaderClient::dispatchWillSendSubmitEvent(PassRefPtr<FormState> prp RefPtr<FormState> formState = prpFormState; HTMLFormElement* form = formState->form(); - WebFrameLoaderClient* webFrameLoaderClient = toWebFrameLoaderClient(formState->sourceDocument()->frame()->loader()->client()); - WebFrame* sourceFrame = webFrameLoaderClient ? webFrameLoaderClient->webFrame() : 0; + WebFrame* sourceFrame = WebFrame::fromCoreFrame(*formState->sourceDocument()->frame()); ASSERT(sourceFrame); webPage->injectedBundleFormClient().willSendSubmitEvent(webPage, form, m_frame, sourceFrame, formState->textFieldValues()); } -void WebFrameLoaderClient::dispatchWillSubmitForm(FramePolicyFunction function, PassRefPtr<FormState> prpFormState) +void WebFrameLoaderClient::dispatchWillSubmitForm(PassRefPtr<FormState> prpFormState, FramePolicyFunction function) { WebPage* webPage = m_frame->page(); if (!webPage) @@ -761,19 +877,18 @@ void WebFrameLoaderClient::dispatchWillSubmitForm(FramePolicyFunction function, HTMLFormElement* form = formState->form(); - WebFrameLoaderClient* webFrameLoaderClient = toWebFrameLoaderClient(formState->sourceDocument()->frame()->loader()->client()); - WebFrame* sourceFrame = webFrameLoaderClient ? webFrameLoaderClient->webFrame() : 0; + WebFrame* sourceFrame = WebFrame::fromCoreFrame(*formState->sourceDocument()->frame()); ASSERT(sourceFrame); - const Vector<std::pair<String, String> >& values = formState->textFieldValues(); + const Vector<std::pair<String, String>>& values = formState->textFieldValues(); - RefPtr<APIObject> userData; + RefPtr<API::Object> userData; webPage->injectedBundleFormClient().willSubmitForm(webPage, form, m_frame, sourceFrame, values, userData); - uint64_t listenerID = m_frame->setUpPolicyListener(function); + uint64_t listenerID = m_frame->setUpPolicyListener(WTFMove(function)); - webPage->send(Messages::WebPageProxy::WillSubmitForm(m_frame->frameID(), sourceFrame->frameID(), values, listenerID, InjectedBundleUserMessageEncoder(userData.get()))); + webPage->send(Messages::WebPageProxy::WillSubmitForm(m_frame->frameID(), sourceFrame->frameID(), values, listenerID, UserData(WebProcess::singleton().transformObjectsToHandles(userData.get()).get()))); } void WebFrameLoaderClient::revertToProvisionalState(DocumentLoader*) @@ -787,50 +902,10 @@ void WebFrameLoaderClient::setMainDocumentError(DocumentLoader*, const ResourceE return; m_pluginView->manualLoadDidFail(error); - m_pluginView = 0; + m_pluginView = nullptr; m_hasSentResponseToPluginView = false; } -void WebFrameLoaderClient::willChangeEstimatedProgress() -{ - notImplemented(); -} - -void WebFrameLoaderClient::didChangeEstimatedProgress() -{ - notImplemented(); -} - -void WebFrameLoaderClient::postProgressStartedNotification() -{ - if (WebPage* webPage = m_frame->page()) { - if (m_frame->isMainFrame()) - webPage->send(Messages::WebPageProxy::DidStartProgress()); - } -} - -void WebFrameLoaderClient::postProgressEstimateChangedNotification() -{ - if (WebPage* webPage = m_frame->page()) { - if (m_frame->isMainFrame()) { - double progress = webPage->corePage()->progress()->estimatedProgress(); - webPage->send(Messages::WebPageProxy::DidChangeProgress(progress)); - } - } -} - -void WebFrameLoaderClient::postProgressFinishedNotification() -{ - if (WebPage* webPage = m_frame->page()) { - if (m_frame->isMainFrame()) { - // Notify the bundle client. - webPage->injectedBundleLoaderClient().didFinishProgress(webPage); - - webPage->send(Messages::WebPageProxy::DidFinishProgress()); - } - } -} - void WebFrameLoaderClient::setMainFrameDocumentReady(bool) { notImplemented(); @@ -851,6 +926,22 @@ void WebFrameLoaderClient::didChangeTitle(DocumentLoader*) notImplemented(); } +void WebFrameLoaderClient::willReplaceMultipartContent() +{ + WebPage* webPage = m_frame->page(); + if (!webPage) + return; + webPage->willReplaceMultipartContent(*m_frame); +} + +void WebFrameLoaderClient::didReplaceMultipartContent() +{ + WebPage* webPage = m_frame->page(); + if (!webPage) + return; + webPage->didReplaceMultipartContent(*m_frame); +} + void WebFrameLoaderClient::committedLoad(DocumentLoader* loader, const char* data, int length) { if (!m_pluginView) @@ -879,8 +970,19 @@ void WebFrameLoaderClient::committedLoad(DocumentLoader* loader, const char* dat void WebFrameLoaderClient::finishedLoading(DocumentLoader* loader) { - if (!m_pluginView) + if (!m_pluginView) { + if (m_frameHasCustomContentProvider) { + WebPage* webPage = m_frame->page(); + if (!webPage) + return; + + RefPtr<SharedBuffer> mainResourceData = loader->mainResourceData(); + IPC::DataReference dataReference(reinterpret_cast<const uint8_t*>(mainResourceData ? mainResourceData->data() : 0), mainResourceData ? mainResourceData->size() : 0); + webPage->send(Messages::WebPageProxy::DidFinishLoadingDataForCustomContentProvider(loader->response().suggestedFilename(), dataReference)); + } + return; + } // If we just received an empty response without any data, we won't have sent a response to the plug-in view. // Make sure to do this before calling manualLoadDidFinishLoading. @@ -893,7 +995,7 @@ void WebFrameLoaderClient::finishedLoading(DocumentLoader* loader) } m_pluginView->manualLoadDidFinishLoading(); - m_pluginView = 0; + m_pluginView = nullptr; m_hasSentResponseToPluginView = false; } @@ -903,15 +1005,16 @@ void WebFrameLoaderClient::updateGlobalHistory() if (!webPage || !webPage->pageGroup()->isVisibleToHistoryClient()) return; - DocumentLoader* loader = m_frame->coreFrame()->loader()->documentLoader(); + DocumentLoader* loader = m_frame->coreFrame()->loader().documentLoader(); WebNavigationDataStore data; data.url = loader->url().string(); // FIXME: use direction of title. data.title = loader->title().string(); data.originalRequest = loader->originalRequestCopy(); + data.response = loader->response(); - WebProcess::shared().parentProcessConnection()->send(Messages::WebProcessProxy::DidNavigateWithNavigationData(webPage->pageID(), data, m_frame->frameID()), 0); + webPage->send(Messages::WebPageProxy::DidNavigateWithNavigationData(data, m_frame->frameID())); } void WebFrameLoaderClient::updateGlobalHistoryRedirectLinks() @@ -920,19 +1023,19 @@ void WebFrameLoaderClient::updateGlobalHistoryRedirectLinks() if (!webPage || !webPage->pageGroup()->isVisibleToHistoryClient()) return; - DocumentLoader* loader = m_frame->coreFrame()->loader()->documentLoader(); + DocumentLoader* loader = m_frame->coreFrame()->loader().documentLoader(); ASSERT(loader->unreachableURL().isEmpty()); // Client redirect if (!loader->clientRedirectSourceForHistory().isNull()) { - WebProcess::shared().parentProcessConnection()->send(Messages::WebProcessProxy::DidPerformClientRedirect(webPage->pageID(), - loader->clientRedirectSourceForHistory(), loader->clientRedirectDestinationForHistory(), m_frame->frameID()), 0); + webPage->send(Messages::WebPageProxy::DidPerformClientRedirect( + loader->clientRedirectSourceForHistory(), loader->clientRedirectDestinationForHistory(), m_frame->frameID())); } // Server redirect if (!loader->serverRedirectSourceForHistory().isNull()) { - WebProcess::shared().parentProcessConnection()->send(Messages::WebProcessProxy::DidPerformServerRedirect(webPage->pageID(), - loader->serverRedirectSourceForHistory(), loader->serverRedirectDestinationForHistory(), m_frame->frameID()), 0); + webPage->send(Messages::WebPageProxy::DidPerformServerRedirect( + loader->serverRedirectSourceForHistory(), loader->serverRedirectDestinationForHistory(), m_frame->frameID())); } } @@ -950,26 +1053,14 @@ bool WebFrameLoaderClient::shouldGoToHistoryItem(HistoryItem* item) const } RefPtr<InjectedBundleBackForwardListItem> bundleItem = InjectedBundleBackForwardListItem::create(item); - RefPtr<APIObject> userData; + RefPtr<API::Object> userData; // Ask the bundle client first bool shouldGoToBackForwardListItem = webPage->injectedBundleLoaderClient().shouldGoToBackForwardListItem(webPage, bundleItem.get(), userData); if (!shouldGoToBackForwardListItem) return false; - - if (webPage->willGoToBackForwardItemCallbackEnabled()) { - webPage->send(Messages::WebPageProxy::WillGoToBackForwardListItem(itemID, InjectedBundleUserMessageEncoder(userData.get()))); - return true; - } - - if (!webPage->sendSync(Messages::WebPageProxy::ShouldGoToBackForwardListItem(itemID), Messages::WebPageProxy::ShouldGoToBackForwardListItem::Reply(shouldGoToBackForwardListItem))) - return false; - - return shouldGoToBackForwardListItem; -} -bool WebFrameLoaderClient::shouldStopLoadingForHistoryItem(HistoryItem*) const -{ + webPage->send(Messages::WebPageProxy::WillGoToBackForwardListItem(itemID, UserData(WebProcess::singleton().transformObjectsToHandles(userData.get()).get()))); return true; } @@ -979,37 +1070,37 @@ void WebFrameLoaderClient::didDisplayInsecureContent() if (!webPage) return; - RefPtr<APIObject> userData; + RefPtr<API::Object> userData; webPage->injectedBundleLoaderClient().didDisplayInsecureContentForFrame(webPage, m_frame, userData); - webPage->send(Messages::WebPageProxy::DidDisplayInsecureContentForFrame(m_frame->frameID(), InjectedBundleUserMessageEncoder(userData.get()))); + webPage->send(Messages::WebPageProxy::DidDisplayInsecureContentForFrame(m_frame->frameID(), UserData(WebProcess::singleton().transformObjectsToHandles(userData.get()).get()))); } -void WebFrameLoaderClient::didRunInsecureContent(SecurityOrigin*, const KURL&) +void WebFrameLoaderClient::didRunInsecureContent(SecurityOrigin*, const URL&) { WebPage* webPage = m_frame->page(); if (!webPage) return; - RefPtr<APIObject> userData; + RefPtr<API::Object> userData; webPage->injectedBundleLoaderClient().didRunInsecureContentForFrame(webPage, m_frame, userData); - webPage->send(Messages::WebPageProxy::DidRunInsecureContentForFrame(m_frame->frameID(), InjectedBundleUserMessageEncoder(userData.get()))); + webPage->send(Messages::WebPageProxy::DidRunInsecureContentForFrame(m_frame->frameID(), UserData(WebProcess::singleton().transformObjectsToHandles(userData.get()).get()))); } -void WebFrameLoaderClient::didDetectXSS(const KURL&, bool) +void WebFrameLoaderClient::didDetectXSS(const URL&, bool) { WebPage* webPage = m_frame->page(); if (!webPage) return; - RefPtr<APIObject> userData; + RefPtr<API::Object> userData; webPage->injectedBundleLoaderClient().didDetectXSSForFrame(webPage, m_frame, userData); - webPage->send(Messages::WebPageProxy::DidDetectXSSForFrame(m_frame->frameID(), InjectedBundleUserMessageEncoder(userData.get()))); + webPage->send(Messages::WebPageProxy::DidDetectXSSForFrame(m_frame->frameID(), UserData(WebProcess::singleton().transformObjectsToHandles(userData.get()).get()))); } ResourceError WebFrameLoaderClient::cancelledError(const ResourceRequest& request) @@ -1022,6 +1113,11 @@ ResourceError WebFrameLoaderClient::blockedError(const ResourceRequest& request) return WebKit::blockedError(request); } +ResourceError WebFrameLoaderClient::blockedByContentBlockerError(const ResourceRequest& request) +{ + return WebKit::blockedByContentBlockerError(request); +} + ResourceError WebFrameLoaderClient::cannotShowURLError(const ResourceRequest& request) { return WebKit::cannotShowURLError(request); @@ -1049,13 +1145,13 @@ ResourceError WebFrameLoaderClient::pluginWillHandleLoadError(const ResourceResp bool WebFrameLoaderClient::shouldFallBack(const ResourceError& error) { - DEFINE_STATIC_LOCAL(const ResourceError, cancelledError, (this->cancelledError(ResourceRequest()))); - DEFINE_STATIC_LOCAL(const ResourceError, pluginWillHandleLoadError, (this->pluginWillHandleLoadError(ResourceResponse()))); + static NeverDestroyed<const ResourceError> cancelledError(this->cancelledError(ResourceRequest())); + static NeverDestroyed<const ResourceError> pluginWillHandleLoadError(this->pluginWillHandleLoadError(ResourceResponse())); - if (error.errorCode() == cancelledError.errorCode() && error.domain() == cancelledError.domain()) + if (error.errorCode() == cancelledError.get().errorCode() && error.domain() == cancelledError.get().domain()) return false; - if (error.errorCode() == pluginWillHandleLoadError.errorCode() && error.domain() == pluginWillHandleLoadError.domain()) + if (error.errorCode() == pluginWillHandleLoadError.get().errorCode() && error.domain() == pluginWillHandleLoadError.get().domain()) return false; #if PLATFORM(QT) @@ -1104,21 +1200,36 @@ void WebFrameLoaderClient::frameLoadCompleted() if (!webPage) return; - if (m_frame == m_frame->page()->mainWebFrame() && !m_didCompletePageTransitionAlready) { + if (m_frame->isMainFrame() && !m_didCompletePageTransition) { webPage->didCompletePageTransition(); - m_didCompletePageTransitionAlready = true; + m_didCompletePageTransition = true; } } -void WebFrameLoaderClient::saveViewStateToItem(HistoryItem*) +void WebFrameLoaderClient::saveViewStateToItem(HistoryItem* historyItem) { - notImplemented(); +#if PLATFORM(IOS) || PLATFORM(EFL) + if (m_frame->isMainFrame()) + m_frame->page()->savePageState(*historyItem); +#else + UNUSED_PARAM(historyItem); +#endif } void WebFrameLoaderClient::restoreViewState() { +#if PLATFORM(IOS) || PLATFORM(EFL) + Frame& frame = *m_frame->coreFrame(); + HistoryItem* currentItem = frame.loader().history().currentItem(); + if (FrameView* view = frame.view()) { + if (m_frame->isMainFrame()) + m_frame->page()->restorePageState(*currentItem); + else if (!view->wasScrolledByUser()) + view->setScrollPosition(currentItem->scrollPosition()); + } +#else // Inform the UI process of the scale factor. - double scaleFactor = m_frame->coreFrame()->loader()->history()->currentItem()->pageScaleFactor(); + double scaleFactor = m_frame->coreFrame()->loader().history().currentItem()->pageScaleFactor(); // A scale factor of 0 means the history item has the default scale factor, thus we do not need to update it. if (scaleFactor) @@ -1126,8 +1237,9 @@ void WebFrameLoaderClient::restoreViewState() // FIXME: This should not be necessary. WebCore should be correctly invalidating // the view on restores from the back/forward cache. - if (m_frame == m_frame->page()->mainWebFrame()) + if (m_frame->page() && m_frame == m_frame->page()->mainWebFrame()) m_frame->page()->drawingArea()->setNeedsDisplay(); +#endif } void WebFrameLoaderClient::provisionalLoadStarted() @@ -1136,9 +1248,9 @@ void WebFrameLoaderClient::provisionalLoadStarted() if (!webPage) return; - if (m_frame == m_frame->page()->mainWebFrame()) { + if (m_frame->isMainFrame()) { webPage->didStartPageTransition(); - m_didCompletePageTransitionAlready = false; + m_didCompletePageTransition = false; } } @@ -1154,29 +1266,33 @@ void WebFrameLoaderClient::prepareForDataSourceReplacement() notImplemented(); } -PassRefPtr<DocumentLoader> WebFrameLoaderClient::createDocumentLoader(const ResourceRequest& request, const SubstituteData& data) +Ref<DocumentLoader> WebFrameLoaderClient::createDocumentLoader(const ResourceRequest& request, const SubstituteData& substituteData) { - return DocumentLoader::create(request, data); + return m_frame->page()->createDocumentLoader(*m_frame->coreFrame(), request, substituteData); } -void WebFrameLoaderClient::setTitle(const StringWithDirection& title, const KURL& url) +void WebFrameLoaderClient::updateCachedDocumentLoader(WebCore::DocumentLoader& loader) +{ + m_frame->page()->updateCachedDocumentLoader(static_cast<WebDocumentLoader&>(loader), *m_frame->coreFrame()); +} + +void WebFrameLoaderClient::setTitle(const StringWithDirection& title, const URL& url) { WebPage* webPage = m_frame->page(); if (!webPage || !webPage->pageGroup()->isVisibleToHistoryClient()) return; // FIXME: use direction of title. - WebProcess::shared().parentProcessConnection()->send(Messages::WebProcessProxy::DidUpdateHistoryTitle(webPage->pageID(), - title.string(), url.string(), m_frame->frameID()), 0); + webPage->send(Messages::WebPageProxy::DidUpdateHistoryTitle(title.string(), url.string(), m_frame->frameID())); } -String WebFrameLoaderClient::userAgent(const KURL&) +String WebFrameLoaderClient::userAgent(const URL& url) { WebPage* webPage = m_frame->page(); if (!webPage) return String(); - return webPage->userAgent(); + return webPage->userAgent(m_frame, url); } void WebFrameLoaderClient::savePlatformDataToCachedFrame(CachedFrame*) @@ -1185,6 +1301,8 @@ void WebFrameLoaderClient::savePlatformDataToCachedFrame(CachedFrame*) void WebFrameLoaderClient::transitionToCommittedFromCachedFrame(CachedFrame*) { + const ResourceResponse& response = m_frame->coreFrame()->loader().documentLoader()->response(); + m_frameHasCustomContentProvider = m_frame->isMainFrame() && m_frame->page()->shouldUseCustomContentProviderForResponse(response); m_frameCameFromPageCache = true; } @@ -1192,33 +1310,53 @@ void WebFrameLoaderClient::transitionToCommittedForNewPage() { WebPage* webPage = m_frame->page(); - Color backgroundColor = webPage->drawsTransparentBackground() ? Color::transparent : Color::white; - bool isMainFrame = webPage->mainWebFrame() == m_frame; + Color backgroundColor = webPage->drawsBackground() ? Color::white : Color::transparent; + bool isMainFrame = m_frame->isMainFrame(); bool isTransparent = !webPage->drawsBackground(); bool shouldUseFixedLayout = isMainFrame && webPage->useFixedLayout(); bool shouldDisableScrolling = isMainFrame && !webPage->mainFrameIsScrollable(); - bool shouldHideScrollbars = shouldUseFixedLayout || shouldDisableScrolling; - IntRect currentFixedVisibleContentRect = m_frame->coreFrame()->view() ? m_frame->coreFrame()->view()->fixedVisibleContentRect() : IntRect(); + bool shouldHideScrollbars = shouldDisableScrolling; + IntRect fixedVisibleContentRect; + +#if USE(COORDINATED_GRAPHICS) + if (m_frame->coreFrame()->view()) + fixedVisibleContentRect = m_frame->coreFrame()->view()->fixedVisibleContentRect(); + if (shouldUseFixedLayout) + shouldHideScrollbars = true; +#endif + const ResourceResponse& response = m_frame->coreFrame()->loader().documentLoader()->response(); + m_frameHasCustomContentProvider = isMainFrame && webPage->shouldUseCustomContentProviderForResponse(response); m_frameCameFromPageCache = false; + ScrollbarMode defaultScrollbarMode = shouldHideScrollbars ? ScrollbarAlwaysOff : ScrollbarAuto; + m_frame->coreFrame()->createView(webPage->size(), backgroundColor, isTransparent, - IntSize(), currentFixedVisibleContentRect, shouldUseFixedLayout, - ScrollbarAuto, /* lock */ shouldHideScrollbars, ScrollbarAuto, /* lock */ shouldHideScrollbars); + webPage->fixedLayoutSize(), fixedVisibleContentRect, shouldUseFixedLayout, + defaultScrollbarMode, /* lock */ shouldHideScrollbars, defaultScrollbarMode, /* lock */ shouldHideScrollbars); if (int minimumLayoutWidth = webPage->minimumLayoutSize().width()) { int minimumLayoutHeight = std::max(webPage->minimumLayoutSize().height(), 1); int maximumSize = std::numeric_limits<int>::max(); m_frame->coreFrame()->view()->enableAutoSizeMode(true, IntSize(minimumLayoutWidth, minimumLayoutHeight), IntSize(maximumSize, maximumSize)); + + if (webPage->autoSizingShouldExpandToViewHeight()) + m_frame->coreFrame()->view()->setAutoSizeFixedMinimumHeight(webPage->size().height()); } m_frame->coreFrame()->view()->setProhibitsScrolling(shouldDisableScrolling); m_frame->coreFrame()->view()->setVisualUpdatesAllowedByClient(!webPage->shouldExtendIncrementalRenderingSuppression()); - +#if PLATFORM(COCOA) + m_frame->coreFrame()->view()->setExposedRect(webPage->drawingArea()->exposedRect()); +#endif +#if PLATFORM(IOS) + m_frame->coreFrame()->view()->setDelegatesScrolling(true); +#endif + if (webPage->scrollPinningBehavior() != DoNotPin) m_frame->coreFrame()->view()->setScrollPinningBehavior(webPage->scrollPinningBehavior()); -#if USE(TILED_BACKING_STORE) +#if USE(COORDINATED_GRAPHICS) if (shouldUseFixedLayout) { m_frame->coreFrame()->view()->setDelegatesScrolling(shouldUseFixedLayout); m_frame->coreFrame()->view()->setPaintsEntireContents(shouldUseFixedLayout); @@ -1238,6 +1376,7 @@ void WebFrameLoaderClient::didSaveToPageCache() void WebFrameLoaderClient::didRestoreFromPageCache() { + m_frameCameFromPageCache = true; } void WebFrameLoaderClient::dispatchDidBecomeFrameset(bool value) @@ -1249,12 +1388,19 @@ void WebFrameLoaderClient::dispatchDidBecomeFrameset(bool value) webPage->send(Messages::WebPageProxy::FrameDidBecomeFrameSet(m_frame->frameID(), value)); } -void WebFrameLoaderClient::convertMainResourceLoadToDownload(DocumentLoader *documentLoader, const ResourceRequest& request, const ResourceResponse& response) +bool WebFrameLoaderClient::canCachePage() const { - m_frame->convertMainResourceLoadToDownload(documentLoader, request, response); + // We cannot cache frames that have custom representations because they are + // rendered in the UIProcess. + return !m_frameHasCustomContentProvider; } -PassRefPtr<Frame> WebFrameLoaderClient::createFrame(const KURL& url, const String& name, HTMLFrameOwnerElement* ownerElement, +void WebFrameLoaderClient::convertMainResourceLoadToDownload(DocumentLoader *documentLoader, SessionID sessionID, const ResourceRequest& request, const ResourceResponse& response) +{ + m_frame->convertMainResourceLoadToDownload(documentLoader, sessionID, request, response); +} + +RefPtr<Frame> WebFrameLoaderClient::createFrame(const URL& url, const String& name, HTMLFrameOwnerElement* ownerElement, const String& referrer, bool /*allowsScrolling*/, int /*marginWidth*/, int /*marginHeight*/) { WebPage* webPage = m_frame->page(); @@ -1263,25 +1409,25 @@ PassRefPtr<Frame> WebFrameLoaderClient::createFrame(const KURL& url, const Strin Frame* coreSubframe = subframe->coreFrame(); if (!coreSubframe) - return 0; + return nullptr; // The creation of the frame may have run arbitrary JavaScript that removed it from the page already. if (!coreSubframe->page()) - return 0; + return nullptr; - m_frame->coreFrame()->loader()->loadURLIntoChildFrame(url, referrer, coreSubframe); + m_frame->coreFrame()->loader().loadURLIntoChildFrame(url, referrer, coreSubframe); // The frame's onload handler may have removed it from the document. if (!subframe->coreFrame()) - return 0; + return nullptr; ASSERT(subframe->coreFrame() == coreSubframe); - if (!coreSubframe->tree()->parent()) - return 0; + if (!coreSubframe->tree().parent()) + return nullptr; return coreSubframe; } -PassRefPtr<Widget> WebFrameLoaderClient::createPlugin(const IntSize&, HTMLPlugInElement* pluginElement, const KURL& url, const Vector<String>& paramNames, const Vector<String>& paramValues, const String& mimeType, bool loadManually) +RefPtr<Widget> WebFrameLoaderClient::createPlugin(const IntSize&, HTMLPlugInElement* pluginElement, const URL& url, const Vector<String>& paramNames, const Vector<String>& paramValues, const String& mimeType, bool loadManually) { ASSERT(paramNames.size() == paramValues.size()); ASSERT(m_frame->page()); @@ -1293,35 +1439,19 @@ PassRefPtr<Widget> WebFrameLoaderClient::createPlugin(const IntSize&, HTMLPlugIn parameters.mimeType = mimeType; parameters.isFullFramePlugin = loadManually; parameters.shouldUseManualLoader = parameters.isFullFramePlugin && !m_frameCameFromPageCache; -#if PLATFORM(MAC) +#if PLATFORM(COCOA) parameters.layerHostingMode = m_frame->page()->layerHostingMode(); #endif -#if PLUGIN_ARCHITECTURE(X11) - // FIXME: This should really be X11-specific plug-in quirks. - if (equalIgnoringCase(mimeType, "application/x-shockwave-flash")) { - // Currently we don't support transparency and windowed mode. - // Inject wmode=opaque to make Flash work in these conditions. - size_t wmodeIndex = parameters.names.find("wmode"); - if (wmodeIndex == notFound) { - parameters.names.append("wmode"); - parameters.values.append("opaque"); - } else if (equalIgnoringCase(parameters.values[wmodeIndex], "window")) - parameters.values[wmodeIndex] = "opaque"; - } else if (equalIgnoringCase(mimeType, "application/x-webkit-test-netscape")) { - parameters.names.append("windowedPlugin"); - parameters.values.append("false"); - } -#endif - #if ENABLE(NETSCAPE_PLUGIN_API) RefPtr<Plugin> plugin = m_frame->page()->createPlugin(m_frame, pluginElement, parameters, parameters.mimeType); if (!plugin) - return 0; + return nullptr; return PluginView::create(pluginElement, plugin.release(), parameters); #else - return 0; + UNUSED_PARAM(pluginElement); + return nullptr; #endif } @@ -1335,6 +1465,8 @@ void WebFrameLoaderClient::recreatePlugin(Widget* widget) String newMIMEType; RefPtr<Plugin> plugin = m_frame->page()->createPlugin(m_frame, pluginView->pluginElement(), pluginView->initialParameters(), newMIMEType); pluginView->recreateAndInitialize(plugin.release()); +#else + UNUSED_PARAM(widget); #endif } @@ -1344,95 +1476,101 @@ void WebFrameLoaderClient::redirectDataToPlugin(Widget* pluginWidget) m_pluginView = static_cast<PluginView*>(pluginWidget); } -PassRefPtr<Widget> WebFrameLoaderClient::createJavaAppletWidget(const IntSize& pluginSize, HTMLAppletElement* appletElement, const KURL&, const Vector<String>& paramNames, const Vector<String>& paramValues) +#if ENABLE(WEBGL) +WebCore::WebGLLoadPolicy WebFrameLoaderClient::webGLPolicyForURL(const String& url) const { - RefPtr<Widget> plugin = createPlugin(pluginSize, appletElement, KURL(), paramNames, paramValues, appletElement->serviceType(), false); - if (!plugin) { - if (WebPage* webPage = m_frame->page()) { - String frameURLString = m_frame->coreFrame()->loader()->documentLoader()->responseURL().string(); - String pageURLString = webPage->corePage()->mainFrame()->loader()->documentLoader()->responseURL().string(); - webPage->send(Messages::WebPageProxy::DidFailToInitializePlugin(appletElement->serviceType(), frameURLString, pageURLString)); - } - } - return plugin.release(); -} + if (WebPage* webPage = m_frame->page()) + return webPage->webGLPolicyForURL(m_frame, url); -#if ENABLE(PLUGIN_PROXY_FOR_VIDEO) -PassRefPtr<Widget> WebFrameLoaderClient::createMediaPlayerProxyPlugin(const IntSize&, HTMLMediaElement*, const KURL&, const Vector<String>&, const Vector<String>&, const String&) -{ - notImplemented(); - return 0; + return WebGLAllowCreation; } -void WebFrameLoaderClient::hideMediaPlayerProxyPlugin(Widget*) +WebCore::WebGLLoadPolicy WebFrameLoaderClient::resolveWebGLPolicyForURL(const String& url) const { - notImplemented(); + if (WebPage* webPage = m_frame->page()) + return webPage->resolveWebGLPolicyForURL(m_frame, url); + + return WebGLAllowCreation; } +#endif // ENABLE(WEBGL) -void WebFrameLoaderClient::showMediaPlayerProxyPlugin(Widget*) +PassRefPtr<Widget> WebFrameLoaderClient::createJavaAppletWidget(const IntSize& pluginSize, HTMLAppletElement* appletElement, const URL&, const Vector<String>& paramNames, const Vector<String>& paramValues) { - notImplemented(); -} +#if ENABLE(NETSCAPE_PLUGIN_API) + RefPtr<Widget> plugin = createPlugin(pluginSize, appletElement, URL(), paramNames, paramValues, appletElement->serviceType(), false); + if (!plugin) { + if (WebPage* webPage = m_frame->page()) { + String frameURLString = m_frame->coreFrame()->loader().documentLoader()->responseURL().string(); + String pageURLString = webPage->corePage()->mainFrame().loader().documentLoader()->responseURL().string(); + webPage->send(Messages::WebPageProxy::DidFailToInitializePlugin(appletElement->serviceType(), frameURLString, pageURLString)); + } + } + return plugin.release(); +#else + UNUSED_PARAM(pluginSize); + UNUSED_PARAM(appletElement); + UNUSED_PARAM(paramNames); + UNUSED_PARAM(paramValues); + return 0; #endif +} -static bool pluginSupportsExtension(PluginData* pluginData, const String& extension) +static bool pluginSupportsExtension(const PluginData& pluginData, const String& extension) { - ASSERT(extension.lower() == extension); - - for (size_t i = 0; i < pluginData->mimes().size(); ++i) { - const MimeClassInfo& mimeClassInfo = pluginData->mimes()[i]; - + ASSERT(extension.convertToASCIILowercase() == extension); + Vector<MimeClassInfo> mimes; + Vector<size_t> mimePluginIndices; + pluginData.getWebVisibleMimesAndPluginIndices(mimes, mimePluginIndices); + for (auto& mimeClassInfo : mimes) { if (mimeClassInfo.extensions.contains(extension)) return true; } return false; } -ObjectContentType WebFrameLoaderClient::objectContentType(const KURL& url, const String& mimeTypeIn, bool shouldPreferPlugInsForImages) +ObjectContentType WebFrameLoaderClient::objectContentType(const URL& url, const String& mimeTypeIn) { - // FIXME: This should be merged with WebCore::FrameLoader::defaultObjectContentType when the plugin code - // is consolidated. + // FIXME: This should eventually be merged with WebCore::FrameLoader::defaultObjectContentType. String mimeType = mimeTypeIn; if (mimeType.isEmpty()) { - String extension = url.path().substring(url.path().reverseFind('.') + 1).lower(); + String path = url.path(); + auto dotPosition = path.reverseFind('.'); + if (dotPosition == notFound) + return ObjectContentFrame; + String extension = path.substring(dotPosition + 1).convertToASCIILowercase(); // Try to guess the MIME type from the extension. mimeType = MIMETypeRegistry::getMIMETypeForExtension(extension); - if (mimeType.isEmpty()) { // Check if there's a plug-in around that can handle the extension. if (WebPage* webPage = m_frame->page()) { - if (PluginData* pluginData = webPage->corePage()->pluginData()) { - if (pluginSupportsExtension(pluginData, extension)) - return ObjectContentNetscapePlugin; - } + if (pluginSupportsExtension(webPage->corePage()->pluginData(), extension)) + return ObjectContentNetscapePlugin; } + return ObjectContentFrame; } } - if (mimeType.isEmpty()) - return ObjectContentFrame; + if (MIMETypeRegistry::isSupportedImageMIMEType(mimeType)) + return ObjectContentImage; - bool plugInSupportsMIMEType = false; if (WebPage* webPage = m_frame->page()) { - if (PluginData* pluginData = webPage->corePage()->pluginData()) { - if (pluginData->supportsMimeType(mimeType, PluginData::AllPlugins) && webFrame()->coreFrame()->loader()->subframeLoader()->allowPlugins(NotAboutToInstantiatePlugin)) - plugInSupportsMIMEType = true; - else if (pluginData->supportsMimeType(mimeType, PluginData::OnlyApplicationPlugins)) - plugInSupportsMIMEType = true; - } + auto allowedPluginTypes = webFrame()->coreFrame()->loader().subframeLoader().allowPlugins() + ? PluginData::AllPlugins : PluginData::OnlyApplicationPlugins; + if (webPage->corePage()->pluginData().supportsMimeType(mimeType, allowedPluginTypes)) + return ObjectContentNetscapePlugin; } - - if (MIMETypeRegistry::isSupportedImageMIMEType(mimeType)) - return shouldPreferPlugInsForImages && plugInSupportsMIMEType ? ObjectContentNetscapePlugin : ObjectContentImage; - - if (plugInSupportsMIMEType) - return ObjectContentNetscapePlugin; if (MIMETypeRegistry::isSupportedNonImageMIMEType(mimeType)) return ObjectContentFrame; +#if PLATFORM(IOS) + // iOS can render PDF in <object>/<embed> via PDFDocumentImage. + if (MIMETypeRegistry::isPDFOrPostScriptMIMEType(mimeType)) + return ObjectContentImage; +#endif + return ObjectContentNone; } @@ -1442,7 +1580,7 @@ String WebFrameLoaderClient::overrideMediaType() const return String(); } -void WebFrameLoaderClient::dispatchDidClearWindowObjectInWorld(DOMWrapperWorld* world) +void WebFrameLoaderClient::dispatchDidClearWindowObjectInWorld(DOMWrapperWorld& world) { WebPage* webPage = m_frame->page(); if (!webPage) @@ -1457,7 +1595,7 @@ void WebFrameLoaderClient::dispatchDidClearWindowObjectInWorld(DOMWrapperWorld* } -void WebFrameLoaderClient::dispatchGlobalObjectAvailable(DOMWrapperWorld* world) +void WebFrameLoaderClient::dispatchGlobalObjectAvailable(DOMWrapperWorld& world) { WebPage* webPage = m_frame->page(); if (!webPage) @@ -1493,22 +1631,12 @@ void WebFrameLoaderClient::dispatchWillDestroyGlobalObjectForDOMWindowExtension( webPage->injectedBundleLoaderClient().willDestroyGlobalObjectForDOMWindowExtension(webPage, extension); } -void WebFrameLoaderClient::documentElementAvailable() -{ - notImplemented(); -} - -void WebFrameLoaderClient::didPerformFirstNavigation() const -{ - notImplemented(); -} - void WebFrameLoaderClient::registerForIconNotification(bool /*listen*/) { notImplemented(); } -#if PLATFORM(MAC) +#if PLATFORM(COCOA) RemoteAXObjectRef WebFrameLoaderClient::accessibilityRemoteObject() { @@ -1528,7 +1656,7 @@ NSCachedURLResponse* WebFrameLoaderClient::willCacheResponse(DocumentLoader*, un return webPage->injectedBundleResourceLoadClient().shouldCacheResponse(webPage, m_frame, identifier) ? response : nil; } -#endif // PLATFORM(MAC) +#endif // PLATFORM(COCOA) bool WebFrameLoaderClient::shouldAlwaysUsePluginDocument(const String& /*mimeType*/) const { @@ -1542,17 +1670,7 @@ void WebFrameLoaderClient::didChangeScrollOffset() if (!webPage) return; - webPage->drawingArea()->didChangeScrollOffsetForAnyFrame(); - - if (!m_frame->isMainFrame()) - return; - - // If this is called when tearing down a FrameView, the WebCore::Frame's - // current FrameView will be null. - if (!m_frame->coreFrame()->view()) - return; - - webPage->didChangeScrollOffsetForMainFrame(); + webPage->didChangeScrollOffsetForFrame(m_frame->coreFrame()); } bool WebFrameLoaderClient::allowScript(bool enabledPerSettings) @@ -1576,7 +1694,7 @@ bool WebFrameLoaderClient::allowScript(bool enabledPerSettings) return true; } -bool WebFrameLoaderClient::shouldForceUniversalAccessFromLocalURL(const WebCore::KURL& url) +bool WebFrameLoaderClient::shouldForceUniversalAccessFromLocalURL(const WebCore::URL& url) { WebPage* webPage = m_frame->page(); if (!webPage) @@ -1591,4 +1709,37 @@ PassRefPtr<FrameNetworkingContext> WebFrameLoaderClient::createNetworkingContext return context.release(); } +#if ENABLE(CONTENT_FILTERING) +void WebFrameLoaderClient::contentFilterDidBlockLoad(WebCore::ContentFilterUnblockHandler unblockHandler) +{ + if (!unblockHandler.needsUIProcess()) { + m_frame->coreFrame()->loader().policyChecker().setContentFilterUnblockHandler(WTFMove(unblockHandler)); + return; + } + + if (WebPage* webPage { m_frame->page() }) + webPage->send(Messages::WebPageProxy::ContentFilterDidBlockLoadForFrame(unblockHandler, m_frame->frameID())); +} +#endif + +#if ENABLE(REQUEST_AUTOCOMPLETE) +void WebFrameLoaderClient::didRequestAutocomplete(PassRefPtr<WebCore::FormState>) +{ +} +#endif + +void WebFrameLoaderClient::prefetchDNS(const String& hostname) +{ + WebProcess::singleton().prefetchDNS(hostname); +} + +void WebFrameLoaderClient::didRestoreScrollPosition() +{ + WebPage* webPage = m_frame->page(); + if (!webPage) + return; + + webPage->didRestoreScrollPosition(); +} + } // namespace WebKit |