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