| Index: chrome/browser/extensions/extension_preference_helpers.cc
|
| diff --git a/chrome/browser/extensions/extension_preference_helpers.cc b/chrome/browser/extensions/extension_preference_helpers.cc
|
| index 55bbe1b179844306f0b109149f0107cf5d43a703..64d625b691fa1ed081a37ae3359fdb042615b9c5 100644
|
| --- a/chrome/browser/extensions/extension_preference_helpers.cc
|
| +++ b/chrome/browser/extensions/extension_preference_helpers.cc
|
| @@ -1,15 +1,29 @@
|
| -// Copyright (c) 2011 The Chromium Authors. All rights reserved.
|
| +// Copyright (c) 2012 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.
|
|
|
| #include "chrome/browser/extensions/extension_preference_helpers.h"
|
|
|
| +#include "base/json/json_writer.h"
|
| +#include "base/values.h"
|
| +#include "chrome/browser/extensions/extension_event_router.h"
|
| +#include "chrome/browser/extensions/extension_prefs.h"
|
| +#include "chrome/browser/extensions/extension_service.h"
|
| +#include "chrome/browser/profiles/profile.h"
|
| +
|
| namespace {
|
|
|
| const char kIncognitoPersistent[] = "incognito_persistent";
|
| const char kIncognitoSessionOnly[] = "incognito_session_only";
|
| const char kRegular[] = "regular";
|
|
|
| +const char kLevelOfControlKey[] = "levelOfControl";
|
| +
|
| +const char kNotControllable[] = "not_controllable";
|
| +const char kControlledByOtherExtensions[] = "controlled_by_other_extensions";
|
| +const char kControllableByThisExtension[] = "controllable_by_this_extension";
|
| +const char kControlledByThisExtension[] = "controlled_by_this_extension";
|
| +
|
| } // namespace
|
|
|
| namespace extension_preference_helpers {
|
| @@ -26,4 +40,63 @@ bool StringToScope(const std::string& s, ExtensionPrefsScope* scope) {
|
| return true;
|
| }
|
|
|
| +const char* GetLevelOfControl(
|
| + Profile* profile,
|
| + const std::string& extension_id,
|
| + const std::string& browser_pref,
|
| + bool incognito) {
|
| + PrefService* prefs = incognito ? profile->GetOffTheRecordPrefs()
|
| + : profile->GetPrefs();
|
| + const PrefService::Preference* pref =
|
| + prefs->FindPreference(browser_pref.c_str());
|
| + CHECK(pref);
|
| + ExtensionPrefs* ep = profile->GetExtensionService()->extension_prefs();
|
| +
|
| + if (!pref->IsExtensionModifiable())
|
| + return kNotControllable;
|
| +
|
| + if (ep->DoesExtensionControlPref(extension_id, browser_pref, incognito))
|
| + return kControlledByThisExtension;
|
| +
|
| + if (ep->CanExtensionControlPref(extension_id, browser_pref, incognito))
|
| + return kControllableByThisExtension;
|
| +
|
| + return kControlledByOtherExtensions;
|
| +}
|
| +
|
| +void DispatchEventToExtensions(
|
| + Profile* profile,
|
| + const std::string& event_name,
|
| + ListValue* args,
|
| + ExtensionAPIPermission::ID permission,
|
| + bool incognito,
|
| + const std::string& browser_pref) {
|
| + ExtensionEventRouter* router = profile->GetExtensionEventRouter();
|
| + if (!router || !router->HasEventListener(event_name))
|
| + return;
|
| + ExtensionService* extension_service = profile->GetExtensionService();
|
| + const ExtensionSet* extensions = extension_service->extensions();
|
| + for (ExtensionSet::const_iterator it = extensions->begin();
|
| + it != extensions->end(); ++it) {
|
| + std::string extension_id = (*it)->id();
|
| + // TODO(bauerb): Only iterate over registered event listeners.
|
| + if (router->ExtensionHasEventListener(extension_id, event_name) &&
|
| + (*it)->HasAPIPermission(permission) &&
|
| + (!incognito || extension_service->CanCrossIncognito(*it))) {
|
| + // Inject level of control key-value.
|
| + DictionaryValue* dict;
|
| + bool rv = args->GetDictionary(0, &dict);
|
| + DCHECK(rv);
|
| + std::string level_of_control =
|
| + GetLevelOfControl(profile, extension_id, browser_pref, incognito);
|
| + dict->SetString(kLevelOfControlKey, level_of_control);
|
| +
|
| + std::string json_args;
|
| + base::JSONWriter::Write(args, &json_args);
|
| + router->DispatchEventToExtension(
|
| + extension_id, event_name, json_args, NULL, GURL());
|
| + }
|
| + }
|
| +}
|
| +
|
| } // namespace extension_preference_helpers
|
|
|