// Copyright 2014 The Chromium Authors
// 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 <map>
#include <memory>
#include <set>
#include <string>
#include <vector>

#include "base/memory/read_only_shared_memory_region.h"
#include "base/observer_list.h"
#include "extensions/common/mojom/host_id.mojom-forward.h"
#include "extensions/common/mojom/run_location.mojom-shared.h"
#include "extensions/common/user_script.h"
#include "third_party/blink/public/platform/web_string.h"

class GURL;

namespace content {
class RenderFrame;
}

namespace extensions {
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:
    // Called when the set of user scripts is updated, which invalidates all
    // previous script objects from this UserScriptSet.
    virtual void OnUserScriptsUpdated() = 0;

    // Called when this UserScriptSet is destroyed.
    virtual void OnUserScriptSetDestroyed() = 0;
  };

  explicit UserScriptSet(mojom::HostID host_id);

  UserScriptSet(const UserScriptSet&) = delete;
  UserScriptSet& operator=(const UserScriptSet&) = delete;

  ~UserScriptSet();

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

  // Append any ScriptInjections that should run on the given `render_frame` and
  // `tab_id`, at the given `run_location`, to `injections`.
  // `extensions` is passed in to verify the corresponding extension is still
  // valid.
  void GetInjections(std::vector<std::unique_ptr<ScriptInjection>>* injections,
                     content::RenderFrame* render_frame,
                     int tab_id,
                     mojom::RunLocation run_location,
                     bool log_activity);

  std::unique_ptr<ScriptInjection> GetDeclarativeScriptInjection(
      const std::string& script_id,
      content::RenderFrame* render_frame,
      int tab_id,
      mojom::RunLocation run_location,
      const GURL& document_url,
      bool log_activity);

  // Updates scripts given the shared memory region containing user scripts.
  // Returns true if the scripts were successfully updated.
  bool UpdateUserScripts(base::ReadOnlySharedMemoryRegion shared_memory);

  bool HasScripts() const { return !scripts_.empty(); }

  // Clears all user scripts managed by this set and notifies observers.
  void ClearUserScripts();

  // Returns the contents of a script file.
  // Note that copying is cheap as this uses WebString.
  blink::WebString GetJsSource(const UserScript::Content& file,
                               bool emulate_greasemonkey);
  blink::WebString GetCssSource(const UserScript::Content& file);

 private:
  // Returns a new ScriptInjection for the given `script` to execute in the
  // `render_frame`, or NULL if the script should not execute.
  std::unique_ptr<ScriptInjection> GetInjectionForScript(
      const UserScript* script,
      content::RenderFrame* render_frame,
      int tab_id,
      mojom::RunLocation run_location,
      const GURL& document_url,
      bool is_declarative,
      bool log_activity);

  // Shared memory mapping containing raw script data.
  base::ReadOnlySharedMemoryMapping shared_memory_mapping_;

  // The UserScripts this injector manages.
  UserScriptList scripts_;

  // Map of user script file url -> source.
  std::map<GURL, blink::WebString> script_sources_;

  // The HostID which `scripts_` is associated with.
  mojom::HostID host_id_;

  // The associated observers.
  base::ObserverList<Observer>::Unchecked observers_;
};

}  // namespace extensions

#endif  // EXTENSIONS_RENDERER_USER_SCRIPT_SET_H_
