| // Copyright (c) 2012 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. |
| |
| #ifndef EXTENSIONS_COMMON_EXTENSION_RESOURCE_H_ |
| #define EXTENSIONS_COMMON_EXTENSION_RESOURCE_H_ |
| |
| #include "base/files/file_path.h" |
| #include "extensions/common/extension_id.h" |
| |
| namespace extensions { |
| |
| // Represents a resource inside an extension. Hence a resource pointing to the |
| // root extension directory isn't a valid ExtensionResource. |
| // Examples include an image, or a JavaScript file. This is more complicated |
| // than just a simple FilePath because extension resources can come from |
| // multiple physical file locations depending on locale. |
| class ExtensionResource { |
| public: |
| // SymlinkPolicy decides whether we'll allow resources to be a symlink to |
| // anywhere, or whether they must end up within the extension root. |
| enum SymlinkPolicy { |
| SYMLINKS_MUST_RESOLVE_WITHIN_ROOT, |
| FOLLOW_SYMLINKS_ANYWHERE, |
| }; |
| |
| ExtensionResource(); |
| ExtensionResource(const ExtensionId& extension_id, |
| const base::FilePath& extension_root, |
| const base::FilePath& relative_path); |
| ExtensionResource(const ExtensionResource& other); |
| ExtensionResource(ExtensionResource&& other); |
| ExtensionResource& operator=(ExtensionResource&& other); |
| |
| ~ExtensionResource(); |
| |
| // set_follow_symlinks_anywhere allows the resource to be a symlink to |
| // anywhere in the filesystem. By default, resources have to be within |
| // |extension_root| after resolving symlinks. |
| void set_follow_symlinks_anywhere(); |
| |
| // Returns actual path to the resource (default or locale specific). In the |
| // browser process, this will DCHECK if not called on the file thread. To |
| // easily load extension images on the UI thread, see ImageLoader. |
| const base::FilePath& GetFilePath() const; |
| |
| // Gets the physical file path for the extension resource, taking into account |
| // localization. In the browser process, this will DCHECK if not called on the |
| // file thread. To easily load extension images on the UI thread, see |
| // ImageLoader. |
| // |
| // The relative path must not resolve to a location outside of |
| // |extension_root|. Iff |file_can_symlink_outside_root| is true, then the |
| // file can be a symlink that links outside of |extension_root|. |
| static base::FilePath GetFilePath(const base::FilePath& extension_root, |
| const base::FilePath& relative_path, |
| SymlinkPolicy symlink_policy); |
| |
| // Getters |
| const ExtensionId& extension_id() const { return extension_id_; } |
| |
| // Note that this might be empty for a valid ExtensionResource since dummy |
| // Extension objects may be created with an empty extension root path in code. |
| const base::FilePath& extension_root() const { return extension_root_; } |
| |
| const base::FilePath& relative_path() const { return relative_path_; } |
| |
| bool empty() const { return relative_path_.empty(); } |
| |
| private: |
| // The id of the extension that this resource is associated with. |
| ExtensionId extension_id_; |
| |
| // Extension root. |
| base::FilePath extension_root_; |
| |
| // Relative path to resource. |
| base::FilePath relative_path_; |
| |
| // If |follow_symlinks_anywhere_| is true then the resource itself must be |
| // within |extension_root|, but it can be a symlink to a file that is not. |
| bool follow_symlinks_anywhere_; |
| |
| // Full path to extension resource. Starts empty. |
| mutable base::FilePath full_resource_path_; |
| }; |
| |
| } // namespace extensions |
| |
| #endif // EXTENSIONS_COMMON_EXTENSION_RESOURCE_H_ |