Index: extensions/renderer/native_extension_bindings_system_unittest.cc |
diff --git a/extensions/renderer/native_extension_bindings_system_unittest.cc b/extensions/renderer/native_extension_bindings_system_unittest.cc |
index 09e3058bc5067a6dbe01da0fdebd60b2af0ce4d9..b853306a2bac26a433c09e6a6dba28139ee3a043 100644 |
--- a/extensions/renderer/native_extension_bindings_system_unittest.cc |
+++ b/extensions/renderer/native_extension_bindings_system_unittest.cc |
@@ -793,4 +793,49 @@ TEST_F(NativeExtensionBindingsSystemUnittest, |
check_properties_inequal(context_a, context_b, "chrome.idle.onStateChanged"); |
} |
+// Tests that API methods and events that are conditionally available based on |
+// context are properly present or absent from the API object. |
+TEST_F(NativeExtensionBindingsSystemUnittest, |
+ CheckRestrictedFeaturesBasedOnContext) { |
+ scoped_refptr<Extension> extension = |
+ CreateExtension("extension", ItemType::EXTENSION, {"idle"}); |
+ RegisterExtension(extension->id()); |
+ |
+ v8::HandleScope handle_scope(isolate()); |
+ v8::Local<v8::Context> blessed_context = MainContext(); |
+ v8::Local<v8::Context> webpage_context = AddContext(); |
+ |
+ // Create two contexts - a blessed extension context and a normal web page |
+ // context. |
+ ScriptContext* blessed_script_context = CreateScriptContext( |
+ blessed_context, extension.get(), Feature::BLESSED_EXTENSION_CONTEXT); |
+ blessed_script_context->set_url(extension->url()); |
+ bindings_system()->UpdateBindingsForContext(blessed_script_context); |
+ |
+ ScriptContext* webpage_script_context = |
+ CreateScriptContext(webpage_context, nullptr, Feature::WEB_PAGE_CONTEXT); |
+ webpage_script_context->set_url(GURL("http://example.com")); |
+ bindings_system()->UpdateBindingsForContext(webpage_script_context); |
+ |
+ auto property_exists = [](v8::Local<v8::Context> context, |
+ base::StringPiece property) { |
+ v8::Local<v8::Value> value = V8ValueFromScriptSource(context, property); |
+ EXPECT_FALSE(value.IsEmpty()); |
+ return !value->IsUndefined(); |
+ }; |
+ |
+ // Check that properties are correctly restricted. The blessed context should |
+ // have access to the whole runtime API, but the webpage should only have |
+ // access to sendMessage. |
+ const char kSendMessage[] = "chrome.runtime.sendMessage"; |
+ const char kGetUrl[] = "chrome.runtime.getURL"; |
+ const char kOnMessage[] = "chrome.runtime.onMessage"; |
+ EXPECT_TRUE(property_exists(blessed_context, kSendMessage)); |
+ EXPECT_TRUE(property_exists(blessed_context, kGetUrl)); |
+ EXPECT_TRUE(property_exists(blessed_context, kOnMessage)); |
+ EXPECT_TRUE(property_exists(webpage_context, kSendMessage)); |
+ EXPECT_FALSE(property_exists(webpage_context, kGetUrl)); |
+ EXPECT_FALSE(property_exists(webpage_context, kOnMessage)); |
+} |
+ |
} // namespace extensions |