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; }