diff options
author | fsamuel@chromium.org <fsamuel@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-02-07 08:55:19 +0000 |
---|---|---|
committer | fsamuel@chromium.org <fsamuel@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-02-07 08:55:19 +0000 |
commit | 2aa406a8b4577103e7b933c75ec0e372830f20fe (patch) | |
tree | fd498026e0c139388315f6176f9f98372d7f73d3 /extensions | |
parent | 5f7dd0629b5b7e203e264a21104b7227b3d5968b (diff) | |
download | chromium_src-2aa406a8b4577103e7b933c75ec0e372830f20fe.zip chromium_src-2aa406a8b4577103e7b933c75ec0e372830f20fe.tar.gz chromium_src-2aa406a8b4577103e7b933c75ec0e372830f20fe.tar.bz2 |
<webview>: Update format for local file access in manifest.json
The new format is:
"webview" : {
"partitions" : [
{
"name" : "foo*",
"accessible_resources" : ["a.html", "b.html"]
},
{
"name" : "bar",
"accessible_resources" : ["a.html", "c.html"]
}
]
}
BUG=340291
Review URL: https://codereview.chromium.org/151923005
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@249640 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'extensions')
-rw-r--r-- | extensions/common/manifest_constants.cc | 13 | ||||
-rw-r--r-- | extensions/common/manifest_constants.h | 8 | ||||
-rw-r--r-- | extensions/common/manifest_handlers/webview_info.cc | 128 | ||||
-rw-r--r-- | extensions/common/manifest_handlers/webview_info.h | 17 |
4 files changed, 113 insertions, 53 deletions
diff --git a/extensions/common/manifest_constants.cc b/extensions/common/manifest_constants.cc index 454f5ec..ff6acb1 100644 --- a/extensions/common/manifest_constants.cc +++ b/extensions/common/manifest_constants.cc @@ -162,7 +162,8 @@ const char kWebAccessibleResources[] = "web_accessible_resources"; const char kWebURLs[] = "app.urls"; const char kWebview[] = "webview"; const char kWebviewAccessibleResources[] = "accessible_resources"; -const char kWebviewPrivilegedPartitions[] = "privileged_partitions"; +const char kWebviewName[] = "name"; +const char kWebviewPartitions[] = "partitions"; } // namespace manifest_keys @@ -621,10 +622,12 @@ const char kInvalidWebviewAccessibleResourcesList[] = "Invalid value for'webview.accessible_resources'."; const char kInvalidWebviewAccessibleResource[] = "Invalid value for 'webview.accessible_resources[*]'."; -const char kInvalidWebviewPrivilegedPartitionList[] = - "Invalid value for 'webview.privileged_partitions'."; -const char kInvalidWebviewPrivilegedPartition[] = - "Invalid value for 'webview.privileged_partitions[*]'."; +const char kInvalidWebviewPartition[] = + "Invalid value for 'webview.partitions[*]'."; +const char kInvalidWebviewPartitionName[] = + "Invalid value for 'webview.partitions[*].name'."; +const char kInvalidWebviewPartitionsList[] = + "Invalid value for 'webview.partitions'."; const char kInvalidWebURL[] = "Invalid value for 'app.urls[*]': *"; const char kInvalidWebURLs[] = diff --git a/extensions/common/manifest_constants.h b/extensions/common/manifest_constants.h index a62583f..f008281 100644 --- a/extensions/common/manifest_constants.h +++ b/extensions/common/manifest_constants.h @@ -169,8 +169,9 @@ extern const char kVersion[]; extern const char kWebAccessibleResources[]; extern const char kWebURLs[]; extern const char kWebview[]; +extern const char kWebviewName[]; extern const char kWebviewAccessibleResources[]; -extern const char kWebviewPrivilegedPartitions[]; +extern const char kWebviewPartitions[]; } // namespace manifest_keys @@ -424,8 +425,9 @@ extern const char kInvalidWebAccessibleResource[]; extern const char kInvalidWebview[]; extern const char kInvalidWebviewAccessibleResourcesList[]; extern const char kInvalidWebviewAccessibleResource[]; -extern const char kInvalidWebviewPrivilegedPartitionList[]; -extern const char kInvalidWebviewPrivilegedPartition[]; +extern const char kInvalidWebviewPartition[]; +extern const char kInvalidWebviewPartitionName[]; +extern const char kInvalidWebviewPartitionsList[]; extern const char kInvalidWebURL[]; extern const char kInvalidWebURLs[]; extern const char kInvalidZipHash[]; diff --git a/extensions/common/manifest_handlers/webview_info.cc b/extensions/common/manifest_handlers/webview_info.cc index 5240099..3b30bbe 100644 --- a/extensions/common/manifest_handlers/webview_info.cc +++ b/extensions/common/manifest_handlers/webview_info.cc @@ -28,6 +28,39 @@ const WebviewInfo* GetResourcesInfo( } // namespace +// A PartitionItem represents a set of accessible resources given a partition +// ID pattern. +class PartitionItem { + public: + explicit PartitionItem(const std::string& partition_pattern) + : partition_pattern_(partition_pattern) { + } + + virtual ~PartitionItem() { + } + + bool Matches(const std::string& partition_id) const { + return MatchPattern(partition_id, partition_pattern_); + } + + // Adds a pattern to the set. Returns true if a new pattern was inserted, + // false if the pattern was already in the set. + bool AddPattern(const URLPattern& pattern) { + return accessible_resources_.AddPattern(pattern); + } + + const URLPatternSet& accessible_resources() const { + return accessible_resources_; + } + private: + // A pattern string that matches partition IDs. + const std::string partition_pattern_; + // A URL pattern set of resources accessible to the given + // |partition_pattern_|. + URLPatternSet accessible_resources_; +}; + + WebviewInfo::WebviewInfo() { } @@ -46,18 +79,20 @@ bool WebviewInfo::IsResourceWebviewAccessible( if (!info) return false; - bool partition_is_privileged = false; - for (size_t i = 0; - i < info->webview_privileged_partitions_.size(); - ++i) { - if (MatchPattern(partition_id, info->webview_privileged_partitions_[i])) { - partition_is_privileged = true; - break; + for (size_t i = 0; i < info->partition_items_.size(); ++i) { + const PartitionItem* const item = info->partition_items_[i]; + if (item->Matches(partition_id) && + extension->ResourceMatches(item->accessible_resources(), + relative_path)) { + return true; } } - return partition_is_privileged && extension->ResourceMatches( - info->webview_accessible_resources_, relative_path); + return false; +} + +void WebviewInfo::AddPartitionItem(scoped_ptr<PartitionItem> item) { + partition_items_.push_back(item.release()); } WebviewHandler::WebviewHandler() { @@ -76,47 +111,66 @@ bool WebviewHandler::Parse(Extension* extension, base::string16* error) { return false; } - const base::ListValue* url_list = NULL; - if (!dict_value->GetList(keys::kWebviewAccessibleResources, - &url_list)) { - *error = base::ASCIIToUTF16(errors::kInvalidWebviewAccessibleResourcesList); + const base::ListValue* partition_list = NULL; + if (!dict_value->GetList(keys::kWebviewPartitions, &partition_list)) { + *error = base::ASCIIToUTF16(errors::kInvalidWebviewPartitionsList); return false; } - for (size_t i = 0; i < url_list->GetSize(); ++i) { - std::string relative_path; - if (!url_list->GetString(i, &relative_path)) { + // The partition list must have at least one entry. + if (partition_list->GetSize() == 0) { + *error = base::ASCIIToUTF16(errors::kInvalidWebviewPartitionsList); + return false; + } + + for (size_t i = 0; i < partition_list->GetSize(); ++i) { + const base::DictionaryValue* partition = NULL; + if (!partition_list->GetDictionary(i, &partition)) { *error = ErrorUtils::FormatErrorMessageUTF16( - errors::kInvalidWebviewAccessibleResource, base::IntToString(i)); + errors::kInvalidWebviewPartition, base::IntToString(i)); return false; } - URLPattern pattern(URLPattern::SCHEME_EXTENSION); - if (pattern.Parse(extension->url().spec()) != URLPattern::PARSE_SUCCESS) { + + std::string partition_pattern; + if (!partition->GetString(keys::kWebviewName, &partition_pattern)) { *error = ErrorUtils::FormatErrorMessageUTF16( - errors::kInvalidURLPatternError, extension->url().spec()); + errors::kInvalidWebviewPartitionName, base::IntToString(i)); return false; } - while (relative_path[0] == '/') - relative_path = relative_path.substr(1, relative_path.length() - 1); - pattern.SetPath(pattern.path() + relative_path); - info->webview_accessible_resources_.AddPattern(pattern); - } - const base::ListValue* partition_list = NULL; - if (!dict_value->GetList(keys::kWebviewPrivilegedPartitions, - &partition_list)) { - *error = base::ASCIIToUTF16(errors::kInvalidWebviewPrivilegedPartitionList); - return false; - } - for (size_t i = 0; i < partition_list->GetSize(); ++i) { - std::string partition_wildcard; - if (!partition_list->GetString(i, &partition_wildcard)) { - *error = ErrorUtils::FormatErrorMessageUTF16( - errors::kInvalidWebviewPrivilegedPartition, base::IntToString(i)); + const base::ListValue* url_list = NULL; + if (!partition->GetList(keys::kWebviewAccessibleResources, + &url_list)) { + *error = base::ASCIIToUTF16( + errors::kInvalidWebviewAccessibleResourcesList); + return false; + } + + // The URL list should have at least one entry. + if (url_list->GetSize() == 0) { + *error = base::ASCIIToUTF16( + errors::kInvalidWebviewAccessibleResourcesList); return false; } - info->webview_privileged_partitions_.push_back(partition_wildcard); + + scoped_ptr<PartitionItem> partition_item( + new PartitionItem(partition_pattern)); + + for (size_t i = 0; i < url_list->GetSize(); ++i) { + std::string relative_path; + if (!url_list->GetString(i, &relative_path)) { + *error = ErrorUtils::FormatErrorMessageUTF16( + errors::kInvalidWebviewAccessibleResource, base::IntToString(i)); + return false; + } + URLPattern pattern(URLPattern::SCHEME_EXTENSION, + Extension::GetResourceURL(extension->url(), + relative_path).spec()); + partition_item->AddPattern(pattern); + } + info->AddPartitionItem(partition_item.Pass()); } + extension->SetManifestData(keys::kWebviewAccessibleResources, info.release()); return true; } diff --git a/extensions/common/manifest_handlers/webview_info.h b/extensions/common/manifest_handlers/webview_info.h index d32d145..dcdb400 100644 --- a/extensions/common/manifest_handlers/webview_info.h +++ b/extensions/common/manifest_handlers/webview_info.h @@ -7,15 +7,19 @@ #include <string> +#include "base/memory/scoped_vector.h" #include "extensions/common/extension.h" #include "extensions/common/manifest_handler.h" namespace extensions { -// A structure to hold the <webview> accessible extension resources +class PartitionItem; + +// A class to hold the <webview> accessible extension resources // that may be specified in the manifest of an extension using the // "webview" key. -struct WebviewInfo : public Extension::ManifestData { +class WebviewInfo : public Extension::ManifestData { + public: // Define out of line constructor/destructor to please Clang. WebviewInfo(); virtual ~WebviewInfo(); @@ -25,13 +29,10 @@ struct WebviewInfo : public Extension::ManifestData { const std::string& partition_id, const std::string& relative_path); - // Returns true when 'webview_accessible_resources' are defined for the - // app. - static bool HasWebviewAccessibleResources(const Extension* extension); + void AddPartitionItem(scoped_ptr<PartitionItem> item); - // Optional list of webview accessible extension resources. - std::vector<std::string> webview_privileged_partitions_; - URLPatternSet webview_accessible_resources_; + private: + ScopedVector<PartitionItem> partition_items_; }; // Parses the "webview" manifest key. |