| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/common/extensions/manifest_handlers/settings_overrides_handler.
h" | 5 #include "chrome/common/extensions/manifest_handlers/settings_overrides_handler.
h" |
| 6 | 6 |
| 7 #include <memory> |
| 7 #include <utility> | 8 #include <utility> |
| 8 | 9 |
| 9 #include "base/memory/scoped_ptr.h" | |
| 10 #include "base/strings/string_util.h" | 10 #include "base/strings/string_util.h" |
| 11 #include "base/strings/stringprintf.h" | 11 #include "base/strings/stringprintf.h" |
| 12 #include "base/strings/utf_string_conversions.h" | 12 #include "base/strings/utf_string_conversions.h" |
| 13 #include "base/values.h" | 13 #include "base/values.h" |
| 14 #include "extensions/common/error_utils.h" | 14 #include "extensions/common/error_utils.h" |
| 15 #include "extensions/common/extension_set.h" | 15 #include "extensions/common/extension_set.h" |
| 16 #include "extensions/common/feature_switch.h" | 16 #include "extensions/common/feature_switch.h" |
| 17 #include "extensions/common/manifest_constants.h" | 17 #include "extensions/common/manifest_constants.h" |
| 18 #include "extensions/common/manifest_handlers/permissions_parser.h" | 18 #include "extensions/common/manifest_handlers/permissions_parser.h" |
| 19 #include "extensions/common/permissions/api_permission_set.h" | 19 #include "extensions/common/permissions/api_permission_set.h" |
| 20 #include "extensions/common/permissions/manifest_permission.h" | 20 #include "extensions/common/permissions/manifest_permission.h" |
| 21 #include "extensions/common/permissions/permissions_info.h" | 21 #include "extensions/common/permissions/permissions_info.h" |
| 22 #include "extensions/common/permissions/settings_override_permission.h" | 22 #include "extensions/common/permissions/settings_override_permission.h" |
| 23 #include "ipc/ipc_message.h" | 23 #include "ipc/ipc_message.h" |
| 24 #include "ipc/ipc_message_utils.h" | 24 #include "ipc/ipc_message_utils.h" |
| 25 #include "url/gurl.h" | 25 #include "url/gurl.h" |
| 26 | 26 |
| 27 using extensions::api::manifest_types::ChromeSettingsOverrides; | 27 using extensions::api::manifest_types::ChromeSettingsOverrides; |
| 28 | 28 |
| 29 namespace extensions { | 29 namespace extensions { |
| 30 namespace { | 30 namespace { |
| 31 | 31 |
| 32 const char kWwwPrefix[] = "www."; | 32 const char kWwwPrefix[] = "www."; |
| 33 | 33 |
| 34 scoped_ptr<GURL> CreateManifestURL(const std::string& url) { | 34 std::unique_ptr<GURL> CreateManifestURL(const std::string& url) { |
| 35 scoped_ptr<GURL> manifest_url(new GURL(url)); | 35 std::unique_ptr<GURL> manifest_url(new GURL(url)); |
| 36 if (!manifest_url->is_valid() || | 36 if (!manifest_url->is_valid() || |
| 37 !manifest_url->SchemeIsHTTPOrHTTPS()) | 37 !manifest_url->SchemeIsHTTPOrHTTPS()) |
| 38 return scoped_ptr<GURL>(); | 38 return std::unique_ptr<GURL>(); |
| 39 return manifest_url; | 39 return manifest_url; |
| 40 } | 40 } |
| 41 | 41 |
| 42 scoped_ptr<GURL> ParseHomepage(const ChromeSettingsOverrides& overrides, | 42 std::unique_ptr<GURL> ParseHomepage(const ChromeSettingsOverrides& overrides, |
| 43 base::string16* error) { | 43 base::string16* error) { |
| 44 if (!overrides.homepage) | 44 if (!overrides.homepage) |
| 45 return scoped_ptr<GURL>(); | 45 return std::unique_ptr<GURL>(); |
| 46 scoped_ptr<GURL> manifest_url = CreateManifestURL(*overrides.homepage); | 46 std::unique_ptr<GURL> manifest_url = CreateManifestURL(*overrides.homepage); |
| 47 if (!manifest_url) { | 47 if (!manifest_url) { |
| 48 *error = extensions::ErrorUtils::FormatErrorMessageUTF16( | 48 *error = extensions::ErrorUtils::FormatErrorMessageUTF16( |
| 49 manifest_errors::kInvalidHomepageOverrideURL, *overrides.homepage); | 49 manifest_errors::kInvalidHomepageOverrideURL, *overrides.homepage); |
| 50 } | 50 } |
| 51 return manifest_url; | 51 return manifest_url; |
| 52 } | 52 } |
| 53 | 53 |
| 54 std::vector<GURL> ParseStartupPage(const ChromeSettingsOverrides& overrides, | 54 std::vector<GURL> ParseStartupPage(const ChromeSettingsOverrides& overrides, |
| 55 base::string16* error) { | 55 base::string16* error) { |
| 56 std::vector<GURL> urls; | 56 std::vector<GURL> urls; |
| 57 if (!overrides.startup_pages) | 57 if (!overrides.startup_pages) |
| 58 return urls; | 58 return urls; |
| 59 | 59 |
| 60 for (std::vector<std::string>::const_iterator i = | 60 for (std::vector<std::string>::const_iterator i = |
| 61 overrides.startup_pages->begin(); i != overrides.startup_pages->end(); | 61 overrides.startup_pages->begin(); i != overrides.startup_pages->end(); |
| 62 ++i) { | 62 ++i) { |
| 63 scoped_ptr<GURL> manifest_url = CreateManifestURL(*i); | 63 std::unique_ptr<GURL> manifest_url = CreateManifestURL(*i); |
| 64 if (!manifest_url) { | 64 if (!manifest_url) { |
| 65 *error = extensions::ErrorUtils::FormatErrorMessageUTF16( | 65 *error = extensions::ErrorUtils::FormatErrorMessageUTF16( |
| 66 manifest_errors::kInvalidStartupOverrideURL, *i); | 66 manifest_errors::kInvalidStartupOverrideURL, *i); |
| 67 } else { | 67 } else { |
| 68 urls.push_back(GURL()); | 68 urls.push_back(GURL()); |
| 69 urls.back().Swap(manifest_url.get()); | 69 urls.back().Swap(manifest_url.get()); |
| 70 } | 70 } |
| 71 } | 71 } |
| 72 return urls; | 72 return urls; |
| 73 } | 73 } |
| 74 | 74 |
| 75 scoped_ptr<ChromeSettingsOverrides::Search_provider> ParseSearchEngine( | 75 std::unique_ptr<ChromeSettingsOverrides::Search_provider> ParseSearchEngine( |
| 76 ChromeSettingsOverrides* overrides, | 76 ChromeSettingsOverrides* overrides, |
| 77 base::string16* error) { | 77 base::string16* error) { |
| 78 if (!overrides->search_provider) | 78 if (!overrides->search_provider) |
| 79 return scoped_ptr<ChromeSettingsOverrides::Search_provider>(); | 79 return std::unique_ptr<ChromeSettingsOverrides::Search_provider>(); |
| 80 if (!CreateManifestURL(overrides->search_provider->search_url)) { | 80 if (!CreateManifestURL(overrides->search_provider->search_url)) { |
| 81 *error = extensions::ErrorUtils::FormatErrorMessageUTF16( | 81 *error = extensions::ErrorUtils::FormatErrorMessageUTF16( |
| 82 manifest_errors::kInvalidSearchEngineURL, | 82 manifest_errors::kInvalidSearchEngineURL, |
| 83 overrides->search_provider->search_url); | 83 overrides->search_provider->search_url); |
| 84 return scoped_ptr<ChromeSettingsOverrides::Search_provider>(); | 84 return std::unique_ptr<ChromeSettingsOverrides::Search_provider>(); |
| 85 } | 85 } |
| 86 if (overrides->search_provider->prepopulated_id) | 86 if (overrides->search_provider->prepopulated_id) |
| 87 return std::move(overrides->search_provider); | 87 return std::move(overrides->search_provider); |
| 88 if (!overrides->search_provider->name || | 88 if (!overrides->search_provider->name || |
| 89 !overrides->search_provider->keyword || | 89 !overrides->search_provider->keyword || |
| 90 !overrides->search_provider->encoding || | 90 !overrides->search_provider->encoding || |
| 91 !overrides->search_provider->favicon_url) { | 91 !overrides->search_provider->favicon_url) { |
| 92 *error = | 92 *error = |
| 93 base::ASCIIToUTF16(manifest_errors::kInvalidSearchEngineMissingKeys); | 93 base::ASCIIToUTF16(manifest_errors::kInvalidSearchEngineMissingKeys); |
| 94 return scoped_ptr<ChromeSettingsOverrides::Search_provider>(); | 94 return std::unique_ptr<ChromeSettingsOverrides::Search_provider>(); |
| 95 } | 95 } |
| 96 if (!CreateManifestURL(*overrides->search_provider->favicon_url)) { | 96 if (!CreateManifestURL(*overrides->search_provider->favicon_url)) { |
| 97 *error = extensions::ErrorUtils::FormatErrorMessageUTF16( | 97 *error = extensions::ErrorUtils::FormatErrorMessageUTF16( |
| 98 manifest_errors::kInvalidSearchEngineURL, | 98 manifest_errors::kInvalidSearchEngineURL, |
| 99 *overrides->search_provider->favicon_url); | 99 *overrides->search_provider->favicon_url); |
| 100 return scoped_ptr<ChromeSettingsOverrides::Search_provider>(); | 100 return std::unique_ptr<ChromeSettingsOverrides::Search_provider>(); |
| 101 } | 101 } |
| 102 return std::move(overrides->search_provider); | 102 return std::move(overrides->search_provider); |
| 103 } | 103 } |
| 104 | 104 |
| 105 // A www. prefix is not informative and thus not worth the limited real estate | 105 // A www. prefix is not informative and thus not worth the limited real estate |
| 106 // in the permissions UI. | 106 // in the permissions UI. |
| 107 std::string RemoveWwwPrefix(const std::string& url) { | 107 std::string RemoveWwwPrefix(const std::string& url) { |
| 108 if (base::StartsWith(url, kWwwPrefix, base::CompareCase::INSENSITIVE_ASCII)) | 108 if (base::StartsWith(url, kWwwPrefix, base::CompareCase::INSENSITIVE_ASCII)) |
| 109 return url.substr(strlen(kWwwPrefix)); | 109 return url.substr(strlen(kWwwPrefix)); |
| 110 return url; | 110 return url; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 124 } | 124 } |
| 125 | 125 |
| 126 SettingsOverridesHandler::SettingsOverridesHandler() {} | 126 SettingsOverridesHandler::SettingsOverridesHandler() {} |
| 127 | 127 |
| 128 SettingsOverridesHandler::~SettingsOverridesHandler() {} | 128 SettingsOverridesHandler::~SettingsOverridesHandler() {} |
| 129 | 129 |
| 130 bool SettingsOverridesHandler::Parse(Extension* extension, | 130 bool SettingsOverridesHandler::Parse(Extension* extension, |
| 131 base::string16* error) { | 131 base::string16* error) { |
| 132 const base::Value* dict = NULL; | 132 const base::Value* dict = NULL; |
| 133 CHECK(extension->manifest()->Get(manifest_keys::kSettingsOverride, &dict)); | 133 CHECK(extension->manifest()->Get(manifest_keys::kSettingsOverride, &dict)); |
| 134 scoped_ptr<ChromeSettingsOverrides> settings( | 134 std::unique_ptr<ChromeSettingsOverrides> settings( |
| 135 ChromeSettingsOverrides::FromValue(*dict, error)); | 135 ChromeSettingsOverrides::FromValue(*dict, error)); |
| 136 if (!settings) | 136 if (!settings) |
| 137 return false; | 137 return false; |
| 138 | 138 |
| 139 scoped_ptr<SettingsOverrides> info(new SettingsOverrides); | 139 std::unique_ptr<SettingsOverrides> info(new SettingsOverrides); |
| 140 info->homepage = ParseHomepage(*settings, error); | 140 info->homepage = ParseHomepage(*settings, error); |
| 141 info->search_engine = ParseSearchEngine(settings.get(), error); | 141 info->search_engine = ParseSearchEngine(settings.get(), error); |
| 142 info->startup_pages = ParseStartupPage(*settings, error); | 142 info->startup_pages = ParseStartupPage(*settings, error); |
| 143 if (!info->homepage && !info->search_engine && info->startup_pages.empty()) { | 143 if (!info->homepage && !info->search_engine && info->startup_pages.empty()) { |
| 144 *error = ErrorUtils::FormatErrorMessageUTF16( | 144 *error = ErrorUtils::FormatErrorMessageUTF16( |
| 145 manifest_errors::kInvalidEmptyDictionary, | 145 manifest_errors::kInvalidEmptyDictionary, |
| 146 manifest_keys::kSettingsOverride); | 146 manifest_keys::kSettingsOverride); |
| 147 return false; | 147 return false; |
| 148 } | 148 } |
| 149 | 149 |
| (...skipping 28 matching lines...) Expand all Loading... |
| 178 extension->SetManifestData(manifest_keys::kSettingsOverride, | 178 extension->SetManifestData(manifest_keys::kSettingsOverride, |
| 179 info.release()); | 179 info.release()); |
| 180 return true; | 180 return true; |
| 181 } | 181 } |
| 182 | 182 |
| 183 const std::vector<std::string> SettingsOverridesHandler::Keys() const { | 183 const std::vector<std::string> SettingsOverridesHandler::Keys() const { |
| 184 return SingleKey(manifest_keys::kSettingsOverride); | 184 return SingleKey(manifest_keys::kSettingsOverride); |
| 185 } | 185 } |
| 186 | 186 |
| 187 } // namespace extensions | 187 } // namespace extensions |
| OLD | NEW |