| 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 ea5d5bbeff2a81b5618abebf9a4bc8572fcb2b2b..22304b07d47e098e76bb2839a147699c75405b95 100644
|
| --- a/extensions/renderer/native_extension_bindings_system_unittest.cc
|
| +++ b/extensions/renderer/native_extension_bindings_system_unittest.cc
|
| @@ -15,8 +15,12 @@
|
| #include "extensions/common/value_builder.h"
|
| #include "extensions/renderer/api_binding_test.h"
|
| #include "extensions/renderer/api_binding_test_util.h"
|
| +#include "extensions/renderer/module_system.h"
|
| +#include "extensions/renderer/safe_builtins.h"
|
| #include "extensions/renderer/script_context.h"
|
| #include "extensions/renderer/script_context_set.h"
|
| +#include "extensions/renderer/string_source_map.h"
|
| +#include "extensions/renderer/test_v8_extension_configuration.h"
|
|
|
| namespace extensions {
|
|
|
| @@ -52,6 +56,10 @@ class NativeExtensionBindingsSystemUnittest : public APIBindingTest {
|
| ~NativeExtensionBindingsSystemUnittest() override {}
|
|
|
| protected:
|
| + v8::ExtensionConfiguration* GetV8ExtensionConfiguration() override {
|
| + return TestV8ExtensionConfiguration::GetConfiguration();
|
| + }
|
| +
|
| void SetUp() override {
|
| script_context_set_ = base::MakeUnique<ScriptContextSet>(&extension_ids_);
|
| bindings_system_ = base::MakeUnique<NativeExtensionBindingsSystem>(
|
| @@ -87,6 +95,8 @@ class NativeExtensionBindingsSystemUnittest : public APIBindingTest {
|
| Feature::Context context_type) {
|
| auto script_context = base::MakeUnique<ScriptContext>(
|
| v8_context, nullptr, extension, context_type, extension, context_type);
|
| + script_context->set_module_system(
|
| + base::MakeUnique<ModuleSystem>(script_context.get(), source_map()));
|
| ScriptContext* raw_script_context = script_context.get();
|
| raw_script_contexts_.push_back(raw_script_context);
|
| script_context_set_->AddForTesting(std::move(script_context));
|
| @@ -99,6 +109,7 @@ class NativeExtensionBindingsSystemUnittest : public APIBindingTest {
|
| return bindings_system_.get();
|
| }
|
| const ExtensionHostMsg_Request_Params& last_params() { return last_params_; }
|
| + StringSourceMap* source_map() { return &source_map_; }
|
|
|
| private:
|
| ExtensionIdSet extension_ids_;
|
| @@ -106,6 +117,7 @@ class NativeExtensionBindingsSystemUnittest : public APIBindingTest {
|
| std::vector<ScriptContext*> raw_script_contexts_;
|
| std::unique_ptr<NativeExtensionBindingsSystem> bindings_system_;
|
| ExtensionHostMsg_Request_Params last_params_;
|
| + StringSourceMap source_map_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(NativeExtensionBindingsSystemUnittest);
|
| };
|
| @@ -260,4 +272,60 @@ TEST_F(NativeExtensionBindingsSystemUnittest,
|
| EXPECT_TRUE(power_object->IsUndefined());
|
| }
|
|
|
| +// Tests that traditional custom bindings can be used with the native bindings
|
| +// system.
|
| +TEST_F(NativeExtensionBindingsSystemUnittest, TestBridgingToJSCustomBindings) {
|
| + // Custom binding code. This basically utilizes the interface in binding.js in
|
| + // order to test backwards compatibility.
|
| + const char kCustomBinding[] =
|
| + "apiBridge.registerCustomHook(api => {\n"
|
| + " api.apiFunctions.setHandleRequest('queryState',\n"
|
| + " (time, callback) => {\n"
|
| + " this.timeArg = time;\n"
|
| + " callback('active');\n"
|
| + " });\n"
|
| + "});\n";
|
| +
|
| + source_map()->RegisterModule("idle", kCustomBinding);
|
| +
|
| + scoped_refptr<Extension> extension = CreateExtension("foo", {"idle"});
|
| + RegisterExtension(extension->id());
|
| +
|
| + v8::HandleScope handle_scope(isolate());
|
| + v8::Local<v8::Context> context = ContextLocal();
|
| +
|
| + ScriptContext* script_context = CreateScriptContext(
|
| + context, extension.get(), Feature::BLESSED_EXTENSION_CONTEXT);
|
| + script_context->set_url(extension->url());
|
| +
|
| + bindings_system()->UpdateBindingsForContext(script_context);
|
| +
|
| + {
|
| + // Call the function correctly.
|
| + const char kCallIdleQueryState[] =
|
| + "(function() {\n"
|
| + " chrome.idle.queryState(30, function(state) {\n"
|
| + " this.responseState = state;\n"
|
| + " });\n"
|
| + "});";
|
| +
|
| + v8::Local<v8::Function> call_idle_query_state =
|
| + FunctionFromString(context, kCallIdleQueryState);
|
| + RunFunctionOnGlobal(call_idle_query_state, context, 0, nullptr);
|
| + }
|
| +
|
| + // We need to check two pieces: first, that the custom handler was called
|
| + // with the proper arguments....
|
| + std::unique_ptr<base::Value> result_value =
|
| + GetBaseValuePropertyFromObject(context->Global(), context, "timeArg");
|
| + ASSERT_TRUE(result_value);
|
| + EXPECT_EQ("30", ValueToString(*result_value));
|
| +
|
| + // ...and second, that the callback was called with the proper result.
|
| + result_value = GetBaseValuePropertyFromObject(
|
| + context->Global(), context, "responseState");
|
| + ASSERT_TRUE(result_value);
|
| + EXPECT_EQ("\"active\"", ValueToString(*result_value));
|
| +}
|
| +
|
| } // namespace extensions
|
|
|