WebDevToolsAgentImpl.cpp revision 2bde8e466a4451c7319e3a072d118917957d6554
15e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block/* 22bde8e466a4451c7319e3a072d118917957d6554Steve Block * Copyright (C) 2010-2011 Google Inc. All rights reserved. 35e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block * 45e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block * Redistribution and use in source and binary forms, with or without 55e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block * modification, are permitted provided that the following conditions are 65e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block * met: 75e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block * 85e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block * * Redistributions of source code must retain the above copyright 95e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block * notice, this list of conditions and the following disclaimer. 105e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block * * Redistributions in binary form must reproduce the above 115e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block * copyright notice, this list of conditions and the following disclaimer 125e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block * in the documentation and/or other materials provided with the 135e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block * distribution. 145e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block * * Neither the name of Google Inc. nor the names of its 155e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block * contributors may be used to endorse or promote products derived from 165e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block * this software without specific prior written permission. 175e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block * 185e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 195e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 205e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 215e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 225e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 235e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 245e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 255e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 265e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 275e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 285e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 295e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block */ 305e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block 315e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block#include "config.h" 325e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block#include "WebDevToolsAgentImpl.h" 335e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block 345e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block#include "DebuggerAgentImpl.h" 355e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block#include "DebuggerAgentManager.h" 36f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "ExceptionCode.h" 375e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block#include "InjectedScriptHost.h" 380617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen#include "InspectorBackendDispatcher.h" 395e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block#include "InspectorController.h" 4065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "InspectorInstrumentation.h" 415e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block#include "Page.h" 425af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke#include "PageGroup.h" 432bde8e466a4451c7319e3a072d118917957d6554Steve Block#include "PageScriptDebugServer.h" 445e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block#include "PlatformString.h" 455e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block#include "ResourceError.h" 465e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block#include "ResourceRequest.h" 475e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block#include "ResourceResponse.h" 485e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block#include "V8Binding.h" 495e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block#include "V8Proxy.h" 505e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block#include "V8Utilities.h" 515e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block#include "WebDataSource.h" 525e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block#include "WebDevToolsAgentClient.h" 535e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block#include "WebFrameImpl.h" 5406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#include "WebRect.h" 555e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block#include "WebString.h" 565e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block#include "WebURL.h" 575e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block#include "WebURLError.h" 585e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block#include "WebURLRequest.h" 595e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block#include "WebURLResponse.h" 6006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#include "WebViewClient.h" 615e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block#include "WebViewImpl.h" 6268513a70bcd92384395513322f1b801e7bf9c729Steve Block#include <wtf/CurrentTime.h> 635e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block#include <wtf/Noncopyable.h> 645e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block#include <wtf/OwnPtr.h> 655e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block 662fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockusing namespace WebCore; 675e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block 685e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Blocknamespace WebKit { 695e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block 705e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Blocknamespace { 715e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block 7268513a70bcd92384395513322f1b801e7bf9c729Steve Blockstatic const char kFrontendConnectedFeatureName[] = "frontend-connected"; 7368513a70bcd92384395513322f1b801e7bf9c729Steve Blockstatic const char kInspectorStateFeatureName[] = "inspector-state"; 745e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block 752bde8e466a4451c7319e3a072d118917957d6554Steve Blockclass ClientMessageLoopAdapter : public PageScriptDebugServer::ClientMessageLoop { 765af96e2c7b73ebc627c6894727826a7576d31758Leon Clarkepublic: 775af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke static void ensureClientMessageLoopCreated(WebDevToolsAgentClient* client) 785af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke { 795af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke if (s_instance) 805af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke return; 815af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke s_instance = new ClientMessageLoopAdapter(client->createClientMessageLoop()); 822bde8e466a4451c7319e3a072d118917957d6554Steve Block PageScriptDebugServer::shared().setClientMessageLoop(s_instance); 835af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke } 845af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke 855af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke static void inspectedViewClosed(WebViewImpl* view) 865af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke { 875af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke if (s_instance) 885af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke s_instance->m_frozenViews.remove(view); 895af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke } 905af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke 915af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke static void didNavigate() 925af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke { 935af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke // Release render thread if necessary. 945af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke if (s_instance && s_instance->m_running) 952bde8e466a4451c7319e3a072d118917957d6554Steve Block PageScriptDebugServer::shared().continueProgram(); 965af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke } 975af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke 985af96e2c7b73ebc627c6894727826a7576d31758Leon Clarkeprivate: 995af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke ClientMessageLoopAdapter(PassOwnPtr<WebKit::WebDevToolsAgentClient::WebKitClientMessageLoop> messageLoop) 1005af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke : m_running(false) 1015af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke , m_messageLoop(messageLoop) { } 1025af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke 1035af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke 1045af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke virtual void run(Page* page) 1055af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke { 1065af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke if (m_running) 1075af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke return; 1085af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke m_running = true; 1095af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke 1105af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke Vector<WebViewImpl*> views; 1115af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke 1125af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke // 1. Disable input events. 1135af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke HashSet<Page*>::const_iterator end = page->group().pages().end(); 1145af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke for (HashSet<Page*>::const_iterator it = page->group().pages().begin(); it != end; ++it) { 1155af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke WebViewImpl* view = WebViewImpl::fromPage(*it); 1165af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke m_frozenViews.add(view); 1175af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke views.append(view); 1185af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke view->setIgnoreInputEvents(true); 1195af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke } 1205af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke 1215af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke // 2. Disable active objects 1225af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke WebView::willEnterModalLoop(); 1235af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke 1245af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke // 3. Process messages until quitNow is called. 1255af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke m_messageLoop->run(); 1265af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke 1275af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke // 4. Resume active objects 1285af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke WebView::didExitModalLoop(); 1295af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke 1305af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke // 5. Resume input events. 1315af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke for (Vector<WebViewImpl*>::iterator it = views.begin(); it != views.end(); ++it) { 1325af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke if (m_frozenViews.contains(*it)) { 1335af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke // The view was not closed during the dispatch. 1345af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke (*it)->setIgnoreInputEvents(false); 1355af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke } 1365af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke } 1375af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke 1385af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke // 6. All views have been resumed, clear the set. 1395af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke m_frozenViews.clear(); 1405af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke 1415af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke m_running = false; 1425af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke } 1435af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke 1445af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke virtual void quitNow() 1455af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke { 1465af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke m_messageLoop->quitNow(); 1475af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke } 1485af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke 1495af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke bool m_running; 1505af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke OwnPtr<WebKit::WebDevToolsAgentClient::WebKitClientMessageLoop> m_messageLoop; 1515af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke typedef HashSet<WebViewImpl*> FrozenViewsSet; 1525af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke FrozenViewsSet m_frozenViews; 1535af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke static ClientMessageLoopAdapter* s_instance; 1545af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke 1555af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke}; 1565af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke 1575af96e2c7b73ebc627c6894727826a7576d31758Leon ClarkeClientMessageLoopAdapter* ClientMessageLoopAdapter::s_instance = 0; 1585af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke 1595e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block} // namespace 1605e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block 1615e2bc6953fe6923165b8a5d7679939693a1d58d6Steve BlockWebDevToolsAgentImpl::WebDevToolsAgentImpl( 1625e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block WebViewImpl* webViewImpl, 1635e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block WebDevToolsAgentClient* client) 1645e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block : m_hostId(client->hostIdentifier()) 1655e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block , m_client(client) 1665e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block , m_webViewImpl(webViewImpl) 1675e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block , m_attached(false) 1685e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block{ 1695af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke DebuggerAgentManager::setExposeV8DebuggerProtocol( 1705af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke client->exposeV8DebuggerProtocol()); 1715e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block} 1725e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block 1735e2bc6953fe6923165b8a5d7679939693a1d58d6Steve BlockWebDevToolsAgentImpl::~WebDevToolsAgentImpl() 1745e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block{ 1755e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block DebuggerAgentManager::onWebViewClosed(m_webViewImpl); 1765af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke ClientMessageLoopAdapter::inspectedViewClosed(m_webViewImpl); 1775e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block} 1785e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block 1795e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Blockvoid WebDevToolsAgentImpl::attach() 1805e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block{ 1815e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block if (m_attached) 1825e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block return; 1835af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke 1845af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke if (!m_client->exposeV8DebuggerProtocol()) 1855af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke ClientMessageLoopAdapter::ensureClientMessageLoopCreated(m_client); 1865af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke 1875e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block m_debuggerAgentImpl.set( 188dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch new DebuggerAgentImpl(m_webViewImpl, this, m_client)); 1895e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block m_attached = true; 1905e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block} 1915e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block 1925e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Blockvoid WebDevToolsAgentImpl::detach() 1935e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block{ 1945e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block // Prevent controller from sending messages to the frontend. 195dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch InspectorController* ic = inspectorController(); 196dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ic->disconnectFrontend(); 1975e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block ic->hideHighlight(); 1985e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block ic->close(); 1995e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block m_debuggerAgentImpl.set(0); 2005e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block m_attached = false; 2015e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block} 2025e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block 203dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochvoid WebDevToolsAgentImpl::frontendLoaded() 204dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{ 20565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch inspectorController()->connectFrontend(); 206dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch} 207dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch 2085e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Blockvoid WebDevToolsAgentImpl::didNavigate() 2095e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block{ 2105af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke ClientMessageLoopAdapter::didNavigate(); 2115e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block DebuggerAgentManager::onNavigate(); 2125e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block} 2135e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block 2145e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Blockvoid WebDevToolsAgentImpl::didClearWindowObject(WebFrameImpl* webframe) 2155e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block{ 2165e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block DebuggerAgentManager::setHostId(webframe, m_hostId); 2175e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block} 2185e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block 219dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochvoid WebDevToolsAgentImpl::dispatchOnInspectorBackend(const WebString& message) 2205e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block{ 2212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block inspectorController()->dispatchMessageFromFrontend(message); 2225e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block} 2235e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block 2245e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Blockvoid WebDevToolsAgentImpl::inspectElementAt(const WebPoint& point) 2255e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block{ 2265e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block m_webViewImpl->inspectElementAt(point); 2275e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block} 2285e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block 229f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrickvoid WebDevToolsAgentImpl::setRuntimeProperty(const WebString& name, const WebString& value) 230f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick{ 23165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (name == kInspectorStateFeatureName) { 232dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch InspectorController* ic = inspectorController(); 23368513a70bcd92384395513322f1b801e7bf9c729Steve Block ic->restoreInspectorStateFromCookie(value); 234e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block } 2355e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block} 2365e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block 2372fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockInspectorController* WebDevToolsAgentImpl::inspectorController() 23868513a70bcd92384395513322f1b801e7bf9c729Steve Block{ 23965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (Page* page = m_webViewImpl->page()) 24065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return page->inspectorController(); 24165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return 0; 24268513a70bcd92384395513322f1b801e7bf9c729Steve Block} 24368513a70bcd92384395513322f1b801e7bf9c729Steve Block 2442fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockFrame* WebDevToolsAgentImpl::mainFrame() 2455e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block{ 2465e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block if (Page* page = m_webViewImpl->page()) 24765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return page->mainFrame(); 2485e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block return 0; 2495e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block} 2505e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block 25106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenvoid WebDevToolsAgentImpl::inspectorDestroyed() 25206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{ 25306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen // Our lifetime is bound to the WebViewImpl. 25406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen} 25506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 25606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenvoid WebDevToolsAgentImpl::openInspectorFrontend(InspectorController*) 25706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{ 25806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen} 25906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 26006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenvoid WebDevToolsAgentImpl::highlight(Node* node) 26106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{ 26206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen // InspectorController does the actuall tracking of the highlighted node 26306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen // and the drawing of the highlight. Here we just make sure to invalidate 26406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen // the rects of the old and new nodes. 26506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen hideHighlight(); 26606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen} 26706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 26806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenvoid WebDevToolsAgentImpl::hideHighlight() 26906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{ 27006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen // FIXME: able to invalidate a smaller rect. 27106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen // FIXME: Is it important to just invalidate the rect of the node region 27206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen // given that this is not on a critical codepath? In order to do so, we'd 27306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen // have to take scrolling into account. 27406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen const WebSize& size = m_webViewImpl->size(); 27506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen WebRect damagedRect(0, 0, size.width, size.height); 27606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (m_webViewImpl->client()) 27706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen m_webViewImpl->client()->didInvalidateRect(damagedRect); 27806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen} 27906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 2802fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockbool WebDevToolsAgentImpl::sendMessageToFrontend(const String& message) 28106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{ 28206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen WebDevToolsAgentImpl* devToolsAgent = static_cast<WebDevToolsAgentImpl*>(m_webViewImpl->devToolsAgent()); 28306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (!devToolsAgent) 28406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return false; 28506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 286dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch m_client->sendMessageToInspectorFrontend(message); 28706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return true; 28806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen} 28906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 2902fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid WebDevToolsAgentImpl::updateInspectorStateCookie(const String& state) 29106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{ 29268513a70bcd92384395513322f1b801e7bf9c729Steve Block m_client->runtimePropertyChanged(kInspectorStateFeatureName, state); 29306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen} 29406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 2955e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Blockvoid WebDevToolsAgentImpl::evaluateInWebInspector(long callId, const WebString& script) 2965e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block{ 2975e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block InspectorController* ic = inspectorController(); 2985e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block ic->evaluateForTestInFrontend(callId, script); 2995e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block} 3005e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block 3015e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Blockvoid WebDevToolsAgentImpl::setTimelineProfilingEnabled(bool enabled) 3025e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block{ 3035e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block InspectorController* ic = inspectorController(); 3045e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block if (enabled) 3055e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block ic->startTimelineProfiler(); 3065e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block else 3075e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block ic->stopTimelineProfiler(); 3085e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block} 3095e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block 3105e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Blockvoid WebDevToolsAgent::executeDebuggerCommand(const WebString& command, int callerId) 3115e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block{ 3125e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block DebuggerAgentManager::executeDebuggerCommand(command, callerId); 3135e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block} 3145e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block 3155e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Blockvoid WebDevToolsAgent::debuggerPauseScript() 3165e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block{ 3175e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block DebuggerAgentManager::pauseScript(); 3185e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block} 3195e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block 320f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrickvoid WebDevToolsAgent::interruptAndDispatch(MessageDescriptor* d) 321f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick{ 3222bde8e466a4451c7319e3a072d118917957d6554Steve Block class DebuggerTask : public PageScriptDebugServer::Task { 323f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick public: 324f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick DebuggerTask(WebDevToolsAgent::MessageDescriptor* descriptor) : m_descriptor(descriptor) { } 325f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick virtual ~DebuggerTask() { } 326f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick virtual void run() 327f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick { 328f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick if (WebDevToolsAgent* webagent = m_descriptor->agent()) 329f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick webagent->dispatchOnInspectorBackend(m_descriptor->message()); 330f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick } 331f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick private: 332f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick OwnPtr<WebDevToolsAgent::MessageDescriptor> m_descriptor; 333f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick }; 3342bde8e466a4451c7319e3a072d118917957d6554Steve Block PageScriptDebugServer::interruptAndRun(new DebuggerTask(d)); 335f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick} 336f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick 337f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrickbool WebDevToolsAgent::shouldInterruptForMessage(const WebString& message) 338f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick{ 339f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick String commandName; 340f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick if (!InspectorBackendDispatcher::getCommandName(message, &commandName)) 341f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick return false; 3422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return commandName == InspectorBackendDispatcher::Debugger_pauseCmd 3432bde8e466a4451c7319e3a072d118917957d6554Steve Block || commandName == InspectorBackendDispatcher::Debugger_setBreakpointCmd 3442bde8e466a4451c7319e3a072d118917957d6554Steve Block || commandName == InspectorBackendDispatcher::Debugger_setBreakpointByUrlCmd 3452bde8e466a4451c7319e3a072d118917957d6554Steve Block || commandName == InspectorBackendDispatcher::Debugger_removeBreakpointCmd 3462bde8e466a4451c7319e3a072d118917957d6554Steve Block || commandName == InspectorBackendDispatcher::Debugger_setBreakpointsActiveCmd 3472bde8e466a4451c7319e3a072d118917957d6554Steve Block || commandName == InspectorBackendDispatcher::Profiler_startCmd 3482bde8e466a4451c7319e3a072d118917957d6554Steve Block || commandName == InspectorBackendDispatcher::Profiler_stopCmd 3492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block || commandName == InspectorBackendDispatcher::Profiler_getProfileCmd; 350f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick} 351f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick 352f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrickvoid WebDevToolsAgent::processPendingMessages() 353f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick{ 3542bde8e466a4451c7319e3a072d118917957d6554Steve Block PageScriptDebugServer::shared().runPendingTasks(); 355f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick} 356f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick 3575e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Blockvoid WebDevToolsAgent::setMessageLoopDispatchHandler(MessageLoopDispatchHandler handler) 3585e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block{ 3595e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block DebuggerAgentManager::setMessageLoopDispatchHandler(handler); 3605e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block} 3615e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block 3625e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block} // namespace WebKit 363