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)); // × 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