// 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_H_
#define EXTENSIONS_RENDERER_USER_SCRIPT_SET_H_

#include <set>
#include <string>

#include "base/basictypes.h"
#include "base/macros.h"
#include "base/memory/scoped_ptr.h"
#include "base/memory/scoped_vector.h"
#include "base/memory/shared_memory.h"
#include "base/observer_list.h"
#include "content/public/renderer/render_process_observer.h"
#include "extensions/common/user_script.h"

class GURL;

namespace blink {
class WebFrame;
}

namespace extensions {
class Extension;
class ExtensionSet;
class ScriptInjection;

// The UserScriptSet is a collection of UserScripts which knows how to update
// itself from SharedMemory and create ScriptInjections for UserScripts to
// inject on a page.
class UserScriptSet {
 public:
  class Observer {
   public:
    virtual void OnUserScriptsUpdated(
        const std::set<std::string>& changed_extensions,
        const std::vector<UserScript*>& scripts) = 0;
  };

  explicit UserScriptSet(const ExtensionSet* extensions);
  ~UserScriptSet();

  // Adds or removes observers.
  void AddObserver(Observer* observer);
  void RemoveObserver(Observer* observer);

  // Appends the ids of the extensions that have user scripts to |ids|.
  void GetActiveExtensionIds(std::set<std::string>* ids) const;

  // Populate |injections| with any ScriptInjections that should run on the
  // given |web_frame| and |tab_id|, at the given |run_location|.
  // |extensions| is passed in to verify the corresponding extension is still
  // valid.
  void GetInjections(ScopedVector<ScriptInjection>* injections,
                     blink::WebFrame* web_frame,
                     int tab_id,
                     UserScript::RunLocation run_location);

  // Updates scripts given the shared memory region containing user scripts.
  // Returns true if the scripts were successfully updated.
  bool UpdateUserScripts(base::SharedMemoryHandle shared_memory,
                         const std::set<std::string>& changed_extensions);

  const std::vector<UserScript*>& scripts() const { return scripts_.get(); }

 private:
  // Returns a new ScriptInjection for the given |script| to execute in the
  // |web_frame|, or NULL if the script should not execute.
  scoped_ptr<ScriptInjection> GetInjectionForScript(
      UserScript* script,
      blink::WebFrame* web_frame,
      int tab_id,
      UserScript::RunLocation run_location,
      const GURL& document_url,
      const Extension* extension);

  // Shared memory containing raw script data.
  scoped_ptr<base::SharedMemory> shared_memory_;

  // The set of all known extensions. Owned by the Dispatcher.
  const ExtensionSet* extensions_;

  // The UserScripts this injector manages.
  ScopedVector<UserScript> scripts_;

  // The associated observers.
  ObserverList<Observer> observers_;

  DISALLOW_COPY_AND_ASSIGN(UserScriptSet);
};

}  // namespace extensions

#endif  // EXTENSIONS_RENDERER_USER_SCRIPT_SET_H_
