Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(107)

Unified Diff: extensions/browser/content_verifier.cc

Issue 647193005: Merge codereview.chromium.org/630243002 onto 2171 branch (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git/+/2171
Patch Set: Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: extensions/browser/content_verifier.cc
diff --git a/extensions/browser/content_verifier.cc b/extensions/browser/content_verifier.cc
index 9418fe364662bee1310f18ef6ae594d9c2b97799..8c05f1267f88771c23deaf0d1b6a0e8e2efbfcc4 100644
--- a/extensions/browser/content_verifier.cc
+++ b/extensions/browser/content_verifier.cc
@@ -8,6 +8,7 @@
#include "base/files/file_path.h"
#include "base/stl_util.h"
+#include "base/strings/string_util.h"
#include "content/public/browser/browser_thread.h"
#include "extensions/browser/content_hash_fetcher.h"
#include "extensions/browser/content_hash_reader.h"
@@ -107,6 +108,28 @@ void ContentVerifier::VerifyFailed(const std::string& extension_id,
}
}
+static base::FilePath MakeImagePathRelative(const base::FilePath& path) {
+ if (path.ReferencesParent())
+ return base::FilePath();
+
+ std::vector<base::FilePath::StringType> parts;
+ path.GetComponents(&parts);
+ if (parts.empty())
+ return base::FilePath();
+
+ // Remove the first component if it is '.' or '/' or '//'.
+ const base::FilePath::StringType separators(
+ base::FilePath::kSeparators, base::FilePath::kSeparatorsLength);
+ if (!parts[0].empty() &&
+ (parts[0] == base::FilePath::kCurrentDirectory ||
+ parts[0].find_first_not_of(separators) == std::string::npos))
+ parts.erase(parts.begin());
+
+ // Note that elsewhere we always normalize path separators to '/' so this
+ // should work for all platforms.
+ return base::FilePath(JoinString(parts, '/'));
+}
+
void ContentVerifier::OnExtensionLoaded(
content::BrowserContext* browser_context,
const Extension* extension) {
@@ -115,9 +138,21 @@ void ContentVerifier::OnExtensionLoaded(
ContentVerifierDelegate::Mode mode = delegate_->ShouldBeVerified(*extension);
if (mode != ContentVerifierDelegate::NONE) {
+ // The browser image paths from the extension may not be relative (eg
+ // they might have leading '/' or './'), so we strip those to make
+ // comparing to actual relative paths work later on.
+ std::set<base::FilePath> original_image_paths =
+ delegate_->GetBrowserImagePaths(extension);
+
+ scoped_ptr<std::set<base::FilePath>> image_paths(
+ new std::set<base::FilePath>);
+ for (const auto& path : original_image_paths) {
+ image_paths->insert(MakeImagePathRelative(path));
+ }
+
scoped_ptr<ContentVerifierIOData::ExtensionData> data(
new ContentVerifierIOData::ExtensionData(
- delegate_->GetBrowserImagePaths(extension),
+ image_paths.Pass(),
extension->version() ? *extension->version() : base::Version()));
content::BrowserThread::PostTask(content::BrowserThread::IO,
FROM_HERE,
@@ -196,7 +231,7 @@ bool ContentVerifier::ShouldVerifyAnyPaths(
if (!data)
return false;
- const std::set<base::FilePath>& browser_images = data->browser_image_paths;
+ const std::set<base::FilePath>& browser_images = *(data->browser_image_paths);
base::FilePath locales_dir = extension_root.Append(kLocaleFolder);
scoped_ptr<std::set<std::string> > all_locales;
« no previous file with comments | « chrome/test/data/extensions/content_verifier/dot_slash_paths/page2.js ('k') | extensions/browser/content_verifier_io_data.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698