InspectorAgent.cpp revision 2fc2651226baac27029e38c9d6ef883fa32084db
12fc2651226baac27029e38c9d6ef883fa32084dbSteve Block/*
22fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * Copyright (C) 2007, 2008, 2009, 2010 Apple Inc. All rights reserved.
32fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * Copyright (C) 2008 Matt Lilek <webkit@mattlilek.com>
42fc2651226baac27029e38c9d6ef883fa32084dbSteve Block *
52fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * Redistribution and use in source and binary forms, with or without
62fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * modification, are permitted provided that the following conditions
72fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * are met:
82fc2651226baac27029e38c9d6ef883fa32084dbSteve Block *
92fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * 1.  Redistributions of source code must retain the above copyright
102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block *     notice, this list of conditions and the following disclaimer.
112fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * 2.  Redistributions in binary form must reproduce the above copyright
122fc2651226baac27029e38c9d6ef883fa32084dbSteve Block *     notice, this list of conditions and the following disclaimer in the
132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block *     documentation and/or other materials provided with the distribution.
142fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block *     its contributors may be used to endorse or promote products derived
162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block *     from this software without specific prior written permission.
172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block *
182fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
192fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
202fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
232fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block */
292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "config.h"
312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "InspectorAgent.h"
322fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(INSPECTOR)
342fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
352fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "CachedResource.h"
362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "CachedResourceLoader.h"
372fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "Chrome.h"
382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "Cookie.h"
392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "CookieJar.h"
402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "DOMWindow.h"
412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "DOMWrapperWorld.h"
422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "Document.h"
432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "DocumentLoader.h"
442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "Element.h"
452fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "FloatConversion.h"
462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "FloatQuad.h"
472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "FloatRect.h"
482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "Frame.h"
492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "FrameLoadRequest.h"
502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "FrameLoader.h"
512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "FrameTree.h"
522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "FrameView.h"
532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "GraphicsContext.h"
542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "HTMLFrameOwnerElement.h"
552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "HTTPHeaderMap.h"
562fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "HitTestResult.h"
572fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "InjectedScript.h"
582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "InjectedScriptHost.h"
592fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "InspectorBrowserDebuggerAgent.h"
602fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "InspectorCSSAgent.h"
612fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "InspectorClient.h"
622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "InspectorConsoleAgent.h"
632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "InspectorController.h"
642fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "InspectorDOMAgent.h"
652fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "InspectorDOMStorageResource.h"
662fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "InspectorDatabaseResource.h"
672fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "InspectorDebuggerAgent.h"
682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "InspectorFrontend.h"
692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "InspectorFrontendClient.h"
702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "InspectorInstrumentation.h"
712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "InspectorProfilerAgent.h"
722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "InspectorResourceAgent.h"
732fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "InspectorRuntimeAgent.h"
742fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "InspectorState.h"
752fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "InspectorTimelineAgent.h"
762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "InspectorValues.h"
772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "InspectorWorkerResource.h"
782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "IntRect.h"
792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "Page.h"
802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "ProgressTracker.h"
812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "Range.h"
822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "RenderInline.h"
832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "ResourceRequest.h"
842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "ResourceResponse.h"
852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "ScriptArguments.h"
862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "ScriptCallStack.h"
872fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "ScriptFunctionCall.h"
882fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "ScriptObject.h"
892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "ScriptProfile.h"
902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "ScriptProfiler.h"
912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "ScriptSourceCode.h"
922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "ScriptState.h"
932fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "SecurityOrigin.h"
942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "Settings.h"
952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "SharedBuffer.h"
962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "TextEncoding.h"
972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "TextIterator.h"
982fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "TextRun.h"
992fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "UserGestureIndicator.h"
1002fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "WindowFeatures.h"
1012fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include <wtf/CurrentTime.h>
1022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include <wtf/ListHashSet.h>
1032fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include <wtf/RefCounted.h>
1042fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include <wtf/StdLibExtras.h>
1052fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include <wtf/UnusedParam.h>
1062fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include <wtf/text/StringConcatenate.h>
1072fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1082fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(DATABASE)
1092fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "Database.h"
1102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "InspectorDatabaseAgent.h"
1112fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif
1122fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(DOM_STORAGE)
1142fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "InspectorDOMStorageAgent.h"
1152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "Storage.h"
1162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "StorageArea.h"
1172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif
1182fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1192fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(OFFLINE_WEB_APPLICATIONS)
1202fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "InspectorApplicationCacheAgent.h"
1212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif
1222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1232fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockusing namespace std;
1242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1252fc2651226baac27029e38c9d6ef883fa32084dbSteve Blocknamespace WebCore {
1262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1272fc2651226baac27029e38c9d6ef883fa32084dbSteve Blocknamespace InspectorAgentState {
1282fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic const char searchingForNode[] = "searchingForNode";
1292fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic const char timelineProfilerEnabled[] = "timelineProfilerEnabled";
1302fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic const char userInitiatedProfiling[] = "userInitiatedProfiling";
1312fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic const char debuggerEnabled[] = "debuggerEnabled";
1322fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic const char profilerEnabled[] = "profilerEnabled";
1332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
1342fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1352fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic const char scriptsPanelName[] = "scripts";
1362fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic const char consolePanelName[] = "console";
1372fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic const char profilesPanelName[] = "profiles";
1382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1392fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockInspectorAgent::InspectorAgent(Page* page, InspectorClient* client)
1402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    : m_inspectedPage(page)
1412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    , m_client(client)
1422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    , m_frontend(0)
1432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    , m_cssAgent(new InspectorCSSAgent())
1442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    , m_state(new InspectorState(client))
1452fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    , m_injectedScriptHost(InjectedScriptHost::create(this))
1462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    , m_consoleAgent(new InspectorConsoleAgent(this))
1472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(JAVASCRIPT_DEBUGGER)
1482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    , m_profilerAgent(InspectorProfilerAgent::create(this))
1492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif
1502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
1512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT_ARG(page, page);
1522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT_ARG(client, client);
1532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    InspectorInstrumentation::bindInspectorAgent(m_inspectedPage, this);
1542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
1552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1562fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockInspectorAgent::~InspectorAgent()
1572fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
1582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // These should have been cleared in inspectedPageDestroyed().
1592fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT(!m_client);
1602fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT(!m_inspectedPage);
1612fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT(!m_highlightedNode);
1622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
1632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1642fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::inspectedPageDestroyed()
1652fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
1662fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (m_frontend)
1672fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_frontend->disconnectFromBackend();
1682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    hideHighlight();
1702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(JAVASCRIPT_DEBUGGER)
1722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_debuggerAgent.clear();
1732fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_browserDebuggerAgent.clear();
1742fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif
1752fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT(m_inspectedPage);
1772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    InspectorInstrumentation::unbindInspectorAgent(m_inspectedPage);
1782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_inspectedPage = 0;
1792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    releaseFrontendLifetimeAgents();
1812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_injectedScriptHost->disconnectController();
1822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_client->inspectorDestroyed();
1842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_client = 0;
1852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
1862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1872fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockbool InspectorAgent::searchingForNodeInPage() const
1882fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
1892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return m_state->getBoolean(InspectorAgentState::searchingForNode);
1902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
1912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1922fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::restoreInspectorStateFromCookie(const String& inspectorStateCookie)
1932fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
1942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_state = new InspectorState(m_client, inspectorStateCookie);
1952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_frontend->frontendReused();
1972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_frontend->inspectedURLChanged(inspectedURL().string());
1982fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    pushDataCollectedOffline();
1992fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
2002fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_resourceAgent = InspectorResourceAgent::restore(m_inspectedPage, m_state.get(), m_frontend);
2012fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_timelineAgent = InspectorTimelineAgent::restore(m_state.get(), m_frontend);
2022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
2032fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(JAVASCRIPT_DEBUGGER)
2042fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    restoreDebugger(false);
2052fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    restoreProfiler(ProfilerRestoreResetAgent);
2062fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (m_state->getBoolean(InspectorAgentState::userInitiatedProfiling))
2072fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        startUserInitiatedProfiling();
2082fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif
2092fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
2102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
2112fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::inspect(Node* node)
2122fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
2132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (node->nodeType() != Node::ELEMENT_NODE && node->nodeType() != Node::DOCUMENT_NODE)
2142fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        node = node->parentNode();
2152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_nodeToFocus = node;
2162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
2172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!m_frontend)
2182fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
2192fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
2202fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    focusNode();
2212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
2222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
2232fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::focusNode()
2242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
2252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!enabled())
2262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
2272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
2282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT(m_frontend);
2292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT(m_nodeToFocus);
2302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
2312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    long id = m_domAgent->pushNodePathToFrontend(m_nodeToFocus.get());
2322fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_frontend->updateFocusedNode(id);
2332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_nodeToFocus = 0;
2342fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
2352fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
2362fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::highlight(Node* node)
2372fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
2382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!enabled())
2392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
2402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT_ARG(node, node);
2412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_highlightedNode = node;
2422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_client->highlight(node);
2432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
2442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
2452fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::highlightDOMNode(long nodeId)
2462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
2472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    Node* node = 0;
2482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (m_domAgent && (node = m_domAgent->nodeForId(nodeId)))
2492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        highlight(node);
2502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
2512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
2522fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::highlightFrame(unsigned long frameId)
2532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
2542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    Frame* mainFrame = m_inspectedPage->mainFrame();
2552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    for (Frame* frame = mainFrame; frame; frame = frame->tree()->traverseNext(mainFrame)) {
2562fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (reinterpret_cast<uintptr_t>(frame) == frameId && frame->ownerElement()) {
2572fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            highlight(frame->ownerElement());
2582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            return;
2592fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        }
2602fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
2612fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
2622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
2632fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::hideHighlight()
2642fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
2652fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!enabled())
2662fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
2672fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_highlightedNode = 0;
2682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_client->hideHighlight();
2692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
2702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
2712fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::mouseDidMoveOverElement(const HitTestResult& result, unsigned)
2722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
2732fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!enabled() || !searchingForNodeInPage())
2742fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
2752fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
2762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    Node* node = result.innerNode();
2772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    while (node && node->nodeType() == Node::TEXT_NODE)
2782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        node = node->parentNode();
2792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (node)
2802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        highlight(node);
2812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
2822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
2832fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockbool InspectorAgent::handleMousePress()
2842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
2852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!enabled() || !searchingForNodeInPage())
2862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return false;
2872fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
2882fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (m_highlightedNode) {
2892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        RefPtr<Node> node = m_highlightedNode;
2902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        setSearchingForNode(false);
2912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        inspect(node.get());
2922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
2932fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return true;
2942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
2952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
2962fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::didClearWindowObjectInWorld(Frame* frame, DOMWrapperWorld* world)
2972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
2982fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (world != mainThreadNormalWorld())
2992fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
3002fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3012fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (enabled()) {
3022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (m_frontend && frame == m_inspectedPage->mainFrame())
3032fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            m_injectedScriptHost->discardInjectedScripts();
3042fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3052fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (m_scriptsToEvaluateOnLoad.size()) {
3062fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            ScriptState* scriptState = mainWorldScriptState(frame);
3072fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            for (Vector<String>::iterator it = m_scriptsToEvaluateOnLoad.begin();
3082fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                  it != m_scriptsToEvaluateOnLoad.end(); ++it) {
3092fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                m_injectedScriptHost->injectScript(*it, scriptState);
3102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            }
3112fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        }
3122fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
3132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3142fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!m_inspectorExtensionAPI.isEmpty())
3152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_injectedScriptHost->injectScript(m_inspectorExtensionAPI, mainWorldScriptState(frame));
3162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
3172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3182fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::setSearchingForNode(bool enabled)
3192fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
3202fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (searchingForNodeInPage() == enabled)
3212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
3222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_state->setBoolean(InspectorAgentState::searchingForNode, enabled);
3232fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!enabled)
3242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        hideHighlight();
3252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
3262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3272fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::setSearchingForNode(bool enabled, bool* newState)
3282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
3292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    *newState = enabled;
3302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    setSearchingForNode(enabled);
3312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
3322fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3332fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::setFrontend(InspectorFrontend* inspectorFrontend)
3342fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
3352fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_frontend = inspectorFrontend;
3362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    createFrontendLifetimeAgents();
3372fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_cssAgent->setDOMAgent(m_domAgent.get());
3392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_consoleAgent->setFrontend(m_frontend);
3402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // Initialize Web Inspector title.
3422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_frontend->inspectedURLChanged(inspectedURL().string());
3432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
3442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3452fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::disconnectFrontend()
3462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
3472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!m_frontend)
3482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
3492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // Destroying agents would change the state, but we don't want that.
3512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // Pre-disconnect state will be used to restore inspector agents.
3522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_state->mute();
3532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_frontend = 0;
3552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3562fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(JAVASCRIPT_DEBUGGER)
3572fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // If the window is being closed with the debugger enabled,
3582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // remember this state to re-enable debugger on the next window
3592fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // opening.
3602fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    disableDebugger();
3612fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif
3622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    setSearchingForNode(false);
3632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3642fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    hideHighlight();
3652fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3662fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(JAVASCRIPT_DEBUGGER)
3672fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_profilerAgent->setFrontend(0);
3682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_profilerAgent->stopUserInitiatedProfiling(true);
3692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif
3702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_consoleAgent->setFrontend(0);
3722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3732fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    releaseFrontendLifetimeAgents();
3742fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_userAgentOverride = "";
3752fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
3762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3772fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockInspectorResourceAgent* InspectorAgent::resourceAgent()
3782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
3792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!m_resourceAgent && m_frontend)
3802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_resourceAgent = InspectorResourceAgent::create(m_inspectedPage, m_state.get(), m_frontend);
3812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return m_resourceAgent.get();
3822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
3832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3842fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::createFrontendLifetimeAgents()
3852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
3862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_domAgent = InspectorDOMAgent::create(m_injectedScriptHost.get(), m_frontend);
3872fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_runtimeAgent = InspectorRuntimeAgent::create(m_injectedScriptHost.get());
3882fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(DATABASE)
3902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_databaseAgent = InspectorDatabaseAgent::create(&m_databaseResources, m_frontend);
3912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif
3922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3932fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(DOM_STORAGE)
3942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_domStorageAgent = InspectorDOMStorageAgent::create(&m_domStorageResources, m_frontend);
3952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif
3962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(OFFLINE_WEB_APPLICATIONS)
3982fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_applicationCacheAgent = new InspectorApplicationCacheAgent(m_inspectedPage->mainFrame()->loader()->documentLoader(), m_frontend);
3992fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif
4002fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
4012fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
4022fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::releaseFrontendLifetimeAgents()
4032fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
4042fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_resourceAgent.clear();
4052fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_runtimeAgent.clear();
4062fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_timelineAgent.clear();
4072fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
4082fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(DATABASE)
4092fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_databaseAgent.clear();
4102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif
4112fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
4122fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(DOM_STORAGE)
4132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_domStorageAgent.clear();
4142fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif
4152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
4162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(OFFLINE_WEB_APPLICATIONS)
4172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_applicationCacheAgent.clear();
4182fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif
4192fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
4202fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // This should be invoked prior to m_domAgent destruction.
4212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_cssAgent->setDOMAgent(0);
4222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_domAgent.clear();
4232fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
4242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
4252fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::populateScriptObjects()
4262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
4272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT(m_frontend);
4282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!m_frontend)
4292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
4302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
4312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(JAVASCRIPT_DEBUGGER)
4322fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (m_profilerAgent->enabled())
4332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_frontend->profilerWasEnabled();
4342fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif
4352fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
4362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    pushDataCollectedOffline();
4372fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
4382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (m_nodeToFocus)
4392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        focusNode();
4402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
4412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!m_requiredPanel.isEmpty()) {
4422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_frontend->showPanel(m_requiredPanel);
4432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_requiredPanel = "";
4442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
4452fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
4462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    restoreDebugger(true);
4472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    restoreProfiler(ProfilerRestoreNoAction);
4482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
4492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // Dispatch pending frontend commands
4502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    for (Vector<pair<long, String> >::iterator it = m_pendingEvaluateTestCommands.begin(); it != m_pendingEvaluateTestCommands.end(); ++it)
4512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_frontend->evaluateForTestInFrontend((*it).first, (*it).second);
4522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_pendingEvaluateTestCommands.clear();
4532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
4542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
4552fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::pushDataCollectedOffline()
4562fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
4572fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_domAgent->setDocument(m_inspectedPage->mainFrame()->document());
4582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
4592fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(DATABASE)
4602fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    DatabaseResourcesMap::iterator databasesEnd = m_databaseResources.end();
4612fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    for (DatabaseResourcesMap::iterator it = m_databaseResources.begin(); it != databasesEnd; ++it)
4622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        it->second->bind(m_frontend);
4632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif
4642fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(DOM_STORAGE)
4652fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    DOMStorageResourcesMap::iterator domStorageEnd = m_domStorageResources.end();
4662fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    for (DOMStorageResourcesMap::iterator it = m_domStorageResources.begin(); it != domStorageEnd; ++it)
4672fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        it->second->bind(m_frontend);
4682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif
4692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(JAVASCRIPT_DEBUGGER) && ENABLE(WORKERS)
4702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    WorkersMap::iterator workersEnd = m_workers.end();
4712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    for (WorkersMap::iterator it = m_workers.begin(); it != workersEnd; ++it) {
4722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        InspectorWorkerResource* worker = it->second.get();
4732fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_frontend->didCreateWorker(worker->id(), worker->url(), worker->isSharedWorker());
4742fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
4752fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif
4762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
4772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
4782fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::restoreDebugger(bool eraseStickyBreakpoints)
4792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
4802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT(m_frontend);
4812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(JAVASCRIPT_DEBUGGER)
4822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (m_state->getBoolean(InspectorAgentState::debuggerEnabled))
4832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        enableDebugger(eraseStickyBreakpoints);
4842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif
4852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
4862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
4872fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::restoreProfiler(ProfilerRestoreAction action)
4882fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
4892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT(m_frontend);
4902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(JAVASCRIPT_DEBUGGER)
4912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_profilerAgent->setFrontend(m_frontend);
4922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (m_state->getBoolean(InspectorAgentState::profilerEnabled))
4932fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        enableProfiler();
4942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (action == ProfilerRestoreResetAgent)
4952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_profilerAgent->resetFrontendProfiles();
4962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif
4972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
4982fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
4992fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::didCommitLoad(DocumentLoader* loader)
5002fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
5012fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!enabled())
5022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
5032fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
5042fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (m_resourceAgent)
5052fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_resourceAgent->didCommitLoad(loader);
5062fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
5072fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT(m_inspectedPage);
5082fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
5092fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (loader->frame() == m_inspectedPage->mainFrame()) {
5102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (m_frontend)
5112fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            m_frontend->inspectedURLChanged(loader->url().string());
5122fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
5132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_injectedScriptHost->discardInjectedScripts();
5142fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_consoleAgent->reset();
5152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
5162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (m_timelineAgent)
5172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            m_timelineAgent->didCommitLoad();
5182fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
5192fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(OFFLINE_WEB_APPLICATIONS)
5202fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (m_applicationCacheAgent)
5212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            m_applicationCacheAgent->didCommitLoad(loader);
5222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif
5232fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
5242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(JAVASCRIPT_DEBUGGER)
5252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (m_debuggerAgent) {
5262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            KURL url = inspectedURLWithoutFragment();
5272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            m_debuggerAgent->inspectedURLChanged(url);
5282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            if (m_browserDebuggerAgent)
5292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                m_browserDebuggerAgent->inspectedURLChanged(url);
5302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        }
5312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif
5322fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
5332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(JAVASCRIPT_DEBUGGER) && USE(JSC)
5342fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_profilerAgent->stopUserInitiatedProfiling(true);
5352fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_profilerAgent->resetState();
5362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif
5372fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
5382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (m_frontend) {
5392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            m_frontend->reset();
5402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            m_domAgent->reset();
5412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            m_cssAgent->reset();
5422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        }
5432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(WORKERS)
5442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_workers.clear();
5452fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif
5462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(DATABASE)
5472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_databaseResources.clear();
5482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif
5492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(DOM_STORAGE)
5502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_domStorageResources.clear();
5512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif
5522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
5532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (m_frontend)
5542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            m_domAgent->setDocument(m_inspectedPage->mainFrame()->document());
5552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
5562fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
5572fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
5582fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::domContentLoadedEventFired(DocumentLoader* loader, const KURL& url)
5592fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
5602fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!enabled() || !isMainResourceLoader(loader, url))
5612fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
5622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
5632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (m_domAgent)
5642fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_domAgent->mainFrameDOMContentLoaded();
5652fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (m_timelineAgent)
5662fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_timelineAgent->didMarkDOMContentEvent();
5672fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (m_frontend)
5682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_frontend->domContentEventFired(currentTime());
5692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
5702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
5712fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::loadEventFired(DocumentLoader* loader, const KURL& url)
5722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
5732fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!enabled())
5742fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
5752fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
5762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (m_domAgent)
5772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_domAgent->loadEventFired(loader->frame()->document());
5782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
5792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!isMainResourceLoader(loader, url))
5802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
5812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
5822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (m_timelineAgent)
5832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_timelineAgent->didMarkLoadEvent();
5842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (m_frontend)
5852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_frontend->loadEventFired(currentTime());
5862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
5872fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
5882fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockbool InspectorAgent::isMainResourceLoader(DocumentLoader* loader, const KURL& requestUrl)
5892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
5902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return loader->frame() == m_inspectedPage->mainFrame() && requestUrl == loader->requestURL();
5912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
5922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
5932fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::setUserAgentOverride(const String& userAgent)
5942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
5952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_userAgentOverride = userAgent;
5962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
5972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
5982fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::applyUserAgentOverride(String* userAgent) const
5992fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
6002fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!m_userAgentOverride.isEmpty())
6012fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        *userAgent = m_userAgentOverride;
6022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
6032fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
6042fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::startTimelineProfiler()
6052fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
6062fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (m_timelineAgent || !enabled() || !m_frontend)
6072fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
6082fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
6092fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_timelineAgent = InspectorTimelineAgent::create(m_state.get(), m_frontend);
6102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
6112fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
6122fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::stopTimelineProfiler()
6132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
6142fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_timelineAgent.clear();
6152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
6162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
6172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(WORKERS)
6182fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockclass PostWorkerNotificationToFrontendTask : public ScriptExecutionContext::Task {
6192fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockpublic:
6202fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    static PassOwnPtr<PostWorkerNotificationToFrontendTask> create(PassRefPtr<InspectorWorkerResource> worker, InspectorAgent::WorkerAction action)
6212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    {
6222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return new PostWorkerNotificationToFrontendTask(worker, action);
6232fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
6242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
6252fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockprivate:
6262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    PostWorkerNotificationToFrontendTask(PassRefPtr<InspectorWorkerResource> worker, InspectorAgent::WorkerAction action)
6272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        : m_worker(worker)
6282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        , m_action(action)
6292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    {
6302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
6312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
6322fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    virtual void performTask(ScriptExecutionContext* scriptContext)
6332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    {
6342fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (scriptContext->isDocument()) {
6352fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            if (InspectorAgent* inspectorAgent = static_cast<Document*>(scriptContext)->page()->inspectorController()->m_inspectorAgent.get())
6362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                inspectorAgent->postWorkerNotificationToFrontend(*m_worker, m_action);
6372fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        }
6382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
6392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
6402fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockprivate:
6412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    RefPtr<InspectorWorkerResource> m_worker;
6422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    InspectorAgent::WorkerAction m_action;
6432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block};
6442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
6452fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::postWorkerNotificationToFrontend(const InspectorWorkerResource& worker, InspectorAgent::WorkerAction action)
6462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
6472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!m_frontend)
6482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
6492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(JAVASCRIPT_DEBUGGER)
6502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    switch (action) {
6512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case InspectorAgent::WorkerCreated:
6522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_frontend->didCreateWorker(worker.id(), worker.url(), worker.isSharedWorker());
6532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
6542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case InspectorAgent::WorkerDestroyed:
6552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_frontend->didDestroyWorker(worker.id());
6562fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
6572fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
6582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif
6592fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
6602fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
6612fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::didCreateWorker(intptr_t id, const String& url, bool isSharedWorker)
6622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
6632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!enabled())
6642fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
6652fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
6662fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    RefPtr<InspectorWorkerResource> workerResource(InspectorWorkerResource::create(id, url, isSharedWorker));
6672fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_workers.set(id, workerResource);
6682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (m_inspectedPage && m_frontend)
6692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_inspectedPage->mainFrame()->document()->postTask(PostWorkerNotificationToFrontendTask::create(workerResource, InspectorAgent::WorkerCreated));
6702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
6712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
6722fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::didDestroyWorker(intptr_t id)
6732fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
6742fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!enabled())
6752fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
6762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
6772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    WorkersMap::iterator workerResource = m_workers.find(id);
6782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (workerResource == m_workers.end())
6792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
6802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (m_inspectedPage && m_frontend)
6812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_inspectedPage->mainFrame()->document()->postTask(PostWorkerNotificationToFrontendTask::create(workerResource->second, InspectorAgent::WorkerDestroyed));
6822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_workers.remove(workerResource);
6832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
6842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif // ENABLE(WORKERS)
6852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
6862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(DATABASE)
6872fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::didOpenDatabase(PassRefPtr<Database> database, const String& domain, const String& name, const String& version)
6882fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
6892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!enabled())
6902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
6912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
6922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    RefPtr<InspectorDatabaseResource> resource = InspectorDatabaseResource::create(database, domain, name, version);
6932fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
6942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_databaseResources.set(resource->id(), resource);
6952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
6962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // Resources are only bound while visible.
6972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (m_frontend)
6982fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        resource->bind(m_frontend);
6992fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
7002fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif
7012fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
7022fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::getCookies(RefPtr<InspectorArray>* cookies, WTF::String* cookiesString)
7032fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
7042fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // If we can get raw cookies.
7052fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ListHashSet<Cookie> rawCookiesList;
7062fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
7072fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // If we can't get raw cookies - fall back to String representation
7082fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    String stringCookiesList;
7092fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
7102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // Return value to getRawCookies should be the same for every call because
7112fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // the return value is platform/network backend specific, and the call will
7122fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // always return the same true/false value.
7132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    bool rawCookiesImplemented = false;
7142fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
7152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    for (Frame* frame = m_inspectedPage->mainFrame(); frame; frame = frame->tree()->traverseNext(m_inspectedPage->mainFrame())) {
7162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        Document* document = frame->document();
7172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        const CachedResourceLoader::DocumentResourceMap& allResources = document->cachedResourceLoader()->allCachedResources();
7182fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        CachedResourceLoader::DocumentResourceMap::const_iterator end = allResources.end();
7192fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        for (CachedResourceLoader::DocumentResourceMap::const_iterator it = allResources.begin(); it != end; ++it) {
7202fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            Vector<Cookie> docCookiesList;
7212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            rawCookiesImplemented = getRawCookies(document, KURL(ParsedURLString, it->second->url()), docCookiesList);
7222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
7232fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            if (!rawCookiesImplemented) {
7242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                // FIXME: We need duplication checking for the String representation of cookies.
7252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                ExceptionCode ec = 0;
7262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                stringCookiesList += document->cookie(ec);
7272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                // Exceptions are thrown by cookie() in sandboxed frames. That won't happen here
7282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                // because "document" is the document of the main frame of the page.
7292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                ASSERT(!ec);
7302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            } else {
7312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                int cookiesSize = docCookiesList.size();
7322fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                for (int i = 0; i < cookiesSize; i++) {
7332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                    if (!rawCookiesList.contains(docCookiesList[i]))
7342fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                        rawCookiesList.add(docCookiesList[i]);
7352fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                }
7362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            }
7372fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        }
7382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
7392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
7402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (rawCookiesImplemented)
7412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        *cookies = buildArrayForCookies(rawCookiesList);
7422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    else
7432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        *cookiesString = stringCookiesList;
7442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
7452fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
7462fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockPassRefPtr<InspectorArray> InspectorAgent::buildArrayForCookies(ListHashSet<Cookie>& cookiesList)
7472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
7482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    RefPtr<InspectorArray> cookies = InspectorArray::create();
7492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
7502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ListHashSet<Cookie>::iterator end = cookiesList.end();
7512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ListHashSet<Cookie>::iterator it = cookiesList.begin();
7522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    for (int i = 0; it != end; ++it, i++)
7532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        cookies->pushObject(buildObjectForCookie(*it));
7542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
7552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return cookies;
7562fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
7572fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
7582fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockPassRefPtr<InspectorObject> InspectorAgent::buildObjectForCookie(const Cookie& cookie)
7592fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
7602fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    RefPtr<InspectorObject> value = InspectorObject::create();
7612fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    value->setString("name", cookie.name);
7622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    value->setString("value", cookie.value);
7632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    value->setString("domain", cookie.domain);
7642fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    value->setString("path", cookie.path);
7652fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    value->setNumber("expires", cookie.expires);
7662fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    value->setNumber("size", (cookie.name.length() + cookie.value.length()));
7672fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    value->setBoolean("httpOnly", cookie.httpOnly);
7682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    value->setBoolean("secure", cookie.secure);
7692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    value->setBoolean("session", cookie.session);
7702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return value;
7712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
7722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
7732fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::deleteCookie(const String& cookieName, const String& domain)
7742fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
7752fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    for (Frame* frame = m_inspectedPage->mainFrame(); frame; frame = frame->tree()->traverseNext(m_inspectedPage->mainFrame())) {
7762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        Document* document = frame->document();
7772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (document->url().host() != domain)
7782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            continue;
7792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        const CachedResourceLoader::DocumentResourceMap& allResources = document->cachedResourceLoader()->allCachedResources();
7802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        CachedResourceLoader::DocumentResourceMap::const_iterator end = allResources.end();
7812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        for (CachedResourceLoader::DocumentResourceMap::const_iterator it = allResources.begin(); it != end; ++it)
7822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            WebCore::deleteCookie(document, KURL(ParsedURLString, it->second->url()), cookieName);
7832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
7842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
7852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
7862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(DOM_STORAGE)
7872fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::didUseDOMStorage(StorageArea* storageArea, bool isLocalStorage, Frame* frame)
7882fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
7892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!enabled())
7902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
7912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
7922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    DOMStorageResourcesMap::iterator domStorageEnd = m_domStorageResources.end();
7932fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    for (DOMStorageResourcesMap::iterator it = m_domStorageResources.begin(); it != domStorageEnd; ++it)
7942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (it->second->isSameHostAndType(frame, isLocalStorage))
7952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            return;
7962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
7972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    RefPtr<Storage> domStorage = Storage::create(frame, storageArea);
7982fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    RefPtr<InspectorDOMStorageResource> resource = InspectorDOMStorageResource::create(domStorage.get(), isLocalStorage, frame);
7992fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
8002fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_domStorageResources.set(resource->id(), resource);
8012fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
8022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // Resources are only bound while visible.
8032fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (m_frontend)
8042fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        resource->bind(m_frontend);
8052fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
8062fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif
8072fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
8082fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(WEB_SOCKETS)
8092fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::didCreateWebSocket(unsigned long identifier, const KURL& requestURL, const KURL& documentURL)
8102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
8112fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!enabled())
8122fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
8132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT(m_inspectedPage);
8142fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
8152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (m_resourceAgent)
8162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_resourceAgent->didCreateWebSocket(identifier, requestURL);
8172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    UNUSED_PARAM(documentURL);
8182fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
8192fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
8202fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::willSendWebSocketHandshakeRequest(unsigned long identifier, const WebSocketHandshakeRequest& request)
8212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
8222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (m_resourceAgent)
8232fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_resourceAgent->willSendWebSocketHandshakeRequest(identifier, request);
8242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
8252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
8262fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::didReceiveWebSocketHandshakeResponse(unsigned long identifier, const WebSocketHandshakeResponse& response)
8272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
8282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (m_resourceAgent)
8292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_resourceAgent->didReceiveWebSocketHandshakeResponse(identifier, response);
8302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
8312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
8322fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::didCloseWebSocket(unsigned long identifier)
8332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
8342fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (m_resourceAgent)
8352fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_resourceAgent->didCloseWebSocket(identifier);
8362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
8372fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif // ENABLE(WEB_SOCKETS)
8382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
8392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(JAVASCRIPT_DEBUGGER)
8402fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockbool InspectorAgent::isRecordingUserInitiatedProfile() const
8412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
8422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return m_profilerAgent->isRecordingUserInitiatedProfile();
8432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
8442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
8452fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::startUserInitiatedProfiling()
8462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
8472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!enabled())
8482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
8492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_profilerAgent->startUserInitiatedProfiling();
8502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_state->setBoolean(InspectorAgentState::userInitiatedProfiling, true);
8512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
8522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
8532fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::stopUserInitiatedProfiling()
8542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
8552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!enabled())
8562fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
8572fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_profilerAgent->stopUserInitiatedProfiling();
8582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_state->setBoolean(InspectorAgentState::userInitiatedProfiling, false);
8592fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    showPanel(profilesPanelName);
8602fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
8612fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
8622fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockbool InspectorAgent::profilerEnabled() const
8632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
8642fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return enabled() && m_profilerAgent->enabled();
8652fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
8662fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
8672fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::enableProfiler()
8682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
8692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (profilerEnabled())
8702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
8712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_state->setBoolean(InspectorAgentState::profilerEnabled, true);
8722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_profilerAgent->enable(false);
8732fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
8742fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
8752fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::disableProfiler()
8762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
8772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_state->setBoolean(InspectorAgentState::profilerEnabled, false);
8782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_profilerAgent->disable();
8792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
8802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif
8812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
8822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(JAVASCRIPT_DEBUGGER)
8832fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::showAndEnableDebugger()
8842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
8852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!enabled())
8862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
8872fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
8882fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (debuggerEnabled())
8892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
8902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
8912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!m_frontend) {
8922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_state->setBoolean(InspectorAgentState::debuggerEnabled, true);
8932fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        showPanel(scriptsPanelName);
8942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    } else
8952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        enableDebugger(true);
8962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
8972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
8982fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::enableDebugger(bool eraseStickyBreakpoints)
8992fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
9002fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (debuggerEnabled())
9012fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
9022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_state->setBoolean(InspectorAgentState::debuggerEnabled, true);
9032fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT(m_inspectedPage);
9042fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
9052fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_debuggerAgent = InspectorDebuggerAgent::create(this, m_frontend, eraseStickyBreakpoints);
9062fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_browserDebuggerAgent = InspectorBrowserDebuggerAgent::create(this, eraseStickyBreakpoints);
9072fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
9082fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_frontend->debuggerWasEnabled();
9092fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
9102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
9112fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::disableDebugger()
9122fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
9132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!enabled())
9142fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
9152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT(m_inspectedPage);
9162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_debuggerAgent.clear();
9172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_browserDebuggerAgent.clear();
9182fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
9192fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (m_frontend) {
9202fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_frontend->debuggerWasDisabled();
9212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_state->setBoolean(InspectorAgentState::debuggerEnabled, false);
9222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
9232fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
9242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
9252fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::resume()
9262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
9272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (m_debuggerAgent)
9282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_debuggerAgent->resume();
9292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
9302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif
9312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
9322fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::evaluateForTestInFrontend(long callId, const String& script)
9332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
9342fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (m_frontend)
9352fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_frontend->evaluateForTestInFrontend(callId, script);
9362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    else
9372fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_pendingEvaluateTestCommands.append(pair<long, String>(callId, script));
9382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
9392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
9402fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::didEvaluateForTestInFrontend(long callId, const String& jsonResult)
9412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
9422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ScriptState* scriptState = scriptStateFromPage(debuggerWorld(), m_inspectedPage);
9432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ScriptObject window;
9442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ScriptGlobalObject::get(scriptState, "window", window);
9452fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ScriptFunctionCall function(window, "didEvaluateForTestInFrontend");
9462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    function.appendArgument(callId);
9472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    function.appendArgument(jsonResult);
9482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    function.call();
9492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
9502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
9512fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic Path quadToPath(const FloatQuad& quad)
9522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
9532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    Path quadPath;
9542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    quadPath.moveTo(quad.p1());
9552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    quadPath.addLineTo(quad.p2());
9562fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    quadPath.addLineTo(quad.p3());
9572fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    quadPath.addLineTo(quad.p4());
9582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    quadPath.closeSubpath();
9592fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return quadPath;
9602fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
9612fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
9622fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic void drawOutlinedQuad(GraphicsContext& context, const FloatQuad& quad, const Color& fillColor)
9632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
9642fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    static const int outlineThickness = 2;
9652fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    static const Color outlineColor(62, 86, 180, 228);
9662fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
9672fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    Path quadPath = quadToPath(quad);
9682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
9692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // Clip out the quad, then draw with a 2px stroke to get a pixel
9702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // of outline (because inflating a quad is hard)
9712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    {
9722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        context.save();
9732fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        context.clipOut(quadPath);
9742fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
9752fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        context.setStrokeThickness(outlineThickness);
9762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        context.setStrokeColor(outlineColor, ColorSpaceDeviceRGB);
9772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        context.strokePath(quadPath);
9782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
9792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        context.restore();
9802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
9812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
9822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // Now do the fill
9832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    context.setFillColor(fillColor, ColorSpaceDeviceRGB);
9842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    context.fillPath(quadPath);
9852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
9862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
9872fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic void drawOutlinedQuadWithClip(GraphicsContext& context, const FloatQuad& quad, const FloatQuad& clipQuad, const Color& fillColor)
9882fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
9892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    context.save();
9902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    Path clipQuadPath = quadToPath(clipQuad);
9912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    context.clipOut(clipQuadPath);
9922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    drawOutlinedQuad(context, quad, fillColor);
9932fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    context.restore();
9942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
9952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
9962fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic void drawHighlightForBox(GraphicsContext& context, const FloatQuad& contentQuad, const FloatQuad& paddingQuad, const FloatQuad& borderQuad, const FloatQuad& marginQuad)
9972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
9982fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    static const Color contentBoxColor(125, 173, 217, 128);
9992fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    static const Color paddingBoxColor(125, 173, 217, 160);
10002fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    static const Color borderBoxColor(125, 173, 217, 192);
10012fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    static const Color marginBoxColor(125, 173, 217, 228);
10022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
10032fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (marginQuad != borderQuad)
10042fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        drawOutlinedQuadWithClip(context, marginQuad, borderQuad, marginBoxColor);
10052fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (borderQuad != paddingQuad)
10062fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        drawOutlinedQuadWithClip(context, borderQuad, paddingQuad, borderBoxColor);
10072fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (paddingQuad != contentQuad)
10082fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        drawOutlinedQuadWithClip(context, paddingQuad, contentQuad, paddingBoxColor);
10092fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
10102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    drawOutlinedQuad(context, contentQuad, contentBoxColor);
10112fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
10122fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
10132fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic void drawHighlightForLineBoxesOrSVGRenderer(GraphicsContext& context, const Vector<FloatQuad>& lineBoxQuads)
10142fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
10152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    static const Color lineBoxColor(125, 173, 217, 128);
10162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
10172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    for (size_t i = 0; i < lineBoxQuads.size(); ++i)
10182fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        drawOutlinedQuad(context, lineBoxQuads[i], lineBoxColor);
10192fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
10202fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
10212fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic inline void convertFromFrameToMainFrame(Frame* frame, IntRect& rect)
10222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
10232fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    rect = frame->page()->mainFrame()->view()->windowToContents(frame->view()->contentsToWindow(rect));
10242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
10252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
10262fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic inline IntSize frameToMainFrameOffset(Frame* frame)
10272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
10282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    IntPoint mainFramePoint = frame->page()->mainFrame()->view()->windowToContents(frame->view()->contentsToWindow(IntPoint()));
10292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return mainFramePoint - IntPoint();
10302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
10312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
10322fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::drawNodeHighlight(GraphicsContext& context) const
10332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
10342fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!m_highlightedNode)
10352fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
10362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
10372fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    RenderObject* renderer = m_highlightedNode->renderer();
10382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    Frame* containingFrame = m_highlightedNode->document()->frame();
10392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!renderer || !containingFrame)
10402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
10412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
10422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    IntSize mainFrameOffset = frameToMainFrameOffset(containingFrame);
10432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    IntRect boundingBox = renderer->absoluteBoundingBoxRect(true);
10442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    boundingBox.move(mainFrameOffset);
10452fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
10462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    IntRect titleReferenceBox = boundingBox;
10472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
10482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT(m_inspectedPage);
10492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
10502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    FrameView* view = m_inspectedPage->mainFrame()->view();
10512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    FloatRect overlayRect = view->visibleContentRect();
10522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!overlayRect.contains(boundingBox) && !boundingBox.contains(enclosingIntRect(overlayRect)))
10532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        overlayRect = view->visibleContentRect();
10542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    context.translate(-overlayRect.x(), -overlayRect.y());
10552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
10562fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // RenderSVGRoot should be highlighted through the isBox() code path, all other SVG elements should just dump their absoluteQuads().
10572fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(SVG)
10582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    bool isSVGRenderer = renderer->node() && renderer->node()->isSVGElement() && !renderer->isSVGRoot();
10592fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#else
10602fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    bool isSVGRenderer = false;
10612fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif
10622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
10632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (renderer->isBox() && !isSVGRenderer) {
10642fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        RenderBox* renderBox = toRenderBox(renderer);
10652fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
10662fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        IntRect contentBox = renderBox->contentBoxRect();
10672fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
10682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        IntRect paddingBox(contentBox.x() - renderBox->paddingLeft(), contentBox.y() - renderBox->paddingTop(),
10692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                           contentBox.width() + renderBox->paddingLeft() + renderBox->paddingRight(), contentBox.height() + renderBox->paddingTop() + renderBox->paddingBottom());
10702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        IntRect borderBox(paddingBox.x() - renderBox->borderLeft(), paddingBox.y() - renderBox->borderTop(),
10712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                          paddingBox.width() + renderBox->borderLeft() + renderBox->borderRight(), paddingBox.height() + renderBox->borderTop() + renderBox->borderBottom());
10722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        IntRect marginBox(borderBox.x() - renderBox->marginLeft(), borderBox.y() - renderBox->marginTop(),
10732fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                          borderBox.width() + renderBox->marginLeft() + renderBox->marginRight(), borderBox.height() + renderBox->marginTop() + renderBox->marginBottom());
10742fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
10752fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        titleReferenceBox = marginBox;
10762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        titleReferenceBox.move(mainFrameOffset);
10772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        titleReferenceBox.move(boundingBox.x(), boundingBox.y());
10782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
10792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        FloatQuad absContentQuad = renderBox->localToAbsoluteQuad(FloatRect(contentBox));
10802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        FloatQuad absPaddingQuad = renderBox->localToAbsoluteQuad(FloatRect(paddingBox));
10812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        FloatQuad absBorderQuad = renderBox->localToAbsoluteQuad(FloatRect(borderBox));
10822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        FloatQuad absMarginQuad = renderBox->localToAbsoluteQuad(FloatRect(marginBox));
10832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
10842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        absContentQuad.move(mainFrameOffset);
10852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        absPaddingQuad.move(mainFrameOffset);
10862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        absBorderQuad.move(mainFrameOffset);
10872fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        absMarginQuad.move(mainFrameOffset);
10882fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
10892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        drawHighlightForBox(context, absContentQuad, absPaddingQuad, absBorderQuad, absMarginQuad);
10902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    } else if (renderer->isRenderInline() || isSVGRenderer) {
10912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        // FIXME: We should show margins/padding/border for inlines.
10922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        Vector<FloatQuad> lineBoxQuads;
10932fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        renderer->absoluteQuads(lineBoxQuads);
10942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        for (unsigned i = 0; i < lineBoxQuads.size(); ++i)
10952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            lineBoxQuads[i] += mainFrameOffset;
10962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
10972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        drawHighlightForLineBoxesOrSVGRenderer(context, lineBoxQuads);
10982fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
10992fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
11002fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // Draw node title if necessary.
11012fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
11022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!m_highlightedNode->isElementNode())
11032fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
11042fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
11052fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    WebCore::Settings* settings = containingFrame->settings();
11062fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    drawElementTitle(context, titleReferenceBox, overlayRect, settings);
11072fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
11082fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
11092fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::drawElementTitle(GraphicsContext& context, const IntRect& boundingBox, const FloatRect& overlayRect, WebCore::Settings* settings) const
11102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
11112fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    static const int rectInflatePx = 4;
11122fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    static const int fontHeightPx = 12;
11132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    static const int borderWidthPx = 1;
11142fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    static const Color tooltipBackgroundColor(255, 255, 194, 255);
11152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    static const Color tooltipBorderColor(Color::black);
11162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    static const Color tooltipFontColor(Color::black);
11172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
11182fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    Element* element = static_cast<Element*>(m_highlightedNode.get());
11192fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    bool isXHTML = element->document()->isXHTMLDocument();
11202fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    String nodeTitle = isXHTML ? element->nodeName() : element->nodeName().lower();
11212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    const AtomicString& idValue = element->getIdAttribute();
11222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!idValue.isNull() && !idValue.isEmpty()) {
11232fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        nodeTitle += "#";
11242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        nodeTitle += idValue;
11252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
11262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (element->hasClass() && element->isStyledElement()) {
11272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        const SpaceSplitString& classNamesString = static_cast<StyledElement*>(element)->classNames();
11282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        size_t classNameCount = classNamesString.size();
11292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (classNameCount) {
11302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            HashSet<AtomicString> usedClassNames;
11312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            for (size_t i = 0; i < classNameCount; ++i) {
11322fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                const AtomicString& className = classNamesString[i];
11332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                if (usedClassNames.contains(className))
11342fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                    continue;
11352fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                usedClassNames.add(className);
11362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                nodeTitle += ".";
11372fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                nodeTitle += className;
11382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            }
11392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        }
11402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
11412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
11422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    Element* highlightedElement = m_highlightedNode->isElementNode() ? static_cast<Element*>(m_highlightedNode.get()) : 0;
11432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    nodeTitle += " [";
11442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    nodeTitle += String::number(highlightedElement ? highlightedElement->offsetWidth() : boundingBox.width());
11452fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    nodeTitle.append(static_cast<UChar>(0x00D7)); // &times;
11462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    nodeTitle += String::number(highlightedElement ? highlightedElement->offsetHeight() : boundingBox.height());
11472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    nodeTitle += "]";
11482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
11492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    FontDescription desc;
11502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    FontFamily family;
11512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    family.setFamily(settings->fixedFontFamily());
11522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    desc.setFamily(family);
11532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    desc.setComputedSize(fontHeightPx);
11542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    Font font = Font(desc, 0, 0);
11552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    font.update(0);
11562fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
11572fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    TextRun nodeTitleRun(nodeTitle);
11582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    IntPoint titleBasePoint = IntPoint(boundingBox.x(), boundingBox.maxY() - 1);
11592fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    titleBasePoint.move(rectInflatePx, rectInflatePx);
11602fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    IntRect titleRect = enclosingIntRect(font.selectionRectForText(nodeTitleRun, titleBasePoint, fontHeightPx));
11612fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    titleRect.inflate(rectInflatePx);
11622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
11632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // The initial offsets needed to compensate for a 1px-thick border stroke (which is not a part of the rectangle).
11642fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    int dx = -borderWidthPx;
11652fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    int dy = borderWidthPx;
11662fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
11672fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // If the tip sticks beyond the right of overlayRect, right-align the tip with the said boundary.
11682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (titleRect.maxX() > overlayRect.maxX())
11692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        dx = overlayRect.maxX() - titleRect.maxX();
11702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
11712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // If the tip sticks beyond the left of overlayRect, left-align the tip with the said boundary.
11722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (titleRect.x() + dx < overlayRect.x())
11732fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        dx = overlayRect.x() - titleRect.x() - borderWidthPx;
11742fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
11752fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // If the tip sticks beyond the bottom of overlayRect, show the tip at top of bounding box.
11762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (titleRect.maxY() > overlayRect.maxY()) {
11772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        dy = boundingBox.y() - titleRect.maxY() - borderWidthPx;
11782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        // If the tip still sticks beyond the bottom of overlayRect, bottom-align the tip with the said boundary.
11792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (titleRect.maxY() + dy > overlayRect.maxY())
11802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            dy = overlayRect.maxY() - titleRect.maxY();
11812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
11822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
11832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // If the tip sticks beyond the top of overlayRect, show the tip at top of overlayRect.
11842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (titleRect.y() + dy < overlayRect.y())
11852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        dy = overlayRect.y() - titleRect.y() + borderWidthPx;
11862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
11872fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    titleRect.move(dx, dy);
11882fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    context.setStrokeColor(tooltipBorderColor, ColorSpaceDeviceRGB);
11892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    context.setStrokeThickness(borderWidthPx);
11902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    context.setFillColor(tooltipBackgroundColor, ColorSpaceDeviceRGB);
11912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    context.drawRect(titleRect);
11922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    context.setFillColor(tooltipFontColor, ColorSpaceDeviceRGB);
11932fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    context.drawText(font, nodeTitleRun, IntPoint(titleRect.x() + rectInflatePx, titleRect.y() + font.fontMetrics().height()));
11942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
11952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
11962fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::openInInspectedWindow(const String& url)
11972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
11982fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    Frame* mainFrame = m_inspectedPage->mainFrame();
11992fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
12002fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    FrameLoadRequest request(mainFrame->document()->securityOrigin(), ResourceRequest(), "_blank");
12012fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
12022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    bool created;
12032fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    WindowFeatures windowFeatures;
12042fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    Frame* newFrame = WebCore::createWindow(mainFrame, mainFrame, request, windowFeatures, created);
12052fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!newFrame)
12062fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
12072fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
12082fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    UserGestureIndicator indicator(DefinitelyProcessingUserGesture);
12092fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    newFrame->loader()->setOpener(mainFrame);
12102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    newFrame->page()->setOpenedByDOM();
12112fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    newFrame->loader()->changeLocation(mainFrame->document()->securityOrigin(), newFrame->loader()->completeURL(url), "", false, false);
12122fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
12132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
12142fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::addScriptToEvaluateOnLoad(const String& source)
12152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
12162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_scriptsToEvaluateOnLoad.append(source);
12172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
12182fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
12192fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::removeAllScriptsToEvaluateOnLoad()
12202fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
12212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_scriptsToEvaluateOnLoad.clear();
12222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
12232fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
12242fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::setInspectorExtensionAPI(const String& source)
12252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
12262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_inspectorExtensionAPI = source;
12272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
12282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
12292fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockKURL InspectorAgent::inspectedURL() const
12302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
12312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return m_inspectedPage->mainFrame()->document()->url();
12322fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
12332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
12342fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockKURL InspectorAgent::inspectedURLWithoutFragment() const
12352fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
12362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    KURL url = inspectedURL();
12372fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    url.removeFragmentIdentifier();
12382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return url;
12392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
12402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
12412fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::reloadPage(bool ignoreCache)
12422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
12432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_inspectedPage->mainFrame()->loader()->reload(ignoreCache);
12442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
12452fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
12462fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockbool InspectorAgent::enabled() const
12472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
12482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!m_inspectedPage)
12492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return false;
12502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return m_inspectedPage->settings()->developerExtrasEnabled();
12512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
12522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
12532fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::showConsole()
12542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
12552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    showPanel(consolePanelName);
12562fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
12572fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
12582fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::showPanel(const String& panel)
12592fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
12602fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!m_frontend) {
12612fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_requiredPanel = panel;
12622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
12632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
12642fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_frontend->showPanel(panel);
12652fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
12662fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
12672fc2651226baac27029e38c9d6ef883fa32084dbSteve Block} // namespace WebCore
12682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
12692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif // ENABLE(INSPECTOR)
1270