// Copyright 2014 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 COMPONENTS_TRANSLATE_CONTENT_COMMON_CLD_DATA_SOURCE_H_ #define COMPONENTS_TRANSLATE_CONTENT_COMMON_CLD_DATA_SOURCE_H_ #include #include "base/files/file_path.h" #include "base/macros.h" #include "base/synchronization/lock.h" namespace component_updater { // For friend-class declaration, see private section at bottom of class. class CldComponentInstallerTest; } namespace translate { // Provides high-level functionality related to a CLD Data Source. class CldDataSource { public: // Generally not used by Chromium code, but available for embedders to // configure additional data sources as subclasses. // Chromium code should use the getters (GetStaticDataSource(), // GetStandaloneDataSource(), and GetComponentDataSource()) and checkers // (IsUsingStaticDataSource(), IsUsingStandaloneDataSource() and // IsUsingComponentDataSource()) instead as appropriate. CldDataSource(); virtual ~CldDataSource() {} // Returns the symbolic name of the data source. In the Chromium // open-source tree, the following data sources exist: // static uses the static_[browser|renderer]_cld_data_provider // implementations. // standalone uses the data_file_[browser|renderer]_cld_data_provider // implementations. // component also uses the data_file_[browser|renderer]_cld_data_provider // implementations. // // Other implementations based upon Chromium may provide CLD differently and // may have other names. // This method is threadsafe. virtual std::string GetName(); // For data sources that support a separate CLD data file, configures the path // of that data file. // // The 'component' and 'standalone' data sources need this method to be called // in order to locate the CLD data on disk. // If the data source doesn't need or doesn't support such configuration, this // function is a no-op. This is the case for, e.g., the static data source. // This method is threadsafe. virtual void SetCldDataFilePath(const base::FilePath& path); // Returns the path most recently set by SetCldDataFilePath. The initial value // prior to any such call is the empty path. If the data source doesn't // support a data file, returns the empty path. // This method is threadsafe. virtual base::FilePath GetCldDataFilePath(); // Sets the default data source for this process, i.e. the data source to be // used unless the embedder calls Set(CldDatasource*). This is the method // that normal (i.e., non-test) Chromium code should use; embedders can and // should use the unconditional Set(CldDataSource*) method instead. If a // default data source has already been set, this method does nothing. static void SetDefault(CldDataSource* data_source); // Unconditionally sets the data source for this process, overwriting any // previously-configured default. Normal Chromium code should never use this // method; it is provided for embedders to inject a data source from outside // of the Chromium code base. Test code can also use this method to force the // runtime to have a desired behavior. static void Set(CldDataSource* data_source); // Returns the data source for this process. Guaranteed to never be null. // If no instance has been set, this returns the same object obtained by // calling GetStaticDataSource(), which is always safe but may fail to // function if the CLD data is not *actually* statically linked. static CldDataSource* Get(); // Fetch the global instance of the "static" data source. // Only use to call SetDefault(CldDataSource*) or Set(CldDataSource*). static CldDataSource* GetStaticDataSource(); // Returns true if and only if the data source returned by Get() is the // "static" data source. static bool IsUsingStaticDataSource(); // Fetch the global instance of the "standalone" data source. // Only use to call SetDefault(CldDataSource*) or Set(CldDataSource*). static CldDataSource* GetStandaloneDataSource(); // Returns true if and only if the data source returned by Get() is the // "static" data source. static bool IsUsingStandaloneDataSource(); // Fetch the global instance of the "component" data source. // Only use to call SetDefault(CldDataSource*) or Set(CldDataSource*). static CldDataSource* GetComponentDataSource(); // Returns true if and only if the data source returned by Get() is the // "static" data source. static bool IsUsingComponentDataSource(); private: friend class component_updater::CldComponentInstallerTest; // For unit test code ONLY. Under normal circumstances the calls to // SetCldDataFilePath() and GetCldDataFilePath() have a DHECK intended to // perform a sanity check on the runtime CLD data source configuration; no // production code should be calling SetCldDataFilePath() or // GetCldDataFilePath() unless the "component" or "standalone" data source is // being used. Unit tests will generally be built with the "static" data // source, and this method allows tests to bypass the DCHECK for testing // purposes. // // Unit tests that use this function should use it in SetUp(), and then call // EnableSanityChecksForTest() in TearDown() for maximum safety. static void DisableSanityChecksForTest(); // This method [re-]enables the sanity check disabled by // DisableSanityChecksForTest(). static void EnableSanityChecksForTest(); base::FilePath m_cached_filepath; // Guarded by m_file_lock base::Lock m_file_lock; // Guards m_cached_filepath DISALLOW_COPY_AND_ASSIGN(CldDataSource); }; } // namespace translate #endif // COMPONENTS_TRANSLATE_CONTENT_COMMON_CLD_DATA_SOURCE_H_