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