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

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

Issue 2630693002: Make ScriptController inherit LocalWindowProxyManager
Patch Set: Add comments Created 3 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
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 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
71 #include "public/platform/Platform.h" 71 #include "public/platform/Platform.h"
72 #include "wtf/CurrentTime.h" 72 #include "wtf/CurrentTime.h"
73 #include "wtf/StdLibExtras.h" 73 #include "wtf/StdLibExtras.h"
74 #include "wtf/StringExtras.h" 74 #include "wtf/StringExtras.h"
75 #include "wtf/text/CString.h" 75 #include "wtf/text/CString.h"
76 #include "wtf/text/StringBuilder.h" 76 #include "wtf/text/StringBuilder.h"
77 #include "wtf/text/TextPosition.h" 77 #include "wtf/text/TextPosition.h"
78 78
79 namespace blink { 79 namespace blink {
80 80
81 ScriptController::ScriptController(LocalFrame* frame) 81 ScriptController::ScriptController(LocalFrame& frame)
82 : m_windowProxyManager(LocalWindowProxyManager::create(*frame)) {} 82 : LocalWindowProxyManager(frame) {}
83
84 DEFINE_TRACE(ScriptController) {
85 visitor->trace(m_windowProxyManager);
86 }
87 83
88 void ScriptController::clearForClose() { 84 void ScriptController::clearForClose() {
89 m_windowProxyManager->clearForClose(); 85 LocalWindowProxyManager::clearForClose();
90 MainThreadDebugger::instance()->didClearContextsForFrame(frame()); 86 MainThreadDebugger::instance()->didClearContextsForFrame(frame());
91 } 87 }
92 88
93 void ScriptController::updateSecurityOrigin(SecurityOrigin* securityOrigin) { 89 void ScriptController::updateSecurityOrigin(SecurityOrigin* securityOrigin) {
94 m_windowProxyManager->updateSecurityOrigin(securityOrigin); 90 // This is a little hacky, but a LocalWindowProxyManager can only hold
91 // LocalWindowProxy objects, so the downcast to LocalWindowProxy is safe.
92 static_cast<LocalWindowProxy*>(mainWorldProxy())
Yuki 2017/01/13 10:41:59 Did you make WindowProxyManagerImplHelper::mainWor
dcheng 2017/01/13 18:57:30 Originally, I wrote it this way for consistency or
93 ->updateSecurityOrigin(securityOrigin);
94 for (auto& entry : isolatedWorlds()) {
95 auto* isolatedWindowProxy =
96 static_cast<LocalWindowProxy*>(entry.value.get());
97 SecurityOrigin* isolatedSecurityOrigin =
98 isolatedWindowProxy->world().isolatedWorldSecurityOrigin();
99 isolatedWindowProxy->updateSecurityOrigin(isolatedSecurityOrigin);
100 }
95 } 101 }
96 102
97 namespace { 103 namespace {
98 104
99 V8CacheOptions cacheOptions(const ScriptResource* resource, 105 V8CacheOptions cacheOptions(const ScriptResource* resource,
100 const Settings* settings) { 106 const Settings* settings) {
101 V8CacheOptions v8CacheOptions(V8CacheOptionsDefault); 107 V8CacheOptions v8CacheOptions(V8CacheOptionsDefault);
102 if (settings) 108 if (settings)
103 v8CacheOptions = settings->getV8CacheOptions(); 109 v8CacheOptions = settings->getV8CacheOptions();
104 if (resource && !resource->response().cacheStorageCacheName().isNull()) { 110 if (resource && !resource->response().cacheStorageCacheName().isNull()) {
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
202 V8ScriptRunner::runCompiledScript( 208 V8ScriptRunner::runCompiledScript(
203 isolate(), compiledScript.script(isolate()), frame()->document()), 209 isolate(), compiledScript.script(isolate()), frame()->document()),
204 result, tryCatch)) 210 result, tryCatch))
205 return; 211 return;
206 212
207 TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"), 213 TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"),
208 "UpdateCounters", TRACE_EVENT_SCOPE_THREAD, "data", 214 "UpdateCounters", TRACE_EVENT_SCOPE_THREAD, "data",
209 InspectorUpdateCountersEvent::data()); 215 InspectorUpdateCountersEvent::data());
210 } 216 }
211 217
212 LocalWindowProxy* ScriptController::windowProxy(DOMWrapperWorld& world) {
213 LocalWindowProxy* windowProxy = m_windowProxyManager->windowProxy(world);
214 windowProxy->initializeIfNeeded();
215 return windowProxy;
216 }
217
218 bool ScriptController::shouldBypassMainWorldCSP() { 218 bool ScriptController::shouldBypassMainWorldCSP() {
219 v8::HandleScope handleScope(isolate()); 219 v8::HandleScope handleScope(isolate());
220 v8::Local<v8::Context> context = isolate()->GetCurrentContext(); 220 v8::Local<v8::Context> context = isolate()->GetCurrentContext();
221 if (context.IsEmpty() || !toDOMWindow(context)) 221 if (context.IsEmpty() || !toDOMWindow(context))
222 return false; 222 return false;
223 DOMWrapperWorld& world = DOMWrapperWorld::current(isolate()); 223 DOMWrapperWorld& world = DOMWrapperWorld::current(isolate());
224 return world.isIsolatedWorld() ? world.isolatedWorldHasContentSecurityPolicy() 224 return world.isIsolatedWorld() ? world.isolatedWorldHasContentSecurityPolicy()
225 : false; 225 : false;
226 } 226 }
227 227
228 TextPosition ScriptController::eventHandlerPosition() const { 228 TextPosition ScriptController::eventHandlerPosition() const {
229 ScriptableDocumentParser* parser = 229 ScriptableDocumentParser* parser =
230 frame()->document()->scriptableDocumentParser(); 230 frame()->document()->scriptableDocumentParser();
231 if (parser) 231 if (parser)
232 return parser->textPosition(); 232 return parser->textPosition();
233 return TextPosition::minimumPosition(); 233 return TextPosition::minimumPosition();
234 } 234 }
235 235
236 void ScriptController::enableEval() { 236 void ScriptController::enableEval() {
237 v8::HandleScope handleScope(isolate()); 237 v8::HandleScope handleScope(isolate());
238 v8::Local<v8::Context> v8Context = 238 v8::Local<v8::Context> v8Context = mainWorldProxy()->contextIfInitialized();
239 m_windowProxyManager->mainWorldProxy()->contextIfInitialized();
240 if (v8Context.IsEmpty()) 239 if (v8Context.IsEmpty())
241 return; 240 return;
242 v8Context->AllowCodeGenerationFromStrings(true); 241 v8Context->AllowCodeGenerationFromStrings(true);
243 } 242 }
244 243
245 void ScriptController::disableEval(const String& errorMessage) { 244 void ScriptController::disableEval(const String& errorMessage) {
246 v8::HandleScope handleScope(isolate()); 245 v8::HandleScope handleScope(isolate());
247 v8::Local<v8::Context> v8Context = 246 v8::Local<v8::Context> v8Context = mainWorldProxy()->contextIfInitialized();
248 m_windowProxyManager->mainWorldProxy()->contextIfInitialized();
249 if (v8Context.IsEmpty()) 247 if (v8Context.IsEmpty())
250 return; 248 return;
251 v8Context->AllowCodeGenerationFromStrings(false); 249 v8Context->AllowCodeGenerationFromStrings(false);
252 v8Context->SetErrorMessageForCodeGenerationFromStrings( 250 v8Context->SetErrorMessageForCodeGenerationFromStrings(
253 v8String(isolate(), errorMessage)); 251 v8String(isolate(), errorMessage));
254 } 252 }
255 253
256 PassRefPtr<SharedPersistent<v8::Object>> ScriptController::createPluginWrapper( 254 PassRefPtr<SharedPersistent<v8::Object>> ScriptController::createPluginWrapper(
257 Widget* widget) { 255 Widget* widget) {
258 ASSERT(widget); 256 ASSERT(widget);
(...skipping 19 matching lines...) Expand all
278 void ScriptController::registerExtensionIfNeeded(v8::Extension* extension) { 276 void ScriptController::registerExtensionIfNeeded(v8::Extension* extension) {
279 const V8Extensions& extensions = registeredExtensions(); 277 const V8Extensions& extensions = registeredExtensions();
280 for (size_t i = 0; i < extensions.size(); ++i) { 278 for (size_t i = 0; i < extensions.size(); ++i) {
281 if (extensions[i] == extension) 279 if (extensions[i] == extension)
282 return; 280 return;
283 } 281 }
284 v8::RegisterExtension(extension); 282 v8::RegisterExtension(extension);
285 registeredExtensions().push_back(extension); 283 registeredExtensions().push_back(extension);
286 } 284 }
287 285
288 void ScriptController::clearWindowProxy() { 286 void ScriptController::clearForNavigation() {
Yuki 2017/01/13 10:42:00 nit: Could you put clearForClose and clearForNavig
dcheng 2017/01/13 18:57:30 Done.
289 // V8 binding expects ScriptController::clearWindowProxy only be called when a 287 // V8 binding expects ScriptController::clearForNavigation() only be called
290 // frame is loading a new page. This creates a new context for the new page. 288 // when a frame is loading a new page.
291 m_windowProxyManager->clearForNavigation(); 289 WindowProxyManagerBase::clearForNavigation();
Yuki 2017/01/13 10:42:00 Given LocalWindowProxyManager is a direct base cla
dcheng 2017/01/13 18:57:30 Done.
292 MainThreadDebugger::instance()->didClearContextsForFrame(frame()); 290 MainThreadDebugger::instance()->didClearContextsForFrame(frame());
293 } 291 }
294 292
295 void ScriptController::updateDocument() { 293 void ScriptController::updateDocument() {
296 m_windowProxyManager->mainWorldProxy()->updateDocument(); 294 mainWorldProxy()->updateDocument();
297 } 295 }
298 296
299 bool ScriptController::canExecuteScripts( 297 bool ScriptController::canExecuteScripts(
300 ReasonForCallingCanExecuteScripts reason) { 298 ReasonForCallingCanExecuteScripts reason) {
301 299
302 if (frame()->document() && frame()->document()->isSandboxed(SandboxScripts)) { 300 if (frame()->document() && frame()->document()->isSandboxed(SandboxScripts)) {
303 // FIXME: This message should be moved off the console once a solution to 301 // FIXME: This message should be moved off the console once a solution to
304 // https://bugs.webkit.org/show_bug.cgi?id=103274 exists. 302 // https://bugs.webkit.org/show_bug.cgi?id=103274 exists.
305 if (reason == AboutToExecuteScript) 303 if (reason == AboutToExecuteScript)
306 frame()->document()->addConsoleMessage(ConsoleMessage::create( 304 frame()->document()->addConsoleMessage(ConsoleMessage::create(
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
463 for (size_t i = 0; i < resultArray->Length(); ++i) { 461 for (size_t i = 0; i < resultArray->Length(); ++i) {
464 v8::Local<v8::Value> value; 462 v8::Local<v8::Value> value;
465 if (!resultArray->Get(scriptState->context(), i).ToLocal(&value)) 463 if (!resultArray->Get(scriptState->context(), i).ToLocal(&value))
466 return; 464 return;
467 results->push_back(value); 465 results->push_back(value);
468 } 466 }
469 } 467 }
470 } 468 }
471 469
472 } // namespace blink 470 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698