// Copyright (c) 2011 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_util.h" #include "base/logging.h" #include "base/threading/thread_restrictions.h" ExtensionResource::ExtensionResource() { } ExtensionResource::ExtensionResource(const std::string& extension_id, const FilePath& extension_root, const FilePath& relative_path) : extension_id_(extension_id), extension_root_(extension_root), relative_path_(relative_path) { } ExtensionResource::~ExtensionResource() {} const FilePath& ExtensionResource::GetFilePath() const { if (extension_root_.empty() || relative_path_.empty()) { DCHECK(full_resource_path_.empty()); return full_resource_path_; } // We've already checked, just return last value. if (!full_resource_path_.empty()) return full_resource_path_; full_resource_path_ = GetFilePath(extension_root_, relative_path_); return full_resource_path_; } // static FilePath ExtensionResource::GetFilePath( const FilePath& extension_root, const FilePath& relative_path) { // We need to resolve the parent references in the extension_root // path on its own because IsParent doesn't like parent references. FilePath clean_extension_root(extension_root); if (!file_util::AbsolutePath(&clean_extension_root)) return FilePath(); FilePath full_path = clean_extension_root.Append(relative_path); // We must resolve the absolute path of the combined path when // the relative path contains references to a parent folder (i.e., '..'). // We also check if the path exists because the posix version of AbsolutePath // will fail if the path doesn't exist, and we want the same behavior on // Windows... So until the posix and Windows version of AbsolutePath are // unified, we need an extra call to PathExists, unfortunately. // TODO(mad): Fix this once AbsolutePath is unified. if (file_util::AbsolutePath(&full_path) && file_util::PathExists(full_path) && clean_extension_root.IsParent(full_path)) { return full_path; } return FilePath(); } // Unit-testing helpers. FilePath::StringType ExtensionResource::NormalizeSeperators( const FilePath::StringType& path) const { #if defined(FILE_PATH_USES_WIN_SEPARATORS) FilePath::StringType win_path = path; for (size_t i = 0; i < win_path.length(); i++) { if (FilePath::IsSeparator(win_path[i])) win_path[i] = FilePath::kSeparators[0]; } return win_path; #else return path; #endif // FILE_PATH_USES_WIN_SEPARATORS } bool ExtensionResource::ComparePathWithDefault(const FilePath& path) const { // Make sure we have a cached value to test against... if (full_resource_path_.empty()) GetFilePath(); if (NormalizeSeperators(path.value()) == NormalizeSeperators(full_resource_path_.value())) { return true; } else { return false; } }