void WebFrameLoaderClient::dispatchDecidePolicyForResponse(FramePolicyFunction function, const ResourceResponse& response, const ResourceRequest& request) { WebPage* webPage = m_frame->page(); if (!webPage) return; if (!request.url().string()) { (m_frame->coreFrame()->loader()->policyChecker()->*function)(PolicyUse); return; } RefPtr<APIObject> 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); return; } uint64_t listenerID = m_frame->setUpPolicyListener(function); bool receivedPolicyAction; uint64_t policyAction; uint64_t downloadID; // Notify the UIProcess. if (!webPage->sendSync(Messages::WebPageProxy::DecidePolicyForResponse(m_frame->frameID(), response, request, listenerID, InjectedBundleUserMessageEncoder(userData.get())), Messages::WebPageProxy::DecidePolicyForResponse::Reply(receivedPolicyAction, policyAction, downloadID))) 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); }
void WebFrameLoaderClient::dispatchUnableToImplementPolicy(const ResourceError& error) { WebPage* webPage = m_frame->page(); if (!webPage) return; RefPtr<APIObject> 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()))); }
void WebFrameLoaderClient::dispatchDecidePolicyForNewWindowAction(FramePolicyFunction function, const NavigationAction& navigationAction, const ResourceRequest& request, PassRefPtr<FormState> formState, const String& frameName) { WebPage* webPage = m_frame->page(); if (!webPage) return; RefPtr<APIObject> 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); return; } uint64_t listenerID = m_frame->setUpPolicyListener(function); // Notify the UIProcess. webPage->send(Messages::WebPageProxy::DecidePolicyForNewWindowAction(m_frame->frameID(), action->navigationType(), action->modifiers(), action->mouseButton(), request, frameName, listenerID, InjectedBundleUserMessageEncoder(userData.get()))); }
void WebFrameLoaderClient::dispatchDecidePolicyForNavigationAction(FramePolicyFunction function, const NavigationAction& navigationAction, const ResourceRequest& request, PassRefPtr<FormState> formState) { WebPage* webPage = m_frame->page(); if (!webPage) return; // Always ignore requests with empty URLs. if (request.isEmpty()) { (m_frame->coreFrame()->loader()->policyChecker()->*function)(PolicyIgnore); return; } RefPtr<APIObject> userData; 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); return; } uint64_t listenerID = m_frame->setUpPolicyListener(function); bool receivedPolicyAction; uint64_t policyAction; uint64_t downloadID; // 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))) 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); }