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

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

Issue 2630693002: Make ScriptController inherit LocalWindowProxyManager
Patch Set: rebase 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 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
70 #include "public/platform/Platform.h" 70 #include "public/platform/Platform.h"
71 #include "wtf/CurrentTime.h" 71 #include "wtf/CurrentTime.h"
72 #include "wtf/StdLibExtras.h" 72 #include "wtf/StdLibExtras.h"
73 #include "wtf/StringExtras.h" 73 #include "wtf/StringExtras.h"
74 #include "wtf/text/CString.h" 74 #include "wtf/text/CString.h"
75 #include "wtf/text/StringBuilder.h" 75 #include "wtf/text/StringBuilder.h"
76 #include "wtf/text/TextPosition.h" 76 #include "wtf/text/TextPosition.h"
77 77
78 namespace blink { 78 namespace blink {
79 79
80 ScriptController::ScriptController(LocalFrame* frame) 80 ScriptController::ScriptController(LocalFrame& frame)
81 : m_windowProxyManager(LocalWindowProxyManager::create(*frame)) {} 81 : LocalWindowProxyManager(frame) {}
82
83 DEFINE_TRACE(ScriptController) {
84 visitor->trace(m_windowProxyManager);
85 }
86
87 void ScriptController::clearForClose() {
88 m_windowProxyManager->clearForClose();
89 MainThreadDebugger::instance()->didClearContextsForFrame(frame());
90 }
91
92 void ScriptController::updateSecurityOrigin(SecurityOrigin* securityOrigin) {
93 m_windowProxyManager->updateSecurityOrigin(securityOrigin);
94 }
95 82
96 namespace { 83 namespace {
97 84
98 V8CacheOptions cacheOptions(const ScriptResource* resource, 85 V8CacheOptions cacheOptions(const ScriptResource* resource,
99 const Settings* settings) { 86 const Settings* settings) {
100 V8CacheOptions v8CacheOptions(V8CacheOptionsDefault); 87 V8CacheOptions v8CacheOptions(V8CacheOptionsDefault);
101 if (settings) 88 if (settings)
102 v8CacheOptions = settings->getV8CacheOptions(); 89 v8CacheOptions = settings->getV8CacheOptions();
103 if (resource && !resource->response().cacheStorageCacheName().isNull()) { 90 if (resource && !resource->response().cacheStorageCacheName().isNull()) {
104 switch (settings->getV8CacheStrategiesForCacheStorage()) { 91 switch (settings->getV8CacheStrategiesForCacheStorage()) {
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
153 return result; 140 return result;
154 } 141 }
155 142
156 TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"), 143 TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"),
157 "UpdateCounters", TRACE_EVENT_SCOPE_THREAD, "data", 144 "UpdateCounters", TRACE_EVENT_SCOPE_THREAD, "data",
158 InspectorUpdateCountersEvent::data()); 145 InspectorUpdateCountersEvent::data());
159 146
160 return result; 147 return result;
161 } 148 }
162 149
163 LocalWindowProxy* ScriptController::windowProxy(DOMWrapperWorld& world) {
164 LocalWindowProxy* windowProxy = m_windowProxyManager->windowProxy(world);
165 windowProxy->initializeIfNeeded();
166 return windowProxy;
167 }
168
169 bool ScriptController::shouldBypassMainWorldCSP() { 150 bool ScriptController::shouldBypassMainWorldCSP() {
170 v8::HandleScope handleScope(isolate()); 151 v8::HandleScope handleScope(isolate());
171 v8::Local<v8::Context> context = isolate()->GetCurrentContext(); 152 v8::Local<v8::Context> context = isolate()->GetCurrentContext();
172 if (context.IsEmpty() || !toDOMWindow(context)) 153 if (context.IsEmpty() || !toDOMWindow(context))
173 return false; 154 return false;
174 DOMWrapperWorld& world = DOMWrapperWorld::current(isolate()); 155 DOMWrapperWorld& world = DOMWrapperWorld::current(isolate());
175 return world.isIsolatedWorld() ? world.isolatedWorldHasContentSecurityPolicy() 156 return world.isIsolatedWorld() ? world.isolatedWorldHasContentSecurityPolicy()
176 : false; 157 : false;
177 } 158 }
178 159
179 TextPosition ScriptController::eventHandlerPosition() const { 160 TextPosition ScriptController::eventHandlerPosition() const {
180 ScriptableDocumentParser* parser = 161 ScriptableDocumentParser* parser =
181 frame()->document()->scriptableDocumentParser(); 162 frame()->document()->scriptableDocumentParser();
182 if (parser) 163 if (parser)
183 return parser->textPosition(); 164 return parser->textPosition();
184 return TextPosition::minimumPosition(); 165 return TextPosition::minimumPosition();
185 } 166 }
186 167
168 void ScriptController::namedItemAdded(HTMLDocument* document,
169 const AtomicString& name) {
170 initializeMainWorld();
171
172 mainWorldProxy()->namedItemAdded(document, name);
173 }
174
175 void ScriptController::namedItemRemoved(HTMLDocument* document,
176 const AtomicString& name) {
177 initializeMainWorld();
178
179 mainWorldProxy()->namedItemRemoved(document, name);
180 }
181
187 void ScriptController::enableEval() { 182 void ScriptController::enableEval() {
188 v8::HandleScope handleScope(isolate()); 183 v8::HandleScope handleScope(isolate());
189 v8::Local<v8::Context> v8Context = 184 v8::Local<v8::Context> v8Context = mainWorldProxy()->contextIfInitialized();
190 m_windowProxyManager->mainWorldProxy()->contextIfInitialized();
191 if (v8Context.IsEmpty()) 185 if (v8Context.IsEmpty())
192 return; 186 return;
193 v8Context->AllowCodeGenerationFromStrings(true); 187 v8Context->AllowCodeGenerationFromStrings(true);
194 } 188 }
195 189
196 void ScriptController::disableEval(const String& errorMessage) { 190 void ScriptController::disableEval(const String& errorMessage) {
197 v8::HandleScope handleScope(isolate()); 191 v8::HandleScope handleScope(isolate());
198 v8::Local<v8::Context> v8Context = 192 v8::Local<v8::Context> v8Context = mainWorldProxy()->contextIfInitialized();
199 m_windowProxyManager->mainWorldProxy()->contextIfInitialized();
200 if (v8Context.IsEmpty()) 193 if (v8Context.IsEmpty())
201 return; 194 return;
202 v8Context->AllowCodeGenerationFromStrings(false); 195 v8Context->AllowCodeGenerationFromStrings(false);
203 v8Context->SetErrorMessageForCodeGenerationFromStrings( 196 v8Context->SetErrorMessageForCodeGenerationFromStrings(
204 v8String(isolate(), errorMessage)); 197 v8String(isolate(), errorMessage));
205 } 198 }
206 199
207 PassRefPtr<SharedPersistent<v8::Object>> ScriptController::createPluginWrapper( 200 PassRefPtr<SharedPersistent<v8::Object>> ScriptController::createPluginWrapper(
208 Widget* widget) { 201 Widget* widget) {
209 ASSERT(widget); 202 ASSERT(widget);
210 203
211 if (!widget->isPluginView()) 204 if (!widget->isPluginView())
212 return nullptr; 205 return nullptr;
213 206
214 v8::HandleScope handleScope(isolate()); 207 v8::HandleScope handleScope(isolate());
215 v8::Local<v8::Object> scriptableObject = 208 v8::Local<v8::Object> scriptableObject =
216 toPluginView(widget)->scriptableObject(isolate()); 209 toPluginView(widget)->scriptableObject(isolate());
217 210
218 if (scriptableObject.IsEmpty()) 211 if (scriptableObject.IsEmpty())
219 return nullptr; 212 return nullptr;
220 213
221 return SharedPersistent<v8::Object>::create(scriptableObject, isolate()); 214 return SharedPersistent<v8::Object>::create(scriptableObject, isolate());
222 } 215 }
223 216
217 void ScriptController::clearForClose() {
218 LocalWindowProxyManager::clearForClose();
219 MainThreadDebugger::instance()->didClearContextsForFrame(frame());
220 }
221
222 void ScriptController::clearForNavigation() {
223 // V8 binding expects ScriptController::clearForNavigation() only be called
224 // when a frame is loading a new page.
225 LocalWindowProxyManager::clearForNavigation();
226 MainThreadDebugger::instance()->didClearContextsForFrame(frame());
227 }
228
229 void ScriptController::updateDocument() {
230 mainWorldProxy()->updateDocument();
231 }
232
233 void ScriptController::updateSecurityOrigin(SecurityOrigin* securityOrigin) {
234 mainWorldProxy()->updateSecurityOrigin(securityOrigin);
235 for (auto& entry : isolatedWorlds()) {
236 // This is a little hacky, but a LocalWindowProxyManager can only hold
237 // LocalWindowProxy objects, so the downcast to LocalWindowProxy is safe.
238 auto* isolatedWindowProxy =
239 static_cast<LocalWindowProxy*>(entry.value.get());
240 SecurityOrigin* isolatedSecurityOrigin =
241 isolatedWindowProxy->world().isolatedWorldSecurityOrigin();
242 isolatedWindowProxy->updateSecurityOrigin(isolatedSecurityOrigin);
243 }
244 }
245
246 void ScriptController::initializeMainWorld() {
247 mainWorldProxy()->initializeIfNeeded();
248 }
249
224 V8Extensions& ScriptController::registeredExtensions() { 250 V8Extensions& ScriptController::registeredExtensions() {
225 DEFINE_STATIC_LOCAL(V8Extensions, extensions, ()); 251 DEFINE_STATIC_LOCAL(V8Extensions, extensions, ());
226 return extensions; 252 return extensions;
227 } 253 }
228 254
229 void ScriptController::registerExtensionIfNeeded(v8::Extension* extension) { 255 void ScriptController::registerExtensionIfNeeded(v8::Extension* extension) {
230 const V8Extensions& extensions = registeredExtensions(); 256 const V8Extensions& extensions = registeredExtensions();
231 for (size_t i = 0; i < extensions.size(); ++i) { 257 for (size_t i = 0; i < extensions.size(); ++i) {
232 if (extensions[i] == extension) 258 if (extensions[i] == extension)
233 return; 259 return;
234 } 260 }
235 v8::RegisterExtension(extension); 261 v8::RegisterExtension(extension);
236 registeredExtensions().push_back(extension); 262 registeredExtensions().push_back(extension);
237 } 263 }
238 264
239 void ScriptController::clearWindowProxy() {
240 // V8 binding expects ScriptController::clearWindowProxy only be called when a
241 // frame is loading a new page. This creates a new context for the new page.
242 m_windowProxyManager->clearForNavigation();
243 MainThreadDebugger::instance()->didClearContextsForFrame(frame());
244 }
245
246 void ScriptController::updateDocument() {
247 m_windowProxyManager->mainWorldProxy()->updateDocument();
248 }
249
250 bool ScriptController::canExecuteScripts( 265 bool ScriptController::canExecuteScripts(
251 ReasonForCallingCanExecuteScripts reason) { 266 ReasonForCallingCanExecuteScripts reason) {
252 267
253 if (frame()->document() && frame()->document()->isSandboxed(SandboxScripts)) { 268 if (frame()->document() && frame()->document()->isSandboxed(SandboxScripts)) {
254 // FIXME: This message should be moved off the console once a solution to 269 // FIXME: This message should be moved off the console once a solution to
255 // https://bugs.webkit.org/show_bug.cgi?id=103274 exists. 270 // https://bugs.webkit.org/show_bug.cgi?id=103274 exists.
256 if (reason == AboutToExecuteScript) 271 if (reason == AboutToExecuteScript)
257 frame()->document()->addConsoleMessage(ConsoleMessage::create( 272 frame()->document()->addConsoleMessage(ConsoleMessage::create(
258 SecurityMessageSource, ErrorMessageLevel, 273 SecurityMessageSource, ErrorMessageLevel,
259 "Blocked script execution in '" + 274 "Blocked script execution in '" +
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
413 for (size_t i = 0; i < resultArray->Length(); ++i) { 428 for (size_t i = 0; i < resultArray->Length(); ++i) {
414 v8::Local<v8::Value> value; 429 v8::Local<v8::Value> value;
415 if (!resultArray->Get(scriptState->context(), i).ToLocal(&value)) 430 if (!resultArray->Get(scriptState->context(), i).ToLocal(&value))
416 return; 431 return;
417 results->push_back(value); 432 results->push_back(value);
418 } 433 }
419 } 434 }
420 } 435 }
421 436
422 } // namespace blink 437 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/bindings/core/v8/ScriptController.h ('k') | third_party/WebKit/Source/bindings/core/v8/ToV8.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698