// 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 EXTENSIONS_RENDERER_USER_SCRIPT_SET_MANAGER_H_
#define EXTENSIONS_RENDERER_USER_SCRIPT_SET_MANAGER_H_
#include <map>
#include <set>
#include <string>
#include "base/memory/linked_ptr.h"
#include "base/memory/shared_memory.h"
#include "base/observer_list.h"
#include "content/public/renderer/render_process_observer.h"
#include "extensions/common/extension.h"
#include "extensions/common/user_script.h"
#include "extensions/renderer/user_script_set.h"
namespace IPC {
class Message;
}
namespace blink {
class WebFrame;
}
namespace extensions {
class ExtensionSet;
class ScriptInjection;
// Manager for separate UserScriptSets, one for each shared memory region.
// Regions are organized as follows:
// static_scripts -- contains all extensions' scripts that are statically
// declared in the extension manifest.
// programmatic_scripts -- one region per extension containing only
// programmatically-declared scripts, instantiated
// when an extension first creates a declarative rule
// that would, if triggered, request a script injection.
class UserScriptSetManager : public content::RenderProcessObserver {
public:
// Like a UserScriptSet::Observer, but automatically subscribes to all sets
// associated with the manager.
class Observer {
public:
virtual void OnUserScriptsUpdated(
const std::set<std::string>& changed_extensions,
const std::vector<UserScript*>& scripts) = 0;
};
UserScriptSetManager(const ExtensionSet* extensions);
virtual ~UserScriptSetManager();
void AddObserver(Observer* observer);
void RemoveObserver(Observer* observer);
// Looks up the script injection associated with |script_id| and |extension|
// in the context of the given |web_frame|, |tab_id|, and |url|.
scoped_ptr<ScriptInjection> GetInjectionForDeclarativeScript(
int script_id,
blink::WebFrame* web_frame,
int tab_id,
const GURL& url,
const Extension* extension);
// Put all injections from |static_scripts| and each of
// |programmatic_scripts_| into |injections|.
void GetAllInjections(ScopedVector<ScriptInjection>* injections,
blink::WebFrame* web_frame,
int tab_id,
UserScript::RunLocation run_location);
// Get active extension IDs from |static_scripts| and each of
// |programmatic_scripts_|.
void GetAllActiveExtensionIds(std::set<std::string>* ids) const;
const UserScriptSet* static_scripts() const { return &static_scripts_; }
private:
// Map for per-extension sets that may be defined programmatically.
typedef std::map<ExtensionId, linked_ptr<UserScriptSet> > UserScriptSetMap;
// content::RenderProcessObserver implementation.
virtual bool OnControlMessageReceived(const IPC::Message& message) OVERRIDE;
UserScriptSet* GetProgrammaticScriptsByExtension(
const ExtensionId& extensionId);
// Handle the UpdateUserScripts extension message.
void OnUpdateUserScripts(base::SharedMemoryHandle shared_memory,
const ExtensionId& extension_id,
const std::set<std::string>& changed_extensions);
// Scripts statically defined in extension manifests.
UserScriptSet static_scripts_;
// Scripts programmatically-defined through API calls (initialized and stored
// per-extension).
UserScriptSetMap programmatic_scripts_;
// The set of all known extensions. Owned by the Dispatcher.
const ExtensionSet* extensions_;
// The associated observers.
ObserverList<Observer> observers_;
DISALLOW_COPY_AND_ASSIGN(UserScriptSetManager);
};
} // namespace extensions
#endif // EXTENSIONS_RENDERER_USER_SCRIPT_SET_MANAGER_H_