| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 "extensions/renderer/api_binding.h" | 5 #include "extensions/renderer/api_binding.h" |
| 6 #include "base/bind.h" | 6 #include "base/bind.h" |
| 7 #include "base/memory/ptr_util.h" | 7 #include "base/memory/ptr_util.h" |
| 8 #include "base/stl_util.h" | 8 #include "base/stl_util.h" |
| 9 #include "base/strings/stringprintf.h" | 9 #include "base/strings/stringprintf.h" |
| 10 #include "base/values.h" | 10 #include "base/values.h" |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 62 " 'name': 'intAndCallback'," | 62 " 'name': 'intAndCallback'," |
| 63 " 'parameters': [{" | 63 " 'parameters': [{" |
| 64 " 'name': 'int'," | 64 " 'name': 'int'," |
| 65 " 'type': 'integer'" | 65 " 'type': 'integer'" |
| 66 " }, {" | 66 " }, {" |
| 67 " 'name': 'callback'," | 67 " 'name': 'callback'," |
| 68 " 'type': 'function'" | 68 " 'type': 'function'" |
| 69 " }]" | 69 " }]" |
| 70 "}]"; | 70 "}]"; |
| 71 | 71 |
| 72 bool AllowAllAPIs(const std::string& name) { | 72 bool AllowAllFeatures(v8::Local<v8::Context> context, const std::string& name) { |
| 73 return true; | 73 return true; |
| 74 } | 74 } |
| 75 | 75 |
| 76 void OnEventListenersChanged(const std::string& event_name, | 76 void OnEventListenersChanged(const std::string& event_name, |
| 77 binding::EventListenersChanged change, | 77 binding::EventListenersChanged change, |
| 78 const base::DictionaryValue* filter, | 78 const base::DictionaryValue* filter, |
| 79 bool was_manual, | 79 bool was_manual, |
| 80 v8::Local<v8::Context> context) {} | 80 v8::Local<v8::Context> context) {} |
| 81 | 81 |
| 82 } // namespace | 82 } // namespace |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 141 void SetHooksDelegate( | 141 void SetHooksDelegate( |
| 142 std::unique_ptr<APIBindingHooksDelegate> hooks_delegate) { | 142 std::unique_ptr<APIBindingHooksDelegate> hooks_delegate) { |
| 143 binding_hooks_delegate_ = std::move(hooks_delegate); | 143 binding_hooks_delegate_ = std::move(hooks_delegate); |
| 144 ASSERT_TRUE(binding_hooks_delegate_); | 144 ASSERT_TRUE(binding_hooks_delegate_); |
| 145 } | 145 } |
| 146 | 146 |
| 147 void SetCreateCustomType(const APIBinding::CreateCustomType& callback) { | 147 void SetCreateCustomType(const APIBinding::CreateCustomType& callback) { |
| 148 create_custom_type_ = callback; | 148 create_custom_type_ = callback; |
| 149 } | 149 } |
| 150 | 150 |
| 151 void SetAvailabilityCallback( |
| 152 const APIBinding::AvailabilityCallback& callback) { |
| 153 availability_callback_ = callback; |
| 154 } |
| 155 |
| 151 void InitializeBinding() { | 156 void InitializeBinding() { |
| 152 if (!binding_hooks_) { | 157 if (!binding_hooks_) { |
| 153 binding_hooks_ = base::MakeUnique<APIBindingHooks>( | 158 binding_hooks_ = base::MakeUnique<APIBindingHooks>( |
| 154 kBindingName, binding::RunJSFunctionSync()); | 159 kBindingName, binding::RunJSFunctionSync()); |
| 155 } | 160 } |
| 156 if (binding_hooks_delegate_) | 161 if (binding_hooks_delegate_) |
| 157 binding_hooks_->SetDelegate(std::move(binding_hooks_delegate_)); | 162 binding_hooks_->SetDelegate(std::move(binding_hooks_delegate_)); |
| 163 if (!availability_callback_) |
| 164 availability_callback_ = base::Bind(&AllowAllFeatures); |
| 158 event_handler_ = base::MakeUnique<APIEventHandler>( | 165 event_handler_ = base::MakeUnique<APIEventHandler>( |
| 159 base::Bind(&RunFunctionOnGlobalAndIgnoreResult), | 166 base::Bind(&RunFunctionOnGlobalAndIgnoreResult), |
| 160 base::Bind(&OnEventListenersChanged)); | 167 base::Bind(&OnEventListenersChanged)); |
| 161 binding_ = base::MakeUnique<APIBinding>( | 168 binding_ = base::MakeUnique<APIBinding>( |
| 162 kBindingName, binding_functions_.get(), binding_types_.get(), | 169 kBindingName, binding_functions_.get(), binding_types_.get(), |
| 163 binding_events_.get(), binding_properties_.get(), create_custom_type_, | 170 binding_events_.get(), binding_properties_.get(), create_custom_type_, |
| 164 std::move(binding_hooks_), &type_refs_, request_handler_.get(), | 171 availability_callback_, std::move(binding_hooks_), &type_refs_, |
| 165 event_handler_.get()); | 172 request_handler_.get(), event_handler_.get()); |
| 166 EXPECT_EQ(!binding_types_.get(), type_refs_.empty()); | 173 EXPECT_EQ(!binding_types_.get(), type_refs_.empty()); |
| 167 } | 174 } |
| 168 | 175 |
| 169 void ExpectPass(v8::Local<v8::Object> object, | 176 void ExpectPass(v8::Local<v8::Object> object, |
| 170 const std::string& script_source, | 177 const std::string& script_source, |
| 171 const std::string& expected_json_arguments_single_quotes, | 178 const std::string& expected_json_arguments_single_quotes, |
| 172 bool expect_callback) { | 179 bool expect_callback) { |
| 173 ExpectPass(MainContext(), object, script_source, | 180 ExpectPass(MainContext(), object, script_source, |
| 174 expected_json_arguments_single_quotes, expect_callback); | 181 expected_json_arguments_single_quotes, expect_callback); |
| 175 } | 182 } |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 223 std::unique_ptr<APIRequestHandler> request_handler_; | 230 std::unique_ptr<APIRequestHandler> request_handler_; |
| 224 APITypeReferenceMap type_refs_; | 231 APITypeReferenceMap type_refs_; |
| 225 | 232 |
| 226 std::unique_ptr<base::ListValue> binding_functions_; | 233 std::unique_ptr<base::ListValue> binding_functions_; |
| 227 std::unique_ptr<base::ListValue> binding_events_; | 234 std::unique_ptr<base::ListValue> binding_events_; |
| 228 std::unique_ptr<base::ListValue> binding_types_; | 235 std::unique_ptr<base::ListValue> binding_types_; |
| 229 std::unique_ptr<base::DictionaryValue> binding_properties_; | 236 std::unique_ptr<base::DictionaryValue> binding_properties_; |
| 230 std::unique_ptr<APIBindingHooks> binding_hooks_; | 237 std::unique_ptr<APIBindingHooks> binding_hooks_; |
| 231 std::unique_ptr<APIBindingHooksDelegate> binding_hooks_delegate_; | 238 std::unique_ptr<APIBindingHooksDelegate> binding_hooks_delegate_; |
| 232 APIBinding::CreateCustomType create_custom_type_; | 239 APIBinding::CreateCustomType create_custom_type_; |
| 240 APIBinding::AvailabilityCallback availability_callback_; |
| 233 | 241 |
| 234 DISALLOW_COPY_AND_ASSIGN(APIBindingUnittest); | 242 DISALLOW_COPY_AND_ASSIGN(APIBindingUnittest); |
| 235 }; | 243 }; |
| 236 | 244 |
| 237 void APIBindingUnittest::RunTest(v8::Local<v8::Context> context, | 245 void APIBindingUnittest::RunTest(v8::Local<v8::Context> context, |
| 238 v8::Local<v8::Object> object, | 246 v8::Local<v8::Object> object, |
| 239 const std::string& script_source, | 247 const std::string& script_source, |
| 240 bool should_pass, | 248 bool should_pass, |
| 241 const std::string& expected_json_arguments, | 249 const std::string& expected_json_arguments, |
| 242 bool expect_callback, | 250 bool expect_callback, |
| (...skipping 21 matching lines...) Expand all Loading... |
| 264 | 272 |
| 265 last_request_.reset(); | 273 last_request_.reset(); |
| 266 } | 274 } |
| 267 | 275 |
| 268 TEST_F(APIBindingUnittest, TestEmptyAPI) { | 276 TEST_F(APIBindingUnittest, TestEmptyAPI) { |
| 269 InitializeBinding(); | 277 InitializeBinding(); |
| 270 | 278 |
| 271 v8::HandleScope handle_scope(isolate()); | 279 v8::HandleScope handle_scope(isolate()); |
| 272 v8::Local<v8::Context> context = MainContext(); | 280 v8::Local<v8::Context> context = MainContext(); |
| 273 | 281 |
| 274 v8::Local<v8::Object> binding_object = | 282 v8::Local<v8::Object> binding_object = binding()->CreateInstance(context); |
| 275 binding()->CreateInstance(context, base::Bind(&AllowAllAPIs)); | |
| 276 EXPECT_EQ( | 283 EXPECT_EQ( |
| 277 0u, | 284 0u, |
| 278 binding_object->GetOwnPropertyNames(context).ToLocalChecked()->Length()); | 285 binding_object->GetOwnPropertyNames(context).ToLocalChecked()->Length()); |
| 279 } | 286 } |
| 280 | 287 |
| 281 // Tests the basic call -> request flow of the API binding (ensuring that | 288 // Tests the basic call -> request flow of the API binding (ensuring that |
| 282 // functions are set up correctly and correctly enforced). | 289 // functions are set up correctly and correctly enforced). |
| 283 TEST_F(APIBindingUnittest, TestBasicAPICalls) { | 290 TEST_F(APIBindingUnittest, TestBasicAPICalls) { |
| 284 SetFunctions(kFunctions); | 291 SetFunctions(kFunctions); |
| 285 InitializeBinding(); | 292 InitializeBinding(); |
| 286 | 293 |
| 287 v8::HandleScope handle_scope(isolate()); | 294 v8::HandleScope handle_scope(isolate()); |
| 288 v8::Local<v8::Context> context = MainContext(); | 295 v8::Local<v8::Context> context = MainContext(); |
| 289 | 296 |
| 290 v8::Local<v8::Object> binding_object = | 297 v8::Local<v8::Object> binding_object = binding()->CreateInstance(context); |
| 291 binding()->CreateInstance(context, base::Bind(&AllowAllAPIs)); | |
| 292 | 298 |
| 293 // Argument parsing is tested primarily in APISignature and ArgumentSpec | 299 // Argument parsing is tested primarily in APISignature and ArgumentSpec |
| 294 // tests, so do a few quick sanity checks... | 300 // tests, so do a few quick sanity checks... |
| 295 ExpectPass(binding_object, "obj.oneString('foo');", "['foo']", false); | 301 ExpectPass(binding_object, "obj.oneString('foo');", "['foo']", false); |
| 296 ExpectFailure( | 302 ExpectFailure( |
| 297 binding_object, "obj.oneString(1);", | 303 binding_object, "obj.oneString(1);", |
| 298 InvocationError( | 304 InvocationError( |
| 299 "test.oneString", "string str", | 305 "test.oneString", "string str", |
| 300 ArgumentError("str", InvalidType(kTypeString, kTypeInteger)))); | 306 ArgumentError("str", InvalidType(kTypeString, kTypeInteger)))); |
| 301 ExpectPass(binding_object, "obj.stringAndInt('foo', 1)", "['foo',1]", false); | 307 ExpectPass(binding_object, "obj.stringAndInt('foo', 1)", "['foo',1]", false); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 331 " 'type': 'string'," | 337 " 'type': 'string'," |
| 332 " 'enum': [{'name': 'omega'}]" | 338 " 'enum': [{'name': 'omega'}]" |
| 333 "}]"; | 339 "}]"; |
| 334 | 340 |
| 335 SetTypes(kTypes); | 341 SetTypes(kTypes); |
| 336 InitializeBinding(); | 342 InitializeBinding(); |
| 337 | 343 |
| 338 v8::HandleScope handle_scope(isolate()); | 344 v8::HandleScope handle_scope(isolate()); |
| 339 v8::Local<v8::Context> context = MainContext(); | 345 v8::Local<v8::Context> context = MainContext(); |
| 340 | 346 |
| 341 v8::Local<v8::Object> binding_object = | 347 v8::Local<v8::Object> binding_object = binding()->CreateInstance(context); |
| 342 binding()->CreateInstance(context, base::Bind(&AllowAllAPIs)); | |
| 343 | 348 |
| 344 const char kExpected[] = | 349 const char kExpected[] = |
| 345 "{'ALPHA':'alpha','CAMEL_CASE':'camelCase','HYPHEN_ATED':'Hyphen-ated'," | 350 "{'ALPHA':'alpha','CAMEL_CASE':'camelCase','HYPHEN_ATED':'Hyphen-ated'," |
| 346 "'NUMS123':'nums123','SCREAMING':'SCREAMING','_42NUMS':'42nums'}"; | 351 "'NUMS123':'nums123','SCREAMING':'SCREAMING','_42NUMS':'42nums'}"; |
| 347 EXPECT_EQ(ReplaceSingleQuotes(kExpected), | 352 EXPECT_EQ(ReplaceSingleQuotes(kExpected), |
| 348 GetStringPropertyFromObject(binding_object, context, "first")); | 353 GetStringPropertyFromObject(binding_object, context, "first")); |
| 349 EXPECT_EQ(ReplaceSingleQuotes("{'OMEGA':'omega'}"), | 354 EXPECT_EQ(ReplaceSingleQuotes("{'OMEGA':'omega'}"), |
| 350 GetStringPropertyFromObject(binding_object, context, "last")); | 355 GetStringPropertyFromObject(binding_object, context, "last")); |
| 351 } | 356 } |
| 352 | 357 |
| 353 // Test that empty enum entries are (unfortunately) allowed. | 358 // Test that empty enum entries are (unfortunately) allowed. |
| 354 TEST_F(APIBindingUnittest, EnumWithEmptyEntry) { | 359 TEST_F(APIBindingUnittest, EnumWithEmptyEntry) { |
| 355 const char kTypes[] = | 360 const char kTypes[] = |
| 356 "[{" | 361 "[{" |
| 357 " 'id': 'enumWithEmpty'," | 362 " 'id': 'enumWithEmpty'," |
| 358 " 'type': 'string'," | 363 " 'type': 'string'," |
| 359 " 'enum': [{'name': ''}, {'name': 'other'}]" | 364 " 'enum': [{'name': ''}, {'name': 'other'}]" |
| 360 "}]"; | 365 "}]"; |
| 361 | 366 |
| 362 SetTypes(kTypes); | 367 SetTypes(kTypes); |
| 363 InitializeBinding(); | 368 InitializeBinding(); |
| 364 | 369 |
| 365 v8::HandleScope handle_scope(isolate()); | 370 v8::HandleScope handle_scope(isolate()); |
| 366 v8::Local<v8::Context> context = MainContext(); | 371 v8::Local<v8::Context> context = MainContext(); |
| 367 | 372 |
| 368 v8::Local<v8::Object> binding_object = | 373 v8::Local<v8::Object> binding_object = binding()->CreateInstance(context); |
| 369 binding()->CreateInstance(context, base::Bind(&AllowAllAPIs)); | |
| 370 | 374 |
| 371 EXPECT_EQ( | 375 EXPECT_EQ( |
| 372 "{\"\":\"\",\"OTHER\":\"other\"}", | 376 "{\"\":\"\",\"OTHER\":\"other\"}", |
| 373 GetStringPropertyFromObject(binding_object, context, "enumWithEmpty")); | 377 GetStringPropertyFromObject(binding_object, context, "enumWithEmpty")); |
| 374 } | 378 } |
| 375 | 379 |
| 376 // Test that type references are correctly set up in the API. | 380 // Test that type references are correctly set up in the API. |
| 377 TEST_F(APIBindingUnittest, TypeRefsTest) { | 381 TEST_F(APIBindingUnittest, TypeRefsTest) { |
| 378 const char kTypes[] = | 382 const char kTypes[] = |
| 379 "[{" | 383 "[{" |
| (...skipping 26 matching lines...) Expand all Loading... |
| 406 SetFunctions(kRefFunctions); | 410 SetFunctions(kRefFunctions); |
| 407 SetTypes(kTypes); | 411 SetTypes(kTypes); |
| 408 InitializeBinding(); | 412 InitializeBinding(); |
| 409 EXPECT_EQ(2u, type_refs().size()); | 413 EXPECT_EQ(2u, type_refs().size()); |
| 410 EXPECT_TRUE(type_refs().GetSpec("refObj")); | 414 EXPECT_TRUE(type_refs().GetSpec("refObj")); |
| 411 EXPECT_TRUE(type_refs().GetSpec("refEnum")); | 415 EXPECT_TRUE(type_refs().GetSpec("refEnum")); |
| 412 | 416 |
| 413 v8::HandleScope handle_scope(isolate()); | 417 v8::HandleScope handle_scope(isolate()); |
| 414 v8::Local<v8::Context> context = MainContext(); | 418 v8::Local<v8::Context> context = MainContext(); |
| 415 | 419 |
| 416 v8::Local<v8::Object> binding_object = | 420 v8::Local<v8::Object> binding_object = binding()->CreateInstance(context); |
| 417 binding()->CreateInstance(context, base::Bind(&AllowAllAPIs)); | |
| 418 | 421 |
| 419 // Parsing in general is tested in APISignature and ArgumentSpec tests, but | 422 // Parsing in general is tested in APISignature and ArgumentSpec tests, but |
| 420 // we test that the binding a) correctly finds the definitions, and b) accepts | 423 // we test that the binding a) correctly finds the definitions, and b) accepts |
| 421 // properties from the API object. | 424 // properties from the API object. |
| 422 ExpectPass(binding_object, "obj.takesRefObj({prop1: 'foo'})", | 425 ExpectPass(binding_object, "obj.takesRefObj({prop1: 'foo'})", |
| 423 "[{'prop1':'foo'}]", false); | 426 "[{'prop1':'foo'}]", false); |
| 424 ExpectFailure( | 427 ExpectFailure( |
| 425 binding_object, "obj.takesRefObj({prop1: 'foo', prop2: 'a'})", | 428 binding_object, "obj.takesRefObj({prop1: 'foo', prop2: 'a'})", |
| 426 InvocationError( | 429 InvocationError( |
| 427 "test.takesRefObj", "refObj o", | 430 "test.takesRefObj", "refObj o", |
| (...skipping 21 matching lines...) Expand all Loading... |
| 449 " 'name': 'restrictedOne'," | 452 " 'name': 'restrictedOne'," |
| 450 " 'parameters': []" | 453 " 'parameters': []" |
| 451 "}, {" | 454 "}, {" |
| 452 " 'name': 'restrictedTwo'," | 455 " 'name': 'restrictedTwo'," |
| 453 " 'parameters': []" | 456 " 'parameters': []" |
| 454 "}]"; | 457 "}]"; |
| 455 SetFunctions(kFunctions); | 458 SetFunctions(kFunctions); |
| 456 const char kEvents[] = | 459 const char kEvents[] = |
| 457 "[{'name': 'allowedEvent'}, {'name': 'restrictedEvent'}]"; | 460 "[{'name': 'allowedEvent'}, {'name': 'restrictedEvent'}]"; |
| 458 SetEvents(kEvents); | 461 SetEvents(kEvents); |
| 459 InitializeBinding(); | 462 auto is_available = [](v8::Local<v8::Context> context, |
| 460 | 463 const std::string& name) { |
| 461 v8::HandleScope handle_scope(isolate()); | |
| 462 v8::Local<v8::Context> context = MainContext(); | |
| 463 | |
| 464 auto is_available = [](const std::string& name) { | |
| 465 std::set<std::string> allowed = {"test.allowedOne", "test.allowedTwo", | 464 std::set<std::string> allowed = {"test.allowedOne", "test.allowedTwo", |
| 466 "test.allowedEvent"}; | 465 "test.allowedEvent"}; |
| 467 std::set<std::string> restricted = { | 466 std::set<std::string> restricted = { |
| 468 "test.restrictedOne", "test.restrictedTwo", "test.restrictedEvent"}; | 467 "test.restrictedOne", "test.restrictedTwo", "test.restrictedEvent"}; |
| 469 EXPECT_TRUE(allowed.count(name) || restricted.count(name)) << name; | 468 EXPECT_TRUE(allowed.count(name) || restricted.count(name)) << name; |
| 470 return allowed.count(name) != 0; | 469 return allowed.count(name) != 0; |
| 471 }; | 470 }; |
| 471 SetAvailabilityCallback(base::Bind(is_available)); |
| 472 | 472 |
| 473 v8::Local<v8::Object> binding_object = | 473 InitializeBinding(); |
| 474 binding()->CreateInstance(context, base::Bind(is_available)); | 474 |
| 475 v8::HandleScope handle_scope(isolate()); |
| 476 v8::Local<v8::Context> context = MainContext(); |
| 477 |
| 478 v8::Local<v8::Object> binding_object = binding()->CreateInstance(context); |
| 475 | 479 |
| 476 auto is_defined = [&binding_object, context](const std::string& name) { | 480 auto is_defined = [&binding_object, context](const std::string& name) { |
| 477 v8::Local<v8::Value> val = | 481 v8::Local<v8::Value> val = |
| 478 GetPropertyFromObject(binding_object, context, name); | 482 GetPropertyFromObject(binding_object, context, name); |
| 479 EXPECT_FALSE(val.IsEmpty()); | 483 EXPECT_FALSE(val.IsEmpty()); |
| 480 return !val->IsUndefined() && !val->IsNull(); | 484 return !val->IsUndefined() && !val->IsNull(); |
| 481 }; | 485 }; |
| 482 | 486 |
| 483 EXPECT_TRUE(is_defined("allowedOne")); | 487 EXPECT_TRUE(is_defined("allowedOne")); |
| 484 EXPECT_TRUE(is_defined("allowedTwo")); | 488 EXPECT_TRUE(is_defined("allowedTwo")); |
| 485 EXPECT_TRUE(is_defined("allowedEvent")); | 489 EXPECT_TRUE(is_defined("allowedEvent")); |
| 486 EXPECT_FALSE(is_defined("restrictedOne")); | 490 EXPECT_FALSE(is_defined("restrictedOne")); |
| 487 EXPECT_FALSE(is_defined("restrictedTwo")); | 491 EXPECT_FALSE(is_defined("restrictedTwo")); |
| 488 EXPECT_FALSE(is_defined("restrictedEvent")); | 492 EXPECT_FALSE(is_defined("restrictedEvent")); |
| 489 } | 493 } |
| 490 | 494 |
| 491 // Tests that events specified in the API are created as properties of the API | 495 // Tests that events specified in the API are created as properties of the API |
| 492 // object. | 496 // object. |
| 493 TEST_F(APIBindingUnittest, TestEventCreation) { | 497 TEST_F(APIBindingUnittest, TestEventCreation) { |
| 494 SetEvents("[{'name': 'onFoo'}, {'name': 'onBar'}]"); | 498 SetEvents("[{'name': 'onFoo'}, {'name': 'onBar'}]"); |
| 495 SetFunctions(kFunctions); | 499 SetFunctions(kFunctions); |
| 496 InitializeBinding(); | 500 InitializeBinding(); |
| 497 | 501 |
| 498 v8::HandleScope handle_scope(isolate()); | 502 v8::HandleScope handle_scope(isolate()); |
| 499 v8::Local<v8::Context> context = MainContext(); | 503 v8::Local<v8::Context> context = MainContext(); |
| 500 | 504 |
| 501 v8::Local<v8::Object> binding_object = | 505 v8::Local<v8::Object> binding_object = binding()->CreateInstance(context); |
| 502 binding()->CreateInstance(context, base::Bind(&AllowAllAPIs)); | |
| 503 | 506 |
| 504 // Event behavior is tested in the APIEventHandler unittests as well as the | 507 // Event behavior is tested in the APIEventHandler unittests as well as the |
| 505 // APIBindingsSystem tests, so we really only need to check that the events | 508 // APIBindingsSystem tests, so we really only need to check that the events |
| 506 // are being initialized on the object. | 509 // are being initialized on the object. |
| 507 v8::Maybe<bool> has_on_foo = | 510 v8::Maybe<bool> has_on_foo = |
| 508 binding_object->Has(context, gin::StringToV8(isolate(), "onFoo")); | 511 binding_object->Has(context, gin::StringToV8(isolate(), "onFoo")); |
| 509 EXPECT_TRUE(has_on_foo.IsJust()); | 512 EXPECT_TRUE(has_on_foo.IsJust()); |
| 510 EXPECT_TRUE(has_on_foo.FromJust()); | 513 EXPECT_TRUE(has_on_foo.FromJust()); |
| 511 | 514 |
| 512 v8::Maybe<bool> has_on_bar = | 515 v8::Maybe<bool> has_on_bar = |
| (...skipping 16 matching lines...) Expand all Loading... |
| 529 " 'properties': {" | 532 " 'properties': {" |
| 530 " 'subprop1': { 'value': 'some value', 'type': 'string' }," | 533 " 'subprop1': { 'value': 'some value', 'type': 'string' }," |
| 531 " 'subprop2': { 'value': true, 'type': 'boolean' }" | 534 " 'subprop2': { 'value': true, 'type': 'boolean' }" |
| 532 " }" | 535 " }" |
| 533 " }" | 536 " }" |
| 534 "}"); | 537 "}"); |
| 535 InitializeBinding(); | 538 InitializeBinding(); |
| 536 | 539 |
| 537 v8::HandleScope handle_scope(isolate()); | 540 v8::HandleScope handle_scope(isolate()); |
| 538 v8::Local<v8::Context> context = MainContext(); | 541 v8::Local<v8::Context> context = MainContext(); |
| 539 v8::Local<v8::Object> binding_object = | 542 v8::Local<v8::Object> binding_object = binding()->CreateInstance(context); |
| 540 binding()->CreateInstance(context, base::Bind(&AllowAllAPIs)); | |
| 541 EXPECT_EQ("17", | 543 EXPECT_EQ("17", |
| 542 GetStringPropertyFromObject(binding_object, context, "prop1")); | 544 GetStringPropertyFromObject(binding_object, context, "prop1")); |
| 543 EXPECT_EQ(R"({"subprop1":"some value","subprop2":true})", | 545 EXPECT_EQ(R"({"subprop1":"some value","subprop2":true})", |
| 544 GetStringPropertyFromObject(binding_object, context, "prop2")); | 546 GetStringPropertyFromObject(binding_object, context, "prop2")); |
| 545 } | 547 } |
| 546 | 548 |
| 547 TEST_F(APIBindingUnittest, TestRefProperties) { | 549 TEST_F(APIBindingUnittest, TestRefProperties) { |
| 548 SetProperties( | 550 SetProperties( |
| 549 "{" | 551 "{" |
| 550 " 'alpha': {" | 552 " 'alpha': {" |
| (...skipping 30 matching lines...) Expand all Loading... |
| 581 } | 583 } |
| 582 return result; | 584 return result; |
| 583 }; | 585 }; |
| 584 | 586 |
| 585 SetCreateCustomType(base::Bind(create_custom_type)); | 587 SetCreateCustomType(base::Bind(create_custom_type)); |
| 586 | 588 |
| 587 InitializeBinding(); | 589 InitializeBinding(); |
| 588 | 590 |
| 589 v8::HandleScope handle_scope(isolate()); | 591 v8::HandleScope handle_scope(isolate()); |
| 590 v8::Local<v8::Context> context = MainContext(); | 592 v8::Local<v8::Context> context = MainContext(); |
| 591 v8::Local<v8::Object> binding_object = | 593 v8::Local<v8::Object> binding_object = binding()->CreateInstance(context); |
| 592 binding()->CreateInstance(context, base::Bind(&AllowAllAPIs)); | |
| 593 EXPECT_EQ(R"({"alphaProp":"alphaVal"})", | 594 EXPECT_EQ(R"({"alphaProp":"alphaVal"})", |
| 594 GetStringPropertyFromObject(binding_object, context, "alpha")); | 595 GetStringPropertyFromObject(binding_object, context, "alpha")); |
| 595 EXPECT_EQ( | 596 EXPECT_EQ( |
| 596 R"({"betaProp":"betaVal"})", | 597 R"({"betaProp":"betaVal"})", |
| 597 GetStringPropertyFromObject(binding_object, context, "beta")); | 598 GetStringPropertyFromObject(binding_object, context, "beta")); |
| 598 } | 599 } |
| 599 | 600 |
| 600 TEST_F(APIBindingUnittest, TestDisposedContext) { | 601 TEST_F(APIBindingUnittest, TestDisposedContext) { |
| 601 SetFunctions(kFunctions); | 602 SetFunctions(kFunctions); |
| 602 InitializeBinding(); | 603 InitializeBinding(); |
| 603 | 604 |
| 604 v8::HandleScope handle_scope(isolate()); | 605 v8::HandleScope handle_scope(isolate()); |
| 605 v8::Local<v8::Context> context = MainContext(); | 606 v8::Local<v8::Context> context = MainContext(); |
| 606 | 607 |
| 607 v8::Local<v8::Object> binding_object = | 608 v8::Local<v8::Object> binding_object = binding()->CreateInstance(context); |
| 608 binding()->CreateInstance(context, base::Bind(&AllowAllAPIs)); | |
| 609 | 609 |
| 610 v8::Local<v8::Function> func = | 610 v8::Local<v8::Function> func = |
| 611 FunctionFromString(context, "(function(obj) { obj.oneString('foo'); })"); | 611 FunctionFromString(context, "(function(obj) { obj.oneString('foo'); })"); |
| 612 v8::Local<v8::Value> argv[] = {binding_object}; | 612 v8::Local<v8::Value> argv[] = {binding_object}; |
| 613 DisposeContext(context); | 613 DisposeContext(context); |
| 614 RunFunction(func, context, arraysize(argv), argv); | 614 RunFunction(func, context, arraysize(argv), argv); |
| 615 EXPECT_FALSE(HandlerWasInvoked()); | 615 EXPECT_FALSE(HandlerWasInvoked()); |
| 616 // This test passes if this does not crash, even under AddressSanitizer | 616 // This test passes if this does not crash, even under AddressSanitizer |
| 617 // builds. | 617 // builds. |
| 618 } | 618 } |
| 619 | 619 |
| 620 TEST_F(APIBindingUnittest, MultipleContexts) { | 620 TEST_F(APIBindingUnittest, MultipleContexts) { |
| 621 v8::HandleScope handle_scope(isolate()); | 621 v8::HandleScope handle_scope(isolate()); |
| 622 v8::Local<v8::Context> context_a = MainContext(); | 622 v8::Local<v8::Context> context_a = MainContext(); |
| 623 v8::Local<v8::Context> context_b = AddContext(); | 623 v8::Local<v8::Context> context_b = AddContext(); |
| 624 | 624 |
| 625 SetFunctions(kFunctions); | 625 SetFunctions(kFunctions); |
| 626 InitializeBinding(); | 626 InitializeBinding(); |
| 627 | 627 |
| 628 v8::Local<v8::Object> binding_object_a = | 628 v8::Local<v8::Object> binding_object_a = binding()->CreateInstance(context_a); |
| 629 binding()->CreateInstance(context_a, base::Bind(&AllowAllAPIs)); | 629 v8::Local<v8::Object> binding_object_b = binding()->CreateInstance(context_b); |
| 630 v8::Local<v8::Object> binding_object_b = | |
| 631 binding()->CreateInstance(context_b, base::Bind(&AllowAllAPIs)); | |
| 632 | 630 |
| 633 ExpectPass(context_a, binding_object_a, "obj.oneString('foo');", "['foo']", | 631 ExpectPass(context_a, binding_object_a, "obj.oneString('foo');", "['foo']", |
| 634 false); | 632 false); |
| 635 ExpectPass(context_b, binding_object_b, "obj.oneString('foo');", "['foo']", | 633 ExpectPass(context_b, binding_object_b, "obj.oneString('foo');", "['foo']", |
| 636 false); | 634 false); |
| 637 DisposeContext(context_a); | 635 DisposeContext(context_a); |
| 638 ExpectPass(context_b, binding_object_b, "obj.oneString('foo');", "['foo']", | 636 ExpectPass(context_b, binding_object_b, "obj.oneString('foo');", "['foo']", |
| 639 false); | 637 false); |
| 640 } | 638 } |
| 641 | 639 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 661 return result; | 659 return result; |
| 662 }; | 660 }; |
| 663 hooks->AddHandler("test.oneString", base::Bind(hook, &did_call)); | 661 hooks->AddHandler("test.oneString", base::Bind(hook, &did_call)); |
| 664 SetHooksDelegate(std::move(hooks)); | 662 SetHooksDelegate(std::move(hooks)); |
| 665 | 663 |
| 666 InitializeBinding(); | 664 InitializeBinding(); |
| 667 | 665 |
| 668 v8::HandleScope handle_scope(isolate()); | 666 v8::HandleScope handle_scope(isolate()); |
| 669 v8::Local<v8::Context> context = MainContext(); | 667 v8::Local<v8::Context> context = MainContext(); |
| 670 | 668 |
| 671 v8::Local<v8::Object> binding_object = | 669 v8::Local<v8::Object> binding_object = binding()->CreateInstance(context); |
| 672 binding()->CreateInstance(context, base::Bind(&AllowAllAPIs)); | |
| 673 | 670 |
| 674 // First try calling the oneString() method, which has a custom hook | 671 // First try calling the oneString() method, which has a custom hook |
| 675 // installed. | 672 // installed. |
| 676 v8::Local<v8::Function> func = | 673 v8::Local<v8::Function> func = |
| 677 FunctionFromString(context, "(function(obj) { obj.oneString('foo'); })"); | 674 FunctionFromString(context, "(function(obj) { obj.oneString('foo'); })"); |
| 678 v8::Local<v8::Value> args[] = {binding_object}; | 675 v8::Local<v8::Value> args[] = {binding_object}; |
| 679 RunFunction(func, context, 1, args); | 676 RunFunction(func, context, 1, args); |
| 680 EXPECT_TRUE(did_call); | 677 EXPECT_TRUE(did_call); |
| 681 | 678 |
| 682 // Other methods, like stringAndInt(), should behave normally. | 679 // Other methods, like stringAndInt(), should behave normally. |
| (...skipping 19 matching lines...) Expand all Loading... |
| 702 v8::Local<v8::Function> function = | 699 v8::Local<v8::Function> function = |
| 703 FunctionFromString(context, kRegisterHook); | 700 FunctionFromString(context, kRegisterHook); |
| 704 v8::Local<v8::Value> args[] = {js_hooks}; | 701 v8::Local<v8::Value> args[] = {js_hooks}; |
| 705 RunFunctionOnGlobal(function, context, arraysize(args), args); | 702 RunFunctionOnGlobal(function, context, arraysize(args), args); |
| 706 } | 703 } |
| 707 | 704 |
| 708 SetFunctions(kFunctions); | 705 SetFunctions(kFunctions); |
| 709 SetHooks(std::move(hooks)); | 706 SetHooks(std::move(hooks)); |
| 710 InitializeBinding(); | 707 InitializeBinding(); |
| 711 | 708 |
| 712 v8::Local<v8::Object> binding_object = | 709 v8::Local<v8::Object> binding_object = binding()->CreateInstance(context); |
| 713 binding()->CreateInstance(context, base::Bind(&AllowAllAPIs)); | |
| 714 | 710 |
| 715 // First try calling with an invalid invocation. An error should be raised and | 711 // First try calling with an invalid invocation. An error should be raised and |
| 716 // the hook should never have been called, since the arguments didn't match. | 712 // the hook should never have been called, since the arguments didn't match. |
| 717 ExpectFailure( | 713 ExpectFailure( |
| 718 binding_object, "obj.oneString(1);", | 714 binding_object, "obj.oneString(1);", |
| 719 InvocationError( | 715 InvocationError( |
| 720 "test.oneString", "string str", | 716 "test.oneString", "string str", |
| 721 ArgumentError("str", InvalidType(kTypeString, kTypeInteger)))); | 717 ArgumentError("str", InvalidType(kTypeString, kTypeInteger)))); |
| 722 v8::Local<v8::Value> property = | 718 v8::Local<v8::Value> property = |
| 723 GetPropertyFromObject(context->Global(), context, "requestArguments"); | 719 GetPropertyFromObject(context->Global(), context, "requestArguments"); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 758 "})"; | 754 "})"; |
| 759 v8::Local<v8::Object> js_hooks = hooks->GetJSHookInterface(context); | 755 v8::Local<v8::Object> js_hooks = hooks->GetJSHookInterface(context); |
| 760 v8::Local<v8::Function> function = FunctionFromString(context, kRegisterHook); | 756 v8::Local<v8::Function> function = FunctionFromString(context, kRegisterHook); |
| 761 v8::Local<v8::Value> args[] = {js_hooks}; | 757 v8::Local<v8::Value> args[] = {js_hooks}; |
| 762 RunFunctionOnGlobal(function, context, arraysize(args), args); | 758 RunFunctionOnGlobal(function, context, arraysize(args), args); |
| 763 | 759 |
| 764 SetHooks(std::move(hooks)); | 760 SetHooks(std::move(hooks)); |
| 765 SetFunctions(kFunctions); | 761 SetFunctions(kFunctions); |
| 766 InitializeBinding(); | 762 InitializeBinding(); |
| 767 | 763 |
| 768 v8::Local<v8::Object> binding_object = | 764 v8::Local<v8::Object> binding_object = binding()->CreateInstance(context); |
| 769 binding()->CreateInstance(context, base::Bind(&AllowAllAPIs)); | |
| 770 | 765 |
| 771 // Call the method with a hook. Since the hook updates arguments before | 766 // Call the method with a hook. Since the hook updates arguments before |
| 772 // validation, we should be able to pass in invalid arguments and still | 767 // validation, we should be able to pass in invalid arguments and still |
| 773 // have the hook called. | 768 // have the hook called. |
| 774 ExpectFailure( | 769 ExpectFailure( |
| 775 binding_object, "obj.oneString(false);", | 770 binding_object, "obj.oneString(false);", |
| 776 InvocationError( | 771 InvocationError( |
| 777 "test.oneString", "string str", | 772 "test.oneString", "string str", |
| 778 ArgumentError("str", InvalidType(kTypeString, kTypeBoolean)))); | 773 ArgumentError("str", InvalidType(kTypeString, kTypeBoolean)))); |
| 779 EXPECT_EQ("[false]", GetStringPropertyFromObject( | 774 EXPECT_EQ("[false]", GetStringPropertyFromObject( |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 820 v8::Local<v8::Function> function = | 815 v8::Local<v8::Function> function = |
| 821 FunctionFromString(context, kRegisterHook); | 816 FunctionFromString(context, kRegisterHook); |
| 822 v8::Local<v8::Value> args[] = {js_hooks}; | 817 v8::Local<v8::Value> args[] = {js_hooks}; |
| 823 RunFunctionOnGlobal(function, context, arraysize(args), args); | 818 RunFunctionOnGlobal(function, context, arraysize(args), args); |
| 824 } | 819 } |
| 825 | 820 |
| 826 SetHooks(std::move(hooks)); | 821 SetHooks(std::move(hooks)); |
| 827 SetFunctions(kFunctions); | 822 SetFunctions(kFunctions); |
| 828 InitializeBinding(); | 823 InitializeBinding(); |
| 829 | 824 |
| 830 v8::Local<v8::Object> binding_object = | 825 v8::Local<v8::Object> binding_object = binding()->CreateInstance(context); |
| 831 binding()->CreateInstance(context, base::Bind(&AllowAllAPIs)); | |
| 832 | 826 |
| 833 v8::Local<v8::Function> function = | 827 v8::Local<v8::Function> function = |
| 834 FunctionFromString(context, | 828 FunctionFromString(context, |
| 835 "(function(obj) { return obj.oneString('ping'); })"); | 829 "(function(obj) { return obj.oneString('ping'); })"); |
| 836 v8::Local<v8::Value> args[] = {binding_object}; | 830 v8::Local<v8::Value> args[] = {binding_object}; |
| 837 RunFunctionAndExpectError(function, context, v8::Undefined(isolate()), | 831 RunFunctionAndExpectError(function, context, v8::Undefined(isolate()), |
| 838 arraysize(args), args, | 832 arraysize(args), args, |
| 839 "Uncaught Error: Custom Hook Error"); | 833 "Uncaught Error: Custom Hook Error"); |
| 840 | 834 |
| 841 // Other methods, like stringAndInt(), should behave normally. | 835 // Other methods, like stringAndInt(), should behave normally. |
| (...skipping 20 matching lines...) Expand all Loading... |
| 862 v8::Local<v8::Function> function = | 856 v8::Local<v8::Function> function = |
| 863 FunctionFromString(context, kRegisterHook); | 857 FunctionFromString(context, kRegisterHook); |
| 864 v8::Local<v8::Value> args[] = {js_hooks}; | 858 v8::Local<v8::Value> args[] = {js_hooks}; |
| 865 RunFunctionOnGlobal(function, context, arraysize(args), args); | 859 RunFunctionOnGlobal(function, context, arraysize(args), args); |
| 866 } | 860 } |
| 867 | 861 |
| 868 SetHooks(std::move(hooks)); | 862 SetHooks(std::move(hooks)); |
| 869 SetFunctions(kFunctions); | 863 SetFunctions(kFunctions); |
| 870 InitializeBinding(); | 864 InitializeBinding(); |
| 871 | 865 |
| 872 v8::Local<v8::Object> binding_object = | 866 v8::Local<v8::Object> binding_object = binding()->CreateInstance(context); |
| 873 binding()->CreateInstance(context, base::Bind(&AllowAllAPIs)); | |
| 874 | 867 |
| 875 v8::Local<v8::Function> function = | 868 v8::Local<v8::Function> function = |
| 876 FunctionFromString(context, | 869 FunctionFromString(context, |
| 877 "(function(obj) { return obj.oneString('ping'); })"); | 870 "(function(obj) { return obj.oneString('ping'); })"); |
| 878 v8::Local<v8::Value> args[] = {binding_object}; | 871 v8::Local<v8::Value> args[] = {binding_object}; |
| 879 v8::Local<v8::Value> result = | 872 v8::Local<v8::Value> result = |
| 880 RunFunction(function, context, arraysize(args), args); | 873 RunFunction(function, context, arraysize(args), args); |
| 881 ASSERT_FALSE(result.IsEmpty()); | 874 ASSERT_FALSE(result.IsEmpty()); |
| 882 std::unique_ptr<base::Value> json_result = V8ToBaseValue(result, context); | 875 std::unique_ptr<base::Value> json_result = V8ToBaseValue(result, context); |
| 883 ASSERT_TRUE(json_result); | 876 ASSERT_TRUE(json_result); |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 923 v8::Local<v8::Function> function = | 916 v8::Local<v8::Function> function = |
| 924 FunctionFromString(context, kRegisterHook); | 917 FunctionFromString(context, kRegisterHook); |
| 925 v8::Local<v8::Value> args[] = {js_hooks}; | 918 v8::Local<v8::Value> args[] = {js_hooks}; |
| 926 RunFunctionOnGlobal(function, context, arraysize(args), args); | 919 RunFunctionOnGlobal(function, context, arraysize(args), args); |
| 927 } | 920 } |
| 928 | 921 |
| 929 SetHooks(std::move(hooks)); | 922 SetHooks(std::move(hooks)); |
| 930 SetFunctions(kFunctions); | 923 SetFunctions(kFunctions); |
| 931 InitializeBinding(); | 924 InitializeBinding(); |
| 932 | 925 |
| 933 v8::Local<v8::Object> binding_object = | 926 v8::Local<v8::Object> binding_object = binding()->CreateInstance(context); |
| 934 binding()->CreateInstance(context, base::Bind(&AllowAllAPIs)); | |
| 935 | 927 |
| 936 v8::Local<v8::Function> function = | 928 v8::Local<v8::Function> function = |
| 937 FunctionFromString(context, | 929 FunctionFromString(context, |
| 938 "(function(obj) { return obj.oneString('ping'); })"); | 930 "(function(obj) { return obj.oneString('ping'); })"); |
| 939 v8::Local<v8::Value> args[] = {binding_object}; | 931 v8::Local<v8::Value> args[] = {binding_object}; |
| 940 RunFunctionAndExpectError(function, context, v8::Undefined(isolate()), | 932 RunFunctionAndExpectError(function, context, v8::Undefined(isolate()), |
| 941 arraysize(args), args, | 933 arraysize(args), args, |
| 942 "Uncaught Error: Custom Hook Error"); | 934 "Uncaught Error: Custom Hook Error"); |
| 943 } | 935 } |
| 944 | 936 |
| (...skipping 28 matching lines...) Expand all Loading... |
| 973 result.return_value = | 965 result.return_value = |
| 974 gin::StringToV8(context->GetIsolate(), arg_value + " pong"); | 966 gin::StringToV8(context->GetIsolate(), arg_value + " pong"); |
| 975 return result; | 967 return result; |
| 976 }; | 968 }; |
| 977 hooks->AddHandler("test.oneString", base::Bind(hook, &did_call)); | 969 hooks->AddHandler("test.oneString", base::Bind(hook, &did_call)); |
| 978 | 970 |
| 979 SetHooksDelegate(std::move(hooks)); | 971 SetHooksDelegate(std::move(hooks)); |
| 980 SetFunctions(kFunctions); | 972 SetFunctions(kFunctions); |
| 981 InitializeBinding(); | 973 InitializeBinding(); |
| 982 | 974 |
| 983 v8::Local<v8::Object> binding_object = | 975 v8::Local<v8::Object> binding_object = binding()->CreateInstance(context); |
| 984 binding()->CreateInstance(context, base::Bind(&AllowAllAPIs)); | |
| 985 | 976 |
| 986 { | 977 { |
| 987 // Test an invocation that we expect to throw an exception. | 978 // Test an invocation that we expect to throw an exception. |
| 988 v8::Local<v8::Function> function = | 979 v8::Local<v8::Function> function = |
| 989 FunctionFromString( | 980 FunctionFromString( |
| 990 context, "(function(obj) { return obj.oneString('throw'); })"); | 981 context, "(function(obj) { return obj.oneString('throw'); })"); |
| 991 v8::Local<v8::Value> args[] = {binding_object}; | 982 v8::Local<v8::Value> args[] = {binding_object}; |
| 992 RunFunctionAndExpectError(function, context, v8::Undefined(isolate()), | 983 RunFunctionAndExpectError(function, context, v8::Undefined(isolate()), |
| 993 arraysize(args), args, | 984 arraysize(args), args, |
| 994 "Uncaught Error: Custom Hook Error"); | 985 "Uncaught Error: Custom Hook Error"); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1029 v8::Local<v8::Function> function = | 1020 v8::Local<v8::Function> function = |
| 1030 FunctionFromString(context, kRegisterHook); | 1021 FunctionFromString(context, kRegisterHook); |
| 1031 v8::Local<v8::Value> args[] = {js_hooks}; | 1022 v8::Local<v8::Value> args[] = {js_hooks}; |
| 1032 RunFunctionOnGlobal(function, context, arraysize(args), args); | 1023 RunFunctionOnGlobal(function, context, arraysize(args), args); |
| 1033 } | 1024 } |
| 1034 | 1025 |
| 1035 SetHooks(std::move(hooks)); | 1026 SetHooks(std::move(hooks)); |
| 1036 SetFunctions(kFunctions); | 1027 SetFunctions(kFunctions); |
| 1037 InitializeBinding(); | 1028 InitializeBinding(); |
| 1038 | 1029 |
| 1039 v8::Local<v8::Object> binding_object = | 1030 v8::Local<v8::Object> binding_object = binding()->CreateInstance(context); |
| 1040 binding()->CreateInstance(context, base::Bind(&AllowAllAPIs)); | |
| 1041 | 1031 |
| 1042 // Try calling the method with an invalid signature. Since it's invalid, we | 1032 // Try calling the method with an invalid signature. Since it's invalid, we |
| 1043 // should never enter the hook. | 1033 // should never enter the hook. |
| 1044 ExpectFailure( | 1034 ExpectFailure( |
| 1045 binding_object, "obj.oneString(false);", | 1035 binding_object, "obj.oneString(false);", |
| 1046 InvocationError( | 1036 InvocationError( |
| 1047 "test.oneString", "string str", | 1037 "test.oneString", "string str", |
| 1048 ArgumentError("str", InvalidType(kTypeString, kTypeBoolean)))); | 1038 ArgumentError("str", InvalidType(kTypeString, kTypeBoolean)))); |
| 1049 EXPECT_EQ("undefined", GetStringPropertyFromObject( | 1039 EXPECT_EQ("undefined", GetStringPropertyFromObject( |
| 1050 context->Global(), context, "requestArguments")); | 1040 context->Global(), context, "requestArguments")); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 1081 v8::Local<v8::Function> function = | 1071 v8::Local<v8::Function> function = |
| 1082 FunctionFromString(context, kRegisterHook); | 1072 FunctionFromString(context, kRegisterHook); |
| 1083 v8::Local<v8::Value> args[] = {js_hooks}; | 1073 v8::Local<v8::Value> args[] = {js_hooks}; |
| 1084 RunFunctionOnGlobal(function, context, arraysize(args), args); | 1074 RunFunctionOnGlobal(function, context, arraysize(args), args); |
| 1085 } | 1075 } |
| 1086 | 1076 |
| 1087 SetHooks(std::move(hooks)); | 1077 SetHooks(std::move(hooks)); |
| 1088 SetFunctions(kFunctions); | 1078 SetFunctions(kFunctions); |
| 1089 InitializeBinding(); | 1079 InitializeBinding(); |
| 1090 | 1080 |
| 1091 v8::Local<v8::Object> binding_object = | 1081 v8::Local<v8::Object> binding_object = binding()->CreateInstance(context); |
| 1092 binding()->CreateInstance(context, base::Bind(&AllowAllAPIs)); | |
| 1093 | 1082 |
| 1094 // Call the method with a valid signature. The hook should be entered and | 1083 // Call the method with a valid signature. The hook should be entered and |
| 1095 // manipulate the arguments. | 1084 // manipulate the arguments. |
| 1096 ExpectPass(binding_object, "obj.oneString('ping');", "[{}]", false); | 1085 ExpectPass(binding_object, "obj.oneString('ping');", "[{}]", false); |
| 1097 } | 1086 } |
| 1098 | 1087 |
| 1099 // Test that user gestures are properly recorded when calling APIs. | 1088 // Test that user gestures are properly recorded when calling APIs. |
| 1100 TEST_F(APIBindingUnittest, TestUserGestures) { | 1089 TEST_F(APIBindingUnittest, TestUserGestures) { |
| 1101 SetFunctions(kFunctions); | 1090 SetFunctions(kFunctions); |
| 1102 InitializeBinding(); | 1091 InitializeBinding(); |
| 1103 | 1092 |
| 1104 v8::HandleScope handle_scope(isolate()); | 1093 v8::HandleScope handle_scope(isolate()); |
| 1105 v8::Local<v8::Context> context = MainContext(); | 1094 v8::Local<v8::Context> context = MainContext(); |
| 1106 | 1095 |
| 1107 v8::Local<v8::Object> binding_object = | 1096 v8::Local<v8::Object> binding_object = binding()->CreateInstance(context); |
| 1108 binding()->CreateInstance(context, base::Bind(&AllowAllAPIs)); | |
| 1109 | 1097 |
| 1110 v8::Local<v8::Function> function = | 1098 v8::Local<v8::Function> function = |
| 1111 FunctionFromString(context, "(function(obj) { obj.oneString('foo');})"); | 1099 FunctionFromString(context, "(function(obj) { obj.oneString('foo');})"); |
| 1112 ASSERT_FALSE(function.IsEmpty()); | 1100 ASSERT_FALSE(function.IsEmpty()); |
| 1113 | 1101 |
| 1114 v8::Local<v8::Value> argv[] = {binding_object}; | 1102 v8::Local<v8::Value> argv[] = {binding_object}; |
| 1115 RunFunction(function, context, arraysize(argv), argv); | 1103 RunFunction(function, context, arraysize(argv), argv); |
| 1116 ASSERT_TRUE(last_request()); | 1104 ASSERT_TRUE(last_request()); |
| 1117 EXPECT_FALSE(last_request()->has_user_gesture); | 1105 EXPECT_FALSE(last_request()->has_user_gesture); |
| 1118 reset_last_request(); | 1106 reset_last_request(); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 1148 " {'name': 'url', 'type': 'array', 'items': {'type': 'any'}}" | 1136 " {'name': 'url', 'type': 'array', 'items': {'type': 'any'}}" |
| 1149 " ]," | 1137 " ]," |
| 1150 " 'parameters': []" | 1138 " 'parameters': []" |
| 1151 "}]"; | 1139 "}]"; |
| 1152 SetEvents(kEvents); | 1140 SetEvents(kEvents); |
| 1153 InitializeBinding(); | 1141 InitializeBinding(); |
| 1154 | 1142 |
| 1155 v8::HandleScope handle_scope(isolate()); | 1143 v8::HandleScope handle_scope(isolate()); |
| 1156 v8::Local<v8::Context> context = MainContext(); | 1144 v8::Local<v8::Context> context = MainContext(); |
| 1157 | 1145 |
| 1158 v8::Local<v8::Object> binding_object = | 1146 v8::Local<v8::Object> binding_object = binding()->CreateInstance(context); |
| 1159 binding()->CreateInstance(context, base::Bind(&AllowAllAPIs)); | |
| 1160 | 1147 |
| 1161 const char kAddFilteredListener[] = | 1148 const char kAddFilteredListener[] = |
| 1162 "(function(evt) {\n" | 1149 "(function(evt) {\n" |
| 1163 " evt.addListener(function() {},\n" | 1150 " evt.addListener(function() {},\n" |
| 1164 " {url: [{pathContains: 'simple2.html'}]});\n" | 1151 " {url: [{pathContains: 'simple2.html'}]});\n" |
| 1165 "})"; | 1152 "})"; |
| 1166 v8::Local<v8::Function> function = | 1153 v8::Local<v8::Function> function = |
| 1167 FunctionFromString(context, kAddFilteredListener); | 1154 FunctionFromString(context, kAddFilteredListener); |
| 1168 ASSERT_FALSE(function.IsEmpty()); | 1155 ASSERT_FALSE(function.IsEmpty()); |
| 1169 | 1156 |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1202 gin::ConvertToV8(isolate, 42)); | 1189 gin::ConvertToV8(isolate, 42)); |
| 1203 }; | 1190 }; |
| 1204 hooks->SetTemplateInitializer(base::Bind(hook)); | 1191 hooks->SetTemplateInitializer(base::Bind(hook)); |
| 1205 SetHooksDelegate(std::move(hooks)); | 1192 SetHooksDelegate(std::move(hooks)); |
| 1206 | 1193 |
| 1207 InitializeBinding(); | 1194 InitializeBinding(); |
| 1208 | 1195 |
| 1209 v8::HandleScope handle_scope(isolate()); | 1196 v8::HandleScope handle_scope(isolate()); |
| 1210 v8::Local<v8::Context> context = MainContext(); | 1197 v8::Local<v8::Context> context = MainContext(); |
| 1211 | 1198 |
| 1212 v8::Local<v8::Object> binding_object = | 1199 v8::Local<v8::Object> binding_object = binding()->CreateInstance(context); |
| 1213 binding()->CreateInstance(context, base::Bind(&AllowAllAPIs)); | |
| 1214 | 1200 |
| 1215 // The extra property should be present on the binding object. | 1201 // The extra property should be present on the binding object. |
| 1216 EXPECT_EQ("42", GetStringPropertyFromObject(binding_object, context, | 1202 EXPECT_EQ("42", GetStringPropertyFromObject(binding_object, context, |
| 1217 "hookedProperty")); | 1203 "hookedProperty")); |
| 1218 // Sanity check: other values should still be there. | 1204 // Sanity check: other values should still be there. |
| 1219 EXPECT_EQ("function", | 1205 EXPECT_EQ("function", |
| 1220 GetStringPropertyFromObject(binding_object, context, "oneString")); | 1206 GetStringPropertyFromObject(binding_object, context, "oneString")); |
| 1221 } | 1207 } |
| 1222 | 1208 |
| 1223 } // namespace extensions | 1209 } // namespace extensions |
| OLD | NEW |