| 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 "base/bind.h" | 5 #include "base/bind.h" |
| 6 #include "base/memory/ptr_util.h" | 6 #include "base/memory/ptr_util.h" |
| 7 #include "base/stl_util.h" | 7 #include "base/stl_util.h" |
| 8 #include "base/strings/stringprintf.h" | 8 #include "base/strings/stringprintf.h" |
| 9 #include "base/values.h" | 9 #include "base/values.h" |
| 10 #include "extensions/renderer/api_binding.h" | 10 #include "extensions/renderer/api_binding.h" |
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 140 : type_refs_(APITypeReferenceMap::InitializeTypeCallback()) {} | 140 : type_refs_(APITypeReferenceMap::InitializeTypeCallback()) {} |
| 141 void SetUp() override { | 141 void SetUp() override { |
| 142 APIBindingTest::SetUp(); | 142 APIBindingTest::SetUp(); |
| 143 request_handler_ = base::MakeUnique<APIRequestHandler>( | 143 request_handler_ = base::MakeUnique<APIRequestHandler>( |
| 144 base::Bind(&APIBindingUnittest::OnFunctionCall, base::Unretained(this)), | 144 base::Bind(&APIBindingUnittest::OnFunctionCall, base::Unretained(this)), |
| 145 base::Bind(&RunFunctionOnGlobalAndIgnoreResult), | 145 base::Bind(&RunFunctionOnGlobalAndIgnoreResult), |
| 146 APILastError(APILastError::GetParent())); | 146 APILastError(APILastError::GetParent())); |
| 147 } | 147 } |
| 148 | 148 |
| 149 void TearDown() override { | 149 void TearDown() override { |
| 150 DisposeAllContexts(); |
| 150 request_handler_.reset(); | 151 request_handler_.reset(); |
| 151 event_handler_.reset(); | 152 event_handler_.reset(); |
| 152 binding_.reset(); | 153 binding_.reset(); |
| 153 APIBindingTest::TearDown(); | 154 APIBindingTest::TearDown(); |
| 154 } | 155 } |
| 155 | 156 |
| 157 void OnWillDisposeContext(v8::Local<v8::Context> context) override { |
| 158 event_handler_->InvalidateContext(context); |
| 159 request_handler_->InvalidateContext(context); |
| 160 } |
| 161 |
| 156 void SetFunctions(const char* functions) { | 162 void SetFunctions(const char* functions) { |
| 157 binding_functions_ = ListValueFromString(functions); | 163 binding_functions_ = ListValueFromString(functions); |
| 158 ASSERT_TRUE(binding_functions_); | 164 ASSERT_TRUE(binding_functions_); |
| 159 } | 165 } |
| 160 | 166 |
| 161 void SetEvents(const char* events) { | 167 void SetEvents(const char* events) { |
| 162 binding_events_ = ListValueFromString(events); | 168 binding_events_ = ListValueFromString(events); |
| 163 ASSERT_TRUE(binding_events_); | 169 ASSERT_TRUE(binding_events_); |
| 164 } | 170 } |
| 165 | 171 |
| (...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 489 ExpectFailure(binding_object, "obj.takesRefObj({prop1: 'foo', prop2: 'a'})", | 495 ExpectFailure(binding_object, "obj.takesRefObj({prop1: 'foo', prop2: 'a'})", |
| 490 kError); | 496 kError); |
| 491 ExpectPass(binding_object, "obj.takesRefEnum('alpha')", "['alpha']", false); | 497 ExpectPass(binding_object, "obj.takesRefEnum('alpha')", "['alpha']", false); |
| 492 ExpectPass(binding_object, "obj.takesRefEnum('beta')", "['beta']", false); | 498 ExpectPass(binding_object, "obj.takesRefEnum('beta')", "['beta']", false); |
| 493 ExpectPass(binding_object, "obj.takesRefEnum(obj.refEnum.BETA)", "['beta']", | 499 ExpectPass(binding_object, "obj.takesRefEnum(obj.refEnum.BETA)", "['beta']", |
| 494 false); | 500 false); |
| 495 ExpectFailure(binding_object, "obj.takesRefEnum('gamma')", kError); | 501 ExpectFailure(binding_object, "obj.takesRefEnum('gamma')", kError); |
| 496 } | 502 } |
| 497 | 503 |
| 498 TEST_F(APIBindingUnittest, RestrictedAPIs) { | 504 TEST_F(APIBindingUnittest, RestrictedAPIs) { |
| 499 const char kRestrictedFunctions[] = | 505 const char kFunctions[] = |
| 500 "[{" | 506 "[{" |
| 501 " 'name': 'allowedOne'," | 507 " 'name': 'allowedOne'," |
| 502 " 'parameters': []" | 508 " 'parameters': []" |
| 503 "}, {" | 509 "}, {" |
| 504 " 'name': 'allowedTwo'," | 510 " 'name': 'allowedTwo'," |
| 505 " 'parameters': []" | 511 " 'parameters': []" |
| 506 "}, {" | 512 "}, {" |
| 507 " 'name': 'restrictedOne'," | 513 " 'name': 'restrictedOne'," |
| 508 " 'parameters': []" | 514 " 'parameters': []" |
| 509 "}, {" | 515 "}, {" |
| 510 " 'name': 'restrictedTwo'," | 516 " 'name': 'restrictedTwo'," |
| 511 " 'parameters': []" | 517 " 'parameters': []" |
| 512 "}]"; | 518 "}]"; |
| 513 SetFunctions(kRestrictedFunctions); | 519 SetFunctions(kFunctions); |
| 520 const char kEvents[] = |
| 521 "[{'name': 'allowedEvent'}, {'name': 'restrictedEvent'}]"; |
| 522 SetEvents(kEvents); |
| 514 InitializeBinding(); | 523 InitializeBinding(); |
| 515 | 524 |
| 516 v8::HandleScope handle_scope(isolate()); | 525 v8::HandleScope handle_scope(isolate()); |
| 517 v8::Local<v8::Context> context = MainContext(); | 526 v8::Local<v8::Context> context = MainContext(); |
| 518 | 527 |
| 519 auto is_available = [](const std::string& name) { | 528 auto is_available = [](const std::string& name) { |
| 520 std::set<std::string> functions = {"test.allowedOne", "test.allowedTwo", | 529 std::set<std::string> allowed = {"test.allowedOne", "test.allowedTwo", |
| 521 "test.restrictedOne", | 530 "test.allowedEvent"}; |
| 522 "test.restrictedTwo"}; | 531 std::set<std::string> restricted = { |
| 523 EXPECT_TRUE(functions.count(name)); | 532 "test.restrictedOne", "test.restrictedTwo", "test.restrictedEvent"}; |
| 524 return name == "test.allowedOne" || name == "test.allowedTwo"; | 533 EXPECT_TRUE(allowed.count(name) || restricted.count(name)) << name; |
| 534 return allowed.count(name) != 0; |
| 525 }; | 535 }; |
| 526 | 536 |
| 527 v8::Local<v8::Object> binding_object = | 537 v8::Local<v8::Object> binding_object = |
| 528 binding()->CreateInstance(context, isolate(), base::Bind(is_available)); | 538 binding()->CreateInstance(context, isolate(), base::Bind(is_available)); |
| 529 | 539 |
| 530 auto is_defined = [&binding_object, context](const std::string& name) { | 540 auto is_defined = [&binding_object, context](const std::string& name) { |
| 531 v8::Local<v8::Value> val = | 541 v8::Local<v8::Value> val = |
| 532 GetPropertyFromObject(binding_object, context, name); | 542 GetPropertyFromObject(binding_object, context, name); |
| 533 EXPECT_FALSE(val.IsEmpty()); | 543 EXPECT_FALSE(val.IsEmpty()); |
| 534 return !val->IsUndefined() && !val->IsNull(); | 544 return !val->IsUndefined() && !val->IsNull(); |
| 535 }; | 545 }; |
| 536 | 546 |
| 537 EXPECT_TRUE(is_defined("allowedOne")); | 547 EXPECT_TRUE(is_defined("allowedOne")); |
| 538 EXPECT_TRUE(is_defined("allowedTwo")); | 548 EXPECT_TRUE(is_defined("allowedTwo")); |
| 549 EXPECT_TRUE(is_defined("allowedEvent")); |
| 539 EXPECT_FALSE(is_defined("restrictedOne")); | 550 EXPECT_FALSE(is_defined("restrictedOne")); |
| 540 EXPECT_FALSE(is_defined("restrictedTwo")); | 551 EXPECT_FALSE(is_defined("restrictedTwo")); |
| 552 EXPECT_FALSE(is_defined("restrictedEvent")); |
| 541 } | 553 } |
| 542 | 554 |
| 543 // Tests that events specified in the API are created as properties of the API | 555 // Tests that events specified in the API are created as properties of the API |
| 544 // object. | 556 // object. |
| 545 TEST_F(APIBindingUnittest, TestEventCreation) { | 557 TEST_F(APIBindingUnittest, TestEventCreation) { |
| 546 SetEvents("[{'name': 'onFoo'}, {'name': 'onBar'}]"); | 558 SetEvents("[{'name': 'onFoo'}, {'name': 'onBar'}]"); |
| 547 SetFunctions(kFunctions); | 559 SetFunctions(kFunctions); |
| 548 InitializeBinding(); | 560 InitializeBinding(); |
| 549 | 561 |
| 550 v8::HandleScope handle_scope(isolate()); | 562 v8::HandleScope handle_scope(isolate()); |
| (...skipping 605 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1156 | 1168 |
| 1157 blink::WebScopedUserGesture user_gesture(nullptr); | 1169 blink::WebScopedUserGesture user_gesture(nullptr); |
| 1158 RunFunction(function, context, arraysize(argv), argv); | 1170 RunFunction(function, context, arraysize(argv), argv); |
| 1159 ASSERT_TRUE(last_request()); | 1171 ASSERT_TRUE(last_request()); |
| 1160 EXPECT_TRUE(last_request()->has_user_gesture); | 1172 EXPECT_TRUE(last_request()->has_user_gesture); |
| 1161 | 1173 |
| 1162 reset_last_request(); | 1174 reset_last_request(); |
| 1163 } | 1175 } |
| 1164 | 1176 |
| 1165 } // namespace extensions | 1177 } // namespace extensions |
| OLD | NEW |