15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_EXTENSIONS_EXTERNAL_LOADER_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_EXTENSIONS_EXTERNAL_LOADER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DictionaryValue;
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExternalProviderImpl;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Base class for gathering a list of external extensions. Subclasses
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// implement loading from registry, JSON file, policy.
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Instances are owned by ExternalProviderImpl objects.
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Instances are created on the UI thread and expect public method calls from
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the UI thread. Some subclasses introduce new methods that are executed on the
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// FILE thread.
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The sequence of loading the extension list:
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1.) StartLoading() - checks if a loading task is already running
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2.) Load() - implemented in subclasses
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3.) LoadFinished()
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 4.) owner_->SetPrefs()
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExternalLoader : public base::RefCountedThreadSafe<ExternalLoader> {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExternalLoader();
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Specifies the provider that owns this object.
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Init(ExternalProviderImpl* owner);
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called by the owner before it gets deleted.
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OwnerShutdown();
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initiates the possibly asynchronous loading of extension list.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // It is the responsibility of the caller to ensure that calls to
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // this method do not overlap with each other.
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Implementations of this method should save the loaded results
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // in prefs_ and then call LoadFinished.
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void StartLoading() = 0;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Some external providers allow relative file paths to local CRX files.
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Subclasses that want this behavior should override this method to
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // return the absolute path from which relative paths should be resolved.
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // By default, return an empty path, which indicates that relative paths
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // are not allowed.
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual const base::FilePath GetBaseCrxFilePath();
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ExternalLoader();
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notifies the provider that the list of extensions has been loaded.
5858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  virtual void LoadFinished();
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used for passing the list of extensions from the method that loads them
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to |LoadFinished|. To ensure thread safety, the rules are the following:
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // if this value is written on another thread than the UI, then it should
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // only be written in a task that was posted from |StartLoading|. After that,
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // this task should invoke |LoadFinished| with a PostTask. This scheme of
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // posting tasks will avoid concurrent access and imply the necessary memory
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // barriers.
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::DictionaryValue> prefs_;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class base::RefCountedThreadSafe<ExternalLoader>;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExternalProviderImpl* owner_;  // weak
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ExternalLoader);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace extensions
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_EXTENSIONS_EXTERNAL_LOADER_H_
80