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)#include "chrome/browser/extensions/shared_user_script_master.h"
66e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
76e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/browser/extensions/extension_util.h"
86e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
96e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/common/extensions/manifest_handlers/content_scripts_handler.h"
106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "extensions/browser/extension_registry.h"
116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)namespace extensions {
136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)SharedUserScriptMaster::SharedUserScriptMaster(Profile* profile)
156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    : loader_(profile,
166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)              std::string() /* owner_extension_id */,
176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)              true /* listen_for_extension_system_loaded */),
186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      profile_(profile),
196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      extension_registry_observer_(this) {
206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  extension_registry_observer_.Add(ExtensionRegistry::Get(profile_));
216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)SharedUserScriptMaster::~SharedUserScriptMaster() {
246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void SharedUserScriptMaster::OnExtensionLoaded(
276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    content::BrowserContext* browser_context,
286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    const Extension* extension) {
296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  loader_.AddScripts(GetScriptsMetadata(extension));
306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void SharedUserScriptMaster::OnExtensionUnloaded(
336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    content::BrowserContext* browser_context,
346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    const Extension* extension,
356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    UnloadedExtensionInfo::Reason reason) {
366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  loader_.RemoveScripts(GetScriptsMetadata(extension));
376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)const std::set<UserScript> SharedUserScriptMaster::GetScriptsMetadata(
406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    const Extension* extension) {
416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  bool incognito_enabled = util::IsIncognitoEnabled(extension->id(), profile_);
426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  const UserScriptList& script_list =
436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      ContentScriptsInfo::GetContentScripts(extension);
446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  std::set<UserScript> script_set;
456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  for (UserScriptList::const_iterator it = script_list.begin();
466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)       it != script_list.end();
476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)       ++it) {
486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    UserScript script = *it;
496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    script.set_incognito_enabled(incognito_enabled);
506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    script_set.insert(script);
516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  return script_set;
546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}  // namespace extensions
57