Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 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/extension.h" | 5 #include "chrome/common/extensions/extension.h" |
| 6 | 6 |
| 7 #include "base/base64.h" | 7 #include "base/base64.h" |
| 8 #include "base/basictypes.h" | 8 #include "base/basictypes.h" |
| 9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 10 #include "base/file_path.h" | 10 #include "base/file_path.h" |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 22 #include "base/values.h" | 22 #include "base/values.h" |
| 23 #include "base/version.h" | 23 #include "base/version.h" |
| 24 #include "chrome/common/chrome_constants.h" | 24 #include "chrome/common/chrome_constants.h" |
| 25 #include "chrome/common/chrome_switches.h" | 25 #include "chrome/common/chrome_switches.h" |
| 26 #include "chrome/common/chrome_version_info.h" | 26 #include "chrome/common/chrome_version_info.h" |
| 27 // TODO(rdevlin.cronin): Remove this once PageAction, BrowserAction, and | 27 // TODO(rdevlin.cronin): Remove this once PageAction, BrowserAction, and |
| 28 // SystemIndicator have been moved out of Extension. | 28 // SystemIndicator have been moved out of Extension. |
| 29 #include "chrome/common/extensions/api/extension_action/action_info.h" | 29 #include "chrome/common/extensions/api/extension_action/action_info.h" |
| 30 #include "chrome/common/extensions/api/extension_action/page_action_handler.h" | 30 #include "chrome/common/extensions/api/extension_action/page_action_handler.h" |
| 31 #include "chrome/common/extensions/api/themes/theme_handler.h" | 31 #include "chrome/common/extensions/api/themes/theme_handler.h" |
| 32 // TODO(yoz): should not need this include. | |
| 33 #include "chrome/common/extensions/background_info.h" | |
| 32 #include "chrome/common/extensions/csp_validator.h" | 34 #include "chrome/common/extensions/csp_validator.h" |
| 33 #include "chrome/common/extensions/extension_manifest_constants.h" | 35 #include "chrome/common/extensions/extension_manifest_constants.h" |
| 34 #include "chrome/common/extensions/extension_resource.h" | 36 #include "chrome/common/extensions/extension_resource.h" |
| 35 #include "chrome/common/extensions/feature_switch.h" | 37 #include "chrome/common/extensions/feature_switch.h" |
| 36 #include "chrome/common/extensions/features/base_feature_provider.h" | 38 #include "chrome/common/extensions/features/base_feature_provider.h" |
| 37 #include "chrome/common/extensions/features/feature.h" | 39 #include "chrome/common/extensions/features/feature.h" |
| 38 #include "chrome/common/extensions/manifest.h" | 40 #include "chrome/common/extensions/manifest.h" |
| 39 #include "chrome/common/extensions/manifest_handler.h" | 41 #include "chrome/common/extensions/manifest_handler.h" |
| 40 #include "chrome/common/extensions/manifest_handler_helpers.h" | 42 #include "chrome/common/extensions/manifest_handler_helpers.h" |
| 41 #include "chrome/common/extensions/manifest_url_handler.h" | 43 #include "chrome/common/extensions/manifest_url_handler.h" |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 165 // Note: Component extensions have this right implicitly and do not need to be | 167 // Note: Component extensions have this right implicitly and do not need to be |
| 166 // added to this list. | 168 // added to this list. |
| 167 Extension::ScriptingWhitelist scripting_whitelist_; | 169 Extension::ScriptingWhitelist scripting_whitelist_; |
| 168 }; | 170 }; |
| 169 | 171 |
| 170 bool ReadLaunchDimension(const extensions::Manifest* manifest, | 172 bool ReadLaunchDimension(const extensions::Manifest* manifest, |
| 171 const char* key, | 173 const char* key, |
| 172 int* target, | 174 int* target, |
| 173 bool is_valid_container, | 175 bool is_valid_container, |
| 174 string16* error) { | 176 string16* error) { |
| 175 Value* temp = NULL; | 177 const Value* temp = NULL; |
| 176 if (manifest->Get(key, &temp)) { | 178 if (manifest->Get(key, &temp)) { |
| 177 if (!is_valid_container) { | 179 if (!is_valid_container) { |
| 178 *error = ErrorUtils::FormatErrorMessageUTF16( | 180 *error = ErrorUtils::FormatErrorMessageUTF16( |
| 179 errors::kInvalidLaunchValueContainer, | 181 errors::kInvalidLaunchValueContainer, |
| 180 key); | 182 key); |
| 181 return false; | 183 return false; |
| 182 } | 184 } |
| 183 if (!temp->GetAsInteger(target) || *target < 0) { | 185 if (!temp->GetAsInteger(target) || *target < 0) { |
| 184 *target = 0; | 186 *target = 0; |
| 185 *error = ErrorUtils::FormatErrorMessageUTF16( | 187 *error = ErrorUtils::FormatErrorMessageUTF16( |
| (...skipping 401 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 587 // static | 589 // static |
| 588 const Extension::ScriptingWhitelist* Extension::GetScriptingWhitelist() { | 590 const Extension::ScriptingWhitelist* Extension::GetScriptingWhitelist() { |
| 589 return ExtensionConfig::GetInstance()->whitelist(); | 591 return ExtensionConfig::GetInstance()->whitelist(); |
| 590 } | 592 } |
| 591 | 593 |
| 592 bool Extension::ParsePermissions(const char* key, | 594 bool Extension::ParsePermissions(const char* key, |
| 593 string16* error, | 595 string16* error, |
| 594 APIPermissionSet* api_permissions, | 596 APIPermissionSet* api_permissions, |
| 595 URLPatternSet* host_permissions) { | 597 URLPatternSet* host_permissions) { |
| 596 if (manifest_->HasKey(key)) { | 598 if (manifest_->HasKey(key)) { |
| 597 ListValue* permissions = NULL; | 599 const ListValue* permissions = NULL; |
| 598 if (!manifest_->GetList(key, &permissions)) { | 600 if (!manifest_->GetList(key, &permissions)) { |
| 599 *error = ErrorUtils::FormatErrorMessageUTF16( | 601 *error = ErrorUtils::FormatErrorMessageUTF16( |
| 600 errors::kInvalidPermissions, ""); | 602 errors::kInvalidPermissions, ""); |
| 601 return false; | 603 return false; |
| 602 } | 604 } |
| 603 | 605 |
| 604 // NOTE: We need to get the APIPermission before we check if features | 606 // NOTE: We need to get the APIPermission before we check if features |
| 605 // associated with them are available because the feature system does not | 607 // associated with them are available because the feature system does not |
| 606 // know about aliases. | 608 // know about aliases. |
| 607 | 609 |
| (...skipping 579 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1187 return !content_pack_site_list_.empty(); | 1189 return !content_pack_site_list_.empty(); |
| 1188 } | 1190 } |
| 1189 | 1191 |
| 1190 ExtensionResource Extension::GetContentPackSiteList() const { | 1192 ExtensionResource Extension::GetContentPackSiteList() const { |
| 1191 if (!is_content_pack()) | 1193 if (!is_content_pack()) |
| 1192 return ExtensionResource(); | 1194 return ExtensionResource(); |
| 1193 | 1195 |
| 1194 return GetResource(content_pack_site_list_); | 1196 return GetResource(content_pack_site_list_); |
| 1195 } | 1197 } |
| 1196 | 1198 |
| 1197 GURL Extension::GetBackgroundURL() const { | |
| 1198 if (background_scripts_.empty()) | |
| 1199 return background_url_; | |
| 1200 return GetResourceURL(extension_filenames::kGeneratedBackgroundPageFilename); | |
| 1201 } | |
| 1202 | |
| 1203 Extension::RuntimeData::RuntimeData() {} | 1199 Extension::RuntimeData::RuntimeData() {} |
| 1204 Extension::RuntimeData::RuntimeData(const PermissionSet* active) | 1200 Extension::RuntimeData::RuntimeData(const PermissionSet* active) |
| 1205 : active_permissions_(active) {} | 1201 : active_permissions_(active) {} |
| 1206 Extension::RuntimeData::~RuntimeData() {} | 1202 Extension::RuntimeData::~RuntimeData() {} |
| 1207 | 1203 |
| 1208 void Extension::RuntimeData::SetActivePermissions( | 1204 void Extension::RuntimeData::SetActivePermissions( |
| 1209 const PermissionSet* active) { | 1205 const PermissionSet* active) { |
| 1210 active_permissions_ = active; | 1206 active_permissions_ = active; |
| 1211 } | 1207 } |
| 1212 | 1208 |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1295 | 1291 |
| 1296 return base::FilePath(path_str); | 1292 return base::FilePath(path_str); |
| 1297 #else | 1293 #else |
| 1298 return path; | 1294 return path; |
| 1299 #endif | 1295 #endif |
| 1300 } | 1296 } |
| 1301 | 1297 |
| 1302 bool Extension::LoadManagedModeFeatures(string16* error) { | 1298 bool Extension::LoadManagedModeFeatures(string16* error) { |
| 1303 if (!manifest_->HasKey(keys::kContentPack)) | 1299 if (!manifest_->HasKey(keys::kContentPack)) |
| 1304 return true; | 1300 return true; |
| 1305 DictionaryValue* content_pack_value = NULL; | 1301 const DictionaryValue* content_pack_value = NULL; |
| 1306 if (!manifest_->GetDictionary(keys::kContentPack, &content_pack_value)) { | 1302 if (!manifest_->GetDictionary(keys::kContentPack, &content_pack_value)) { |
| 1307 *error = ASCIIToUTF16(errors::kInvalidContentPack); | 1303 *error = ASCIIToUTF16(errors::kInvalidContentPack); |
| 1308 return false; | 1304 return false; |
| 1309 } | 1305 } |
| 1310 | 1306 |
| 1311 if (!LoadManagedModeSites(content_pack_value, error)) | 1307 if (!LoadManagedModeSites(content_pack_value, error)) |
| 1312 return false; | 1308 return false; |
| 1313 if (!LoadManagedModeConfigurations(content_pack_value, error)) | 1309 if (!LoadManagedModeConfigurations(content_pack_value, error)) |
| 1314 return false; | 1310 return false; |
| 1315 | 1311 |
| (...skipping 29 matching lines...) Expand all Loading... | |
| 1345 // See http://b/4946060 for more details. | 1341 // See http://b/4946060 for more details. |
| 1346 return id == std::string("nckgahadagoaajjgafhacjanaoiihapd"); | 1342 return id == std::string("nckgahadagoaajjgafhacjanaoiihapd"); |
| 1347 } | 1343 } |
| 1348 | 1344 |
| 1349 Extension::Extension(const base::FilePath& path, | 1345 Extension::Extension(const base::FilePath& path, |
| 1350 scoped_ptr<extensions::Manifest> manifest) | 1346 scoped_ptr<extensions::Manifest> manifest) |
| 1351 : manifest_version_(0), | 1347 : manifest_version_(0), |
| 1352 incognito_split_mode_(false), | 1348 incognito_split_mode_(false), |
| 1353 offline_enabled_(false), | 1349 offline_enabled_(false), |
| 1354 converted_from_user_script_(false), | 1350 converted_from_user_script_(false), |
| 1355 background_page_is_persistent_(true), | |
| 1356 allow_background_js_access_(true), | |
| 1357 manifest_(manifest.release()), | 1351 manifest_(manifest.release()), |
| 1358 finished_parsing_manifest_(false), | 1352 finished_parsing_manifest_(false), |
| 1359 is_storage_isolated_(false), | 1353 is_storage_isolated_(false), |
| 1360 launch_container_(extension_misc::LAUNCH_TAB), | 1354 launch_container_(extension_misc::LAUNCH_TAB), |
| 1361 launch_width_(0), | 1355 launch_width_(0), |
| 1362 launch_height_(0), | 1356 launch_height_(0), |
| 1363 display_in_launcher_(true), | 1357 display_in_launcher_(true), |
| 1364 display_in_new_tab_page_(true), | 1358 display_in_new_tab_page_(true), |
| 1365 wants_file_access_(false), | 1359 wants_file_access_(false), |
| 1366 creation_flags_(0) { | 1360 creation_flags_(0) { |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1485 is_storage_isolated_ = true; | 1479 is_storage_isolated_ = true; |
| 1486 return true; | 1480 return true; |
| 1487 } | 1481 } |
| 1488 | 1482 |
| 1489 // Other apps only get it if it is requested _and_ experimental APIs are | 1483 // Other apps only get it if it is requested _and_ experimental APIs are |
| 1490 // enabled. | 1484 // enabled. |
| 1491 if (!initial_api_permissions()->count(APIPermission::kExperimental) | 1485 if (!initial_api_permissions()->count(APIPermission::kExperimental) |
| 1492 || !is_app()) | 1486 || !is_app()) |
| 1493 return true; | 1487 return true; |
| 1494 | 1488 |
| 1495 Value* tmp_isolation = NULL; | 1489 const Value* tmp_isolation = NULL; |
| 1496 if (!manifest_->Get(keys::kIsolation, &tmp_isolation)) | 1490 if (!manifest_->Get(keys::kIsolation, &tmp_isolation)) |
| 1497 return true; | 1491 return true; |
| 1498 | 1492 |
| 1499 if (tmp_isolation->GetType() != Value::TYPE_LIST) { | 1493 if (tmp_isolation->GetType() != Value::TYPE_LIST) { |
| 1500 *error = ASCIIToUTF16(errors::kInvalidIsolation); | 1494 *error = ASCIIToUTF16(errors::kInvalidIsolation); |
| 1501 return false; | 1495 return false; |
| 1502 } | 1496 } |
| 1503 | 1497 |
| 1504 ListValue* isolation_list = static_cast<ListValue*>(tmp_isolation); | 1498 const ListValue* isolation_list = NULL; |
| 1499 tmp_isolation->GetAsList(&isolation_list); | |
|
Matt Perry
2013/02/15 20:15:02
As long as you using this method, combine it with
Yoyo Zhou
2013/02/16 00:54:04
Done.
| |
| 1505 for (size_t i = 0; i < isolation_list->GetSize(); ++i) { | 1500 for (size_t i = 0; i < isolation_list->GetSize(); ++i) { |
| 1506 std::string isolation_string; | 1501 std::string isolation_string; |
| 1507 if (!isolation_list->GetString(i, &isolation_string)) { | 1502 if (!isolation_list->GetString(i, &isolation_string)) { |
| 1508 *error = ErrorUtils::FormatErrorMessageUTF16( | 1503 *error = ErrorUtils::FormatErrorMessageUTF16( |
| 1509 errors::kInvalidIsolationValue, | 1504 errors::kInvalidIsolationValue, |
| 1510 base::UintToString(i)); | 1505 base::UintToString(i)); |
| 1511 return false; | 1506 return false; |
| 1512 } | 1507 } |
| 1513 | 1508 |
| 1514 // Check for isolated storage. | 1509 // Check for isolated storage. |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1577 display_in_new_tab_page_ = display_in_launcher_; | 1572 display_in_new_tab_page_ = display_in_launcher_; |
| 1578 } | 1573 } |
| 1579 return true; | 1574 return true; |
| 1580 } | 1575 } |
| 1581 | 1576 |
| 1582 bool Extension::LoadExtent(const char* key, | 1577 bool Extension::LoadExtent(const char* key, |
| 1583 URLPatternSet* extent, | 1578 URLPatternSet* extent, |
| 1584 const char* list_error, | 1579 const char* list_error, |
| 1585 const char* value_error, | 1580 const char* value_error, |
| 1586 string16* error) { | 1581 string16* error) { |
| 1587 Value* temp_pattern_value = NULL; | 1582 const Value* temp_pattern_value = NULL; |
| 1588 if (!manifest_->Get(key, &temp_pattern_value)) | 1583 if (!manifest_->Get(key, &temp_pattern_value)) |
| 1589 return true; | 1584 return true; |
| 1590 | 1585 |
| 1591 if (temp_pattern_value->GetType() != Value::TYPE_LIST) { | 1586 if (temp_pattern_value->GetType() != Value::TYPE_LIST) { |
| 1592 *error = ASCIIToUTF16(list_error); | 1587 *error = ASCIIToUTF16(list_error); |
| 1593 return false; | 1588 return false; |
| 1594 } | 1589 } |
| 1595 | 1590 |
| 1596 ListValue* pattern_list = static_cast<ListValue*>(temp_pattern_value); | 1591 const ListValue* pattern_list = NULL; |
| 1592 temp_pattern_value->GetAsList(&pattern_list); | |
| 1597 for (size_t i = 0; i < pattern_list->GetSize(); ++i) { | 1593 for (size_t i = 0; i < pattern_list->GetSize(); ++i) { |
| 1598 std::string pattern_string; | 1594 std::string pattern_string; |
| 1599 if (!pattern_list->GetString(i, &pattern_string)) { | 1595 if (!pattern_list->GetString(i, &pattern_string)) { |
| 1600 *error = ErrorUtils::FormatErrorMessageUTF16(value_error, | 1596 *error = ErrorUtils::FormatErrorMessageUTF16(value_error, |
| 1601 base::UintToString(i), | 1597 base::UintToString(i), |
| 1602 errors::kExpectString); | 1598 errors::kExpectString); |
| 1603 return false; | 1599 return false; |
| 1604 } | 1600 } |
| 1605 | 1601 |
| 1606 URLPattern pattern(kValidWebExtentSchemes); | 1602 URLPattern pattern(kValidWebExtentSchemes); |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1647 } | 1643 } |
| 1648 pattern.SetPath(pattern.path() + '*'); | 1644 pattern.SetPath(pattern.path() + '*'); |
| 1649 | 1645 |
| 1650 extent->AddPattern(pattern); | 1646 extent->AddPattern(pattern); |
| 1651 } | 1647 } |
| 1652 | 1648 |
| 1653 return true; | 1649 return true; |
| 1654 } | 1650 } |
| 1655 | 1651 |
| 1656 bool Extension::LoadLaunchContainer(string16* error) { | 1652 bool Extension::LoadLaunchContainer(string16* error) { |
| 1657 Value* tmp_launcher_container = NULL; | 1653 const Value* tmp_launcher_container = NULL; |
| 1658 if (!manifest_->Get(keys::kLaunchContainer, &tmp_launcher_container)) | 1654 if (!manifest_->Get(keys::kLaunchContainer, &tmp_launcher_container)) |
| 1659 return true; | 1655 return true; |
| 1660 | 1656 |
| 1661 std::string launch_container_string; | 1657 std::string launch_container_string; |
| 1662 if (!tmp_launcher_container->GetAsString(&launch_container_string)) { | 1658 if (!tmp_launcher_container->GetAsString(&launch_container_string)) { |
| 1663 *error = ASCIIToUTF16(errors::kInvalidLaunchContainer); | 1659 *error = ASCIIToUTF16(errors::kInvalidLaunchContainer); |
| 1664 return false; | 1660 return false; |
| 1665 } | 1661 } |
| 1666 | 1662 |
| 1667 if (launch_container_string == values::kLaunchContainerPanel) { | 1663 if (launch_container_string == values::kLaunchContainerPanel) { |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 1692 &launch_height_, | 1688 &launch_height_, |
| 1693 can_specify_initial_size, | 1689 can_specify_initial_size, |
| 1694 error)) { | 1690 error)) { |
| 1695 return false; | 1691 return false; |
| 1696 } | 1692 } |
| 1697 | 1693 |
| 1698 return true; | 1694 return true; |
| 1699 } | 1695 } |
| 1700 | 1696 |
| 1701 bool Extension::LoadLaunchURL(string16* error) { | 1697 bool Extension::LoadLaunchURL(string16* error) { |
| 1702 Value* temp = NULL; | 1698 const Value* temp = NULL; |
| 1703 | 1699 |
| 1704 // launch URL can be either local (to chrome-extension:// root) or an absolute | 1700 // launch URL can be either local (to chrome-extension:// root) or an absolute |
| 1705 // web URL. | 1701 // web URL. |
| 1706 if (manifest_->Get(keys::kLaunchLocalPath, &temp)) { | 1702 if (manifest_->Get(keys::kLaunchLocalPath, &temp)) { |
| 1707 if (manifest_->Get(keys::kLaunchWebURL, NULL)) { | 1703 if (manifest_->Get(keys::kLaunchWebURL, NULL)) { |
| 1708 *error = ASCIIToUTF16(errors::kLaunchPathAndURLAreExclusive); | 1704 *error = ASCIIToUTF16(errors::kLaunchPathAndURLAreExclusive); |
| 1709 return false; | 1705 return false; |
| 1710 } | 1706 } |
| 1711 | 1707 |
| 1712 if (manifest_->Get(keys::kWebURLs, NULL)) { | 1708 if (manifest_->Get(keys::kWebURLs, NULL)) { |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1811 } | 1807 } |
| 1812 | 1808 |
| 1813 bool Extension::LoadSharedFeatures(string16* error) { | 1809 bool Extension::LoadSharedFeatures(string16* error) { |
| 1814 if (!LoadDescription(error) || | 1810 if (!LoadDescription(error) || |
| 1815 !LoadIcons(error) || | 1811 !LoadIcons(error) || |
| 1816 !ManifestHandler::ParseExtension(this, error) || | 1812 !ManifestHandler::ParseExtension(this, error) || |
| 1817 !LoadPlugins(error) || | 1813 !LoadPlugins(error) || |
| 1818 !LoadNaClModules(error) || | 1814 !LoadNaClModules(error) || |
| 1819 !LoadSandboxedPages(error) || | 1815 !LoadSandboxedPages(error) || |
| 1820 !LoadRequirements(error) || | 1816 !LoadRequirements(error) || |
| 1821 !LoadOfflineEnabled(error) || | 1817 !LoadOfflineEnabled(error)) |
| 1822 // LoadBackgroundScripts() must be called before LoadBackgroundPage(). | |
| 1823 !LoadBackgroundScripts(error) || | |
| 1824 !LoadBackgroundPage(error) || | |
| 1825 !LoadBackgroundPersistent(error) || | |
| 1826 !LoadBackgroundAllowJSAccess(error)) | |
| 1827 return false; | 1818 return false; |
| 1828 | 1819 |
| 1829 return true; | 1820 return true; |
| 1830 } | 1821 } |
| 1831 | 1822 |
| 1832 bool Extension::LoadDescription(string16* error) { | 1823 bool Extension::LoadDescription(string16* error) { |
| 1833 if (manifest_->HasKey(keys::kDescription) && | 1824 if (manifest_->HasKey(keys::kDescription) && |
| 1834 !manifest_->GetString(keys::kDescription, &description_)) { | 1825 !manifest_->GetString(keys::kDescription, &description_)) { |
| 1835 *error = ASCIIToUTF16(errors::kInvalidDescription); | 1826 *error = ASCIIToUTF16(errors::kInvalidDescription); |
| 1836 return false; | 1827 return false; |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 1860 base::IntToString(kModernManifestVersion)); | 1851 base::IntToString(kModernManifestVersion)); |
| 1861 return false; | 1852 return false; |
| 1862 } | 1853 } |
| 1863 | 1854 |
| 1864 return true; | 1855 return true; |
| 1865 } | 1856 } |
| 1866 | 1857 |
| 1867 bool Extension::LoadIcons(string16* error) { | 1858 bool Extension::LoadIcons(string16* error) { |
| 1868 if (!manifest_->HasKey(keys::kIcons)) | 1859 if (!manifest_->HasKey(keys::kIcons)) |
| 1869 return true; | 1860 return true; |
| 1870 DictionaryValue* icons_value = NULL; | 1861 const DictionaryValue* icons_value = NULL; |
| 1871 if (!manifest_->GetDictionary(keys::kIcons, &icons_value)) { | 1862 if (!manifest_->GetDictionary(keys::kIcons, &icons_value)) { |
| 1872 *error = ASCIIToUTF16(errors::kInvalidIcons); | 1863 *error = ASCIIToUTF16(errors::kInvalidIcons); |
| 1873 return false; | 1864 return false; |
| 1874 } | 1865 } |
| 1875 | 1866 |
| 1876 return manifest_handler_helpers::LoadIconsFromDictionary( | 1867 return manifest_handler_helpers::LoadIconsFromDictionary( |
| 1877 icons_value, | 1868 icons_value, |
| 1878 extension_misc::kExtensionIconSizes, | 1869 extension_misc::kExtensionIconSizes, |
| 1879 extension_misc::kNumExtensionIconSizes, | 1870 extension_misc::kNumExtensionIconSizes, |
| 1880 &icons_, | 1871 &icons_, |
| 1881 error); | 1872 error); |
| 1882 } | 1873 } |
| 1883 | 1874 |
| 1884 bool Extension::LoadPlugins(string16* error) { | 1875 bool Extension::LoadPlugins(string16* error) { |
| 1885 if (!manifest_->HasKey(keys::kPlugins)) | 1876 if (!manifest_->HasKey(keys::kPlugins)) |
| 1886 return true; | 1877 return true; |
| 1887 | 1878 |
| 1888 ListValue* list_value = NULL; | 1879 const ListValue* list_value = NULL; |
| 1889 if (!manifest_->GetList(keys::kPlugins, &list_value)) { | 1880 if (!manifest_->GetList(keys::kPlugins, &list_value)) { |
| 1890 *error = ASCIIToUTF16(errors::kInvalidPlugins); | 1881 *error = ASCIIToUTF16(errors::kInvalidPlugins); |
| 1891 return false; | 1882 return false; |
| 1892 } | 1883 } |
| 1893 | 1884 |
| 1894 for (size_t i = 0; i < list_value->GetSize(); ++i) { | 1885 for (size_t i = 0; i < list_value->GetSize(); ++i) { |
| 1895 DictionaryValue* plugin_value = NULL; | 1886 const DictionaryValue* plugin_value = NULL; |
| 1896 if (!list_value->GetDictionary(i, &plugin_value)) { | 1887 if (!list_value->GetDictionary(i, &plugin_value)) { |
| 1897 *error = ASCIIToUTF16(errors::kInvalidPlugins); | 1888 *error = ASCIIToUTF16(errors::kInvalidPlugins); |
| 1898 return false; | 1889 return false; |
| 1899 } | 1890 } |
| 1900 // Get plugins[i].path. | 1891 // Get plugins[i].path. |
| 1901 std::string path_str; | 1892 std::string path_str; |
| 1902 if (!plugin_value->GetString(keys::kPluginsPath, &path_str)) { | 1893 if (!plugin_value->GetString(keys::kPluginsPath, &path_str)) { |
| 1903 *error = ErrorUtils::FormatErrorMessageUTF16( | 1894 *error = ErrorUtils::FormatErrorMessageUTF16( |
| 1904 errors::kInvalidPluginsPath, base::IntToString(i)); | 1895 errors::kInvalidPluginsPath, base::IntToString(i)); |
| 1905 return false; | 1896 return false; |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 1930 plugins_.back().path = path().Append( | 1921 plugins_.back().path = path().Append( |
| 1931 base::FilePath::FromUTF8Unsafe(path_str)); | 1922 base::FilePath::FromUTF8Unsafe(path_str)); |
| 1932 plugins_.back().is_public = is_public; | 1923 plugins_.back().is_public = is_public; |
| 1933 } | 1924 } |
| 1934 return true; | 1925 return true; |
| 1935 } | 1926 } |
| 1936 | 1927 |
| 1937 bool Extension::LoadNaClModules(string16* error) { | 1928 bool Extension::LoadNaClModules(string16* error) { |
| 1938 if (!manifest_->HasKey(keys::kNaClModules)) | 1929 if (!manifest_->HasKey(keys::kNaClModules)) |
| 1939 return true; | 1930 return true; |
| 1940 ListValue* list_value = NULL; | 1931 const ListValue* list_value = NULL; |
| 1941 if (!manifest_->GetList(keys::kNaClModules, &list_value)) { | 1932 if (!manifest_->GetList(keys::kNaClModules, &list_value)) { |
| 1942 *error = ASCIIToUTF16(errors::kInvalidNaClModules); | 1933 *error = ASCIIToUTF16(errors::kInvalidNaClModules); |
| 1943 return false; | 1934 return false; |
| 1944 } | 1935 } |
| 1945 | 1936 |
| 1946 for (size_t i = 0; i < list_value->GetSize(); ++i) { | 1937 for (size_t i = 0; i < list_value->GetSize(); ++i) { |
| 1947 DictionaryValue* module_value = NULL; | 1938 const DictionaryValue* module_value = NULL; |
| 1948 if (!list_value->GetDictionary(i, &module_value)) { | 1939 if (!list_value->GetDictionary(i, &module_value)) { |
| 1949 *error = ASCIIToUTF16(errors::kInvalidNaClModules); | 1940 *error = ASCIIToUTF16(errors::kInvalidNaClModules); |
| 1950 return false; | 1941 return false; |
| 1951 } | 1942 } |
| 1952 | 1943 |
| 1953 // Get nacl_modules[i].path. | 1944 // Get nacl_modules[i].path. |
| 1954 std::string path_str; | 1945 std::string path_str; |
| 1955 if (!module_value->GetString(keys::kNaClModulesPath, &path_str)) { | 1946 if (!module_value->GetString(keys::kNaClModulesPath, &path_str)) { |
| 1956 *error = ErrorUtils::FormatErrorMessageUTF16( | 1947 *error = ErrorUtils::FormatErrorMessageUTF16( |
| 1957 errors::kInvalidNaClModulesPath, base::IntToString(i)); | 1948 errors::kInvalidNaClModulesPath, base::IntToString(i)); |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 1971 nacl_modules_.back().mime_type = mime_type; | 1962 nacl_modules_.back().mime_type = mime_type; |
| 1972 } | 1963 } |
| 1973 | 1964 |
| 1974 return true; | 1965 return true; |
| 1975 } | 1966 } |
| 1976 | 1967 |
| 1977 bool Extension::LoadSandboxedPages(string16* error) { | 1968 bool Extension::LoadSandboxedPages(string16* error) { |
| 1978 if (!manifest_->HasPath(keys::kSandboxedPages)) | 1969 if (!manifest_->HasPath(keys::kSandboxedPages)) |
| 1979 return true; | 1970 return true; |
| 1980 | 1971 |
| 1981 ListValue* list_value = NULL; | 1972 const ListValue* list_value = NULL; |
| 1982 if (!manifest_->GetList(keys::kSandboxedPages, &list_value)) { | 1973 if (!manifest_->GetList(keys::kSandboxedPages, &list_value)) { |
| 1983 *error = ASCIIToUTF16(errors::kInvalidSandboxedPagesList); | 1974 *error = ASCIIToUTF16(errors::kInvalidSandboxedPagesList); |
| 1984 return false; | 1975 return false; |
| 1985 } | 1976 } |
| 1986 for (size_t i = 0; i < list_value->GetSize(); ++i) { | 1977 for (size_t i = 0; i < list_value->GetSize(); ++i) { |
| 1987 std::string relative_path; | 1978 std::string relative_path; |
| 1988 if (!list_value->GetString(i, &relative_path)) { | 1979 if (!list_value->GetString(i, &relative_path)) { |
| 1989 *error = ErrorUtils::FormatErrorMessageUTF16( | 1980 *error = ErrorUtils::FormatErrorMessageUTF16( |
| 1990 errors::kInvalidSandboxedPage, base::IntToString(i)); | 1981 errors::kInvalidSandboxedPage, base::IntToString(i)); |
| 1991 return false; | 1982 return false; |
| (...skipping 30 matching lines...) Expand all Loading... | |
| 2022 CHECK(ContentSecurityPolicyIsSandboxed( | 2013 CHECK(ContentSecurityPolicyIsSandboxed( |
| 2023 sandboxed_pages_content_security_policy_, GetType())); | 2014 sandboxed_pages_content_security_policy_, GetType())); |
| 2024 } | 2015 } |
| 2025 | 2016 |
| 2026 return true; | 2017 return true; |
| 2027 } | 2018 } |
| 2028 | 2019 |
| 2029 bool Extension::LoadRequirements(string16* error) { | 2020 bool Extension::LoadRequirements(string16* error) { |
| 2030 // Before parsing requirements from the manifest, automatically default the | 2021 // Before parsing requirements from the manifest, automatically default the |
| 2031 // NPAPI plugin requirement based on whether it includes NPAPI plugins. | 2022 // NPAPI plugin requirement based on whether it includes NPAPI plugins. |
| 2032 ListValue* list_value = NULL; | 2023 const ListValue* list_value = NULL; |
| 2033 requirements_.npapi = | 2024 requirements_.npapi = |
| 2034 manifest_->GetList(keys::kPlugins, &list_value) && !list_value->empty(); | 2025 manifest_->GetList(keys::kPlugins, &list_value) && !list_value->empty(); |
| 2035 | 2026 |
| 2036 if (!manifest_->HasKey(keys::kRequirements)) | 2027 if (!manifest_->HasKey(keys::kRequirements)) |
| 2037 return true; | 2028 return true; |
| 2038 | 2029 |
| 2039 DictionaryValue* requirements_value = NULL; | 2030 const DictionaryValue* requirements_value = NULL; |
| 2040 if (!manifest_->GetDictionary(keys::kRequirements, &requirements_value)) { | 2031 if (!manifest_->GetDictionary(keys::kRequirements, &requirements_value)) { |
| 2041 *error = ASCIIToUTF16(errors::kInvalidRequirements); | 2032 *error = ASCIIToUTF16(errors::kInvalidRequirements); |
| 2042 return false; | 2033 return false; |
| 2043 } | 2034 } |
| 2044 | 2035 |
| 2045 for (DictionaryValue::Iterator it(*requirements_value); !it.IsAtEnd(); | 2036 for (DictionaryValue::Iterator it(*requirements_value); !it.IsAtEnd(); |
| 2046 it.Advance()) { | 2037 it.Advance()) { |
| 2047 const DictionaryValue* requirement_value; | 2038 const DictionaryValue* requirement_value; |
| 2048 if (!it.value().GetAsDictionary(&requirement_value)) { | 2039 if (!it.value().GetAsDictionary(&requirement_value)) { |
| 2049 *error = ErrorUtils::FormatErrorMessageUTF16( | 2040 *error = ErrorUtils::FormatErrorMessageUTF16( |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2108 offline_enabled_ = is_platform_app(); | 2099 offline_enabled_ = is_platform_app(); |
| 2109 return true; | 2100 return true; |
| 2110 } | 2101 } |
| 2111 if (!manifest_->GetBoolean(keys::kOfflineEnabled, &offline_enabled_)) { | 2102 if (!manifest_->GetBoolean(keys::kOfflineEnabled, &offline_enabled_)) { |
| 2112 *error = ASCIIToUTF16(errors::kInvalidOfflineEnabled); | 2103 *error = ASCIIToUTF16(errors::kInvalidOfflineEnabled); |
| 2113 return false; | 2104 return false; |
| 2114 } | 2105 } |
| 2115 return true; | 2106 return true; |
| 2116 } | 2107 } |
| 2117 | 2108 |
| 2118 bool Extension::LoadBackgroundScripts(string16* error) { | |
| 2119 const std::string& key = is_platform_app() ? | |
| 2120 keys::kPlatformAppBackgroundScripts : keys::kBackgroundScripts; | |
| 2121 return LoadBackgroundScripts(key, error); | |
| 2122 } | |
| 2123 | |
| 2124 bool Extension::LoadBackgroundScripts(const std::string& key, string16* error) { | |
| 2125 Value* background_scripts_value = NULL; | |
| 2126 if (!manifest_->Get(key, &background_scripts_value)) | |
| 2127 return true; | |
| 2128 | |
| 2129 CHECK(background_scripts_value); | |
| 2130 if (background_scripts_value->GetType() != Value::TYPE_LIST) { | |
| 2131 *error = ASCIIToUTF16(errors::kInvalidBackgroundScripts); | |
| 2132 return false; | |
| 2133 } | |
| 2134 | |
| 2135 ListValue* background_scripts = | |
| 2136 static_cast<ListValue*>(background_scripts_value); | |
| 2137 for (size_t i = 0; i < background_scripts->GetSize(); ++i) { | |
| 2138 std::string script; | |
| 2139 if (!background_scripts->GetString(i, &script)) { | |
| 2140 *error = ErrorUtils::FormatErrorMessageUTF16( | |
| 2141 errors::kInvalidBackgroundScript, base::IntToString(i)); | |
| 2142 return false; | |
| 2143 } | |
| 2144 background_scripts_.push_back(script); | |
| 2145 } | |
| 2146 | |
| 2147 return true; | |
| 2148 } | |
| 2149 | |
| 2150 bool Extension::LoadBackgroundPage(string16* error) { | |
| 2151 if (is_platform_app()) { | |
| 2152 return LoadBackgroundPage(keys::kPlatformAppBackgroundPage, error); | |
| 2153 } | |
| 2154 | |
| 2155 if (!LoadBackgroundPage(keys::kBackgroundPage, error)) | |
| 2156 return false; | |
| 2157 if (background_url_.is_empty()) { | |
| 2158 return LoadBackgroundPage( | |
| 2159 keys::kBackgroundPageLegacy, error); | |
| 2160 } | |
| 2161 return true; | |
| 2162 } | |
| 2163 | |
| 2164 bool Extension::LoadBackgroundPage(const std::string& key, string16* error) { | |
| 2165 base::Value* background_page_value = NULL; | |
| 2166 if (!manifest_->Get(key, &background_page_value)) | |
| 2167 return true; | |
| 2168 | |
| 2169 if (!background_scripts_.empty()) { | |
| 2170 *error = ASCIIToUTF16(errors::kInvalidBackgroundCombination); | |
| 2171 return false; | |
| 2172 } | |
| 2173 | |
| 2174 | |
| 2175 std::string background_str; | |
| 2176 if (!background_page_value->GetAsString(&background_str)) { | |
| 2177 *error = ASCIIToUTF16(errors::kInvalidBackground); | |
| 2178 return false; | |
| 2179 } | |
| 2180 | |
| 2181 if (is_hosted_app()) { | |
| 2182 background_url_ = GURL(background_str); | |
| 2183 | |
| 2184 // Make sure "background" permission is set. | |
| 2185 if (!initial_api_permissions()->count(APIPermission::kBackground)) { | |
| 2186 *error = ASCIIToUTF16(errors::kBackgroundPermissionNeeded); | |
| 2187 return false; | |
| 2188 } | |
| 2189 // Hosted apps require an absolute URL. | |
| 2190 if (!background_url_.is_valid()) { | |
| 2191 *error = ASCIIToUTF16(errors::kInvalidBackgroundInHostedApp); | |
| 2192 return false; | |
| 2193 } | |
| 2194 | |
| 2195 if (!(background_url_.SchemeIs("https") || | |
| 2196 (CommandLine::ForCurrentProcess()->HasSwitch( | |
| 2197 switches::kAllowHTTPBackgroundPage) && | |
| 2198 background_url_.SchemeIs("http")))) { | |
| 2199 *error = ASCIIToUTF16(errors::kInvalidBackgroundInHostedApp); | |
| 2200 return false; | |
| 2201 } | |
| 2202 } else { | |
| 2203 background_url_ = GetResourceURL(background_str); | |
| 2204 } | |
| 2205 | |
| 2206 return true; | |
| 2207 } | |
| 2208 | |
| 2209 bool Extension::LoadBackgroundPersistent(string16* error) { | |
| 2210 if (is_platform_app()) { | |
| 2211 background_page_is_persistent_ = false; | |
| 2212 return true; | |
| 2213 } | |
| 2214 | |
| 2215 Value* background_persistent = NULL; | |
| 2216 if (!manifest_->Get(keys::kBackgroundPersistent, &background_persistent)) | |
| 2217 return true; | |
| 2218 | |
| 2219 if (!background_persistent->GetAsBoolean(&background_page_is_persistent_)) { | |
| 2220 *error = ASCIIToUTF16(errors::kInvalidBackgroundPersistent); | |
| 2221 return false; | |
| 2222 } | |
| 2223 | |
| 2224 if (!has_background_page()) { | |
| 2225 *error = ASCIIToUTF16(errors::kInvalidBackgroundPersistentNoPage); | |
| 2226 return false; | |
| 2227 } | |
| 2228 | |
| 2229 return true; | |
| 2230 } | |
| 2231 | |
| 2232 bool Extension::LoadBackgroundAllowJSAccess(string16* error) { | |
| 2233 Value* allow_js_access = NULL; | |
| 2234 if (!manifest_->Get(keys::kBackgroundAllowJsAccess, &allow_js_access)) | |
| 2235 return true; | |
| 2236 | |
| 2237 if (!allow_js_access->IsType(Value::TYPE_BOOLEAN) || | |
| 2238 !allow_js_access->GetAsBoolean(&allow_background_js_access_)) { | |
| 2239 *error = ASCIIToUTF16(errors::kInvalidBackgroundAllowJsAccess); | |
| 2240 return false; | |
| 2241 } | |
| 2242 | |
| 2243 return true; | |
| 2244 } | |
| 2245 | |
| 2246 bool Extension::LoadExtensionFeatures(string16* error) { | 2109 bool Extension::LoadExtensionFeatures(string16* error) { |
| 2247 if (manifest_->HasKey(keys::kConvertedFromUserScript)) | 2110 if (manifest_->HasKey(keys::kConvertedFromUserScript)) |
| 2248 manifest_->GetBoolean(keys::kConvertedFromUserScript, | 2111 manifest_->GetBoolean(keys::kConvertedFromUserScript, |
| 2249 &converted_from_user_script_); | 2112 &converted_from_user_script_); |
| 2250 | 2113 |
| 2251 if (!LoadContentScripts(error) || | 2114 if (!LoadContentScripts(error) || |
| 2252 !LoadSystemIndicator(error) || | 2115 !LoadSystemIndicator(error) || |
| 2253 !LoadIncognitoMode(error) || | 2116 !LoadIncognitoMode(error) || |
| 2254 !LoadContentSecurityPolicy(error)) | 2117 !LoadContentSecurityPolicy(error)) |
| 2255 return false; | 2118 return false; |
| 2256 | 2119 |
| 2257 return true; | 2120 return true; |
| 2258 } | 2121 } |
| 2259 | 2122 |
| 2260 bool Extension::LoadContentScripts(string16* error) { | 2123 bool Extension::LoadContentScripts(string16* error) { |
| 2261 if (!manifest_->HasKey(keys::kContentScripts)) | 2124 if (!manifest_->HasKey(keys::kContentScripts)) |
| 2262 return true; | 2125 return true; |
| 2263 ListValue* list_value; | 2126 const ListValue* list_value; |
| 2264 if (!manifest_->GetList(keys::kContentScripts, &list_value)) { | 2127 if (!manifest_->GetList(keys::kContentScripts, &list_value)) { |
| 2265 *error = ASCIIToUTF16(errors::kInvalidContentScriptsList); | 2128 *error = ASCIIToUTF16(errors::kInvalidContentScriptsList); |
| 2266 return false; | 2129 return false; |
| 2267 } | 2130 } |
| 2268 | 2131 |
| 2269 for (size_t i = 0; i < list_value->GetSize(); ++i) { | 2132 for (size_t i = 0; i < list_value->GetSize(); ++i) { |
| 2270 DictionaryValue* content_script = NULL; | 2133 const DictionaryValue* content_script = NULL; |
| 2271 if (!list_value->GetDictionary(i, &content_script)) { | 2134 if (!list_value->GetDictionary(i, &content_script)) { |
| 2272 *error = ErrorUtils::FormatErrorMessageUTF16( | 2135 *error = ErrorUtils::FormatErrorMessageUTF16( |
| 2273 errors::kInvalidContentScript, base::IntToString(i)); | 2136 errors::kInvalidContentScript, base::IntToString(i)); |
| 2274 return false; | 2137 return false; |
| 2275 } | 2138 } |
| 2276 | 2139 |
| 2277 UserScript script; | 2140 UserScript script; |
| 2278 if (!LoadUserScriptHelper(content_script, i, error, &script)) | 2141 if (!LoadUserScriptHelper(content_script, i, error, &script)) |
| 2279 return false; // Failed to parse script context definition. | 2142 return false; // Failed to parse script context definition. |
| 2280 script.set_extension_id(id()); | 2143 script.set_extension_id(id()); |
| 2281 if (converted_from_user_script_) { | 2144 if (converted_from_user_script_) { |
| 2282 script.set_emulate_greasemonkey(true); | 2145 script.set_emulate_greasemonkey(true); |
| 2283 script.set_match_all_frames(true); // Greasemonkey matches all frames. | 2146 script.set_match_all_frames(true); // Greasemonkey matches all frames. |
| 2284 } | 2147 } |
| 2285 content_scripts_.push_back(script); | 2148 content_scripts_.push_back(script); |
| 2286 } | 2149 } |
| 2287 return true; | 2150 return true; |
| 2288 } | 2151 } |
| 2289 | 2152 |
| 2290 bool Extension::LoadSystemIndicator(string16* error) { | 2153 bool Extension::LoadSystemIndicator(string16* error) { |
| 2291 if (!manifest_->HasKey(keys::kSystemIndicator)) { | 2154 if (!manifest_->HasKey(keys::kSystemIndicator)) { |
| 2292 // There was no manifest entry for the system indicator. | 2155 // There was no manifest entry for the system indicator. |
| 2293 return true; | 2156 return true; |
| 2294 } | 2157 } |
| 2295 | 2158 |
| 2296 DictionaryValue* system_indicator_value = NULL; | 2159 const DictionaryValue* system_indicator_value = NULL; |
| 2297 if (!manifest_->GetDictionary(keys::kSystemIndicator, | 2160 if (!manifest_->GetDictionary(keys::kSystemIndicator, |
| 2298 &system_indicator_value)) { | 2161 &system_indicator_value)) { |
| 2299 *error = ASCIIToUTF16(errors::kInvalidSystemIndicator); | 2162 *error = ASCIIToUTF16(errors::kInvalidSystemIndicator); |
| 2300 return false; | 2163 return false; |
| 2301 } | 2164 } |
| 2302 | 2165 |
| 2303 system_indicator_info_ = LoadExtensionActionInfoHelper( | 2166 system_indicator_info_ = LoadExtensionActionInfoHelper( |
| 2304 this, system_indicator_value, error); | 2167 this, system_indicator_value, error); |
| 2305 | 2168 |
| 2306 if (!system_indicator_info_.get()) { | 2169 if (!system_indicator_info_.get()) { |
| (...skipping 423 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2730 minimum_version_string); | 2593 minimum_version_string); |
| 2731 return false; | 2594 return false; |
| 2732 } | 2595 } |
| 2733 return true; | 2596 return true; |
| 2734 } | 2597 } |
| 2735 | 2598 |
| 2736 bool Extension::CheckPlatformAppFeatures(std::string* utf8_error) const { | 2599 bool Extension::CheckPlatformAppFeatures(std::string* utf8_error) const { |
| 2737 if (!is_platform_app()) | 2600 if (!is_platform_app()) |
| 2738 return true; | 2601 return true; |
| 2739 | 2602 |
| 2740 if (!has_background_page()) { | 2603 if (!BackgroundInfo::HasBackgroundPage(this)) { |
| 2741 *utf8_error = errors::kBackgroundRequiredForPlatformApps; | 2604 *utf8_error = errors::kBackgroundRequiredForPlatformApps; |
| 2742 return false; | 2605 return false; |
| 2743 } | 2606 } |
| 2744 | 2607 |
| 2745 if (!incognito_split_mode_) { | 2608 if (!incognito_split_mode_) { |
| 2746 *utf8_error = errors::kInvalidIncognitoModeForPlatformApp; | 2609 *utf8_error = errors::kInvalidIncognitoModeForPlatformApp; |
| 2747 return false; | 2610 return false; |
| 2748 } | 2611 } |
| 2749 | 2612 |
| 2750 return true; | 2613 return true; |
| 2751 } | 2614 } |
| 2752 | 2615 |
| 2753 bool Extension::CheckConflictingFeatures(std::string* utf8_error) const { | 2616 bool Extension::CheckConflictingFeatures(std::string* utf8_error) const { |
| 2754 if (has_lazy_background_page() && | 2617 if (BackgroundInfo::HasLazyBackgroundPage(this) && |
| 2755 HasAPIPermission(APIPermission::kWebRequest)) { | 2618 HasAPIPermission(APIPermission::kWebRequest)) { |
| 2756 *utf8_error = errors::kWebRequestConflictsWithLazyBackground; | 2619 *utf8_error = errors::kWebRequestConflictsWithLazyBackground; |
| 2757 return false; | 2620 return false; |
| 2758 } | 2621 } |
| 2759 | 2622 |
| 2760 return true; | 2623 return true; |
| 2761 } | 2624 } |
| 2762 | 2625 |
| 2763 ExtensionInfo::ExtensionInfo(const DictionaryValue* manifest, | 2626 ExtensionInfo::ExtensionInfo(const DictionaryValue* manifest, |
| 2764 const std::string& id, | 2627 const std::string& id, |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 2782 | 2645 |
| 2783 UpdatedExtensionPermissionsInfo::UpdatedExtensionPermissionsInfo( | 2646 UpdatedExtensionPermissionsInfo::UpdatedExtensionPermissionsInfo( |
| 2784 const Extension* extension, | 2647 const Extension* extension, |
| 2785 const PermissionSet* permissions, | 2648 const PermissionSet* permissions, |
| 2786 Reason reason) | 2649 Reason reason) |
| 2787 : reason(reason), | 2650 : reason(reason), |
| 2788 extension(extension), | 2651 extension(extension), |
| 2789 permissions(permissions) {} | 2652 permissions(permissions) {} |
| 2790 | 2653 |
| 2791 } // namespace extensions | 2654 } // namespace extensions |
| OLD | NEW |