// 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. // Implementation of the Chrome Extensions Managed Mode API. #include "chrome/browser/extensions/extension_managed_mode_api.h" #include #include "base/bind.h" #include "base/json/json_writer.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/extensions/extension_event_router.h" #include "chrome/browser/extensions/extension_preference_api_constants.h" #include "chrome/browser/managed_mode.h" #include "chrome/browser/prefs/pref_service.h" #include "chrome/browser/profiles/profile.h" #include "chrome/common/chrome_notification_types.h" #include "chrome/common/pref_names.h" #include "content/public/browser/notification_details.h" namespace { // Event that is fired when we enter or leave managed mode. const char kChangeEventName[] = "experimental.managedMode.onChange"; // Key to report whether the attempt to enter managed mode succeeded. const char kEnterSuccessKey[] = "success"; } // namespace namespace keys = extension_preference_api_constants; ExtensionManagedModeEventRouter::ExtensionManagedModeEventRouter( Profile* profile) : profile_(profile) { } void ExtensionManagedModeEventRouter::Init() { registrar_.Init(g_browser_process->local_state()); registrar_.Add(prefs::kInManagedMode, this); } ExtensionManagedModeEventRouter::~ExtensionManagedModeEventRouter() { } void ExtensionManagedModeEventRouter::Observe( int type, const content::NotificationSource& source, const content::NotificationDetails& details) { DCHECK_EQ(chrome::NOTIFICATION_PREF_CHANGED, type); const std::string& pref_name = *content::Details(details).ptr(); DCHECK_EQ(std::string(prefs::kInManagedMode), pref_name); ListValue args; DictionaryValue* dict = new DictionaryValue(); args.Append(dict); dict->SetBoolean(extension_preference_api_constants::kValue, g_browser_process->local_state()->GetBoolean(prefs::kInManagedMode)); std::string json_args; base::JSONWriter::Write(&args, &json_args); ExtensionEventRouter* event_router = profile_->GetExtensionEventRouter(); event_router->DispatchEventToRenderers(kChangeEventName, json_args, NULL, GURL()); } GetManagedModeFunction::~GetManagedModeFunction() { } bool GetManagedModeFunction::RunImpl() { bool in_managed_mode = ManagedMode::IsInManagedMode(); scoped_ptr result(new DictionaryValue); result->SetBoolean(keys::kValue, in_managed_mode); result_.reset(result.release()); return true; } EnterManagedModeFunction::~EnterManagedModeFunction() { } bool EnterManagedModeFunction::RunImpl() { ManagedMode::EnterManagedMode( profile(), base::Bind(&EnterManagedModeFunction::SendResult, this)); return true; } void EnterManagedModeFunction::SendResult(bool success) { scoped_ptr result(new DictionaryValue); result->SetBoolean(kEnterSuccessKey, success); result_.reset(result.release()); SendResponse(true); }