| 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 "config.h" | 5 #include "config.h" |
| 6 #include "bindings/core/v8/PrivateScriptRunner.h" | 6 #include "bindings/core/v8/PrivateScriptRunner.h" |
| 7 | 7 |
| 8 #include "bindings/core/v8/DOMWrapperWorld.h" | 8 #include "bindings/core/v8/DOMWrapperWorld.h" |
| 9 #include "bindings/core/v8/ExceptionState.h" | 9 #include "bindings/core/v8/ExceptionState.h" |
| 10 #include "bindings/core/v8/V8Binding.h" | 10 #include "bindings/core/v8/V8Binding.h" |
| (...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 179 if (context.IsEmpty()) | 179 if (context.IsEmpty()) |
| 180 return v8::Handle<v8::Value>(); | 180 return v8::Handle<v8::Value>(); |
| 181 ScriptState* scriptState = ScriptState::from(context); | 181 ScriptState* scriptState = ScriptState::from(context); |
| 182 if (!scriptState->executionContext()) | 182 if (!scriptState->executionContext()) |
| 183 return v8::Handle<v8::Value>(); | 183 return v8::Handle<v8::Value>(); |
| 184 | 184 |
| 185 ScriptState::Scope scope(scriptState); | 185 ScriptState::Scope scope(scriptState); |
| 186 return classObjectOfPrivateScript(scriptState, className); | 186 return classObjectOfPrivateScript(scriptState, className); |
| 187 } | 187 } |
| 188 | 188 |
| 189 v8::Handle<v8::Value> PrivateScriptRunner::runDOMAttributeGetter(ScriptState* sc
riptState, String className, String attributeName, v8::Handle<v8::Value> holder) | 189 namespace { |
| 190 { | |
| 191 v8::Handle<v8::Object> classObject = classObjectOfPrivateScript(scriptState,
className); | |
| 192 v8::Handle<v8::Value> descriptor = classObject->GetOwnPropertyDescriptor(v8S
tring(scriptState->isolate(), attributeName)); | |
| 193 if (descriptor.IsEmpty() || !descriptor->IsObject()) { | |
| 194 fprintf(stderr, "Private script error: Target DOM attribute getter was n
ot found. (Class name = %s, Attribute name = %s)\n", className.utf8().data(), at
tributeName.utf8().data()); | |
| 195 RELEASE_ASSERT_NOT_REACHED(); | |
| 196 } | |
| 197 v8::Handle<v8::Value> getter = v8::Handle<v8::Object>::Cast(descriptor)->Get
(v8String(scriptState->isolate(), "get")); | |
| 198 if (getter.IsEmpty() || !getter->IsFunction()) { | |
| 199 fprintf(stderr, "Private script error: Target DOM attribute getter was n
ot found. (Class name = %s, Attribute name = %s)\n", className.utf8().data(), at
tributeName.utf8().data()); | |
| 200 RELEASE_ASSERT_NOT_REACHED(); | |
| 201 } | |
| 202 initializeHolderIfNeeded(scriptState, classObject, holder); | |
| 203 return V8ScriptRunner::callFunction(v8::Handle<v8::Function>::Cast(getter),
scriptState->executionContext(), holder, 0, 0, scriptState->isolate()); | |
| 204 } | |
| 205 | 190 |
| 206 void PrivateScriptRunner::runDOMAttributeSetter(ScriptState* scriptState, String
className, String attributeName, v8::Handle<v8::Value> holder, v8::Handle<v8::V
alue> v8Value) | 191 void rethrowExceptionInPrivateScript(v8::Isolate* isolate, v8::TryCatch& block,
ScriptState* scriptStateInUserScript, ExceptionState::Context errorContext, cons
t char* propertyName, const char* interfaceName) |
| 207 { | |
| 208 v8::Handle<v8::Object> classObject = classObjectOfPrivateScript(scriptState,
className); | |
| 209 v8::Handle<v8::Value> descriptor = classObject->GetOwnPropertyDescriptor(v8S
tring(scriptState->isolate(), attributeName)); | |
| 210 if (descriptor.IsEmpty() || !descriptor->IsObject()) { | |
| 211 fprintf(stderr, "Private script error: Target DOM attribute setter was n
ot found. (Class name = %s, Attribute name = %s)\n", className.utf8().data(), at
tributeName.utf8().data()); | |
| 212 RELEASE_ASSERT_NOT_REACHED(); | |
| 213 } | |
| 214 v8::Handle<v8::Value> setter = v8::Handle<v8::Object>::Cast(descriptor)->Get
(v8String(scriptState->isolate(), "set")); | |
| 215 if (setter.IsEmpty() || !setter->IsFunction()) { | |
| 216 fprintf(stderr, "Private script error: Target DOM attribute setter was n
ot found. (Class name = %s, Attribute name = %s)\n", className.utf8().data(), at
tributeName.utf8().data()); | |
| 217 RELEASE_ASSERT_NOT_REACHED(); | |
| 218 } | |
| 219 initializeHolderIfNeeded(scriptState, classObject, holder); | |
| 220 v8::Handle<v8::Value> argv[] = { v8Value }; | |
| 221 V8ScriptRunner::callFunction(v8::Handle<v8::Function>::Cast(setter), scriptS
tate->executionContext(), holder, WTF_ARRAY_LENGTH(argv), argv, scriptState->iso
late()); | |
| 222 } | |
| 223 | |
| 224 v8::Handle<v8::Value> PrivateScriptRunner::runDOMMethod(ScriptState* scriptState
, String className, String methodName, v8::Handle<v8::Value> holder, int argc, v
8::Handle<v8::Value> argv[]) | |
| 225 { | |
| 226 v8::Handle<v8::Object> classObject = classObjectOfPrivateScript(scriptState,
className); | |
| 227 v8::Handle<v8::Value> method = classObject->Get(v8String(scriptState->isolat
e(), methodName)); | |
| 228 if (method.IsEmpty() || !method->IsFunction()) { | |
| 229 fprintf(stderr, "Private script error: Target DOM method was not found.
(Class name = %s, Method name = %s)\n", className.utf8().data(), methodName.utf8
().data()); | |
| 230 RELEASE_ASSERT_NOT_REACHED(); | |
| 231 } | |
| 232 initializeHolderIfNeeded(scriptState, classObject, holder); | |
| 233 return V8ScriptRunner::callFunction(v8::Handle<v8::Function>::Cast(method),
scriptState->executionContext(), holder, argc, argv, scriptState->isolate()); | |
| 234 } | |
| 235 | |
| 236 void PrivateScriptRunner::rethrowExceptionInPrivateScript(v8::Isolate* isolate,
v8::TryCatch& block, ScriptState* scriptStateInUserScript, ExceptionState::Conte
xt errorContext, const char* propertyName, const char* interfaceName) | |
| 237 { | 192 { |
| 238 v8::Handle<v8::Value> exception = block.Exception(); | 193 v8::Handle<v8::Value> exception = block.Exception(); |
| 239 RELEASE_ASSERT(!exception.IsEmpty() && exception->IsObject()); | 194 RELEASE_ASSERT(!exception.IsEmpty() && exception->IsObject()); |
| 240 | 195 |
| 241 v8::Handle<v8::Object> exceptionObject = v8::Handle<v8::Object>::Cast(except
ion); | 196 v8::Handle<v8::Object> exceptionObject = v8::Handle<v8::Object>::Cast(except
ion); |
| 242 v8::Handle<v8::Value> name = exceptionObject->Get(v8String(isolate, "name"))
; | 197 v8::Handle<v8::Value> name = exceptionObject->Get(v8String(isolate, "name"))
; |
| 243 RELEASE_ASSERT(!name.IsEmpty() && name->IsString()); | 198 RELEASE_ASSERT(!name.IsEmpty() && name->IsString()); |
| 244 | 199 |
| 245 v8::Handle<v8::Message> tryCatchMessage = block.Message(); | 200 v8::Handle<v8::Message> tryCatchMessage = block.Message(); |
| 246 v8::Handle<v8::Value> message = exceptionObject->Get(v8String(isolate, "mess
age")); | 201 v8::Handle<v8::Value> message = exceptionObject->Get(v8String(isolate, "mess
age")); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 269 exceptionState.throwDOMException(V8RangeError, messageString); | 224 exceptionState.throwDOMException(V8RangeError, messageString); |
| 270 exceptionState.throwIfNeeded(); | 225 exceptionState.throwIfNeeded(); |
| 271 return; | 226 return; |
| 272 } | 227 } |
| 273 | 228 |
| 274 fprintf(stderr, "Private script error: %s was thrown.\n", exceptionName.utf8
().data()); | 229 fprintf(stderr, "Private script error: %s was thrown.\n", exceptionName.utf8
().data()); |
| 275 dumpV8Message(tryCatchMessage); | 230 dumpV8Message(tryCatchMessage); |
| 276 RELEASE_ASSERT_NOT_REACHED(); | 231 RELEASE_ASSERT_NOT_REACHED(); |
| 277 } | 232 } |
| 278 | 233 |
| 234 } // namespace |
| 235 |
| 236 v8::Handle<v8::Value> PrivateScriptRunner::runDOMAttributeGetter(ScriptState* sc
riptState, ScriptState* scriptStateInUserScript, const char* className, const ch
ar* attributeName, v8::Handle<v8::Value> holder) |
| 237 { |
| 238 v8::Handle<v8::Object> classObject = classObjectOfPrivateScript(scriptState,
className); |
| 239 v8::Handle<v8::Value> descriptor = classObject->GetOwnPropertyDescriptor(v8S
tring(scriptState->isolate(), attributeName)); |
| 240 if (descriptor.IsEmpty() || !descriptor->IsObject()) { |
| 241 fprintf(stderr, "Private script error: Target DOM attribute getter was n
ot found. (Class name = %s, Attribute name = %s)\n", className, attributeName); |
| 242 RELEASE_ASSERT_NOT_REACHED(); |
| 243 } |
| 244 v8::Handle<v8::Value> getter = v8::Handle<v8::Object>::Cast(descriptor)->Get
(v8String(scriptState->isolate(), "get")); |
| 245 if (getter.IsEmpty() || !getter->IsFunction()) { |
| 246 fprintf(stderr, "Private script error: Target DOM attribute getter was n
ot found. (Class name = %s, Attribute name = %s)\n", className, attributeName); |
| 247 RELEASE_ASSERT_NOT_REACHED(); |
| 248 } |
| 249 initializeHolderIfNeeded(scriptState, classObject, holder); |
| 250 v8::TryCatch block; |
| 251 v8::Handle<v8::Value> result = V8ScriptRunner::callFunction(v8::Handle<v8::F
unction>::Cast(getter), scriptState->executionContext(), holder, 0, 0, scriptSta
te->isolate()); |
| 252 if (block.HasCaught()) { |
| 253 rethrowExceptionInPrivateScript(scriptState->isolate(), block, scriptSta
teInUserScript, ExceptionState::GetterContext, attributeName, className); |
| 254 block.ReThrow(); |
| 255 return v8::Handle<v8::Value>(); |
| 256 } |
| 257 return result; |
| 258 } |
| 259 |
| 260 bool PrivateScriptRunner::runDOMAttributeSetter(ScriptState* scriptState, Script
State* scriptStateInUserScript, const char* className, const char* attributeName
, v8::Handle<v8::Value> holder, v8::Handle<v8::Value> v8Value) |
| 261 { |
| 262 v8::Handle<v8::Object> classObject = classObjectOfPrivateScript(scriptState,
className); |
| 263 v8::Handle<v8::Value> descriptor = classObject->GetOwnPropertyDescriptor(v8S
tring(scriptState->isolate(), attributeName)); |
| 264 if (descriptor.IsEmpty() || !descriptor->IsObject()) { |
| 265 fprintf(stderr, "Private script error: Target DOM attribute setter was n
ot found. (Class name = %s, Attribute name = %s)\n", className, attributeName); |
| 266 RELEASE_ASSERT_NOT_REACHED(); |
| 267 } |
| 268 v8::Handle<v8::Value> setter = v8::Handle<v8::Object>::Cast(descriptor)->Get
(v8String(scriptState->isolate(), "set")); |
| 269 if (setter.IsEmpty() || !setter->IsFunction()) { |
| 270 fprintf(stderr, "Private script error: Target DOM attribute setter was n
ot found. (Class name = %s, Attribute name = %s)\n", className, attributeName); |
| 271 RELEASE_ASSERT_NOT_REACHED(); |
| 272 } |
| 273 initializeHolderIfNeeded(scriptState, classObject, holder); |
| 274 v8::Handle<v8::Value> argv[] = { v8Value }; |
| 275 v8::TryCatch block; |
| 276 V8ScriptRunner::callFunction(v8::Handle<v8::Function>::Cast(setter), scriptS
tate->executionContext(), holder, WTF_ARRAY_LENGTH(argv), argv, scriptState->iso
late()); |
| 277 if (block.HasCaught()) { |
| 278 rethrowExceptionInPrivateScript(scriptState->isolate(), block, scriptSta
teInUserScript, ExceptionState::SetterContext, attributeName, className); |
| 279 block.ReThrow(); |
| 280 return false; |
| 281 } |
| 282 return true; |
| 283 } |
| 284 |
| 285 v8::Handle<v8::Value> PrivateScriptRunner::runDOMMethod(ScriptState* scriptState
, ScriptState* scriptStateInUserScript, const char* className, const char* metho
dName, v8::Handle<v8::Value> holder, int argc, v8::Handle<v8::Value> argv[]) |
| 286 { |
| 287 v8::Handle<v8::Object> classObject = classObjectOfPrivateScript(scriptState,
className); |
| 288 v8::Handle<v8::Value> method = classObject->Get(v8String(scriptState->isolat
e(), methodName)); |
| 289 if (method.IsEmpty() || !method->IsFunction()) { |
| 290 fprintf(stderr, "Private script error: Target DOM method was not found.
(Class name = %s, Method name = %s)\n", className, methodName); |
| 291 RELEASE_ASSERT_NOT_REACHED(); |
| 292 } |
| 293 initializeHolderIfNeeded(scriptState, classObject, holder); |
| 294 v8::TryCatch block; |
| 295 v8::Handle<v8::Value> result = V8ScriptRunner::callFunction(v8::Handle<v8::F
unction>::Cast(method), scriptState->executionContext(), holder, argc, argv, scr
iptState->isolate()); |
| 296 if (block.HasCaught()) { |
| 297 rethrowExceptionInPrivateScript(scriptState->isolate(), block, scriptSta
teInUserScript, ExceptionState::ExecutionContext, methodName, className); |
| 298 block.ReThrow(); |
| 299 return v8::Handle<v8::Value>(); |
| 300 } |
| 301 return result; |
| 302 } |
| 303 |
| 279 } // namespace blink | 304 } // namespace blink |
| OLD | NEW |