Index: chrome/common/extensions/extension_resource.cc |
=================================================================== |
--- chrome/common/extensions/extension_resource.cc (revision 0) |
+++ chrome/common/extensions/extension_resource.cc (revision 0) |
@@ -0,0 +1,100 @@ |
+// Copyright (c) 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 "chrome/common/extensions/extension_resource.h" |
+ |
+#include "base/file_path.h" |
+#include "base/file_util.h" |
+#include "base/string_util.h" |
+#include "chrome/browser/extensions/extension_l10n_util.h" |
+#include "googleurl/src/gurl.h" |
+#include "net/base/net_util.h" |
+ |
+ExtensionResource::ExtensionResource() { |
+} |
+ |
+ExtensionResource::ExtensionResource(const FilePath& extension_root, |
+ const FilePath& relative_path) |
+ : extension_root_(extension_root), |
+ relative_path_(relative_path) { |
+} |
+ |
+const FilePath& ExtensionResource::GetFilePath() const { |
+ if (extension_root_.empty() || relative_path_.empty()) |
+ return full_resource_path_; |
+ |
+ // We've already checked, just return last value. |
+ if (!full_resource_path_.empty()) |
+ return full_resource_path_; |
+ |
+ // Stat l10n file, and return new path if it exists. |
+ FilePath l10n_relative_path = |
+ extension_l10n_util::GetL10nRelativePath(relative_path_); |
+ full_resource_path_ = CombinePathsSafely(extension_root_, l10n_relative_path); |
+ if (file_util::PathExists(full_resource_path_)) { |
+ return full_resource_path_; |
+ } |
+ |
+ // Fall back to root resource. |
+ full_resource_path_ = CombinePathsSafely(extension_root_, relative_path_); |
+ return full_resource_path_; |
+} |
+ |
+FilePath ExtensionResource::CombinePathsSafely( |
+ const FilePath& extension_path, |
+ const FilePath& relative_resource_path) const { |
+ // Build up a file:// URL and convert that back to a FilePath. This avoids |
+ // URL encoding and path separator issues. |
+ |
+ // Convert the extension's root to a file:// URL. |
+ GURL extension_url = net::FilePathToFileURL(extension_path); |
+ if (!extension_url.is_valid()) |
+ return FilePath(); |
+ |
+ // Append the requested path. |
+ std::string relative_path = |
+ WideToUTF8(relative_resource_path.ToWStringHack()); |
+ GURL::Replacements replacements; |
+ std::string new_path(extension_url.path()); |
+ new_path += "/"; |
+ new_path += relative_path; |
+ replacements.SetPathStr(new_path); |
+ GURL file_url = extension_url.ReplaceComponents(replacements); |
+ if (!file_url.is_valid()) |
+ return FilePath(); |
+ |
+ // Convert the result back to a FilePath. |
+ FilePath ret_val; |
+ if (!net::FileURLToFilePath(file_url, &ret_val)) |
+ return FilePath(); |
+ |
+ // Double-check that the path we ended up with is actually inside the |
+ // extension root. |
+ if (!extension_path.IsParent(ret_val)) |
+ return FilePath(); |
+ |
+ return ret_val; |
+} |
+ |
+// Unittesting helpers. |
+FilePath::StringType ExtensionResource::NormalizeSeperators( |
+ FilePath::StringType path) const { |
+#if defined(FILE_PATH_USES_WIN_SEPARATORS) |
+ FilePath::StringType ret_val; |
+ for (size_t i = 0; i < path.length(); i++) { |
+ if (FilePath::IsSeparator(path[i])) |
+ path[i] = FilePath::kSeparators[0]; |
+ } |
+#endif // FILE_PATH_USES_WIN_SEPARATORS |
+ return path; |
+} |
+ |
+bool ExtensionResource::ComparePathWithDefault(const FilePath& path) const { |
+ if (NormalizeSeperators(path.value()) == |
+ NormalizeSeperators(full_resource_path_.value())) { |
+ return true; |
+ } else { |
+ return false; |
+ } |
+} |
Property changes on: chrome\common\extensions\extension_resource.cc |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |