| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "bindings/core/v8/PrivateScriptRunner.h" | 5 #include "bindings/core/v8/PrivateScriptRunner.h" |
| 6 | 6 |
| 7 #include "bindings/core/v8/DOMWrapperWorld.h" | 7 #include "bindings/core/v8/DOMWrapperWorld.h" |
| 8 #include "bindings/core/v8/ExceptionState.h" | 8 #include "bindings/core/v8/ExceptionState.h" |
| 9 #include "bindings/core/v8/V8Binding.h" | 9 #include "bindings/core/v8/V8Binding.h" |
| 10 #include "bindings/core/v8/V8PerContextData.h" | 10 #include "bindings/core/v8/V8PerContextData.h" |
| 11 #include "bindings/core/v8/V8PrivateProperty.h" |
| 11 #include "bindings/core/v8/V8ScriptRunner.h" | 12 #include "bindings/core/v8/V8ScriptRunner.h" |
| 12 #include "core/PrivateScriptSources.h" | 13 #include "core/PrivateScriptSources.h" |
| 13 #ifndef NDEBUG | 14 #ifndef NDEBUG |
| 14 #include "core/PrivateScriptSourcesForTesting.h" | 15 #include "core/PrivateScriptSourcesForTesting.h" |
| 15 #endif | 16 #endif |
| 16 #include "core/dom/Document.h" | 17 #include "core/dom/Document.h" |
| 17 #include "core/dom/ExceptionCode.h" | 18 #include "core/dom/ExceptionCode.h" |
| 18 #include "platform/PlatformResourceLoader.h" | 19 #include "platform/PlatformResourceLoader.h" |
| 19 | 20 |
| 20 namespace blink { | 21 namespace blink { |
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 182 return v8::Local<v8::Object>::Cast(compiledClass); | 183 return v8::Local<v8::Object>::Cast(compiledClass); |
| 183 } | 184 } |
| 184 | 185 |
| 185 static void initializeHolderIfNeeded(ScriptState* scriptState, v8::Local<v8::Obj
ect> classObject, v8::Local<v8::Value> holder) | 186 static void initializeHolderIfNeeded(ScriptState* scriptState, v8::Local<v8::Obj
ect> classObject, v8::Local<v8::Value> holder) |
| 186 { | 187 { |
| 187 RELEASE_ASSERT(!holder.IsEmpty()); | 188 RELEASE_ASSERT(!holder.IsEmpty()); |
| 188 RELEASE_ASSERT(holder->IsObject()); | 189 RELEASE_ASSERT(holder->IsObject()); |
| 189 v8::Local<v8::Object> holderObject = v8::Local<v8::Object>::Cast(holder); | 190 v8::Local<v8::Object> holderObject = v8::Local<v8::Object>::Cast(holder); |
| 190 v8::Isolate* isolate = scriptState->isolate(); | 191 v8::Isolate* isolate = scriptState->isolate(); |
| 191 v8::Local<v8::Context> context = scriptState->context(); | 192 v8::Local<v8::Context> context = scriptState->context(); |
| 192 v8::Local<v8::Value> isInitialized = V8HiddenValue::getHiddenValue(scriptSta
te, holderObject, V8HiddenValue::privateScriptObjectIsInitialized(isolate)); | 193 auto privateIsInitialized = V8PrivateProperty::getPrivateScriptRunnerIsIniti
alized(isolate); |
| 193 if (isInitialized.IsEmpty()) { | 194 if (privateIsInitialized.hasValue(context, holderObject)) |
| 195 return; // Already initialized. |
| 196 |
| 197 v8::TryCatch block(isolate); |
| 198 v8::Local<v8::Value> initializeFunction; |
| 199 if (classObject->Get(scriptState->context(), v8String(isolate, "initialize")
).ToLocal(&initializeFunction) && initializeFunction->IsFunction()) { |
| 194 v8::TryCatch block(isolate); | 200 v8::TryCatch block(isolate); |
| 195 v8::Local<v8::Value> initializeFunction; | 201 v8::Local<v8::Value> result; |
| 196 if (classObject->Get(scriptState->context(), v8String(isolate, "initiali
ze")).ToLocal(&initializeFunction) && initializeFunction->IsFunction()) { | 202 if (!V8ScriptRunner::callFunction(v8::Local<v8::Function>::Cast(initiali
zeFunction), scriptState->getExecutionContext(), holder, 0, 0, isolate).ToLocal(
&result)) { |
| 197 v8::TryCatch block(isolate); | 203 fprintf(stderr, "Private script error: Object constructor threw an e
xception.\n"); |
| 198 v8::Local<v8::Value> result; | 204 dumpV8Message(context, block.Message()); |
| 199 if (!V8ScriptRunner::callFunction(v8::Local<v8::Function>::Cast(init
ializeFunction), scriptState->getExecutionContext(), holder, 0, 0, isolate).ToLo
cal(&result)) { | 205 RELEASE_NOTREACHED(); |
| 200 fprintf(stderr, "Private script error: Object constructor threw
an exception.\n"); | |
| 201 dumpV8Message(context, block.Message()); | |
| 202 RELEASE_NOTREACHED(); | |
| 203 } | |
| 204 } | 206 } |
| 207 } |
| 205 | 208 |
| 206 // Inject the prototype object of the private script into the prototype
chain of the holder object. | 209 // Inject the prototype object of the private script into the prototype chai
n of the holder object. |
| 207 // This is necessary to let the holder object use properties defined on
the prototype object | 210 // This is necessary to let the holder object use properties defined on the
prototype object |
| 208 // of the private script. (e.g., if the prototype object has |foo|, the
holder object should be able | 211 // of the private script. (e.g., if the prototype object has |foo|, the hold
er object should be able |
| 209 // to use it with |this.foo|.) | 212 // to use it with |this.foo|.) |
| 210 if (classObject->GetPrototype() != holderObject->GetPrototype()) { | 213 if (classObject->GetPrototype() != holderObject->GetPrototype()) { |
| 211 if (!v8CallBoolean(classObject->SetPrototype(context, holderObject->
GetPrototype()))) { | 214 if (!v8CallBoolean(classObject->SetPrototype(context, holderObject->GetP
rototype()))) { |
| 212 fprintf(stderr, "Private script error: SetPrototype failed.\n"); | |
| 213 dumpV8Message(context, block.Message()); | |
| 214 RELEASE_NOTREACHED(); | |
| 215 } | |
| 216 } | |
| 217 if (!v8CallBoolean(holderObject->SetPrototype(context, classObject))) { | |
| 218 fprintf(stderr, "Private script error: SetPrototype failed.\n"); | 215 fprintf(stderr, "Private script error: SetPrototype failed.\n"); |
| 219 dumpV8Message(context, block.Message()); | 216 dumpV8Message(context, block.Message()); |
| 220 RELEASE_NOTREACHED(); | 217 RELEASE_NOTREACHED(); |
| 221 } | 218 } |
| 219 } |
| 220 if (!v8CallBoolean(holderObject->SetPrototype(context, classObject))) { |
| 221 fprintf(stderr, "Private script error: SetPrototype failed.\n"); |
| 222 dumpV8Message(context, block.Message()); |
| 223 RELEASE_NOTREACHED(); |
| 224 } |
| 222 | 225 |
| 223 isInitialized = v8Boolean(true, isolate); | 226 privateIsInitialized.set(context, holderObject, v8Boolean(true, isolate)); |
| 224 V8HiddenValue::setHiddenValue(scriptState, holderObject, V8HiddenValue::
privateScriptObjectIsInitialized(isolate), isInitialized); | |
| 225 } | |
| 226 } | 227 } |
| 227 | 228 |
| 228 v8::Local<v8::Value> PrivateScriptRunner::installClassIfNeeded(Document* documen
t, String className) | 229 v8::Local<v8::Value> PrivateScriptRunner::installClassIfNeeded(Document* documen
t, String className) |
| 229 { | 230 { |
| 230 if (!document->contextDocument()->frame()) | 231 if (!document->contextDocument()->frame()) |
| 231 return v8::Local<v8::Value>(); | 232 return v8::Local<v8::Value>(); |
| 232 | 233 |
| 233 v8::HandleScope handleScope(toIsolate(document)); | 234 v8::HandleScope handleScope(toIsolate(document)); |
| 234 ScriptState* scriptState = ScriptState::forWorld(document->contextDocument()
->frame(), DOMWrapperWorld::privateScriptIsolatedWorld()); | 235 ScriptState* scriptState = ScriptState::forWorld(document->contextDocument()
->frame(), DOMWrapperWorld::privateScriptIsolatedWorld()); |
| 235 if (!scriptState) | 236 if (!scriptState) |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 352 v8::Local<v8::Value> result; | 353 v8::Local<v8::Value> result; |
| 353 if (!V8ScriptRunner::callFunction(v8::Local<v8::Function>::Cast(method), scr
iptState->getExecutionContext(), holder, argc, argv, scriptState->isolate()).ToL
ocal(&result)) { | 354 if (!V8ScriptRunner::callFunction(v8::Local<v8::Function>::Cast(method), scr
iptState->getExecutionContext(), holder, argc, argv, scriptState->isolate()).ToL
ocal(&result)) { |
| 354 rethrowExceptionInPrivateScript(scriptState->isolate(), block, scriptSta
teInUserScript, ExceptionState::ExecutionContext, methodName, className); | 355 rethrowExceptionInPrivateScript(scriptState->isolate(), block, scriptSta
teInUserScript, ExceptionState::ExecutionContext, methodName, className); |
| 355 block.ReThrow(); | 356 block.ReThrow(); |
| 356 return v8::Local<v8::Value>(); | 357 return v8::Local<v8::Value>(); |
| 357 } | 358 } |
| 358 return result; | 359 return result; |
| 359 } | 360 } |
| 360 | 361 |
| 361 } // namespace blink | 362 } // namespace blink |
| OLD | NEW |