handler_options_handler.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/options/handler_options_handler.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/utf_string_conversions.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prefs/pref_service.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_notification_types.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_ui.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace options { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HandlerOptionsHandler::HandlerOptionsHandler() { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HandlerOptionsHandler::~HandlerOptionsHandler() { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HandlerOptionsHandler::GetLocalizedValues( 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryValue* localized_strings) { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(localized_strings); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static OptionsStringResource resources[] = { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "handlers_tab_label", IDS_HANDLERS_TAB_LABEL }, 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "handlers_allow", IDS_HANDLERS_ALLOW_RADIO }, 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "handlers_block", IDS_HANDLERS_DONOTALLOW_RADIO }, 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "handlers_type_column_header", IDS_HANDLERS_TYPE_COLUMN_HEADER }, 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "handlers_site_column_header", IDS_HANDLERS_SITE_COLUMN_HEADER }, 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "handlers_remove_link", IDS_HANDLERS_REMOVE_HANDLER_LINK }, 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "handlers_none_handler", IDS_HANDLERS_NONE_HANDLER }, 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "handlers_active_heading", IDS_HANDLERS_ACTIVE_HEADING }, 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "handlers_ignored_heading", IDS_HANDLERS_IGNORED_HEADING }, 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RegisterTitle(localized_strings, "handlersPage", 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_HANDLER_OPTIONS_WINDOW_TITLE); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RegisterStrings(localized_strings, resources, arraysize(resources)); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HandlerOptionsHandler::InitializeHandler() { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notification_registrar_.Add( 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, chrome::NOTIFICATION_PROTOCOL_HANDLER_REGISTRY_CHANGED, 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<Profile>(Profile::FromWebUI(web_ui()))); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HandlerOptionsHandler::InitializePage() { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateHandlerList(); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HandlerOptionsHandler::RegisterMessages() { 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->RegisterMessageCallback("clearDefault", 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&HandlerOptionsHandler::ClearDefault, 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this))); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->RegisterMessageCallback("removeHandler", 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&HandlerOptionsHandler::RemoveHandler, 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this))); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->RegisterMessageCallback("setHandlersEnabled", 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&HandlerOptionsHandler::SetHandlersEnabled, 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this))); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->RegisterMessageCallback("setDefault", 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&HandlerOptionsHandler::SetDefault, 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this))); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->RegisterMessageCallback("removeIgnoredHandler", 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&HandlerOptionsHandler::RemoveIgnoredHandler, 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this))); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ProtocolHandlerRegistry* HandlerOptionsHandler::GetProtocolHandlerRegistry() { 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Profile::FromWebUI(web_ui())->GetProtocolHandlerRegistry(); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void GetHandlersAsListValue( 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ProtocolHandlerRegistry::ProtocolHandlerList& handlers, 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ListValue* handler_list) { 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandlerRegistry::ProtocolHandlerList::const_iterator handler; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (handler = handlers.begin(); handler != handlers.end(); ++handler) { 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ListValue* handlerValue = new ListValue(); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) handlerValue->Append(Value::CreateStringValue(handler->protocol())); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) handlerValue->Append(Value::CreateStringValue(handler->url().spec())); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) handlerValue->Append(Value::CreateStringValue(handler->title())); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) handler_list->Append(handlerValue); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HandlerOptionsHandler::GetHandlersForProtocol( 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& protocol, 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryValue* handlers_value) { 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandlerRegistry* registry = GetProtocolHandlerRegistry(); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) handlers_value->SetString("protocol", protocol); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) handlers_value->SetInteger("default_handler", 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry->GetHandlerIndex(protocol)); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ListValue* handlers_list = new ListValue(); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetHandlersAsListValue(registry->GetHandlersFor(protocol), handlers_list); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) handlers_value->Set("handlers", handlers_list); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HandlerOptionsHandler::GetIgnoredHandlers(ListValue* handlers) { 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandlerRegistry* registry = GetProtocolHandlerRegistry(); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandlerRegistry::ProtocolHandlerList ignored_handlers = 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry->GetIgnoredHandlers(); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetHandlersAsListValue(ignored_handlers, handlers); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HandlerOptionsHandler::UpdateHandlerList() { 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandlerRegistry* registry = GetProtocolHandlerRegistry(); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string> protocols; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry->GetRegisteredProtocols(&protocols); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ListValue handlers; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::vector<std::string>::iterator protocol = protocols.begin(); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protocol != protocols.end(); protocol++) { 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryValue* handler_value = new DictionaryValue(); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetHandlersForProtocol(*protocol, handler_value); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) handlers.Append(handler_value); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ListValue> ignored_handlers(new ListValue()); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetIgnoredHandlers(ignored_handlers.get()); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->CallJavascriptFunction("HandlerOptions.setHandlers", handlers); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->CallJavascriptFunction("HandlerOptions.setIgnoredHandlers", 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *ignored_handlers); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HandlerOptionsHandler::RemoveHandler(const ListValue* args) { 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ListValue* list; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!args->GetList(0, &list)) { 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandler handler(ParseHandlerFromArgs(list)); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetProtocolHandlerRegistry()->RemoveHandler(handler); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // No need to call UpdateHandlerList() - we should receive a notification 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that the ProtocolHandlerRegistry has changed and we will update the view 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // then. 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HandlerOptionsHandler::RemoveIgnoredHandler(const ListValue* args) { 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ListValue* list; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!args->GetList(0, &list)) { 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandler handler(ParseHandlerFromArgs(list)); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetProtocolHandlerRegistry()->RemoveIgnoredHandler(handler); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HandlerOptionsHandler::SetHandlersEnabled(const ListValue* args) { 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool enabled = true; 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(args->GetBoolean(0, &enabled)); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (enabled) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetProtocolHandlerRegistry()->Enable(); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetProtocolHandlerRegistry()->Disable(); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HandlerOptionsHandler::ClearDefault(const ListValue* args) { 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(args->Get(0, &value)); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string protocol_to_clear; 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(value->GetAsString(&protocol_to_clear)); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetProtocolHandlerRegistry()->ClearDefault(protocol_to_clear); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HandlerOptionsHandler::SetDefault(const ListValue* args) { 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ListValue* list; 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(args->GetList(0, &list)); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ProtocolHandler& handler(ParseHandlerFromArgs(list)); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(!handler.IsEmpty()); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetProtocolHandlerRegistry()->OnAcceptRegisterProtocolHandler(handler); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ProtocolHandler HandlerOptionsHandler::ParseHandlerFromArgs( 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ListValue* args) const { 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 protocol; 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 url; 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 title; 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool ok = args->GetString(0, &protocol) && args->GetString(1, &url) && 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) args->GetString(2, &title); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ok) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ProtocolHandler::EmptyProtocolHandler(); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ProtocolHandler::CreateProtocolHandler(UTF16ToUTF8(protocol), 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL(UTF16ToUTF8(url)), 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) title); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HandlerOptionsHandler::Observe( 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int type, 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationSource& source, 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationDetails& details) { 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (type == chrome::NOTIFICATION_PROTOCOL_HANDLER_REGISTRY_CHANGED) 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateHandlerList(); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace options 209