Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(197)

Side by Side Diff: Source/bindings/core/v8/ScriptController.cpp

Issue 854453003: Revert of Revert of Reland factor out window proxy management portions of ScriptController. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Rebase and deflake test Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2008, 2009 Google Inc. All rights reserved. 2 * Copyright (C) 2008, 2009 Google Inc. All rights reserved.
3 * Copyright (C) 2009 Apple Inc. All rights reserved. 3 * Copyright (C) 2009 Apple Inc. All rights reserved.
4 * Copyright (C) 2014 Opera Software ASA. All rights reserved. 4 * Copyright (C) 2014 Opera Software ASA. All rights reserved.
5 * 5 *
6 * Redistribution and use in source and binary forms, with or without 6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are 7 * modification, are permitted provided that the following conditions are
8 * met: 8 * met:
9 * 9 *
10 * * Redistributions of source code must retain the above copyright 10 * * Redistributions of source code must retain the above copyright
(...skipping 29 matching lines...) Expand all
40 #include "bindings/core/v8/ScriptValue.h" 40 #include "bindings/core/v8/ScriptValue.h"
41 #include "bindings/core/v8/V8Binding.h" 41 #include "bindings/core/v8/V8Binding.h"
42 #include "bindings/core/v8/V8Event.h" 42 #include "bindings/core/v8/V8Event.h"
43 #include "bindings/core/v8/V8GCController.h" 43 #include "bindings/core/v8/V8GCController.h"
44 #include "bindings/core/v8/V8HTMLElement.h" 44 #include "bindings/core/v8/V8HTMLElement.h"
45 #include "bindings/core/v8/V8NPObject.h" 45 #include "bindings/core/v8/V8NPObject.h"
46 #include "bindings/core/v8/V8PerContextData.h" 46 #include "bindings/core/v8/V8PerContextData.h"
47 #include "bindings/core/v8/V8ScriptRunner.h" 47 #include "bindings/core/v8/V8ScriptRunner.h"
48 #include "bindings/core/v8/V8Window.h" 48 #include "bindings/core/v8/V8Window.h"
49 #include "bindings/core/v8/WindowProxy.h" 49 #include "bindings/core/v8/WindowProxy.h"
50 #include "bindings/core/v8/WindowProxyManager.h"
50 #include "bindings/core/v8/npruntime_impl.h" 51 #include "bindings/core/v8/npruntime_impl.h"
51 #include "bindings/core/v8/npruntime_priv.h" 52 #include "bindings/core/v8/npruntime_priv.h"
52 #include "core/dom/Document.h" 53 #include "core/dom/Document.h"
53 #include "core/dom/Node.h" 54 #include "core/dom/Node.h"
54 #include "core/dom/ScriptableDocumentParser.h" 55 #include "core/dom/ScriptableDocumentParser.h"
55 #include "core/events/Event.h" 56 #include "core/events/Event.h"
56 #include "core/events/EventListener.h" 57 #include "core/events/EventListener.h"
57 #include "core/frame/LocalDOMWindow.h" 58 #include "core/frame/LocalDOMWindow.h"
58 #include "core/frame/LocalFrame.h"
59 #include "core/frame/Settings.h" 59 #include "core/frame/Settings.h"
60 #include "core/frame/UseCounter.h" 60 #include "core/frame/UseCounter.h"
61 #include "core/frame/csp/ContentSecurityPolicy.h" 61 #include "core/frame/csp/ContentSecurityPolicy.h"
62 #include "core/html/HTMLPlugInElement.h" 62 #include "core/html/HTMLPlugInElement.h"
63 #include "core/inspector/InspectorInstrumentation.h" 63 #include "core/inspector/InspectorInstrumentation.h"
64 #include "core/inspector/InspectorTraceEvents.h" 64 #include "core/inspector/InspectorTraceEvents.h"
65 #include "core/inspector/ScriptCallStack.h" 65 #include "core/inspector/ScriptCallStack.h"
66 #include "core/loader/DocumentLoader.h" 66 #include "core/loader/DocumentLoader.h"
67 #include "core/loader/FrameLoader.h" 67 #include "core/loader/FrameLoader.h"
68 #include "core/loader/FrameLoaderClient.h" 68 #include "core/loader/FrameLoaderClient.h"
(...skipping 16 matching lines...) Expand all
85 85
86 bool ScriptController::canAccessFromCurrentOrigin(LocalFrame *frame) 86 bool ScriptController::canAccessFromCurrentOrigin(LocalFrame *frame)
87 { 87 {
88 if (!frame) 88 if (!frame)
89 return false; 89 return false;
90 v8::Isolate* isolate = toIsolate(frame); 90 v8::Isolate* isolate = toIsolate(frame);
91 return !isolate->InContext() || BindingSecurity::shouldAllowAccessToFrame(is olate, frame); 91 return !isolate->InContext() || BindingSecurity::shouldAllowAccessToFrame(is olate, frame);
92 } 92 }
93 93
94 ScriptController::ScriptController(LocalFrame* frame) 94 ScriptController::ScriptController(LocalFrame* frame)
95 : m_frame(frame) 95 : m_windowProxyManager(WindowProxyManager::create(frame))
96 , m_sourceURL(0) 96 , m_sourceURL(0)
97 , m_isolate(v8::Isolate::GetCurrent())
98 , m_windowProxy(WindowProxy::create(frame, DOMWrapperWorld::mainWorld(), m_i solate))
99 , m_windowScriptNPObject(0) 97 , m_windowScriptNPObject(0)
100 { 98 {
101 } 99 }
102 100
103 ScriptController::~ScriptController() 101 ScriptController::~ScriptController()
104 { 102 {
105 } 103 }
106 104
107 void ScriptController::trace(Visitor* visitor) 105 void ScriptController::trace(Visitor* visitor)
108 { 106 {
109 #if ENABLE(OILPAN) 107 #if ENABLE(OILPAN)
110 visitor->trace(m_frame); 108 visitor->trace(m_windowProxyManager);
111 visitor->trace(m_windowProxy);
112 visitor->trace(m_isolatedWorlds);
113 #endif 109 #endif
114 } 110 }
115 111
116 void ScriptController::clearScriptObjects() 112 void ScriptController::clearScriptObjects()
117 { 113 {
118 PluginObjectMap::iterator it = m_pluginObjects.begin(); 114 PluginObjectMap::iterator it = m_pluginObjects.begin();
119 for (; it != m_pluginObjects.end(); ++it) { 115 for (; it != m_pluginObjects.end(); ++it) {
120 _NPN_UnregisterObject(it->value); 116 _NPN_UnregisterObject(it->value);
121 _NPN_ReleaseObject(it->value); 117 _NPN_ReleaseObject(it->value);
122 } 118 }
123 m_pluginObjects.clear(); 119 m_pluginObjects.clear();
124 120
125 if (m_windowScriptNPObject) { 121 if (m_windowScriptNPObject) {
126 // Dispose of the underlying V8 object before releasing our reference 122 // Dispose of the underlying V8 object before releasing our reference
127 // to it, so that if a plugin fails to release it properly we will 123 // to it, so that if a plugin fails to release it properly we will
128 // only leak the NPObject wrapper, not the object, its document, or 124 // only leak the NPObject wrapper, not the object, its document, or
129 // anything else they reference. 125 // anything else they reference.
130 disposeUnderlyingV8Object(m_isolate, m_windowScriptNPObject); 126 disposeUnderlyingV8Object(isolate(), m_windowScriptNPObject);
131 _NPN_ReleaseObject(m_windowScriptNPObject); 127 _NPN_ReleaseObject(m_windowScriptNPObject);
132 m_windowScriptNPObject = 0; 128 m_windowScriptNPObject = 0;
133 } 129 }
134 } 130 }
135 131
136 void ScriptController::clearForClose() 132 void ScriptController::clearForClose()
137 { 133 {
138 double start = currentTime(); 134 double start = currentTime();
139 m_windowProxy->clearForClose(); 135 m_windowProxyManager->clearForClose();
140 for (IsolatedWorldMap::iterator iter = m_isolatedWorlds.begin(); iter != m_i solatedWorlds.end(); ++iter)
141 iter->value->clearForClose();
142 blink::Platform::current()->histogramCustomCounts("WebCore.ScriptController. clearForClose", (currentTime() - start) * 1000, 0, 10000, 50); 136 blink::Platform::current()->histogramCustomCounts("WebCore.ScriptController. clearForClose", (currentTime() - start) * 1000, 0, 10000, 50);
143 } 137 }
144 138
145 void ScriptController::updateSecurityOrigin(SecurityOrigin* origin) 139 void ScriptController::updateSecurityOrigin(SecurityOrigin* origin)
146 { 140 {
147 m_windowProxy->updateSecurityOrigin(origin); 141 m_windowProxyManager->mainWorldProxy()->updateSecurityOrigin(origin);
148 } 142 }
149 143
150 v8::Local<v8::Value> ScriptController::callFunction(v8::Handle<v8::Function> fun ction, v8::Handle<v8::Value> receiver, int argc, v8::Handle<v8::Value> info[]) 144 v8::Local<v8::Value> ScriptController::callFunction(v8::Handle<v8::Function> fun ction, v8::Handle<v8::Value> receiver, int argc, v8::Handle<v8::Value> info[])
151 { 145 {
152 // Keep LocalFrame (and therefore ScriptController) alive. 146 // Keep LocalFrame (and therefore ScriptController) alive.
153 RefPtrWillBeRawPtr<LocalFrame> protect(m_frame.get()); 147 RefPtrWillBeRawPtr<LocalFrame> protect(frame());
154 return ScriptController::callFunction(m_frame->document(), function, receive r, argc, info, m_isolate); 148 return ScriptController::callFunction(frame()->document(), function, receive r, argc, info, isolate());
155 } 149 }
156 150
157 v8::Local<v8::Value> ScriptController::callFunction(ExecutionContext* context, v 8::Handle<v8::Function> function, v8::Handle<v8::Value> receiver, int argc, v8:: Handle<v8::Value> info[], v8::Isolate* isolate) 151 v8::Local<v8::Value> ScriptController::callFunction(ExecutionContext* context, v 8::Handle<v8::Function> function, v8::Handle<v8::Value> receiver, int argc, v8:: Handle<v8::Value> info[], v8::Isolate* isolate)
158 { 152 {
159 TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"), "FunctionCall", "data", devToolsTraceEventData(isolate, context, function)); 153 TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"), "FunctionCall", "data", devToolsTraceEventData(isolate, context, function));
160 // FIXME(361045): remove InspectorInstrumentation calls once DevTools Timeli ne migrates to tracing. 154 // FIXME(361045): remove InspectorInstrumentation calls once DevTools Timeli ne migrates to tracing.
161 InspectorInstrumentationCookie cookie; 155 InspectorInstrumentationCookie cookie;
162 if (InspectorInstrumentation::hasFrontends()) { 156 if (InspectorInstrumentation::hasFrontends()) {
163 int scriptId = 0; 157 int scriptId = 0;
164 String resourceName; 158 String resourceName;
165 int lineNumber = 1; 159 int lineNumber = 1;
166 GetDevToolsFunctionInfo(function, isolate, scriptId, resourceName, lineN umber); 160 GetDevToolsFunctionInfo(function, isolate, scriptId, resourceName, lineN umber);
167 cookie = InspectorInstrumentation::willCallFunction(context, scriptId, r esourceName, lineNumber); 161 cookie = InspectorInstrumentation::willCallFunction(context, scriptId, r esourceName, lineNumber);
168 } 162 }
169 163
170 v8::Local<v8::Value> result = V8ScriptRunner::callFunction(function, context , receiver, argc, info, isolate); 164 v8::Local<v8::Value> result = V8ScriptRunner::callFunction(function, context , receiver, argc, info, isolate);
171 165
172 InspectorInstrumentation::didCallFunction(cookie); 166 InspectorInstrumentation::didCallFunction(cookie);
173 return result; 167 return result;
174 } 168 }
175 169
176 v8::Local<v8::Value> ScriptController::executeScriptAndReturnValue(v8::Handle<v8 ::Context> context, const ScriptSourceCode& source, AccessControlStatus corsStat us, double* compilationFinishTime) 170 v8::Local<v8::Value> ScriptController::executeScriptAndReturnValue(v8::Handle<v8 ::Context> context, const ScriptSourceCode& source, AccessControlStatus corsStat us, double* compilationFinishTime)
177 { 171 {
178 TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"), "EvaluateScript ", "data", InspectorEvaluateScriptEvent::data(m_frame, source.url().string(), so urce.startLine())); 172 TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"), "EvaluateScript ", "data", InspectorEvaluateScriptEvent::data(frame(), source.url().string(), so urce.startLine()));
179 // FIXME(361045): remove InspectorInstrumentation calls once DevTools Timeli ne migrates to tracing. 173 // FIXME(361045): remove InspectorInstrumentation calls once DevTools Timeli ne migrates to tracing.
180 InspectorInstrumentationCookie cookie = InspectorInstrumentation::willEvalua teScript(m_frame, source.url().string(), source.startLine()); 174 InspectorInstrumentationCookie cookie = InspectorInstrumentation::willEvalua teScript(frame(), source.url().string(), source.startLine());
181 175
182 v8::Local<v8::Value> result; 176 v8::Local<v8::Value> result;
183 { 177 {
184 V8CacheOptions v8CacheOptions(V8CacheOptionsDefault); 178 V8CacheOptions v8CacheOptions(V8CacheOptionsDefault);
185 if (m_frame->settings()) 179 if (frame()->settings())
186 v8CacheOptions = m_frame->settings()->v8CacheOptions(); 180 v8CacheOptions = frame()->settings()->v8CacheOptions();
187 181
188 // Isolate exceptions that occur when compiling and executing 182 // Isolate exceptions that occur when compiling and executing
189 // the code. These exceptions should not interfere with 183 // the code. These exceptions should not interfere with
190 // javascript code we might evaluate from C++ when returning 184 // javascript code we might evaluate from C++ when returning
191 // from here. 185 // from here.
192 v8::TryCatch tryCatch; 186 v8::TryCatch tryCatch;
193 tryCatch.SetVerbose(true); 187 tryCatch.SetVerbose(true);
194 188
195 v8::Handle<v8::Script> script = V8ScriptRunner::compileScript(source, m_ isolate, corsStatus, v8CacheOptions); 189 v8::Handle<v8::Script> script = V8ScriptRunner::compileScript(source, is olate(), corsStatus, v8CacheOptions);
196 190
197 if (compilationFinishTime) { 191 if (compilationFinishTime) {
198 *compilationFinishTime = WTF::monotonicallyIncreasingTime(); 192 *compilationFinishTime = WTF::monotonicallyIncreasingTime();
199 } 193 }
200 // Keep LocalFrame (and therefore ScriptController) alive. 194 // Keep LocalFrame (and therefore ScriptController) alive.
201 RefPtrWillBeRawPtr<LocalFrame> protect(m_frame.get()); 195 RefPtrWillBeRawPtr<LocalFrame> protect(frame());
202 result = V8ScriptRunner::runCompiledScript(m_isolate, script, m_frame->d ocument()); 196 result = V8ScriptRunner::runCompiledScript(isolate(), script, frame()->d ocument());
203 ASSERT(!tryCatch.HasCaught() || result.IsEmpty()); 197 ASSERT(!tryCatch.HasCaught() || result.IsEmpty());
204 } 198 }
205 199
206 InspectorInstrumentation::didEvaluateScript(cookie); 200 InspectorInstrumentation::didEvaluateScript(cookie);
207 TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"), "Update Counters", "data", InspectorUpdateCountersEvent::data()); 201 TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"), "Update Counters", "data", InspectorUpdateCountersEvent::data());
208 202
209 return result; 203 return result;
210 } 204 }
211 205
212 bool ScriptController::initializeMainWorld() 206 bool ScriptController::initializeMainWorld()
213 { 207 {
214 if (m_windowProxy->isContextInitialized()) 208 if (m_windowProxyManager->mainWorldProxy()->isContextInitialized())
215 return false; 209 return false;
216 return windowProxy(DOMWrapperWorld::mainWorld())->isContextInitialized(); 210 return windowProxy(DOMWrapperWorld::mainWorld())->isContextInitialized();
217 } 211 }
218 212
219 WindowProxy* ScriptController::existingWindowProxy(DOMWrapperWorld& world) 213 WindowProxy* ScriptController::existingWindowProxy(DOMWrapperWorld& world)
220 { 214 {
221 if (world.isMainWorld()) 215 return m_windowProxyManager->existingWindowProxy(world);
222 return m_windowProxy->isContextInitialized() ? m_windowProxy.get() : 0;
223
224 IsolatedWorldMap::iterator iter = m_isolatedWorlds.find(world.worldId());
225 if (iter == m_isolatedWorlds.end())
226 return 0;
227 return iter->value->isContextInitialized() ? iter->value.get() : 0;
228 } 216 }
229 217
230 WindowProxy* ScriptController::windowProxy(DOMWrapperWorld& world) 218 WindowProxy* ScriptController::windowProxy(DOMWrapperWorld& world)
231 { 219 {
232 WindowProxy* windowProxy = nullptr; 220 WindowProxy* windowProxy = m_windowProxyManager->windowProxy(world);
233 if (world.isMainWorld()) {
234 windowProxy = m_windowProxy.get();
235 } else {
236 IsolatedWorldMap::iterator iter = m_isolatedWorlds.find(world.worldId()) ;
237 if (iter != m_isolatedWorlds.end()) {
238 windowProxy = iter->value.get();
239 } else {
240 OwnPtrWillBeRawPtr<WindowProxy> isolatedWorldWindowProxy = WindowPro xy::create(m_frame, world, m_isolate);
241 windowProxy = isolatedWorldWindowProxy.get();
242 m_isolatedWorlds.set(world.worldId(), isolatedWorldWindowProxy.relea se());
243 }
244 }
245 if (!windowProxy->isContextInitialized() && windowProxy->initializeIfNeeded( ) && world.isMainWorld()) 221 if (!windowProxy->isContextInitialized() && windowProxy->initializeIfNeeded( ) && world.isMainWorld())
246 m_frame->loader().dispatchDidClearWindowObjectInMainWorld(); 222 frame()->loader().dispatchDidClearWindowObjectInMainWorld();
223 // FIXME: There are some situations where we can return an uninitialized
224 // context. This is broken.
247 return windowProxy; 225 return windowProxy;
248 } 226 }
249 227
250 bool ScriptController::shouldBypassMainWorldCSP() 228 bool ScriptController::shouldBypassMainWorldCSP()
251 { 229 {
252 v8::HandleScope handleScope(m_isolate); 230 v8::HandleScope handleScope(isolate());
253 v8::Handle<v8::Context> context = m_isolate->GetCurrentContext(); 231 v8::Handle<v8::Context> context = isolate()->GetCurrentContext();
254 if (context.IsEmpty() || !toDOMWindow(context)) 232 if (context.IsEmpty() || !toDOMWindow(context))
255 return false; 233 return false;
256 DOMWrapperWorld& world = DOMWrapperWorld::current(m_isolate); 234 DOMWrapperWorld& world = DOMWrapperWorld::current(isolate());
257 return world.isIsolatedWorld() ? world.isolatedWorldHasContentSecurityPolicy () : false; 235 return world.isIsolatedWorld() ? world.isolatedWorldHasContentSecurityPolicy () : false;
258 } 236 }
259 237
260 TextPosition ScriptController::eventHandlerPosition() const 238 TextPosition ScriptController::eventHandlerPosition() const
261 { 239 {
262 ScriptableDocumentParser* parser = m_frame->document()->scriptableDocumentPa rser(); 240 ScriptableDocumentParser* parser = frame()->document()->scriptableDocumentPa rser();
263 if (parser) 241 if (parser)
264 return parser->textPosition(); 242 return parser->textPosition();
265 return TextPosition::minimumPosition(); 243 return TextPosition::minimumPosition();
266 } 244 }
267 245
268 // Create a V8 object with an interceptor of NPObjectPropertyGetter. 246 // Create a V8 object with an interceptor of NPObjectPropertyGetter.
269 void ScriptController::bindToWindowObject(LocalFrame* frame, const String& key, NPObject* object) 247 void ScriptController::bindToWindowObject(LocalFrame* frame, const String& key, NPObject* object)
270 { 248 {
271 ScriptState* scriptState = ScriptState::forMainWorld(frame); 249 ScriptState* scriptState = ScriptState::forMainWorld(frame);
272 if (!scriptState->contextIsValid()) 250 if (!scriptState->contextIsValid())
273 return; 251 return;
274 252
275 ScriptState::Scope scope(scriptState); 253 ScriptState::Scope scope(scriptState);
276 v8::Handle<v8::Object> value = createV8ObjectForNPObject(m_isolate, object, 0); 254 v8::Handle<v8::Object> value = createV8ObjectForNPObject(isolate(), object, 0);
277 255
278 // Attach to the global object. 256 // Attach to the global object.
279 scriptState->context()->Global()->Set(v8String(m_isolate, key), value); 257 scriptState->context()->Global()->Set(v8String(isolate(), key), value);
280 } 258 }
281 259
282 void ScriptController::enableEval() 260 void ScriptController::enableEval()
283 { 261 {
284 if (!m_windowProxy->isContextInitialized()) 262 if (!m_windowProxyManager->mainWorldProxy()->isContextInitialized())
285 return; 263 return;
286 v8::HandleScope handleScope(m_isolate); 264 v8::HandleScope handleScope(isolate());
287 m_windowProxy->context()->AllowCodeGenerationFromStrings(true); 265 m_windowProxyManager->mainWorldProxy()->context()->AllowCodeGenerationFromSt rings(true);
288 } 266 }
289 267
290 void ScriptController::disableEval(const String& errorMessage) 268 void ScriptController::disableEval(const String& errorMessage)
291 { 269 {
292 if (!m_windowProxy->isContextInitialized()) 270 if (!m_windowProxyManager->mainWorldProxy()->isContextInitialized())
293 return; 271 return;
294 v8::HandleScope handleScope(m_isolate); 272 v8::HandleScope handleScope(isolate());
295 v8::Local<v8::Context> v8Context = m_windowProxy->context(); 273 v8::Local<v8::Context> v8Context = m_windowProxyManager->mainWorldProxy()->c ontext();
296 v8Context->AllowCodeGenerationFromStrings(false); 274 v8Context->AllowCodeGenerationFromStrings(false);
297 v8Context->SetErrorMessageForCodeGenerationFromStrings(v8String(m_isolate, e rrorMessage)); 275 v8Context->SetErrorMessageForCodeGenerationFromStrings(v8String(isolate(), e rrorMessage));
298 } 276 }
299 277
300 PassRefPtr<SharedPersistent<v8::Object> > ScriptController::createPluginWrapper( Widget* widget) 278 PassRefPtr<SharedPersistent<v8::Object> > ScriptController::createPluginWrapper( Widget* widget)
301 { 279 {
302 ASSERT(widget); 280 ASSERT(widget);
303 281
304 if (!widget->isPluginView()) 282 if (!widget->isPluginView())
305 return nullptr; 283 return nullptr;
306 284
307 v8::HandleScope handleScope(m_isolate); 285 v8::HandleScope handleScope(isolate());
308 v8::Local<v8::Object> scriptableObject = toPluginView(widget)->scriptableObj ect(m_isolate); 286 v8::Local<v8::Object> scriptableObject = toPluginView(widget)->scriptableObj ect(isolate());
309 287
310 if (scriptableObject.IsEmpty()) 288 if (scriptableObject.IsEmpty())
311 return nullptr; 289 return nullptr;
312 290
313 // LocalFrame Memory Management for NPObjects 291 // LocalFrame Memory Management for NPObjects
314 // ------------------------------------- 292 // -------------------------------------
315 // NPObjects are treated differently than other objects wrapped by JS. 293 // NPObjects are treated differently than other objects wrapped by JS.
316 // NPObjects can be created either by the browser (e.g. the main 294 // NPObjects can be created either by the browser (e.g. the main
317 // window object) or by the plugin (the main plugin object 295 // window object) or by the plugin (the main plugin object
318 // for a HTMLEmbedElement). Further, unlike most DOM Objects, the frame 296 // for a HTMLEmbedElement). Further, unlike most DOM Objects, the frame
(...skipping 13 matching lines...) Expand all
332 // 310 //
333 // Inside the javascript engine, the engine can keep a reference to the 311 // Inside the javascript engine, the engine can keep a reference to the
334 // NPObject as part of its wrapper. However, before accessing the object 312 // NPObject as part of its wrapper. However, before accessing the object
335 // it must consult the _NPN_Registry. 313 // it must consult the _NPN_Registry.
336 314
337 if (isWrappedNPObject(scriptableObject)) { 315 if (isWrappedNPObject(scriptableObject)) {
338 // Track the plugin object. We've been given a reference to the object. 316 // Track the plugin object. We've been given a reference to the object.
339 m_pluginObjects.set(widget, v8ObjectToNPObject(scriptableObject)); 317 m_pluginObjects.set(widget, v8ObjectToNPObject(scriptableObject));
340 } 318 }
341 319
342 return SharedPersistent<v8::Object>::create(scriptableObject, m_isolate); 320 return SharedPersistent<v8::Object>::create(scriptableObject, isolate());
343 } 321 }
344 322
345 void ScriptController::cleanupScriptObjectsForPlugin(Widget* nativeHandle) 323 void ScriptController::cleanupScriptObjectsForPlugin(Widget* nativeHandle)
346 { 324 {
347 PluginObjectMap::iterator it = m_pluginObjects.find(nativeHandle); 325 PluginObjectMap::iterator it = m_pluginObjects.find(nativeHandle);
348 if (it == m_pluginObjects.end()) 326 if (it == m_pluginObjects.end())
349 return; 327 return;
350 _NPN_UnregisterObject(it->value); 328 _NPN_UnregisterObject(it->value);
351 _NPN_ReleaseObject(it->value); 329 _NPN_ReleaseObject(it->value);
352 m_pluginObjects.remove(it); 330 m_pluginObjects.remove(it);
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
389 } 367 }
390 368
391 NPObject* ScriptController::windowScriptNPObject() 369 NPObject* ScriptController::windowScriptNPObject()
392 { 370 {
393 if (m_windowScriptNPObject) 371 if (m_windowScriptNPObject)
394 return m_windowScriptNPObject; 372 return m_windowScriptNPObject;
395 373
396 if (canExecuteScripts(NotAboutToExecuteScript)) { 374 if (canExecuteScripts(NotAboutToExecuteScript)) {
397 // JavaScript is enabled, so there is a JavaScript window object. 375 // JavaScript is enabled, so there is a JavaScript window object.
398 // Return an NPObject bound to the window object. 376 // Return an NPObject bound to the window object.
399 m_windowScriptNPObject = createScriptObject(m_frame, m_isolate); 377 m_windowScriptNPObject = createScriptObject(frame(), isolate());
400 _NPN_RegisterObject(m_windowScriptNPObject, 0); 378 _NPN_RegisterObject(m_windowScriptNPObject, 0);
401 } else { 379 } else {
402 // JavaScript is not enabled, so we cannot bind the NPObject to the 380 // JavaScript is not enabled, so we cannot bind the NPObject to the
403 // JavaScript window object. Instead, we create an NPObject of a 381 // JavaScript window object. Instead, we create an NPObject of a
404 // different class, one which is not bound to a JavaScript object. 382 // different class, one which is not bound to a JavaScript object.
405 m_windowScriptNPObject = createNoScriptObject(); 383 m_windowScriptNPObject = createNoScriptObject();
406 } 384 }
407 return m_windowScriptNPObject; 385 return m_windowScriptNPObject;
408 } 386 }
409 387
410 NPObject* ScriptController::createScriptObjectForPluginElement(HTMLPlugInElement * plugin) 388 NPObject* ScriptController::createScriptObjectForPluginElement(HTMLPlugInElement * plugin)
411 { 389 {
412 // Can't create NPObjects when JavaScript is disabled. 390 // Can't create NPObjects when JavaScript is disabled.
413 if (!canExecuteScripts(NotAboutToExecuteScript)) 391 if (!canExecuteScripts(NotAboutToExecuteScript))
414 return createNoScriptObject(); 392 return createNoScriptObject();
415 393
416 ScriptState* scriptState = ScriptState::forMainWorld(m_frame); 394 ScriptState* scriptState = ScriptState::forMainWorld(frame());
417 if (!scriptState->contextIsValid()) 395 if (!scriptState->contextIsValid())
418 return createNoScriptObject(); 396 return createNoScriptObject();
419 397
420 ScriptState::Scope scope(scriptState); 398 ScriptState::Scope scope(scriptState);
421 LocalDOMWindow* window = m_frame->localDOMWindow(); 399 LocalDOMWindow* window = frame()->localDOMWindow();
422 v8::Handle<v8::Value> v8plugin = toV8(plugin, scriptState->context()->Global (), scriptState->isolate()); 400 v8::Handle<v8::Value> v8plugin = toV8(plugin, scriptState->context()->Global (), scriptState->isolate());
423 if (!v8plugin->IsObject()) 401 if (!v8plugin->IsObject())
424 return createNoScriptObject(); 402 return createNoScriptObject();
425 403
426 return npCreateV8ScriptObject(scriptState->isolate(), 0, v8::Handle<v8::Obje ct>::Cast(v8plugin), window); 404 return npCreateV8ScriptObject(scriptState->isolate(), 0, v8::Handle<v8::Obje ct>::Cast(v8plugin), window);
427 } 405 }
428 406
429 void ScriptController::clearWindowProxy() 407 void ScriptController::clearWindowProxy()
430 { 408 {
431 double start = currentTime();
432 // V8 binding expects ScriptController::clearWindowProxy only be called 409 // V8 binding expects ScriptController::clearWindowProxy only be called
433 // when a frame is loading a new page. This creates a new context for the ne w page. 410 // when a frame is loading a new page. This creates a new context for the ne w page.
434 411
412 double start = currentTime();
435 // The V8 context must be available for |clearScriptObjects()|. 413 // The V8 context must be available for |clearScriptObjects()|.
436 // The below call must be before |clearForNavigation()| which disposes the V 8 context. 414 // The below call must be before |clearForNavigation()| which disposes the V 8 context.
437 clearScriptObjects(); 415 clearScriptObjects();
438 m_windowProxy->clearForNavigation(); 416
439 for (IsolatedWorldMap::iterator iter = m_isolatedWorlds.begin(); iter != m_i solatedWorlds.end(); ++iter) 417 m_windowProxyManager->clearForNavigation();
440 iter->value->clearForNavigation();
441 blink::Platform::current()->histogramCustomCounts("WebCore.ScriptController. clearWindowProxy", (currentTime() - start) * 1000, 0, 10000, 50); 418 blink::Platform::current()->histogramCustomCounts("WebCore.ScriptController. clearWindowProxy", (currentTime() - start) * 1000, 0, 10000, 50);
442 } 419 }
443 420
444 void ScriptController::setCaptureCallStackForUncaughtExceptions(bool value) 421 void ScriptController::setCaptureCallStackForUncaughtExceptions(bool value)
445 { 422 {
446 v8::V8::SetCaptureStackTraceForUncaughtExceptions(value, ScriptCallStack::ma xCallStackSizeToCapture, stackTraceOptions); 423 v8::V8::SetCaptureStackTraceForUncaughtExceptions(value, ScriptCallStack::ma xCallStackSizeToCapture, stackTraceOptions);
447 } 424 }
448 425
449 void ScriptController::collectIsolatedContexts(Vector<std::pair<ScriptState*, Se curityOrigin*> >& result) 426 void ScriptController::collectIsolatedContexts(Vector<std::pair<ScriptState*, Se curityOrigin*> >& result)
450 { 427 {
451 for (IsolatedWorldMap::iterator it = m_isolatedWorlds.begin(); it != m_isola tedWorlds.end(); ++it) { 428 m_windowProxyManager->collectIsolatedContexts(result);
452 WindowProxy* isolatedWorldWindowProxy = it->value.get();
453 SecurityOrigin* origin = isolatedWorldWindowProxy->world().isolatedWorld SecurityOrigin();
454 if (!isolatedWorldWindowProxy->isContextInitialized())
455 continue;
456 result.append(std::pair<ScriptState*, SecurityOrigin*>(isolatedWorldWind owProxy->scriptState(), origin));
457 }
458 } 429 }
459 430
460 void ScriptController::setWorldDebugId(int worldId, int debuggerId) 431 void ScriptController::setWorldDebugId(int worldId, int debuggerId)
461 { 432 {
462 ASSERT(debuggerId > 0); 433 m_windowProxyManager->setWorldDebugId(worldId, debuggerId);
463 bool isMainWorld = worldId == MainWorldId;
464 WindowProxy* windowProxy = 0;
465 if (isMainWorld) {
466 windowProxy = m_windowProxy.get();
467 } else {
468 IsolatedWorldMap::iterator iter = m_isolatedWorlds.find(worldId);
469 if (iter != m_isolatedWorlds.end())
470 windowProxy = iter->value.get();
471 }
472 if (!windowProxy || !windowProxy->isContextInitialized())
473 return;
474 v8::HandleScope scope(m_isolate);
475 v8::Local<v8::Context> context = windowProxy->context();
476 const char* worldName = isMainWorld ? "page" : "injected";
477 V8PerContextDebugData::setContextDebugData(context, worldName, debuggerId);
478 } 434 }
479 435
480 void ScriptController::updateDocument() 436 void ScriptController::updateDocument()
481 { 437 {
482 // For an uninitialized main window windowProxy, do not incur the cost of co ntext initialization. 438 // For an uninitialized main window windowProxy, do not incur the cost of co ntext initialization.
483 if (!m_windowProxy->isGlobalInitialized()) 439 if (!m_windowProxyManager->mainWorldProxy()->isGlobalInitialized())
484 return; 440 return;
485 441
486 if (!initializeMainWorld()) 442 if (!initializeMainWorld())
487 windowProxy(DOMWrapperWorld::mainWorld())->updateDocument(); 443 windowProxy(DOMWrapperWorld::mainWorld())->updateDocument();
488 } 444 }
489 445
490 void ScriptController::namedItemAdded(HTMLDocument* doc, const AtomicString& nam e) 446 void ScriptController::namedItemAdded(HTMLDocument* doc, const AtomicString& nam e)
491 { 447 {
492 windowProxy(DOMWrapperWorld::mainWorld())->namedItemAdded(doc, name); 448 windowProxy(DOMWrapperWorld::mainWorld())->namedItemAdded(doc, name);
493 } 449 }
494 450
495 void ScriptController::namedItemRemoved(HTMLDocument* doc, const AtomicString& n ame) 451 void ScriptController::namedItemRemoved(HTMLDocument* doc, const AtomicString& n ame)
496 { 452 {
497 windowProxy(DOMWrapperWorld::mainWorld())->namedItemRemoved(doc, name); 453 windowProxy(DOMWrapperWorld::mainWorld())->namedItemRemoved(doc, name);
498 } 454 }
499 455
500 static bool isInPrivateScriptIsolateWorld(v8::Isolate* isolate) 456 static bool isInPrivateScriptIsolateWorld(v8::Isolate* isolate)
501 { 457 {
502 v8::Handle<v8::Context> context = isolate->GetCurrentContext(); 458 v8::Handle<v8::Context> context = isolate->GetCurrentContext();
503 return !context.IsEmpty() && toDOMWindow(context) && DOMWrapperWorld::curren t(isolate).isPrivateScriptIsolatedWorld(); 459 return !context.IsEmpty() && toDOMWindow(context) && DOMWrapperWorld::curren t(isolate).isPrivateScriptIsolatedWorld();
504 } 460 }
505 461
506 bool ScriptController::canExecuteScripts(ReasonForCallingCanExecuteScripts reaso n) 462 bool ScriptController::canExecuteScripts(ReasonForCallingCanExecuteScripts reaso n)
507 { 463 {
508 // For performance reasons, we check isInPrivateScriptIsolateWorld() only if 464 // For performance reasons, we check isInPrivateScriptIsolateWorld() only if
509 // canExecuteScripts is going to return false. 465 // canExecuteScripts is going to return false.
510 466
511 if (m_frame->document() && m_frame->document()->isSandboxed(SandboxScripts)) { 467 if (frame()->document() && frame()->document()->isSandboxed(SandboxScripts)) {
512 if (isInPrivateScriptIsolateWorld(m_isolate)) 468 if (isInPrivateScriptIsolateWorld(isolate()))
513 return true; 469 return true;
514 // FIXME: This message should be moved off the console once a solution t o https://bugs.webkit.org/show_bug.cgi?id=103274 exists. 470 // FIXME: This message should be moved off the console once a solution t o https://bugs.webkit.org/show_bug.cgi?id=103274 exists.
515 if (reason == AboutToExecuteScript) 471 if (reason == AboutToExecuteScript)
516 m_frame->document()->addConsoleMessage(ConsoleMessage::create(Securi tyMessageSource, ErrorMessageLevel, "Blocked script execution in '" + m_frame->d ocument()->url().elidedString() + "' because the document's frame is sandboxed a nd the 'allow-scripts' permission is not set.")); 472 frame()->document()->addConsoleMessage(ConsoleMessage::create(Securi tyMessageSource, ErrorMessageLevel, "Blocked script execution in '" + frame()->d ocument()->url().elidedString() + "' because the document's frame is sandboxed a nd the 'allow-scripts' permission is not set."));
517 return false; 473 return false;
518 } 474 }
519 475
520 if (m_frame->document() && m_frame->document()->isViewSource()) { 476 if (frame()->document() && frame()->document()->isViewSource()) {
521 ASSERT(m_frame->document()->securityOrigin()->isUnique()); 477 ASSERT(frame()->document()->securityOrigin()->isUnique());
522 return true; 478 return true;
523 } 479 }
524 480
525 FrameLoaderClient* client = m_frame->loader().client(); 481 FrameLoaderClient* client = frame()->loader().client();
526 if (!client) 482 if (!client)
527 return false; 483 return false;
528 Settings* settings = m_frame->settings(); 484 Settings* settings = frame()->settings();
529 const bool allowed = client->allowScript(settings && settings->scriptEnabled ()) 485 const bool allowed = client->allowScript(settings && settings->scriptEnabled ())
530 || isInPrivateScriptIsolateWorld(m_isolate); 486 || isInPrivateScriptIsolateWorld(isolate());
531 if (!allowed && reason == AboutToExecuteScript) 487 if (!allowed && reason == AboutToExecuteScript)
532 client->didNotAllowScript(); 488 client->didNotAllowScript();
533 return allowed; 489 return allowed;
534 } 490 }
535 491
536 bool ScriptController::executeScriptIfJavaScriptURL(const KURL& url) 492 bool ScriptController::executeScriptIfJavaScriptURL(const KURL& url)
537 { 493 {
538 if (!protocolIsJavaScript(url)) 494 if (!protocolIsJavaScript(url))
539 return false; 495 return false;
540 496
541 bool shouldBypassMainWorldContentSecurityPolicy = ContentSecurityPolicy::sho uldBypassMainWorld(m_frame->document()); 497 bool shouldBypassMainWorldContentSecurityPolicy = ContentSecurityPolicy::sho uldBypassMainWorld(frame()->document());
542 if (!m_frame->page() 498 if (!frame()->page()
543 || (!shouldBypassMainWorldContentSecurityPolicy && !m_frame->document()- >contentSecurityPolicy()->allowJavaScriptURLs(m_frame->document()->url(), eventH andlerPosition().m_line))) 499 || (!shouldBypassMainWorldContentSecurityPolicy && !frame()->document()- >contentSecurityPolicy()->allowJavaScriptURLs(frame()->document()->url(), eventH andlerPosition().m_line)))
544 return true; 500 return true;
545 501
546 if (m_frame->loader().stateMachine()->isDisplayingInitialEmptyDocument()) 502 if (frame()->loader().stateMachine()->isDisplayingInitialEmptyDocument())
547 m_frame->loader().progress().progressStarted(); 503 frame()->loader().progress().progressStarted();
548 504
549 // We need to hold onto the LocalFrame here because executing script can 505 // We need to hold onto the LocalFrame here because executing script can
550 // destroy the frame. 506 // destroy the frame.
551 RefPtrWillBeRawPtr<LocalFrame> protect(m_frame.get()); 507 RefPtrWillBeRawPtr<LocalFrame> protect(frame());
552 RefPtrWillBeRawPtr<Document> ownerDocument(m_frame->document()); 508 RefPtrWillBeRawPtr<Document> ownerDocument(frame()->document());
553 509
554 const int javascriptSchemeLength = sizeof("javascript:") - 1; 510 const int javascriptSchemeLength = sizeof("javascript:") - 1;
555 511
556 bool locationChangeBefore = m_frame->navigationScheduler().locationChangePen ding(); 512 bool locationChangeBefore = frame()->navigationScheduler().locationChangePen ding();
557 513
558 String decodedURL = decodeURLEscapeSequences(url.string()); 514 String decodedURL = decodeURLEscapeSequences(url.string());
559 v8::HandleScope handleScope(m_isolate); 515 v8::HandleScope handleScope(isolate());
560 v8::Local<v8::Value> result = evaluateScriptInMainWorld(ScriptSourceCode(dec odedURL.substring(javascriptSchemeLength)), NotSharableCrossOrigin, DoNotExecute ScriptWhenScriptsDisabled); 516 v8::Local<v8::Value> result = evaluateScriptInMainWorld(ScriptSourceCode(dec odedURL.substring(javascriptSchemeLength)), NotSharableCrossOrigin, DoNotExecute ScriptWhenScriptsDisabled);
561 517
562 // If executing script caused this frame to be removed from the page, we 518 // If executing script caused this frame to be removed from the page, we
563 // don't want to try to replace its document! 519 // don't want to try to replace its document!
564 if (!m_frame->page()) 520 if (!frame()->page())
565 return true; 521 return true;
566 522
567 if (result.IsEmpty() || !result->IsString()) 523 if (result.IsEmpty() || !result->IsString())
568 return true; 524 return true;
569 String scriptResult = toCoreString(v8::Handle<v8::String>::Cast(result)); 525 String scriptResult = toCoreString(v8::Handle<v8::String>::Cast(result));
570 526
571 // We're still in a frame, so there should be a DocumentLoader. 527 // We're still in a frame, so there should be a DocumentLoader.
572 ASSERT(m_frame->document()->loader()); 528 ASSERT(frame()->document()->loader());
573 if (!locationChangeBefore && m_frame->navigationScheduler().locationChangePe nding()) 529 if (!locationChangeBefore && frame()->navigationScheduler().locationChangePe nding())
574 return true; 530 return true;
575 531
576 m_frame->loader().replaceDocumentWhileExecutingJavaScriptURL(scriptResult, o wnerDocument.get()); 532 frame()->loader().replaceDocumentWhileExecutingJavaScriptURL(scriptResult, o wnerDocument.get());
577 return true; 533 return true;
578 } 534 }
579 535
580 void ScriptController::executeScriptInMainWorld(const String& script, ExecuteScr iptPolicy policy) 536 void ScriptController::executeScriptInMainWorld(const String& script, ExecuteScr iptPolicy policy)
581 { 537 {
582 v8::HandleScope handleScope(m_isolate); 538 v8::HandleScope handleScope(isolate());
583 evaluateScriptInMainWorld(ScriptSourceCode(script), NotSharableCrossOrigin, policy); 539 evaluateScriptInMainWorld(ScriptSourceCode(script), NotSharableCrossOrigin, policy);
584 } 540 }
585 541
586 void ScriptController::executeScriptInMainWorld(const ScriptSourceCode& sourceCo de, AccessControlStatus corsStatus, double* compilationFinishTime) 542 void ScriptController::executeScriptInMainWorld(const ScriptSourceCode& sourceCo de, AccessControlStatus corsStatus, double* compilationFinishTime)
587 { 543 {
588 v8::HandleScope handleScope(m_isolate); 544 v8::HandleScope handleScope(isolate());
589 evaluateScriptInMainWorld(sourceCode, corsStatus, DoNotExecuteScriptWhenScri ptsDisabled, compilationFinishTime); 545 evaluateScriptInMainWorld(sourceCode, corsStatus, DoNotExecuteScriptWhenScri ptsDisabled, compilationFinishTime);
590 } 546 }
591 547
592 v8::Local<v8::Value> ScriptController::executeScriptInMainWorldAndReturnValue(co nst ScriptSourceCode& sourceCode) 548 v8::Local<v8::Value> ScriptController::executeScriptInMainWorldAndReturnValue(co nst ScriptSourceCode& sourceCode)
593 { 549 {
594 return evaluateScriptInMainWorld(sourceCode, NotSharableCrossOrigin, DoNotEx ecuteScriptWhenScriptsDisabled); 550 return evaluateScriptInMainWorld(sourceCode, NotSharableCrossOrigin, DoNotEx ecuteScriptWhenScriptsDisabled);
595 } 551 }
596 552
597 v8::Local<v8::Value> ScriptController::evaluateScriptInMainWorld(const ScriptSou rceCode& sourceCode, AccessControlStatus corsStatus, ExecuteScriptPolicy policy, double* compilationFinishTime) 553 v8::Local<v8::Value> ScriptController::evaluateScriptInMainWorld(const ScriptSou rceCode& sourceCode, AccessControlStatus corsStatus, ExecuteScriptPolicy policy, double* compilationFinishTime)
598 { 554 {
599 if (policy == DoNotExecuteScriptWhenScriptsDisabled && !canExecuteScripts(Ab outToExecuteScript)) 555 if (policy == DoNotExecuteScriptWhenScriptsDisabled && !canExecuteScripts(Ab outToExecuteScript))
600 return v8::Local<v8::Value>(); 556 return v8::Local<v8::Value>();
601 557
602 String sourceURL = sourceCode.url(); 558 String sourceURL = sourceCode.url();
603 const String* savedSourceURL = m_sourceURL; 559 const String* savedSourceURL = m_sourceURL;
604 m_sourceURL = &sourceURL; 560 m_sourceURL = &sourceURL;
605 561
606 v8::EscapableHandleScope handleScope(m_isolate); 562 v8::EscapableHandleScope handleScope(isolate());
607 v8::Handle<v8::Context> context = toV8Context(m_frame, DOMWrapperWorld::main World()); 563 v8::Handle<v8::Context> context = toV8Context(frame(), DOMWrapperWorld::main World());
608 if (context.IsEmpty()) 564 if (context.IsEmpty())
609 return v8::Local<v8::Value>(); 565 return v8::Local<v8::Value>();
610 566
611 ScriptState* scriptState = ScriptState::from(context); 567 ScriptState* scriptState = ScriptState::from(context);
612 ScriptState::Scope scope(scriptState); 568 ScriptState::Scope scope(scriptState);
613 569
614 RefPtrWillBeRawPtr<LocalFrame> protect(m_frame.get()); 570 RefPtrWillBeRawPtr<LocalFrame> protect(frame());
615 if (m_frame->loader().stateMachine()->isDisplayingInitialEmptyDocument()) 571 if (frame()->loader().stateMachine()->isDisplayingInitialEmptyDocument())
616 m_frame->loader().didAccessInitialDocument(); 572 frame()->loader().didAccessInitialDocument();
617 573
618 OwnPtr<ScriptSourceCode> maybeProcessedSourceCode = InspectorInstrumentatio n::preprocess(m_frame, sourceCode); 574 OwnPtr<ScriptSourceCode> maybeProcessedSourceCode = InspectorInstrumentatio n::preprocess(frame(), sourceCode);
619 const ScriptSourceCode& sourceCodeToCompile = maybeProcessedSourceCode ? *ma ybeProcessedSourceCode : sourceCode; 575 const ScriptSourceCode& sourceCodeToCompile = maybeProcessedSourceCode ? *ma ybeProcessedSourceCode : sourceCode;
620 576
621 v8::Local<v8::Value> object = executeScriptAndReturnValue(scriptState->conte xt(), sourceCodeToCompile, corsStatus, compilationFinishTime); 577 v8::Local<v8::Value> object = executeScriptAndReturnValue(scriptState->conte xt(), sourceCodeToCompile, corsStatus, compilationFinishTime);
622 m_sourceURL = savedSourceURL; 578 m_sourceURL = savedSourceURL;
623 579
624 if (object.IsEmpty()) 580 if (object.IsEmpty())
625 return v8::Local<v8::Value>(); 581 return v8::Local<v8::Value>();
626 582
627 return handleScope.Escape(object); 583 return handleScope.Escape(object);
628 } 584 }
629 585
630 void ScriptController::executeScriptInIsolatedWorld(int worldID, const Vector<Sc riptSourceCode>& sources, int extensionGroup, Vector<v8::Local<v8::Value> >* res ults) 586 void ScriptController::executeScriptInIsolatedWorld(int worldID, const Vector<Sc riptSourceCode>& sources, int extensionGroup, Vector<v8::Local<v8::Value> >* res ults)
631 { 587 {
632 ASSERT(worldID > 0); 588 ASSERT(worldID > 0);
633 589
634 RefPtr<DOMWrapperWorld> world = DOMWrapperWorld::ensureIsolatedWorld(m_isola te, worldID, extensionGroup); 590 RefPtr<DOMWrapperWorld> world = DOMWrapperWorld::ensureIsolatedWorld(isolate (), worldID, extensionGroup);
635 WindowProxy* isolatedWorldWindowProxy = windowProxy(*world); 591 WindowProxy* isolatedWorldWindowProxy = windowProxy(*world);
636 if (!isolatedWorldWindowProxy->isContextInitialized()) 592 if (!isolatedWorldWindowProxy->isContextInitialized())
637 return; 593 return;
638 594
639 ScriptState* scriptState = isolatedWorldWindowProxy->scriptState(); 595 ScriptState* scriptState = isolatedWorldWindowProxy->scriptState();
640 v8::Context::Scope scope(scriptState->context()); 596 v8::Context::Scope scope(scriptState->context());
641 v8::Local<v8::Array> resultArray = v8::Array::New(m_isolate, sources.size()) ; 597 v8::Local<v8::Array> resultArray = v8::Array::New(isolate(), sources.size()) ;
642 598
643 for (size_t i = 0; i < sources.size(); ++i) { 599 for (size_t i = 0; i < sources.size(); ++i) {
644 v8::Local<v8::Value> evaluationResult = executeScriptAndReturnValue(scri ptState->context(), sources[i]); 600 v8::Local<v8::Value> evaluationResult = executeScriptAndReturnValue(scri ptState->context(), sources[i]);
645 if (evaluationResult.IsEmpty()) 601 if (evaluationResult.IsEmpty())
646 evaluationResult = v8::Local<v8::Value>::New(m_isolate, v8::Undefine d(m_isolate)); 602 evaluationResult = v8::Local<v8::Value>::New(isolate(), v8::Undefine d(isolate()));
647 resultArray->Set(i, evaluationResult); 603 resultArray->Set(i, evaluationResult);
648 } 604 }
649 605
650 if (results) { 606 if (results) {
651 for (size_t i = 0; i < resultArray->Length(); ++i) 607 for (size_t i = 0; i < resultArray->Length(); ++i)
652 results->append(resultArray->Get(i)); 608 results->append(resultArray->Get(i));
653 } 609 }
654 } 610 }
655 611
656 } // namespace blink 612 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698