void DebuggerAgentManager::hostDispatchHandler(const Vector<WebCore::Page*>& pages) { if (!s_messageLoopDispatchHandler) return; if (s_inHostDispatchHandler) return; s_inHostDispatchHandler = true; Vector<WebViewImpl*> views; // 1. Disable active objects and input events. for (size_t i = 0; i < pages.size(); i++) { WebCore::Page* page = pages[i]; WebViewImpl* view = WebViewImpl::fromPage(page); s_pageDeferrers.set(view , new WebCore::PageGroupLoadDeferrer(page, true)); views.append(view); view->setIgnoreInputEvents(true); } // 2. Process messages. s_messageLoopDispatchHandler(); // 3. Bring things back. for (Vector<WebViewImpl*>::iterator it = views.begin(); it != views.end(); ++it) { if (s_pageDeferrers.contains(*it)) { // The view was not closed during the dispatch. (*it)->setIgnoreInputEvents(false); } } deleteAllValues(s_pageDeferrers); s_pageDeferrers.clear(); s_inHostDispatchHandler = false; }
void ImeOnFocusTest::runImeOnFocusTest(std::string fileName, int expectedImeRequestCount, IntPoint tapPoint, const AtomicString& focusElement, std::string frame) { ImeRequestTrackingWebViewClient client; registerMockedURLFromBaseURL(WebString::fromUTF8(m_baseURL), WebString::fromUTF8(fileName)); WebViewImpl* webView = m_webViewHelper.initialize(true, 0, &client); webView->resize(WebSize(800, 1200)); loadFrame(webView->mainFrame(), m_baseURL + fileName); m_document = m_webViewHelper.webViewImpl()->mainFrameImpl()->document().unwrap<Document>(); if (!focusElement.isNull()) focus(focusElement); EXPECT_EQ(0, client.imeRequestCount()); if (tapPoint.x() >= 0 && tapPoint.y() >= 0) sendGestureTap(webView, tapPoint); if (!frame.empty()) { registerMockedURLFromBaseURL(WebString::fromUTF8(m_baseURL), WebString::fromUTF8(frame)); WebFrame* childFrame = webView->mainFrame()->firstChild(); loadFrame(childFrame, m_baseURL + frame); } if (!focusElement.isNull()) focus(focusElement); EXPECT_EQ(expectedImeRequestCount, client.imeRequestCount()); m_webViewHelper.reset(); }
bool IDBFactoryBackendProxy::allowIndexedDB(ScriptExecutionContext* context, const String& name, const WebSecurityOrigin& origin, PassRefPtr<IDBCallbacks> callbacks) { bool allowed; ASSERT(context->isDocument() || context->isWorkerContext()); if (context->isDocument()) { Document* document = static_cast<Document*>(context); WebFrameImpl* webFrame = WebFrameImpl::fromFrame(document->frame()); WebViewImpl* webView = webFrame->viewImpl(); // FIXME: webView->permissionClient() returns 0 in test_shell and content_shell http://crbug.com/137269 allowed = !webView->permissionClient() || webView->permissionClient()->allowIndexedDB(webFrame, name, origin); } else { WorkerContext* workerContext = static_cast<WorkerContext*>(context); WebWorkerBase* webWorkerBase = static_cast<WebWorkerBase*>(&workerContext->thread()->workerLoaderProxy()); WorkerRunLoop& runLoop = workerContext->thread()->runLoop(); String mode = allowIndexedDBMode; mode.append(String::number(runLoop.createUniqueId())); RefPtr<AllowIndexedDBMainThreadBridge> bridge = AllowIndexedDBMainThreadBridge::create(webWorkerBase, mode, name); // Either the bridge returns, or the queue gets terminated. if (runLoop.runInMode(workerContext, mode) == MessageQueueTerminated) { bridge->cancel(); allowed = false; } else allowed = bridge->result(); } if (!allowed) callbacks->onError(WebIDBDatabaseError(IDBDatabaseException::UNKNOWN_ERR, "The user denied permission to access the database.")); return allowed; }
bool DatabaseObserver::canEstablishDatabase(ScriptExecutionContext* scriptExecutionContext, const String& name, const String& displayName, unsigned long estimatedSize) { ASSERT(scriptExecutionContext->isContextThread()); ASSERT(scriptExecutionContext->isDocument() || scriptExecutionContext->isWorkerGlobalScope()); if (scriptExecutionContext->isDocument()) { Document* document = toDocument(scriptExecutionContext); WebFrameImpl* webFrame = WebFrameImpl::fromFrame(document->frame()); if (!webFrame) return false; WebViewImpl* webView = webFrame->viewImpl(); if (!webView) return false; if (webView->permissionClient()) return webView->permissionClient()->allowDatabase(webFrame, name, displayName, estimatedSize); } else { WorkerGlobalScope* workerGlobalScope = toWorkerGlobalScope(scriptExecutionContext); WebWorkerBase* webWorker = static_cast<WebWorkerBase*>(workerGlobalScope->thread()->workerLoaderProxy().toWebWorkerBase()); WebView* view = webWorker->view(); if (!view) return false; return allowDatabaseForWorker(view->mainFrame(), name, displayName, estimatedSize); } return true; }
void FrameLoaderClientImpl::postProgressFinishedNotification() { // FIXME: why might the webview be null? http://b/1234461 WebViewImpl* webview = m_webFrame->viewImpl(); if (webview && webview->client()) webview->client()->didStopLoading(); }
bool DatabaseObserver::canEstablishDatabase(ExecutionContext* executionContext, const String& name, const String& displayName, unsigned long estimatedSize) { ASSERT(executionContext->isContextThread()); ASSERT(executionContext->isDocument() || executionContext->isWorkerGlobalScope()); if (executionContext->isDocument()) { Document* document = toDocument(executionContext); WebFrameImpl* webFrame = WebFrameImpl::fromFrame(document->frame()); if (!webFrame) return false; WebViewImpl* webView = webFrame->viewImpl(); if (!webView) return false; if (webView->permissionClient()) return webView->permissionClient()->allowDatabase(webFrame, name, displayName, estimatedSize); } else { WorkerGlobalScope* workerGlobalScope = toWorkerGlobalScope(executionContext); WorkerPermissionClient* permissionClient = WorkerPermissionClient::from(workerGlobalScope); if (permissionClient->proxy()) return permissionClient->allowDatabase(name, displayName, estimatedSize); // FIXME: Deprecate this bridge code when PermissionClientProxy is // implemented by the embedder. WebWorkerBase* webWorker = static_cast<WebWorkerBase*>(workerGlobalScope->thread()->workerLoaderProxy().toWebWorkerBase()); WebView* view = webWorker->view(); if (!view) return false; return allowDatabaseForWorker(view->mainFrame(), name, displayName, estimatedSize); } return true; }
bool DatabaseObserver::canEstablishDatabase(ScriptExecutionContext* scriptExecutionContext, const String& name, const String& displayName, unsigned long estimatedSize) { ASSERT(scriptExecutionContext->isContextThread()); ASSERT(scriptExecutionContext->isDocument() || scriptExecutionContext->isWorkerContext()); if (scriptExecutionContext->isDocument()) { Document* document = static_cast<Document*>(scriptExecutionContext); WebFrameImpl* webFrame = WebFrameImpl::fromFrame(document->frame()); if (!webFrame) return false; WebViewImpl* webView = webFrame->viewImpl(); if (!webView) return false; if (webView->permissionClient()) return webView->permissionClient()->allowDatabase(webFrame, name, displayName, estimatedSize); } else { #if ENABLE(WORKERS) WorkerContext* workerContext = static_cast<WorkerContext*>(scriptExecutionContext); WorkerLoaderProxy* workerLoaderProxy = &workerContext->thread()->workerLoaderProxy(); NewWebWorkerBase* webWorker = static_cast<NewWebWorkerBase*>(workerLoaderProxy); return allowDatabaseForWorker(webWorker->newCommonClient(), webWorker->view()->mainFrame(), name, displayName, estimatedSize); #else ASSERT_NOT_REACHED(); #endif } return true; }
// static PassOwnPtrWillBeRawPtr<WebDevToolsAgentImpl> WebDevToolsAgentImpl::create(WebLocalFrameImpl* frame, WebDevToolsAgentClient* client) { WebViewImpl* view = frame->viewImpl(); bool isMainFrame = view && view->mainFrameImpl() == frame; if (!isMainFrame) { WebDevToolsAgentImpl* agent = new WebDevToolsAgentImpl(frame, client, frame->inspectorOverlay()); if (frame->frameWidget()) agent->layerTreeViewChanged(frame->frameWidget()->layerTreeView()); return adoptPtrWillBeNoop(agent); } WebDevToolsAgentImpl* agent = new WebDevToolsAgentImpl(frame, client, view->inspectorOverlay()); agent->registerAgent(InspectorRenderingAgent::create(view)); agent->registerAgent(InspectorEmulationAgent::create(view)); // TODO(dgozman): migrate each of the following agents to frame once module is ready. agent->registerAgent(InspectorDatabaseAgent::create(view->page())); agent->registerAgent(DeviceOrientationInspectorAgent::create(view->page())); agent->registerAgent(InspectorFileSystemAgent::create(view->page())); agent->registerAgent(InspectorIndexedDBAgent::create(view->page())); agent->registerAgent(InspectorAccessibilityAgent::create(view->page())); agent->registerAgent(InspectorDOMStorageAgent::create(view->page())); agent->registerAgent(InspectorCacheStorageAgent::create()); agent->layerTreeViewChanged(view->layerTreeView()); return adoptPtrWillBeNoop(agent); }
void FrameLoaderClientImpl::didNotAllowPlugins() { WebViewImpl* webview = m_webFrame->viewImpl(); if (webview && webview->permissionClient()) webview->permissionClient()->didNotAllowPlugins(m_webFrame); }
unsigned FrameLoaderClientImpl::backForwardLength() { WebViewImpl* webview = m_webFrame->viewImpl(); if (!webview || !webview->client()) return 0; return webview->client()->historyBackListCount() + 1 + webview->client()->historyForwardListCount(); }
Page* ChromeClientImpl::createWindow( Frame* frame, const FrameLoadRequest& r, const WindowFeatures& features, const NavigationAction& action) { if (!m_webView->client()) return 0; // FrameLoaderClientImpl may have given us a policy to use for the next new // window navigation. If not, determine the policy using the same logic as // show(). WebNavigationPolicy policy; if (m_nextNewWindowNavigationPolicy != WebNavigationPolicyIgnore) { policy = m_nextNewWindowNavigationPolicy; m_nextNewWindowNavigationPolicy = WebNavigationPolicyIgnore; } else policy = getNavigationPolicy(); WrappedResourceRequest request; if (!r.resourceRequest().isEmpty()) request.bind(r.resourceRequest()); else if (!action.resourceRequest().isEmpty()) request.bind(action.resourceRequest()); WebViewImpl* newView = static_cast<WebViewImpl*>( m_webView->client()->createView(WebFrameImpl::fromFrame(frame), request, features, r.frameName(), policy)); if (!newView) return 0; return newView->page(); }
TEST_F(DocumentLoaderTest, isCommittedButEmpty) { WebViewImpl* webViewImpl = m_webViewHelper.initializeAndLoad("about:blank", true); EXPECT_TRUE(toLocalFrame(webViewImpl->page()->mainFrame()) ->loader() .documentLoader() ->isCommittedButEmpty()); }
void FrameLoaderClientImpl::postProgressEstimateChangedNotification() { WebViewImpl* webview = m_webFrame->viewImpl(); if (webview && webview->client()) { webview->client()->didChangeLoadProgress( m_webFrame, m_webFrame->frame()->page()->progress().estimatedProgress()); } }
bool FrameLoaderClientImpl::allowScriptFromSource(bool enabledPerSettings, const KURL& scriptURL) { WebViewImpl* webview = m_webFrame->viewImpl(); if (webview && webview->permissionClient()) return webview->permissionClient()->allowScriptFromSource(m_webFrame, enabledPerSettings, scriptURL); return enabledPerSettings; }
bool FrameLoaderClientImpl::allowImage(bool enabledPerSettings, const KURL& imageURL) { WebViewImpl* webview = m_webFrame->viewImpl(); if (webview && webview->permissionClient()) return webview->permissionClient()->allowImage(m_webFrame, enabledPerSettings, imageURL); return enabledPerSettings; }
void FrameLoaderClientImpl::didCreateScriptContext(v8::Handle<v8::Context> context, int extensionGroup, int worldId) { WebViewImpl* webview = m_webFrame->viewImpl(); if (webview->devToolsAgentPrivate()) webview->devToolsAgentPrivate()->didCreateScriptContext(m_webFrame, worldId); if (m_webFrame->client()) m_webFrame->client()->didCreateScriptContext(m_webFrame, context, extensionGroup, worldId); }
bool FrameLoaderClientImpl::allowRunningInsecureContent(bool enabledPerSettings, SecurityOrigin* context, const KURL& url) { WebViewImpl* webview = m_webFrame->viewImpl(); if (webview && webview->permissionClient()) return webview->permissionClient()->allowRunningInsecureContent(m_webFrame, enabledPerSettings, WebSecurityOrigin(context), WebURL(url)); return enabledPerSettings; }
bool FrameLoaderClientImpl::allowPlugins(bool enabledPerSettings) { WebViewImpl* webview = m_webFrame->viewImpl(); if (webview && webview->permissionClient()) return webview->permissionClient()->allowPlugins(m_webFrame, enabledPerSettings); return enabledPerSettings; }
void FrameLoaderClientImpl::dispatchDidCommitLoad() { WebViewImpl* webview = m_webFrame->viewImpl(); bool isNewNavigation; webview->didCommitLoad(&isNewNavigation, false); if (m_webFrame->client()) m_webFrame->client()->didCommitProvisionalLoad(m_webFrame, isNewNavigation); }
void AutofillPopupMenuClient::popupDidHide() { WebViewImpl* webView = getWebView(); if (!webView) return; webView->autofillPopupDidHide(); webView->autofillClient()->didClearAutofillSelection(WebNode(getTextField())); }
void WebLocalFrameImpl::createFrameView() { TRACE_EVENT0("blink", "WebLocalFrameImpl::createFrameView"); ASSERT(frame()); // If frame() doesn't exist, we probably didn't init properly. WebViewImpl* webView = viewImpl(); frame()->createView(webView->size(), webView->baseBackgroundColor(), webView->isTransparent()); frame()->view()->setInputEventsTransformForEmulation(m_inputEventsOffsetForEmulation, m_inputEventsScaleFactorForEmulation); }
bool FrameLoaderClientImpl::allowScriptExtension(const String& extensionName, int extensionGroup, int worldId) { WebViewImpl* webview = m_webFrame->viewImpl(); if (webview && webview->permissionClient()) return webview->permissionClient()->allowScriptExtension(m_webFrame, extensionName, extensionGroup, worldId); return true; }
static void allowIndexedDBTask(ScriptExecutionContext*, PassRefPtr<AllowIndexedDBMainThreadBridge> bridge, PassRefPtr<WebFrameImpl> prpWebFrame, const String& name, const String& mode) { RefPtr<WebFrameImpl> webFrame = prpWebFrame; WebViewImpl* webView = webFrame->viewImpl(); if (!webView) { bridge->signalCompleted(false, mode); return; } bool allowed = !webView->permissionClient() || webView->permissionClient()->allowIndexedDB(webFrame.get(), name, WebSecurityOrigin()); bridge->signalCompleted(allowed, mode); }
void IDBFactoryBackendProxy::open(const String& name, PassRefPtr<IDBCallbacks> callbacks, PassRefPtr<SecurityOrigin> prpOrigin, Frame* frame, const String& dataDir, int64_t maximumSize, BackingStoreType backingStoreType) { WebSecurityOrigin origin(prpOrigin); WebFrameImpl* webFrame = WebFrameImpl::fromFrame(frame); WebViewImpl* webView = webFrame->viewImpl(); if (webView->permissionClient() && !webView->permissionClient()->allowIndexedDB(webFrame, name, origin)) { callbacks->onError(WebIDBDatabaseError(0, "The user denied permission to access the database.")); return; } m_webIDBFactory->open(name, new WebIDBCallbacksImpl(callbacks), origin, webFrame, dataDir, maximumSize, static_cast<WebIDBFactory::BackingStoreType>(backingStoreType)); }
void IDBFactoryBackendProxy::deleteDatabase(const String& name, PassRefPtr<IDBCallbacks> callbacks, PassRefPtr<SecurityOrigin> prpOrigin, Frame* frame, const String& dataDir) { WebSecurityOrigin origin(prpOrigin); WebFrameImpl* webFrame = WebFrameImpl::fromFrame(frame); WebViewImpl* webView = webFrame->viewImpl(); if (webView->permissionClient() && !webView->permissionClient()->allowIndexedDB(webFrame, name, origin)) { callbacks->onError(WebIDBDatabaseError(0, "The user denied permission to access the database.")); return; } m_webIDBFactory->deleteDatabase(name, new WebIDBCallbacksImpl(callbacks), origin, webFrame, dataDir); }
void AutofillPopupMenuClient::selectionChanged(unsigned listIndex, bool fireEvents) { WebViewImpl* webView = getWebView(); if (!webView) return; ASSERT_WITH_SECURITY_IMPLICATION(listIndex < m_names.size()); webView->autofillClient()->didSelectAutofillSuggestion(WebNode(getTextField()), m_names[listIndex], m_labels[listIndex], m_itemIDs[listIndex]); }
bool FrameLoaderClientImpl::navigateBackForward(int offset) const { WebViewImpl* webview = m_webFrame->viewImpl(); if (!webview->client()) return false; DCHECK(offset); if (offset > webview->client()->historyForwardListCount()) return false; if (offset < -webview->client()->historyBackListCount()) return false; webview->client()->navigateBackForwardSoon(offset); return true; }
void PopupContainer::popupOpened(const IntRect& bounds) { WebViewImpl* webView = WebViewImpl::fromPage(m_frameView->frame().page()); if (!webView->client()) return; WebWidget* webwidget = webView->client()->createPopupMenu(WebPopupTypeSelect); // We only notify when the WebView has to handle the popup, as when // the popup is handled externally, the fact that a popup is showing is // transparent to the WebView. webView->popupOpened(this); toWebPopupMenuImpl(webwidget)->initialize(this, bounds); }
bool FrameLoaderClientImpl::navigateBackForward(int offset) const { WebViewImpl* webview = m_webFrame->viewImpl(); if (!webview->client()) return false; ASSERT(offset); offset = std::min(offset, webview->client()->historyForwardListCount()); offset = std::max(offset, -webview->client()->historyBackListCount()); if (!offset) return false; webview->client()->navigateBackForwardSoon(offset); return true; }
virtual void run(Page* page) { if (m_running) return; m_running = true; // 0. Flush pending frontend messages. WebViewImpl* viewImpl = WebViewImpl::fromPage(page); WebDevToolsAgentImpl* agent = static_cast<WebDevToolsAgentImpl*>(viewImpl->devToolsAgent()); agent->flushPendingFrontendMessages(); Vector<WebViewImpl*> views; // 1. Disable input events. const HashSet<Page*>& pages = Page::ordinaryPages(); HashSet<Page*>::const_iterator end = pages.end(); for (HashSet<Page*>::const_iterator it = pages.begin(); it != end; ++it) { WebViewImpl* view = WebViewImpl::fromPage(*it); if (!view) continue; m_frozenViews.add(view); views.append(view); view->setIgnoreInputEvents(true); } // Notify embedder about pausing. agent->client()->willEnterDebugLoop(); // 2. Disable active objects WebView::willEnterModalLoop(); // 3. Process messages until quitNow is called. m_messageLoop->run(); // 4. Resume active objects WebView::didExitModalLoop(); // 5. Resume input events. for (Vector<WebViewImpl*>::iterator it = views.begin(); it != views.end(); ++it) { if (m_frozenViews.contains(*it)) { // The view was not closed during the dispatch. (*it)->setIgnoreInputEvents(false); } } agent->client()->didExitDebugLoop(); // 6. All views have been resumed, clear the set. m_frozenViews.clear(); m_running = false; }