16e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
26e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
36e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// found in the LICENSE file.
46e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
56e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#ifndef CHROME_BROWSER_EXTENSIONS_DECLARATIVE_USER_SCRIPT_MASTER_H_
66e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#define CHROME_BROWSER_EXTENSIONS_DECLARATIVE_USER_SCRIPT_MASTER_H_
76e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
86e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "base/scoped_observer.h"
96e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/browser/extensions/user_script_loader.h"
106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "extensions/browser/extension_registry_observer.h"
116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "extensions/common/extension.h"
126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)class Profile;
146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)namespace extensions {
166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)class ExtensionRegistry;
186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)class UserScript;
196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// Manages declarative user scripts for a single extension. Owns a
216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// UserScriptLoader to which file loading and shared memory management
226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// operations are delegated, and provides an interface for adding, removing,
236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// and clearing scripts.
246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)class DeclarativeUserScriptMaster : public ExtensionRegistryObserver {
256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) public:
266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DeclarativeUserScriptMaster(Profile* profile,
276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                              const ExtensionId& extension_id);
286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual ~DeclarativeUserScriptMaster();
296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Adds script to shared memory region. This may not happen right away if a
316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // script load is in progress.
326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  void AddScript(const UserScript& script);
336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Removes script from shared memory region. This may not happen right away if
356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // a script load is in progress.
366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  void RemoveScript(const UserScript& script);
376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Removes all scripts from shared memory region. This may not happen right
396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // away if a script load is in progress.
406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  void ClearScripts();
416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  const ExtensionId& extension_id() const { return extension_id_; }
436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) private:
456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // ExtensionRegistryObserver implementation.
466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual void OnExtensionUnloaded(
476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      content::BrowserContext* browser_context,
486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      const Extension* extension,
496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      UnloadedExtensionInfo::Reason reason) OVERRIDE;
506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // ID of extension that owns scripts that this component manages.
526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ExtensionId extension_id_;
536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Script loader that handles loading contents of scripts into shared memory
556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // and notifying renderers of script updates.
566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  UserScriptLoader loader_;
576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ScopedObserver<ExtensionRegistry, ExtensionRegistryObserver>
596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      extension_registry_observer_;
606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DeclarativeUserScriptMaster);
626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)};
636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}  // namespace extensions
656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#endif  // CHROME_BROWSER_EXTENSIONS_DECLARATIVE_USER_SCRIPT_MASTER_H_
67