1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#ifndef CHROME_BROWSER_EXTENSIONS_EXTERNAL_LOADER_H_ 6#define CHROME_BROWSER_EXTENSIONS_EXTERNAL_LOADER_H_ 7 8#include "base/files/file_path.h" 9#include "base/memory/ref_counted.h" 10#include "base/memory/scoped_ptr.h" 11 12namespace base { 13class DictionaryValue; 14} 15 16namespace extensions { 17class ExternalProviderImpl; 18 19// Base class for gathering a list of external extensions. Subclasses 20// implement loading from registry, JSON file, policy. 21// Instances are owned by ExternalProviderImpl objects. 22// Instances are created on the UI thread and expect public method calls from 23// the UI thread. Some subclasses introduce new methods that are executed on the 24// FILE thread. 25// The sequence of loading the extension list: 26// 1.) StartLoading() - checks if a loading task is already running 27// 2.) Load() - implemented in subclasses 28// 3.) LoadFinished() 29// 4.) owner_->SetPrefs() 30class ExternalLoader : public base::RefCountedThreadSafe<ExternalLoader> { 31 public: 32 ExternalLoader(); 33 34 // Specifies the provider that owns this object. 35 void Init(ExternalProviderImpl* owner); 36 37 // Called by the owner before it gets deleted. 38 void OwnerShutdown(); 39 40 // Initiates the possibly asynchronous loading of extension list. 41 // It is the responsibility of the caller to ensure that calls to 42 // this method do not overlap with each other. 43 // Implementations of this method should save the loaded results 44 // in prefs_ and then call LoadFinished. 45 virtual void StartLoading() = 0; 46 47 // Some external providers allow relative file paths to local CRX files. 48 // Subclasses that want this behavior should override this method to 49 // return the absolute path from which relative paths should be resolved. 50 // By default, return an empty path, which indicates that relative paths 51 // are not allowed. 52 virtual const base::FilePath GetBaseCrxFilePath(); 53 54 protected: 55 virtual ~ExternalLoader(); 56 57 // Notifies the provider that the list of extensions has been loaded. 58 virtual void LoadFinished(); 59 60 // Used for passing the list of extensions from the method that loads them 61 // to |LoadFinished|. To ensure thread safety, the rules are the following: 62 // if this value is written on another thread than the UI, then it should 63 // only be written in a task that was posted from |StartLoading|. After that, 64 // this task should invoke |LoadFinished| with a PostTask. This scheme of 65 // posting tasks will avoid concurrent access and imply the necessary memory 66 // barriers. 67 scoped_ptr<base::DictionaryValue> prefs_; 68 69 private: 70 friend class base::RefCountedThreadSafe<ExternalLoader>; 71 72 ExternalProviderImpl* owner_; // weak 73 74 DISALLOW_COPY_AND_ASSIGN(ExternalLoader); 75}; 76 77} // namespace extensions 78 79#endif // CHROME_BROWSER_EXTENSIONS_EXTERNAL_LOADER_H_ 80