diff options
author | rafaelw@chromium.org <rafaelw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-03-09 01:47:37 +0000 |
---|---|---|
committer | rafaelw@chromium.org <rafaelw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-03-09 01:47:37 +0000 |
commit | 829f8e2906fa3251da47e61bbbe002f2c704e60f (patch) | |
tree | dc139d54c9594ce76c28099fcce39640bc689687 /chrome/browser/extensions | |
parent | 71167c0906304846a86280830c91109a080f9fd6 (diff) | |
download | chromium_src-829f8e2906fa3251da47e61bbbe002f2c704e60f.zip chromium_src-829f8e2906fa3251da47e61bbbe002f2c704e60f.tar.gz chromium_src-829f8e2906fa3251da47e61bbbe002f2c704e60f.tar.bz2 |
chrome-ui://extensions/ is now populated with data collected from the ExtensionsService and ExtensionErrorReporter
Review URL: http://codereview.chromium.org/39026
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@11233 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/extensions')
-rw-r--r-- | chrome/browser/extensions/extension_ui_unittest.cc | 106 | ||||
-rw-r--r-- | chrome/browser/extensions/extensions_service_unittest.cc | 6 | ||||
-rw-r--r-- | chrome/browser/extensions/extensions_ui.cc | 95 | ||||
-rw-r--r-- | chrome/browser/extensions/extensions_ui.h | 20 |
4 files changed, 222 insertions, 5 deletions
diff --git a/chrome/browser/extensions/extension_ui_unittest.cc b/chrome/browser/extensions/extension_ui_unittest.cc new file mode 100644 index 0000000..3915e74 --- /dev/null +++ b/chrome/browser/extensions/extension_ui_unittest.cc @@ -0,0 +1,106 @@ +// Copyright (c) 2006-2009 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 "base/path_service.h" +#include "base/string_util.h" +#include "chrome/browser/extensions/extension.h" +#include "chrome/browser/extensions/extensions_ui.h" +#include "chrome/common/chrome_paths.h" +#include "chrome/common/json_value_serializer.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace { + static DictionaryValue* DeserializeJSONTestData(const FilePath& path, + std::string *error) { + Value* value; + + JSONFileValueSerializer serializer(path.ToWStringHack()); + value = serializer.Deserialize(error); + + return static_cast<DictionaryValue*>(value); + } + + static bool CompareExpectedAndActualOutput(const FilePath& extension_path, + const FilePath& expected_output_path) { + // TODO(rafaelw): Using the extension_path passed in above, causes this + // unit test to fail on linux. The Values come back valid, but the + // UserScript.path() values return "". +#if defined(OS_WIN) + FilePath path(FILE_PATH_LITERAL("c:\\foo")); +#elif defined(OS_POSIX) + FilePath path(FILE_PATH_LITERAL("/foo")); +#endif + Extension extension(path); + std::string error; + + FilePath manifest_path = extension_path.AppendASCII( + Extension::kManifestFilename); + scoped_ptr<DictionaryValue> extension_data(DeserializeJSONTestData( + manifest_path, &error)); + EXPECT_EQ("", error); + EXPECT_TRUE(extension.InitFromValue(*extension_data, &error)); + EXPECT_EQ("", error); + + scoped_ptr<DictionaryValue>expected_output_data(DeserializeJSONTestData( + expected_output_path, &error)); + EXPECT_EQ("", error); + + // Produce test output. + scoped_ptr<DictionaryValue> actual_output_data( + ExtensionsDOMHandler::CreateExtensionDetailValue(&extension)); + + // Compare the outputs. + return expected_output_data->Equals(actual_output_data.get()); + } +} // namespace + +class ExtensionUITest : public testing::Test { +}; + +TEST(ExtensionUITest, GenerateExtensionsJSONData) { + FilePath data_test_dir_path, extension_path, expected_output_path; + EXPECT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &data_test_dir_path)); + + // Test Extension1 + extension_path = data_test_dir_path.AppendASCII("extensions") + .AppendASCII("good") + .AppendASCII("extension1") + .AppendASCII("1"); + + expected_output_path = data_test_dir_path.AppendASCII("extensions") + .AppendASCII("ui") + .AppendASCII("create_extension_detail_value_expected_output") + .AppendASCII("good-extension1.json"); + + EXPECT_TRUE(CompareExpectedAndActualOutput(extension_path, + expected_output_path)) << extension_path.value(); + + // Test Extension2 + extension_path = data_test_dir_path.AppendASCII("extensions") + .AppendASCII("good") + .AppendASCII("extension2") + .AppendASCII("2"); + + expected_output_path = data_test_dir_path.AppendASCII("extensions") + .AppendASCII("ui") + .AppendASCII("create_extension_detail_value_expected_output") + .AppendASCII("good-extension2.json"); + + EXPECT_TRUE(CompareExpectedAndActualOutput(extension_path, + expected_output_path)) << extension_path.value(); + + // Test Extension3 + extension_path = data_test_dir_path.AppendASCII("extensions") + .AppendASCII("good") + .AppendASCII("extension3") + .AppendASCII("1.0"); + + expected_output_path = data_test_dir_path.AppendASCII("extensions") + .AppendASCII("ui") + .AppendASCII("create_extension_detail_value_expected_output") + .AppendASCII("good-extension3.json"); + + EXPECT_TRUE(CompareExpectedAndActualOutput(extension_path, + expected_output_path)) << extension_path.value(); +} diff --git a/chrome/browser/extensions/extensions_service_unittest.cc b/chrome/browser/extensions/extensions_service_unittest.cc index d74c060..304aba4 100644 --- a/chrome/browser/extensions/extensions_service_unittest.cc +++ b/chrome/browser/extensions/extensions_service_unittest.cc @@ -169,7 +169,7 @@ TEST_F(ExtensionsServiceTest, LoadAllExtensionsFromDirectorySuccess) { Extension* extension = frontend->extensions()->at(0); const UserScriptList& scripts = extension->content_scripts(); - ASSERT_EQ(2u, scripts.size()); + ASSERT_EQ(3u, scripts.size()); EXPECT_EQ(2u, scripts[0].url_patterns().size()); EXPECT_EQ("http://*.google.com/*", scripts[0].url_patterns()[0].GetAsString()); @@ -181,6 +181,10 @@ TEST_F(ExtensionsServiceTest, LoadAllExtensionsFromDirectorySuccess) { EXPECT_EQ("http://*.yahoo.com/*", scripts[1].url_patterns()[0].GetAsString()); EXPECT_EQ(extension->path().AppendASCII("script2.js").value(), scripts[1].path().value()); + EXPECT_EQ(1u, scripts[2].url_patterns().size()); + EXPECT_EQ("http://*.news.com/*", scripts[2].url_patterns()[0].GetAsString()); + EXPECT_EQ(extension->path().AppendASCII("js_files").AppendASCII("script3.js") + .value(), scripts[2].path().value()); EXPECT_EQ(std::string("10123456789abcdef0123456789abcdef0123456"), frontend->extensions()->at(1)->id()); diff --git a/chrome/browser/extensions/extensions_ui.cc b/chrome/browser/extensions/extensions_ui.cc index c4d2344..776676b 100644 --- a/chrome/browser/extensions/extensions_ui.cc +++ b/chrome/browser/extensions/extensions_ui.cc @@ -6,10 +6,14 @@ #include "base/thread.h" #include "chrome/browser/browser_process.h" +#include "chrome/browser/extensions/extensions_service.h" +#include "chrome/browser/extensions/extension_error_reporter.h" +#include "chrome/browser/profile.h" #include "chrome/common/jstemplate_builder.h" #include "chrome/common/l10n_util.h" #include "chrome/common/resource_bundle.h" #include "chrome/common/url_constants.h" +#include "net/base/net_util.h" #include "grit/browser_resources.h" #include "grit/generated_resources.h" @@ -52,8 +56,90 @@ void ExtensionsUIHTMLSource::StartDataRequest(const std::string& path, // /////////////////////////////////////////////////////////////////////////////// -ExtensionsDOMHandler::ExtensionsDOMHandler(DOMUI* dom_ui) - : DOMMessageHandler(dom_ui) { +ExtensionsDOMHandler::ExtensionsDOMHandler(DOMUI* dom_ui, + ExtensionsService* extension_service) + : DOMMessageHandler(dom_ui), extensions_service_(extension_service) { + dom_ui_->RegisterMessageCallback("requestExtensionsData", + NewCallback(this, &ExtensionsDOMHandler::HandleRequestExtensionsData)); +} + +void ExtensionsDOMHandler::HandleRequestExtensionsData(const Value* value) { + DictionaryValue results; + + // Add the extensions to the results structure. + ListValue *extensions_list = new ListValue(); + const ExtensionList* extensions = extensions_service_->extensions(); + for (ExtensionList::const_iterator extension = extensions->begin(); + extension != extensions->end(); ++extension) { + extensions_list->Append(CreateExtensionDetailValue(*extension)); + } + results.Set(L"extensions", extensions_list); + + // Add any error log lines to the result structure. + ListValue *errors_list = new ListValue(); + const std::vector<std::string>* errors = + ExtensionErrorReporter::GetInstance()->GetErrors(); + for (std::vector<std::string>::const_iterator error = errors->begin(); + error != errors->end(); ++error) { + errors_list->Append(Value::CreateStringValue(*error)); + } + results.Set(L"errors", errors_list); + + dom_ui_->CallJavascriptFunction(L"returnExtensionsData", results); +} + +// Static +DictionaryValue* ExtensionsDOMHandler::CreateContentScriptDetailValue( + const UserScript& script, const FilePath& extension_path) { + DictionaryValue* script_data = new DictionaryValue(); + + // TODO(rafaelw): When UserScript supports multiple js, this will have to + // put them all in this list; + ListValue *js_list = new ListValue(); + // We are passing through GURLs to canonicalize the output to a valid + // URL path fragment. + GURL script_url = net::FilePathToFileURL(script.path()); + GURL extension_url = net::FilePathToFileURL(extension_path); + std::string relative_js_path = + script_url.spec().substr(extension_url.spec().length() + 1); + + js_list->Append(new StringValue(relative_js_path)); + script_data->Set(L"js", js_list); + + // Get list of glob "matches" strings + ListValue *url_pattern_list = new ListValue(); + const std::vector<URLPattern>& url_patterns = script.url_patterns(); + for (std::vector<URLPattern>::const_iterator url_pattern = + url_patterns.begin(); + url_pattern != url_patterns.end(); ++url_pattern) { + url_pattern_list->Append(new StringValue(url_pattern->GetAsString())); + } + + script_data->Set(L"matches", url_pattern_list); + + return script_data; +} + +// Static +DictionaryValue* ExtensionsDOMHandler::CreateExtensionDetailValue( + const Extension *extension) { + DictionaryValue* extension_data = new DictionaryValue(); + + extension_data->SetString(L"name", extension->name()); + extension_data->SetString(L"description", extension->description()); + extension_data->SetString(L"version", extension->version()->GetString()); + + // Add list of content_script detail DictionaryValues + ListValue *content_script_list = new ListValue(); + UserScriptList content_scripts = extension->content_scripts(); + for (UserScriptList::const_iterator script = content_scripts.begin(); + script != content_scripts.end(); ++script) { + content_script_list->Append(CreateContentScriptDetailValue(*script, + extension->path())); + } + extension_data->Set(L"content_scripts", content_script_list); + + return extension_data; } ExtensionsDOMHandler::~ExtensionsDOMHandler() { @@ -68,7 +154,10 @@ ExtensionsUI::ExtensionsUI(DOMUIContents* contents) : DOMUI(contents) { } void ExtensionsUI::Init() { - ExtensionsDOMHandler* handler = new ExtensionsDOMHandler(this); + ExtensionsService *exstension_service = get_profile()->GetExtensionsService(); + + ExtensionsDOMHandler* handler = new ExtensionsDOMHandler(this, + exstension_service); AddMessageHandler(handler); handler->Init(); diff --git a/chrome/browser/extensions/extensions_ui.h b/chrome/browser/extensions/extensions_ui.h index 1298289..3252ddc 100644 --- a/chrome/browser/extensions/extensions_ui.h +++ b/chrome/browser/extensions/extensions_ui.h @@ -9,6 +9,7 @@ #include "chrome/browser/dom_ui/dom_ui.h" #include "chrome/browser/dom_ui/dom_ui_contents.h" +#include "chrome/browser/extensions/extensions_service.h" class GURL; @@ -30,11 +31,28 @@ class ExtensionsUIHTMLSource : public ChromeURLDataManager::DataSource { // The handler for Javascript messages related to the "extensions" view. class ExtensionsDOMHandler : public DOMMessageHandler { public: - explicit ExtensionsDOMHandler(DOMUI* dom_ui); + ExtensionsDOMHandler(DOMUI* dom_ui, + ExtensionsService* extension_service); + virtual ~ExtensionsDOMHandler(); void Init(); + // Extension Detail JSON Struct for page. (static for ease of testing). + static DictionaryValue* + CreateExtensionDetailValue(const Extension *extension); + + // ContentScript JSON Struct for page. (static for ease of testing). + static DictionaryValue* + CreateContentScriptDetailValue(const UserScript& script, + const FilePath& extension_path); + private: + // Callback for "requestExtensionsData" message. + void HandleRequestExtensionsData(const Value* value); + + // Our model. + scoped_refptr<ExtensionsService> extensions_service_; + DISALLOW_COPY_AND_ASSIGN(ExtensionsDOMHandler); }; |