// 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.

#include "extensions/renderer/user_script_set_manager.h"

#include "base/observer_list.h"
#include "components/crx_file/id_util.h"
#include "content/public/renderer/render_thread.h"
#include "extensions/common/extension_messages.h"
#include "extensions/common/mojom/host_id.mojom.h"
#include "extensions/renderer/dispatcher.h"
#include "extensions/renderer/script_injection.h"
#include "extensions/renderer/user_script_set.h"

namespace extensions {

UserScriptSetManager::UserScriptSetManager()
    : activity_logging_enabled_(false) {
}

UserScriptSetManager::~UserScriptSetManager() {
}

void UserScriptSetManager::AddObserver(Observer* observer) {
  observers_.AddObserver(observer);
}

void UserScriptSetManager::RemoveObserver(Observer* observer) {
  observers_.RemoveObserver(observer);
}

std::unique_ptr<ScriptInjection>
UserScriptSetManager::GetInjectionForDeclarativeScript(
    const std::string& script_id,
    content::RenderFrame* render_frame,
    int tab_id,
    const GURL& url,
    const std::string& extension_id) {
  UserScriptSet* user_script_set = GetScriptsByHostID(
      mojom::HostID(mojom::HostID::HostType::kExtensions, extension_id));
  if (!user_script_set)
    return nullptr;

  return user_script_set->GetDeclarativeScriptInjection(
      script_id, render_frame, tab_id, mojom::RunLocation::kBrowserDriven, url,
      activity_logging_enabled_);
}

void UserScriptSetManager::GetAllInjections(
    std::vector<std::unique_ptr<ScriptInjection>>* injections,
    content::RenderFrame* render_frame,
    int tab_id,
    mojom::RunLocation run_location) {
  for (auto it = scripts_.begin(); it != scripts_.end(); ++it) {
    it->second->GetInjections(injections, render_frame, tab_id, run_location,
                              activity_logging_enabled_);
  }
}

void UserScriptSetManager::GetAllActiveExtensionIds(
    std::set<std::string>* ids) const {
  DCHECK(ids);
  for (auto it = scripts_.cbegin(); it != scripts_.cend(); ++it) {
    if (it->first.type == mojom::HostID::HostType::kExtensions &&
        it->second->HasScripts()) {
      ids->insert(it->first.id);
    }
  }
}

UserScriptSet* UserScriptSetManager::GetScriptsByHostID(
    const mojom::HostID& host_id) {
  UserScriptSetMap::const_iterator it = scripts_.find(host_id);
  return it != scripts_.end() ? it->second.get() : nullptr;
}

void UserScriptSetManager::OnUpdateUserScripts(
    base::ReadOnlySharedMemoryRegion shared_memory,
    const mojom::HostID& host_id) {
  if (!shared_memory.IsValid()) {
    NOTREACHED() << "Bad scripts handle";
    return;
  }

  if (host_id.type == mojom::HostID::HostType::kExtensions &&
      !crx_file::id_util::IdIsValid(host_id.id)) {
    NOTREACHED() << "Invalid extension id: " << host_id.id;
    return;
  }

  auto& scripts = scripts_[host_id];
  if (!scripts)
    scripts = std::make_unique<UserScriptSet>(host_id);

  if (scripts->UpdateUserScripts(std::move(shared_memory))) {
    for (auto& observer : observers_)
      observer.OnUserScriptsUpdated(host_id);
  }
}

void UserScriptSetManager::OnExtensionUnloaded(
    const std::string& extension_id) {
  auto it = scripts_.find(
      mojom::HostID(mojom::HostID::HostType::kExtensions, extension_id));
  if (it != scripts_.end()) {
    it->second->ClearUserScripts();
    scripts_.erase(it);
  }
}

}  // namespace extensions
