summaryrefslogtreecommitdiff
path: root/chromium/chrome/renderer/extensions/tabs_hooks_delegate_unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/chrome/renderer/extensions/tabs_hooks_delegate_unittest.cc')
-rw-r--r--chromium/chrome/renderer/extensions/tabs_hooks_delegate_unittest.cc183
1 files changed, 183 insertions, 0 deletions
diff --git a/chromium/chrome/renderer/extensions/tabs_hooks_delegate_unittest.cc b/chromium/chrome/renderer/extensions/tabs_hooks_delegate_unittest.cc
new file mode 100644
index 00000000000..d1802aa1673
--- /dev/null
+++ b/chromium/chrome/renderer/extensions/tabs_hooks_delegate_unittest.cc
@@ -0,0 +1,183 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/renderer/extensions/tabs_hooks_delegate.h"
+
+#include "base/strings/stringprintf.h"
+#include "extensions/common/extension_builder.h"
+#include "extensions/renderer/bindings/api_binding_test_util.h"
+#include "extensions/renderer/message_target.h"
+#include "extensions/renderer/messaging_util.h"
+#include "extensions/renderer/native_extension_bindings_system.h"
+#include "extensions/renderer/native_extension_bindings_system_test_base.h"
+#include "extensions/renderer/native_renderer_messaging_service.h"
+#include "extensions/renderer/script_context.h"
+#include "extensions/renderer/send_message_tester.h"
+
+namespace extensions {
+
+namespace {
+
+void CallAPIAndExpectError(v8::Local<v8::Context> context,
+ const char* method_name,
+ const char* args) {
+ SCOPED_TRACE(base::StringPrintf("Args: `%s`", args));
+ constexpr char kTemplate[] = "(function() { chrome.tabs.%s(%s); })";
+
+ v8::Isolate* isolate = context->GetIsolate();
+
+ // Just verify some error was thrown. Expecting the exact error message
+ // tends to rely too much on our argument spec code, which is tested
+ // separately.
+ v8::Local<v8::Function> function = FunctionFromString(
+ context, base::StringPrintf(kTemplate, method_name, args));
+ v8::TryCatch try_catch(isolate);
+ v8::MaybeLocal<v8::Value> result =
+ function->Call(context, v8::Undefined(isolate), 0, nullptr);
+ EXPECT_TRUE(result.IsEmpty());
+ EXPECT_TRUE(try_catch.HasCaught());
+}
+
+} // namespace
+
+class TabsHooksDelegateTest : public NativeExtensionBindingsSystemUnittest {
+ public:
+ TabsHooksDelegateTest() {}
+ ~TabsHooksDelegateTest() override {}
+
+ // NativeExtensionBindingsSystemUnittest:
+ void SetUp() override {
+ NativeExtensionBindingsSystemUnittest::SetUp();
+ messaging_service_ =
+ std::make_unique<NativeRendererMessagingService>(bindings_system());
+
+ bindings_system()->api_system()->GetHooksForAPI("tabs")->SetDelegate(
+ std::make_unique<TabsHooksDelegate>(messaging_service_.get()));
+
+ scoped_refptr<const Extension> mutable_extension = BuildExtension();
+ RegisterExtension(mutable_extension);
+ extension_ = mutable_extension;
+
+ v8::HandleScope handle_scope(isolate());
+ v8::Local<v8::Context> context = MainContext();
+
+ script_context_ = CreateScriptContext(context, mutable_extension.get(),
+ Feature::BLESSED_EXTENSION_CONTEXT);
+ script_context_->set_url(extension_->url());
+ bindings_system()->UpdateBindingsForContext(script_context_);
+ }
+ void TearDown() override {
+ script_context_ = nullptr;
+ extension_ = nullptr;
+ messaging_service_.reset();
+ NativeExtensionBindingsSystemUnittest::TearDown();
+ }
+ bool UseStrictIPCMessageSender() override { return true; }
+
+ virtual scoped_refptr<const Extension> BuildExtension() {
+ return ExtensionBuilder("foo").Build();
+ }
+
+ NativeRendererMessagingService* messaging_service() {
+ return messaging_service_.get();
+ }
+ ScriptContext* script_context() { return script_context_; }
+ const Extension* extension() { return extension_.get(); }
+
+ private:
+ std::unique_ptr<NativeRendererMessagingService> messaging_service_;
+
+ ScriptContext* script_context_ = nullptr;
+ scoped_refptr<const Extension> extension_;
+
+ DISALLOW_COPY_AND_ASSIGN(TabsHooksDelegateTest);
+};
+
+TEST_F(TabsHooksDelegateTest, Connect) {
+ v8::HandleScope handle_scope(isolate());
+ v8::Local<v8::Context> context = MainContext();
+
+ SendMessageTester tester(ipc_message_sender(), script_context(), 0, "tabs");
+
+ const bool kExpectIncludeTlsChannelId = false;
+ tester.TestConnect("1", "",
+ MessageTarget::ForTab(1, messaging_util::kNoFrameId),
+ kExpectIncludeTlsChannelId);
+ tester.TestConnect("-0", "",
+ MessageTarget::ForTab(0, messaging_util::kNoFrameId),
+ kExpectIncludeTlsChannelId);
+ tester.TestConnect("4, {name: 'channel'}", "channel",
+ MessageTarget::ForTab(4, messaging_util::kNoFrameId),
+ kExpectIncludeTlsChannelId);
+ tester.TestConnect("9, {frameId: null}", "",
+ MessageTarget::ForTab(9, messaging_util::kNoFrameId),
+ kExpectIncludeTlsChannelId);
+ tester.TestConnect("9, {frameId: 16}", "", MessageTarget::ForTab(9, 16),
+ kExpectIncludeTlsChannelId);
+ tester.TestConnect("25, {}", "",
+ MessageTarget::ForTab(25, messaging_util::kNoFrameId),
+ kExpectIncludeTlsChannelId);
+
+ CallAPIAndExpectError(context, "connect", "36, {includeTlsChannelId: true}");
+}
+
+TEST_F(TabsHooksDelegateTest, SendMessage) {
+ v8::HandleScope handle_scope(isolate());
+ v8::Local<v8::Context> context = MainContext();
+
+ const bool kExpectIncludeTlsChannelId = false;
+
+ SendMessageTester tester(ipc_message_sender(), script_context(), 0, "tabs");
+
+ tester.TestSendMessage("1, ''", R"("")",
+ MessageTarget::ForTab(1, messaging_util::kNoFrameId),
+ kExpectIncludeTlsChannelId, SendMessageTester::CLOSED);
+
+ constexpr char kStandardMessage[] = R"({"data":"hello"})";
+ tester.TestSendMessage("1, {data: 'hello'}", kStandardMessage,
+ MessageTarget::ForTab(1, messaging_util::kNoFrameId),
+ kExpectIncludeTlsChannelId, SendMessageTester::CLOSED);
+ tester.TestSendMessage("-0, {data: 'hello'}", kStandardMessage,
+ MessageTarget::ForTab(0, messaging_util::kNoFrameId),
+ kExpectIncludeTlsChannelId, SendMessageTester::CLOSED);
+ tester.TestSendMessage("1, {data: 'hello'}, function() {}", kStandardMessage,
+ MessageTarget::ForTab(1, messaging_util::kNoFrameId),
+ kExpectIncludeTlsChannelId, SendMessageTester::OPEN);
+ tester.TestSendMessage("1, {data: 'hello'}, {frameId: null}",
+ kStandardMessage,
+ MessageTarget::ForTab(1, messaging_util::kNoFrameId),
+ kExpectIncludeTlsChannelId, SendMessageTester::CLOSED);
+ tester.TestSendMessage("1, {data: 'hello'}, {frameId: 10}", kStandardMessage,
+ MessageTarget::ForTab(1, 10),
+ kExpectIncludeTlsChannelId, SendMessageTester::CLOSED);
+ tester.TestSendMessage("1, {data: 'hello'}, {frameId: 10}, function() {}",
+ kStandardMessage, MessageTarget::ForTab(1, 10),
+ kExpectIncludeTlsChannelId, SendMessageTester::OPEN);
+
+ CallAPIAndExpectError(context, "sendMessage",
+ "1, 'hello', {includeTlsChannelId: true}");
+}
+
+TEST_F(TabsHooksDelegateTest, SendRequest) {
+ v8::HandleScope handle_scope(isolate());
+ v8::Local<v8::Context> context = MainContext();
+
+ SendMessageTester tester(ipc_message_sender(), script_context(), 0, "tabs");
+
+ tester.TestSendRequest("1, ''", R"("")",
+ MessageTarget::ForTab(1, messaging_util::kNoFrameId),
+ SendMessageTester::CLOSED);
+
+ constexpr char kStandardMessage[] = R"({"data":"hello"})";
+ tester.TestSendRequest("1, {data: 'hello'}", kStandardMessage,
+ MessageTarget::ForTab(1, messaging_util::kNoFrameId),
+ SendMessageTester::CLOSED);
+ tester.TestSendRequest("1, {data: 'hello'}, function() {}", kStandardMessage,
+ MessageTarget::ForTab(1, messaging_util::kNoFrameId),
+ SendMessageTester::OPEN);
+
+ CallAPIAndExpectError(context, "sendRequest", "1, 'hello', {frameId: 10}");
+}
+
+} // namespace extensions