Index: chrome/browser/extensions/api/debugger/debugger_apitest.cc |
diff --git a/chrome/browser/extensions/api/debugger/debugger_apitest.cc b/chrome/browser/extensions/api/debugger/debugger_apitest.cc |
index 878135a222aad3d6525d1533a9eb39c260ee3783..f50ecbbb1cd09a7e640fc9be699feb98233d2425 100644 |
--- a/chrome/browser/extensions/api/debugger/debugger_apitest.cc |
+++ b/chrome/browser/extensions/api/debugger/debugger_apitest.cc |
@@ -2,10 +2,144 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
+#include <string> |
+ |
#include "base/command_line.h" |
+#include "base/memory/ref_counted.h" |
+#include "base/path_service.h" |
+#include "base/strings/stringprintf.h" |
+#include "chrome/browser/extensions/api/debugger/debugger_api.h" |
#include "chrome/browser/extensions/extension_apitest.h" |
+#include "chrome/browser/extensions/extension_function_test_utils.h" |
+#include "chrome/browser/ui/tabs/tab_strip_model.h" |
+#include "chrome/common/chrome_paths.h" |
#include "chrome/common/chrome_switches.h" |
+#include "chrome/test/base/ui_test_utils.h" |
+#include "extensions/browser/extension_function.h" |
+#include "extensions/common/extension.h" |
+#include "extensions/common/extension_builder.h" |
+#include "extensions/common/manifest_constants.h" |
+#include "extensions/common/switches.h" |
+#include "extensions/common/value_builder.h" |
+ |
+namespace extensions { |
+ |
+class DebuggerApiTest : public ExtensionApiTest { |
+ protected: |
+ virtual ~DebuggerApiTest() {} |
+ |
+ virtual void SetUpCommandLine(base::CommandLine* command_line) OVERRIDE; |
+ virtual void SetUpOnMainThread() OVERRIDE; |
+ |
+ // Run the attach function. If |expected_error| is not empty, then the |
+ // function should fail with the error. Otherwise, the function is expected |
+ // to succeed. |
+ testing::AssertionResult RunAttachFunction(const GURL& url, |
+ const std::string& expected_error); |
+ |
+ const Extension* extension() const { return extension_; } |
+ base::CommandLine* command_line() const { return command_line_; } |
+ |
+ private: |
+ // The command-line for the test process, preserved in order to modify |
+ // mid-test. |
+ base::CommandLine* command_line_; |
+ |
+ // A basic extension with the debugger permission. |
+ scoped_refptr<const Extension> extension_; |
+}; |
+ |
+void DebuggerApiTest::SetUpCommandLine(base::CommandLine* command_line) { |
+ ExtensionApiTest::SetUpCommandLine(command_line); |
+ // We need to hold onto |command_line| in order to modify it during the test. |
+ command_line_ = command_line; |
+} |
+ |
+void DebuggerApiTest::SetUpOnMainThread() { |
+ ExtensionApiTest::SetUpOnMainThread(); |
+ extension_ = |
+ ExtensionBuilder().SetManifest( |
+ DictionaryBuilder().Set("name", "debugger") |
+ .Set("version", "0.1") |
+ .Set("manifest_version", 2) |
+ .Set("permissions", |
+ ListBuilder().Append("debugger"))).Build(); |
+} |
+ |
+testing::AssertionResult DebuggerApiTest::RunAttachFunction( |
+ const GURL& url, const std::string& expected_error) { |
+ ui_test_utils::NavigateToURL(browser(), url); |
+ content::WebContents* web_contents = |
+ browser()->tab_strip_model()->GetActiveWebContents(); |
+ int tab_id = SessionID::IdForTab(web_contents); |
+ scoped_refptr<DebuggerAttachFunction> attach_function = |
+ new DebuggerAttachFunction(); |
+ attach_function->set_extension(extension_); |
+ std::string args = base::StringPrintf("[{\"tabId\": %d}, \"1.1\"]", tab_id); |
+ |
+ if (!expected_error.empty()) { |
+ std::string actual_error = |
+ extension_function_test_utils::RunFunctionAndReturnError( |
+ attach_function, args, browser()); |
+ if (actual_error != expected_error) { |
+ return testing::AssertionFailure() << "Did not get correct error: " |
+ << "expected: " << expected_error << ", found: " << actual_error; |
+ } |
+ } else { |
+ if (!RunFunction(attach_function, |
+ args, |
+ browser(), |
+ extension_function_test_utils::NONE)) { |
+ return testing::AssertionFailure() << "Could not run function: " |
+ << attach_function->GetError(); |
+ } |
+ |
+ // Clean up and detach. |
+ scoped_refptr<DebuggerDetachFunction> detach_function = |
+ new DebuggerDetachFunction(); |
+ detach_function->set_extension(extension_); |
+ if (!RunFunction(detach_function, |
+ base::StringPrintf("[{\"tabId\": %d}]", tab_id), |
+ browser(), |
+ extension_function_test_utils::NONE)) { |
+ return testing::AssertionFailure() << "Could not detach: " |
+ << detach_function->GetError(); |
+ } |
+ } |
+ return testing::AssertionSuccess(); |
+} |
IN_PROC_BROWSER_TEST_F(ExtensionApiTest, Debugger) { |
ASSERT_TRUE(RunExtensionTest("debugger")) << message_; |
} |
+ |
+IN_PROC_BROWSER_TEST_F(DebuggerApiTest, |
+ DebuggerNotAllowedOnOtherExtensionPages) { |
+ // Load another arbitrary extension with an associated resource (popup.html). |
+ base::FilePath path; |
+ ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &path)); |
+ path = path.AppendASCII("extensions").AppendASCII("good_unpacked"); |
+ const Extension* another_extension = LoadExtension(path); |
+ ASSERT_TRUE(another_extension); |
+ |
+ GURL other_ext_url = |
+ GURL(base::StringPrintf("chrome-extension://%s/popup.html", |
+ another_extension->id().c_str())); |
+ |
+ // This extension should not be able to access another extension. |
+ EXPECT_TRUE(RunAttachFunction( |
+ other_ext_url, manifest_errors::kCannotAccessExtensionUrl)); |
+ |
+ // This extension *should* be able to debug itself. |
+ EXPECT_TRUE(RunAttachFunction( |
+ GURL(base::StringPrintf("chrome-extension://%s/foo.html", |
+ extension()->id().c_str())), |
+ std::string())); |
+ |
+ // Append extensions on chrome urls switch. The extension should now be able |
+ // to debug any extension. |
+ command_line()->AppendSwitch(switches::kExtensionsOnChromeURLs); |
+ EXPECT_TRUE(RunAttachFunction(other_ext_url, std::string())); |
+} |
+ |
+} // namespace extensions |