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 ScriptDebugServer::handleV8DebugHostDispatch() { if (!s_messageLoopDispatchHandler) return; Vector<WebCore::Page*> pages; for (ListenersMap::iterator it = m_listenersMap.begin(); it != m_listenersMap.end(); ++it) pages.append(it->first); s_messageLoopDispatchHandler(pages); }
void DebuggerAgentManager::debugHostDispatchHandler() { if (!s_messageLoopDispatchHandler || !s_attachedAgentsMap) return; if (s_inHostDispatchHandler) return; s_inHostDispatchHandler = true; Vector<WebViewImpl*> views; // 1. Disable active objects and input events. for (AttachedAgentsMap::iterator it = s_attachedAgentsMap->begin(); it != s_attachedAgentsMap->end(); ++it) { DebuggerAgentImpl* agent = it->second; s_pageDeferrers.set(agent->webView(), new WebCore::PageGroupLoadDeferrer(agent->page(), true)); views.append(agent->webView()); agent->webView()->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; if (!s_attachedAgentsMap) { // Remove handlers if all agents were detached within host dispatch. v8::Debug::SetMessageHandler(0); v8::Debug::SetHostDispatchHandler(0); } }