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>
42bde8e466a4451c7319e3a072d118917957d6554Steve Block * Copyright (C) 2011 Google Inc. All rights reserved.
52fc2651226baac27029e38c9d6ef883fa32084dbSteve Block *
62fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * Redistribution and use in source and binary forms, with or without
72fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * modification, are permitted provided that the following conditions
82fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * are met:
92fc2651226baac27029e38c9d6ef883fa32084dbSteve Block *
102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * 1.  Redistributions of source code must retain the above copyright
112fc2651226baac27029e38c9d6ef883fa32084dbSteve Block *     notice, this list of conditions and the following disclaimer.
122fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * 2.  Redistributions in binary form must reproduce the above copyright
132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block *     notice, this list of conditions and the following disclaimer in the
142fc2651226baac27029e38c9d6ef883fa32084dbSteve Block *     documentation and/or other materials provided with the distribution.
152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block *     its contributors may be used to endorse or promote products derived
172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block *     from this software without specific prior written permission.
182fc2651226baac27029e38c9d6ef883fa32084dbSteve Block *
192fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
202fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
232fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block */
302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "config.h"
322fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "InspectorAgent.h"
332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
342fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(INSPECTOR)
352fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "Document.h"
372fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "DocumentLoader.h"
382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "Frame.h"
392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "GraphicsContext.h"
402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "InjectedScriptHost.h"
412bde8e466a4451c7319e3a072d118917957d6554Steve Block#include "InjectedScriptManager.h"
422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "InspectorBrowserDebuggerAgent.h"
432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "InspectorCSSAgent.h"
442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "InspectorClient.h"
452fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "InspectorConsoleAgent.h"
462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "InspectorController.h"
472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "InspectorDOMAgent.h"
482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "InspectorFrontend.h"
492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "InspectorInstrumentation.h"
502bde8e466a4451c7319e3a072d118917957d6554Steve Block#include "InspectorPageAgent.h"
512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "InspectorProfilerAgent.h"
522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "InspectorResourceAgent.h"
532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "InspectorRuntimeAgent.h"
542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "InspectorState.h"
552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "InspectorTimelineAgent.h"
562fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "InspectorValues.h"
572fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "InspectorWorkerResource.h"
5881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include "InstrumentingAgents.h"
592fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "Page.h"
602bde8e466a4451c7319e3a072d118917957d6554Steve Block#include "PageDebuggerAgent.h"
612fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "ResourceRequest.h"
622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "ScriptFunctionCall.h"
632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "ScriptObject.h"
642fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "ScriptState.h"
652fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "Settings.h"
662fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
672fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(DATABASE)
682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "InspectorDatabaseAgent.h"
692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif
702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(DOM_STORAGE)
722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "InspectorDOMStorageAgent.h"
732fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif
742fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
752fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(OFFLINE_WEB_APPLICATIONS)
762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "InspectorApplicationCacheAgent.h"
772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif
782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
792fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockusing namespace std;
802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
812fc2651226baac27029e38c9d6ef883fa32084dbSteve Blocknamespace WebCore {
822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
832fc2651226baac27029e38c9d6ef883fa32084dbSteve Blocknamespace InspectorAgentState {
842fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic const char timelineProfilerEnabled[] = "timelineProfilerEnabled";
852fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic const char debuggerEnabled[] = "debuggerEnabled";
862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
872fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
882fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic const char scriptsPanelName[] = "scripts";
892fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic const char consolePanelName[] = "console";
902fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic const char profilesPanelName[] = "profiles";
912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochnamespace {
932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochclass PageRuntimeAgent : public InspectorRuntimeAgent {
952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochpublic:
962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    PageRuntimeAgent(InjectedScriptManager* injectedScriptManager, Page* page)
972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        : InspectorRuntimeAgent(injectedScriptManager)
982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        , m_inspectedPage(page) { }
992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    virtual ~PageRuntimeAgent() { }
1002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
1012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochprivate:
1022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    virtual ScriptState* getDefaultInspectedState() { return mainWorldScriptState(m_inspectedPage->mainFrame()); }
1032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    Page* m_inspectedPage;
1042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch};
1052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
1062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
1072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
1082bde8e466a4451c7319e3a072d118917957d6554Steve BlockInspectorAgent::InspectorAgent(Page* page, InspectorClient* client, InjectedScriptManager* injectedScriptManager)
1092fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    : m_inspectedPage(page)
1102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    , m_client(client)
1112fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    , m_frontend(0)
11281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    , m_instrumentingAgents(new InstrumentingAgents())
1132bde8e466a4451c7319e3a072d118917957d6554Steve Block    , m_injectedScriptManager(injectedScriptManager)
11481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    , m_state(new InspectorState(client))
1152bde8e466a4451c7319e3a072d118917957d6554Steve Block    , m_pageAgent(InspectorPageAgent::create(m_instrumentingAgents.get(), page, injectedScriptManager))
1162bde8e466a4451c7319e3a072d118917957d6554Steve Block    , m_domAgent(InspectorDOMAgent::create(m_instrumentingAgents.get(), page, m_client, m_state.get(), injectedScriptManager))
11781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    , m_cssAgent(new InspectorCSSAgent(m_instrumentingAgents.get(), m_domAgent.get()))
11881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if ENABLE(DATABASE)
1192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    , m_databaseAgent(InspectorDatabaseAgent::create(m_instrumentingAgents.get(), m_state.get()))
12081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#endif
12181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if ENABLE(DOM_STORAGE)
12281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    , m_domStorageAgent(InspectorDOMStorageAgent::create(m_instrumentingAgents.get()))
12381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#endif
12481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    , m_timelineAgent(InspectorTimelineAgent::create(m_instrumentingAgents.get(), m_state.get()))
12581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if ENABLE(OFFLINE_WEB_APPLICATIONS)
12681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    , m_applicationCacheAgent(new InspectorApplicationCacheAgent(m_instrumentingAgents.get(), page))
12781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#endif
12881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    , m_resourceAgent(InspectorResourceAgent::create(m_instrumentingAgents.get(), page, m_state.get()))
1292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    , m_runtimeAgent(adoptPtr(new PageRuntimeAgent(m_injectedScriptManager, page)))
1302bde8e466a4451c7319e3a072d118917957d6554Steve Block    , m_consoleAgent(new InspectorConsoleAgent(m_instrumentingAgents.get(), this, m_state.get(), injectedScriptManager, m_domAgent.get()))
1312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(JAVASCRIPT_DEBUGGER)
1322bde8e466a4451c7319e3a072d118917957d6554Steve Block    , m_debuggerAgent(PageDebuggerAgent::create(m_instrumentingAgents.get(), m_state.get(), page, injectedScriptManager))
13381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    , m_browserDebuggerAgent(InspectorBrowserDebuggerAgent::create(m_instrumentingAgents.get(), m_state.get(), m_domAgent.get(), m_debuggerAgent.get(), this))
1342bde8e466a4451c7319e3a072d118917957d6554Steve Block    , m_profilerAgent(InspectorProfilerAgent::create(m_instrumentingAgents.get(), m_consoleAgent.get(), page, m_state.get()))
1352fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif
13681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    , m_canIssueEvaluateForTestInFrontend(false)
1372fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
1382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT_ARG(page, page);
1392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT_ARG(client, client);
1402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    InspectorInstrumentation::bindInspectorAgent(m_inspectedPage, this);
1412bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_instrumentingAgents->setInspectorAgent(this);
1422bde8e466a4451c7319e3a072d118917957d6554Steve Block
1432bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_injectedScriptManager->injectedScriptHost()->init(this
1442bde8e466a4451c7319e3a072d118917957d6554Steve Block        , m_consoleAgent.get()
1452bde8e466a4451c7319e3a072d118917957d6554Steve Block#if ENABLE(DATABASE)
1462bde8e466a4451c7319e3a072d118917957d6554Steve Block        , m_databaseAgent.get()
1472bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif
1482bde8e466a4451c7319e3a072d118917957d6554Steve Block#if ENABLE(DOM_STORAGE)
1492bde8e466a4451c7319e3a072d118917957d6554Steve Block        , m_domStorageAgent.get()
1502bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif
1512bde8e466a4451c7319e3a072d118917957d6554Steve Block#if ENABLE(JAVASCRIPT_DEBUGGER)
1522bde8e466a4451c7319e3a072d118917957d6554Steve Block        , m_debuggerAgent.get()
1532bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif
1542bde8e466a4451c7319e3a072d118917957d6554Steve Block    );
1552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
1562fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1572fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockInspectorAgent::~InspectorAgent()
1582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
1592bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_instrumentingAgents->setInspectorAgent(0);
1602bde8e466a4451c7319e3a072d118917957d6554Steve Block
1612fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // These should have been cleared in inspectedPageDestroyed().
1622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT(!m_client);
1632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT(!m_inspectedPage);
1642fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
1652fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1662fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::inspectedPageDestroyed()
1672fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
16881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (m_frontend) {
16981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        m_frontend->inspector()->disconnectFromBackend();
17081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        disconnectFrontend();
17181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
1722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1732fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(JAVASCRIPT_DEBUGGER)
1742fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_browserDebuggerAgent.clear();
17581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_debuggerAgent.clear();
1762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif
1772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT(m_inspectedPage);
1792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    InspectorInstrumentation::unbindInspectorAgent(m_inspectedPage);
1802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_inspectedPage = 0;
1812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1822bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_injectedScriptManager->disconnect();
1832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_client->inspectorDestroyed();
1852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_client = 0;
1862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
1872fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1882fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::restoreInspectorStateFromCookie(const String& inspectorStateCookie)
1892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
19081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_state->loadFromCookie(inspectorStateCookie);
1912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
19281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_frontend->inspector()->frontendReused();
1932bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_pageAgent->restore();
1942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1952bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_domAgent->restore();
19681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_resourceAgent->restore();
19781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_timelineAgent->restore();
1982fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if ENABLE(DATABASE)
2002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    m_databaseAgent->restore();
2012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif
2022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
2032fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(JAVASCRIPT_DEBUGGER)
20481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_debuggerAgent->restore();
2052bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_profilerAgent->restore();
2062fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif
2072fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
2082fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
2092fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::didClearWindowObjectInWorld(Frame* frame, DOMWrapperWorld* world)
2102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
2112fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (world != mainThreadNormalWorld())
2122fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
2132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
2142fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!m_inspectorExtensionAPI.isEmpty())
2152bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_injectedScriptManager->injectScript(m_inspectorExtensionAPI, mainWorldScriptState(frame));
2162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
2172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
2182fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::setFrontend(InspectorFrontend* inspectorFrontend)
2192fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
22081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // We can reconnect to existing front-end -> unmute state.
22181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_state->unmute();
22281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
2232fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_frontend = inspectorFrontend;
2242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
22581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if ENABLE(OFFLINE_WEB_APPLICATIONS)
22681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_applicationCacheAgent->setFrontend(m_frontend);
22781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#endif
2282bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_pageAgent->setFrontend(m_frontend);
22981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_domAgent->setFrontend(m_frontend);
2302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_consoleAgent->setFrontend(m_frontend);
23181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_timelineAgent->setFrontend(m_frontend);
23281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_resourceAgent->setFrontend(m_frontend);
23381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if ENABLE(JAVASCRIPT_DEBUGGER)
23481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_debuggerAgent->setFrontend(m_frontend);
2352bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_profilerAgent->setFrontend(m_frontend);
23681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#endif
23781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if ENABLE(DATABASE)
23881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_databaseAgent->setFrontend(m_frontend);
23981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#endif
24081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if ENABLE(DOM_STORAGE)
24181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_domStorageAgent->setFrontend(m_frontend);
24281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#endif
2432bde8e466a4451c7319e3a072d118917957d6554Steve Block
2442bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (!m_showPanelAfterVisible.isEmpty()) {
2452bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_frontend->inspector()->showPanel(m_showPanelAfterVisible);
2462bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_showPanelAfterVisible = String();
2472bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
2482bde8e466a4451c7319e3a072d118917957d6554Steve Block#if ENABLE(JAVASCRIPT_DEBUGGER) && ENABLE(WORKERS)
2492bde8e466a4451c7319e3a072d118917957d6554Steve Block    WorkersMap::iterator workersEnd = m_workers.end();
2502bde8e466a4451c7319e3a072d118917957d6554Steve Block    for (WorkersMap::iterator it = m_workers.begin(); it != workersEnd; ++it) {
2512bde8e466a4451c7319e3a072d118917957d6554Steve Block        InspectorWorkerResource* worker = it->second.get();
2522bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_frontend->inspector()->didCreateWorker(worker->id(), worker->url(), worker->isSharedWorker());
2532bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
2542bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif
2552bde8e466a4451c7319e3a072d118917957d6554Steve Block    // Dispatch pending frontend commands
2562bde8e466a4451c7319e3a072d118917957d6554Steve Block    issueEvaluateForTestCommands();
2572fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
2582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
2592fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::disconnectFrontend()
2602fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
2612fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!m_frontend)
2622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
2632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
26481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_canIssueEvaluateForTestInFrontend = false;
26581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_pendingEvaluateTestCommands.clear();
26681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
2672fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // Destroying agents would change the state, but we don't want that.
2682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // Pre-disconnect state will be used to restore inspector agents.
2692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_state->mute();
2702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
2712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_frontend = 0;
2722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
2732fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(JAVASCRIPT_DEBUGGER)
27481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_debuggerAgent->clearFrontend();
27581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_browserDebuggerAgent->clearFrontend();
27681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_profilerAgent->clearFrontend();
2772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif
2782bde8e466a4451c7319e3a072d118917957d6554Steve Block
27981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if ENABLE(OFFLINE_WEB_APPLICATIONS)
28081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_applicationCacheAgent->clearFrontend();
28181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#endif
2822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
28381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_consoleAgent->clearFrontend();
28481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_domAgent->clearFrontend();
28581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_timelineAgent->clearFrontend();
28681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_resourceAgent->clearFrontend();
28781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if ENABLE(DATABASE)
28881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_databaseAgent->clearFrontend();
28981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#endif
29081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if ENABLE(DOM_STORAGE)
29181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_domStorageAgent->clearFrontend();
29281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#endif
2932bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_pageAgent->clearFrontend();
2942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
2952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
2962bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid InspectorAgent::didCommitLoad()
2972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
2982bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (m_frontend)
29981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        m_frontend->inspector()->reset();
3002bde8e466a4451c7319e3a072d118917957d6554Steve Block
3012bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_injectedScriptManager->discardInjectedScripts();
3022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(WORKERS)
30381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_workers.clear();
3042fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif
3052fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
3062fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3072bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid InspectorAgent::domContentLoadedEventFired()
3082fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
3092bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_injectedScriptManager->injectedScriptHost()->clearInspectedNodes();
3102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
3112fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3122fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockbool InspectorAgent::isMainResourceLoader(DocumentLoader* loader, const KURL& requestUrl)
3132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
3142fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return loader->frame() == m_inspectedPage->mainFrame() && requestUrl == loader->requestURL();
3152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
3162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(WORKERS)
3182fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockclass PostWorkerNotificationToFrontendTask : public ScriptExecutionContext::Task {
3192fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockpublic:
3202fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    static PassOwnPtr<PostWorkerNotificationToFrontendTask> create(PassRefPtr<InspectorWorkerResource> worker, InspectorAgent::WorkerAction action)
3212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    {
3222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return new PostWorkerNotificationToFrontendTask(worker, action);
3232fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
3242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3252fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockprivate:
3262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    PostWorkerNotificationToFrontendTask(PassRefPtr<InspectorWorkerResource> worker, InspectorAgent::WorkerAction action)
3272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        : m_worker(worker)
3282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        , m_action(action)
3292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    {
3302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
3312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3322fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    virtual void performTask(ScriptExecutionContext* scriptContext)
3332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    {
3342fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (scriptContext->isDocument()) {
3352fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            if (InspectorAgent* inspectorAgent = static_cast<Document*>(scriptContext)->page()->inspectorController()->m_inspectorAgent.get())
3362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                inspectorAgent->postWorkerNotificationToFrontend(*m_worker, m_action);
3372fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        }
3382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
3392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3402fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockprivate:
3412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    RefPtr<InspectorWorkerResource> m_worker;
3422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    InspectorAgent::WorkerAction m_action;
3432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block};
3442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3452fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::postWorkerNotificationToFrontend(const InspectorWorkerResource& worker, InspectorAgent::WorkerAction action)
3462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
3472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!m_frontend)
3482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
3492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(JAVASCRIPT_DEBUGGER)
3502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    switch (action) {
3512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case InspectorAgent::WorkerCreated:
3522bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_frontend->inspector()->didCreateWorker(worker.id(), worker.url(), worker.isSharedWorker());
3532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
3542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case InspectorAgent::WorkerDestroyed:
3552bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_frontend->inspector()->didDestroyWorker(worker.id());
3562fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
3572fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
3582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif
3592fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
3602fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3612fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::didCreateWorker(intptr_t id, const String& url, bool isSharedWorker)
3622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
3632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!enabled())
3642fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
3652fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3662fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    RefPtr<InspectorWorkerResource> workerResource(InspectorWorkerResource::create(id, url, isSharedWorker));
3672fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_workers.set(id, workerResource);
3682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (m_inspectedPage && m_frontend)
3692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_inspectedPage->mainFrame()->document()->postTask(PostWorkerNotificationToFrontendTask::create(workerResource, InspectorAgent::WorkerCreated));
3702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
3712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3722fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::didDestroyWorker(intptr_t id)
3732fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
3742fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!enabled())
3752fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
3762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    WorkersMap::iterator workerResource = m_workers.find(id);
3782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (workerResource == m_workers.end())
3792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
3802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (m_inspectedPage && m_frontend)
3812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_inspectedPage->mainFrame()->document()->postTask(PostWorkerNotificationToFrontendTask::create(workerResource->second, InspectorAgent::WorkerDestroyed));
3822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_workers.remove(workerResource);
3832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
3842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif // ENABLE(WORKERS)
3852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(JAVASCRIPT_DEBUGGER)
3872bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid InspectorAgent::showProfilesPanel()
3882fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
3892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    showPanel(profilesPanelName);
3902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
3912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif
3922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3932fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::evaluateForTestInFrontend(long callId, const String& script)
3942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
39581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_pendingEvaluateTestCommands.append(pair<long, String>(callId, script));
39681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (m_canIssueEvaluateForTestInFrontend)
39781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        issueEvaluateForTestCommands();
3982fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
3992fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
4002fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::setInspectorExtensionAPI(const String& source)
4012fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
4022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_inspectorExtensionAPI = source;
4032fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
4042fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
4052fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockKURL InspectorAgent::inspectedURL() const
4062fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
4072fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return m_inspectedPage->mainFrame()->document()->url();
4082fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
4092fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
4102fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockKURL InspectorAgent::inspectedURLWithoutFragment() const
4112fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
4122fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    KURL url = inspectedURL();
4132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    url.removeFragmentIdentifier();
4142fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return url;
4152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
4162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
4172fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockbool InspectorAgent::enabled() const
4182fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
4192fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!m_inspectedPage)
4202fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return false;
4212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return m_inspectedPage->settings()->developerExtrasEnabled();
4222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
4232fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
4242fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::showConsole()
4252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
4262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    showPanel(consolePanelName);
4272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
4282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
4292fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid InspectorAgent::showPanel(const String& panel)
4302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
4312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!m_frontend) {
43281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        m_showPanelAfterVisible = panel;
4332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
4342fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
43581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_frontend->inspector()->showPanel(panel);
43681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
43781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
43881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid InspectorAgent::issueEvaluateForTestCommands()
43981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
44081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (m_frontend) {
44181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        Vector<pair<long, String> > copy = m_pendingEvaluateTestCommands;
44281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        m_pendingEvaluateTestCommands.clear();
44381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        for (Vector<pair<long, String> >::iterator it = copy.begin(); m_frontend && it != copy.end(); ++it)
44481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            m_frontend->inspector()->evaluateForTestInFrontend((*it).first, (*it).second);
44581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        m_canIssueEvaluateForTestInFrontend = true;
44681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
4472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
4482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
4492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block} // namespace WebCore
4502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
4512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif // ENABLE(INSPECTOR)
452