Index: chrome/browser/external_protocol/external_protocol_handler_unittest.cc |
diff --git a/chrome/browser/external_protocol/external_protocol_handler_unittest.cc b/chrome/browser/external_protocol/external_protocol_handler_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..77246c899084576edfb1083c106212dfed6fb0ad |
--- /dev/null |
+++ b/chrome/browser/external_protocol/external_protocol_handler_unittest.cc |
@@ -0,0 +1,183 @@ |
+// Copyright (c) 2011 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/browser/external_protocol/external_protocol_handler.h" |
+ |
+#include "content/browser/browser_thread.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+class FakeExternalProtocolHandlerWorker |
+ : public ShellIntegration::DefaultProtocolClientWorker { |
+ public: |
+ FakeExternalProtocolHandlerWorker( |
+ ShellIntegration::DefaultWebClientObserver* observer, |
+ const std::string& protocol, |
+ ShellIntegration::DefaultWebClientState os_state) |
+ : ShellIntegration::DefaultProtocolClientWorker(observer, protocol), |
+ os_state_(os_state) {} |
+ |
+ private: |
+ virtual ShellIntegration::DefaultWebClientState CheckIsDefault() { |
+ return os_state_; |
+ } |
+ |
+ virtual void SetAsDefault() {} |
+ |
+ ShellIntegration::DefaultWebClientState os_state_; |
+}; |
+ |
+class FakeExternalProtocolHandlerDelegate |
+ : public ExternalProtocolHandler::Delegate { |
+ public: |
+ FakeExternalProtocolHandlerDelegate() |
+ : block_state_(ExternalProtocolHandler::BLOCK), |
+ os_state_(ShellIntegration::UNKNOWN_DEFAULT_WEB_CLIENT), |
+ has_launched_(false), |
+ has_prompted_(false), |
+ has_blocked_ (false) {} |
+ |
+ virtual ShellIntegration::DefaultProtocolClientWorker* CreateShellWorker( |
+ ShellIntegration::DefaultWebClientObserver* observer, |
+ const std::string& protocol) { |
+ return new FakeExternalProtocolHandlerWorker(observer, protocol, os_state_); |
+ } |
+ |
+ virtual ExternalProtocolHandler::BlockState GetBlockState( |
+ const std::string& scheme) { return block_state_; } |
+ |
+ virtual void BlockRequest() { |
+ ASSERT_TRUE(block_state_ == ExternalProtocolHandler::BLOCK || |
+ os_state_ == ShellIntegration::IS_DEFAULT_WEB_CLIENT); |
+ has_blocked_ = true; |
+ } |
+ |
+ virtual void RunExternalProtocolDialog(const GURL& url, |
+ int render_process_host_id, |
+ int routing_id) { |
+ ASSERT_EQ(block_state_, ExternalProtocolHandler::UNKNOWN); |
+ ASSERT_NE(os_state_, ShellIntegration::IS_DEFAULT_WEB_CLIENT); |
+ has_prompted_ = true; |
+ } |
+ |
+ virtual void LaunchUrlWithoutSecurityCheck(const GURL& url) { |
+ ASSERT_EQ(block_state_, ExternalProtocolHandler::DONT_BLOCK); |
+ ASSERT_NE(os_state_, ShellIntegration::IS_DEFAULT_WEB_CLIENT); |
+ has_launched_ = true; |
+ } |
+ |
+ virtual void FinishedProcessingCheck() { |
+ MessageLoop::current()->Quit(); |
+ } |
+ |
+ void set_os_state(ShellIntegration::DefaultWebClientState value) { |
+ os_state_ = value; |
+ } |
+ |
+ void set_block_state(ExternalProtocolHandler::BlockState value) { |
+ block_state_ = value; |
+ } |
+ |
+ bool has_launched() { return has_launched_; } |
+ bool has_prompted() { return has_prompted_; } |
+ bool has_blocked() { return has_blocked_; } |
+ |
+ private: |
+ ExternalProtocolHandler::BlockState block_state_; |
+ ShellIntegration::DefaultWebClientState os_state_; |
+ bool has_launched_; |
+ bool has_prompted_; |
+ bool has_blocked_; |
+}; |
+ |
+class ExternalProtocolHandlerTest : public testing::Test { |
+ protected: |
+ ExternalProtocolHandlerTest() |
+ : ui_thread_(BrowserThread::UI, MessageLoop::current()), |
+ file_thread_(BrowserThread::FILE) {} |
+ |
+ virtual void SetUp() { |
+ base::Thread::Options options; |
+ options.message_loop_type = MessageLoop::TYPE_DEFAULT; |
+ file_thread_.StartWithOptions(options); |
+ } |
+ |
+ void DoTest(ExternalProtocolHandler::BlockState block_state, |
+ ShellIntegration::DefaultWebClientState os_state, |
+ bool should_prompt, bool should_launch, bool should_block) { |
+ GURL url("mailto:test@test.com"); |
+ ASSERT_FALSE(delegate_.has_prompted()); |
+ ASSERT_FALSE(delegate_.has_launched()); |
+ ASSERT_FALSE(delegate_.has_blocked()); |
+ |
+ delegate_.set_block_state(block_state); |
+ delegate_.set_os_state(os_state); |
+ ExternalProtocolHandler::LaunchUrlWithDelegate(url, 0, 0, &delegate_); |
+ if (block_state != ExternalProtocolHandler::BLOCK) |
+ MessageLoop::current()->Run(); |
+ |
+ ASSERT_EQ(should_prompt, delegate_.has_prompted()); |
+ ASSERT_EQ(should_launch, delegate_.has_launched()); |
+ ASSERT_EQ(should_block, delegate_.has_blocked()); |
+ } |
+ |
+ MessageLoopForUI ui_message_loop_; |
+ BrowserThread ui_thread_; |
+ BrowserThread file_thread_; |
+ |
+ FakeExternalProtocolHandlerDelegate delegate_; |
+}; |
+ |
+TEST_F(ExternalProtocolHandlerTest, TestLaunchSchemeBlockedChromeDefault) { |
+ DoTest(ExternalProtocolHandler::BLOCK, |
+ ShellIntegration::IS_DEFAULT_WEB_CLIENT, |
+ false, false, true); |
+} |
+ |
+TEST_F(ExternalProtocolHandlerTest, TestLaunchSchemeBlockedChromeNotDefault) { |
+ DoTest(ExternalProtocolHandler::BLOCK, |
+ ShellIntegration::NOT_DEFAULT_WEB_CLIENT, |
+ false, false, true); |
+} |
+ |
+TEST_F(ExternalProtocolHandlerTest, TestLaunchSchemeBlockedChromeUnknown) { |
+ DoTest(ExternalProtocolHandler::BLOCK, |
+ ShellIntegration::UNKNOWN_DEFAULT_WEB_CLIENT, |
+ false, false, true); |
+} |
+ |
+TEST_F(ExternalProtocolHandlerTest, TestLaunchSchemeUnBlockedChromeDefault) { |
+ DoTest(ExternalProtocolHandler::DONT_BLOCK, |
+ ShellIntegration::IS_DEFAULT_WEB_CLIENT, |
+ false, false, true); |
+} |
+ |
+TEST_F(ExternalProtocolHandlerTest, TestLaunchSchemeUnBlockedChromeNotDefault) { |
+ DoTest(ExternalProtocolHandler::DONT_BLOCK, |
+ ShellIntegration::NOT_DEFAULT_WEB_CLIENT, |
+ false, true, false); |
+} |
+ |
+TEST_F(ExternalProtocolHandlerTest, TestLaunchSchemeUnBlockedChromeUnknown) { |
+ DoTest(ExternalProtocolHandler::DONT_BLOCK, |
+ ShellIntegration::UNKNOWN_DEFAULT_WEB_CLIENT, |
+ false, true, false); |
+} |
+ |
+TEST_F(ExternalProtocolHandlerTest, TestLaunchSchemeUnknownChromeDefault) { |
+ DoTest(ExternalProtocolHandler::UNKNOWN, |
+ ShellIntegration::IS_DEFAULT_WEB_CLIENT, |
+ false, false, true); |
+} |
+ |
+TEST_F(ExternalProtocolHandlerTest, TestLaunchSchemeUnknownChromeNotDefault) { |
+ DoTest(ExternalProtocolHandler::UNKNOWN, |
+ ShellIntegration::NOT_DEFAULT_WEB_CLIENT, |
+ true, false, false); |
+} |
+ |
+TEST_F(ExternalProtocolHandlerTest, TestLaunchSchemeUnknownChromeUnknown) { |
+ DoTest(ExternalProtocolHandler::UNKNOWN, |
+ ShellIntegration::UNKNOWN_DEFAULT_WEB_CLIENT, |
+ true, false, false); |
+} |