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