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