summaryrefslogtreecommitdiffstats
path: root/Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp')
-rw-r--r--Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp799
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