Web Inspector: Remove InspectorState
[WebKit-https.git] / Source / WebCore / inspector / PageRuntimeAgent.cpp
1 /*
2  * Copyright (C) 2011 Google Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are
6  * met:
7  *
8  *     * Redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer.
10  *     * Redistributions in binary form must reproduce the above
11  * copyright notice, this list of conditions and the following disclaimer
12  * in the documentation and/or other materials provided with the
13  * distribution.
14  *     * Neither the name of Google Inc. nor the names of its
15  * contributors may be used to endorse or promote products derived from
16  * this software without specific prior written permission.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29  */
30
31 #include "config.h"
32
33 #if ENABLE(INSPECTOR)
34
35 #include "PageRuntimeAgent.h"
36
37 #include "Document.h"
38 #include "InjectedScript.h"
39 #include "InjectedScriptManager.h"
40 #include "InspectorPageAgent.h"
41 #include "InstrumentingAgents.h"
42 #include "MainFrame.h"
43 #include "Page.h"
44 #include "PageConsole.h"
45 #include "ScriptController.h"
46 #include "SecurityOrigin.h"
47
48 using WebCore::TypeBuilder::Runtime::ExecutionContextDescription;
49
50 namespace WebCore {
51
52 PageRuntimeAgent::PageRuntimeAgent(InstrumentingAgents* instrumentingAgents, InjectedScriptManager* injectedScriptManager, Page* page, InspectorPageAgent* pageAgent)
53     : InspectorRuntimeAgent(instrumentingAgents, injectedScriptManager)
54     , m_inspectedPage(page)
55     , m_pageAgent(pageAgent)
56     , m_frontend(0)
57     , m_mainWorldContextCreated(false)
58 {
59     m_instrumentingAgents->setPageRuntimeAgent(this);
60 }
61
62 PageRuntimeAgent::~PageRuntimeAgent()
63 {
64     m_instrumentingAgents->setPageRuntimeAgent(0);
65 }
66
67 void PageRuntimeAgent::setFrontend(InspectorFrontend* frontend)
68 {
69     m_frontend = frontend->runtime();
70 }
71
72 void PageRuntimeAgent::clearFrontend()
73 {
74     m_frontend = 0;
75     String errorString;
76     disable(&errorString);
77 }
78
79 void PageRuntimeAgent::enable(ErrorString* errorString)
80 {
81     if (m_enabled)
82         return;
83
84     InspectorRuntimeAgent::enable(errorString);
85
86     // Only report existing contexts if the page did commit load, otherwise we may
87     // unintentionally initialize contexts in the frames which may trigger some listeners
88     // that are expected to be triggered only after the load is committed, see http://crbug.com/131623
89     if (m_mainWorldContextCreated)
90         reportExecutionContextCreation();
91 }
92
93 void PageRuntimeAgent::disable(ErrorString* errorString)
94 {
95     if (!m_enabled)
96         return;
97
98     InspectorRuntimeAgent::disable(errorString);
99 }
100
101 void PageRuntimeAgent::didCreateMainWorldContext(Frame* frame)
102 {
103     m_mainWorldContextCreated = true;
104
105     if (!m_enabled)
106         return;
107     ASSERT(m_frontend);
108     String frameId = m_pageAgent->frameId(frame);
109     JSC::ExecState* scriptState = mainWorldExecState(frame);
110     notifyContextCreated(frameId, scriptState, 0, true);
111 }
112
113 void PageRuntimeAgent::didCreateIsolatedContext(Frame* frame, JSC::ExecState* scriptState, SecurityOrigin* origin)
114 {
115     if (!m_enabled)
116         return;
117     ASSERT(m_frontend);
118     String frameId = m_pageAgent->frameId(frame);
119     notifyContextCreated(frameId, scriptState, origin, false);
120 }
121
122 InjectedScript PageRuntimeAgent::injectedScriptForEval(ErrorString* errorString, const int* executionContextId)
123 {
124     if (!executionContextId) {
125         JSC::ExecState* scriptState = mainWorldExecState(&m_inspectedPage->mainFrame());
126         InjectedScript result = injectedScriptManager()->injectedScriptFor(scriptState);
127         if (result.hasNoValue())
128             *errorString = "Internal error: main world execution context not found.";
129         return result;
130     }
131     InjectedScript injectedScript = injectedScriptManager()->injectedScriptForId(*executionContextId);
132     if (injectedScript.hasNoValue())
133         *errorString = "Execution context with given id not found.";
134     return injectedScript;
135 }
136
137 void PageRuntimeAgent::muteConsole()
138 {
139     PageConsole::mute();
140 }
141
142 void PageRuntimeAgent::unmuteConsole()
143 {
144     PageConsole::unmute();
145 }
146
147 void PageRuntimeAgent::reportExecutionContextCreation()
148 {
149     Vector<std::pair<JSC::ExecState*, SecurityOrigin*>> isolatedContexts;
150     for (Frame* frame = &m_inspectedPage->mainFrame(); frame; frame = frame->tree().traverseNext()) {
151         if (!frame->script().canExecuteScripts(NotAboutToExecuteScript))
152             continue;
153         String frameId = m_pageAgent->frameId(frame);
154
155         JSC::ExecState* scriptState = mainWorldExecState(frame);
156         notifyContextCreated(frameId, scriptState, 0, true);
157         frame->script().collectIsolatedContexts(isolatedContexts);
158         if (isolatedContexts.isEmpty())
159             continue;
160         for (size_t i = 0; i< isolatedContexts.size(); i++)
161             notifyContextCreated(frameId, isolatedContexts[i].first, isolatedContexts[i].second, false);
162         isolatedContexts.clear();
163     }
164 }
165
166 void PageRuntimeAgent::notifyContextCreated(const String& frameId, JSC::ExecState* scriptState, SecurityOrigin* securityOrigin, bool isPageContext)
167 {
168     ASSERT(securityOrigin || isPageContext);
169     int executionContextId = injectedScriptManager()->injectedScriptIdFor(scriptState);
170     String name = securityOrigin ? securityOrigin->toRawString() : "";
171     m_frontend->executionContextCreated(ExecutionContextDescription::create()
172         .setId(executionContextId)
173         .setIsPageContext(isPageContext)
174         .setName(name)
175         .setFrameId(frameId)
176         .release());
177 }
178
179 } // namespace WebCore
180
181 #endif // ENABLE(INSPECTOR)