16d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
26d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
36d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// found in the LICENSE file.
46d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/keyboard/webui/vk_webui_controller.h"
66d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
76d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "base/strings/string_util.h"
86d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "base/strings/stringprintf.h"
95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "content/public/browser/render_frame_host.h"
105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "content/public/browser/render_view_host.h"
116d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "content/public/browser/web_contents.h"
126d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "content/public/browser/web_ui_data_source.h"
135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "content/public/common/service_registry.h"
146d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "grit/keyboard_resources.h"
156d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "grit/keyboard_resources_map.h"
165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "mojo/public/cpp/bindings/interface_impl.h"
175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "mojo/public/cpp/system/core.h"
186d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "ui/keyboard/keyboard_constants.h"
196d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "ui/keyboard/keyboard_util.h"
205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/keyboard/webui/vk_mojo_handler.h"
216d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace keyboard {
236d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
246d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)namespace {
256d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
266d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)content::WebUIDataSource* CreateKeyboardUIDataSource() {
276d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  content::WebUIDataSource* source =
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      content::WebUIDataSource::Create(kKeyboardHost);
296d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
306d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  size_t count = 0;
315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const GritResourceMap* resources = GetKeyboardExtensionResources(&count);
326d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  source->SetDefaultResource(IDR_KEYBOARD_INDEX);
336d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const std::string keyboard_host = base::StringPrintf("%s/", kKeyboardHost);
356d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  for (size_t i = 0; i < count; ++i) {
366d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    size_t offset = 0;
375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // The webui URL needs to skip the 'keyboard/' at the front of the resource
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // names, since it is part of the data-source name.
396d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    if (StartsWithASCII(std::string(resources[i].name), keyboard_host, false))
406d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      offset = keyboard_host.length();
416d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    source->AddResourcePath(resources[i].name + offset, resources[i].value);
426d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  }
436d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  return source;
446d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
456d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
466d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}  // namespace
476d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
486d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
496d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// VKWebUIController:
506d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
516d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)VKWebUIController::VKWebUIController(content::WebUI* web_ui)
525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    : WebUIController(web_ui), weak_factory_(this) {
536d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  content::BrowserContext* browser_context =
546d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      web_ui->GetWebContents()->GetBrowserContext();
556d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  content::WebUIDataSource::Add(browser_context, CreateKeyboardUIDataSource());
565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  content::WebUIDataSource::AddMojoDataSource(browser_context)->AddResourcePath(
575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "ui/keyboard/webui/keyboard.mojom", IDR_KEYBOARD_MOJO_GEN_JS);
586d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
596d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
606d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)VKWebUIController::~VKWebUIController() {
616d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
626d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void VKWebUIController::RenderViewCreated(content::RenderViewHost* host) {
645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  host->GetMainFrame()->GetServiceRegistry()->AddService<KeyboardUIHandlerMojo>(
655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      base::Bind(&VKWebUIController::CreateAndStoreUIHandler,
665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                 weak_factory_.GetWeakPtr()));
675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void VKWebUIController::CreateAndStoreUIHandler(
705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    mojo::InterfaceRequest<KeyboardUIHandlerMojo> request) {
715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ui_handler_ = scoped_ptr<VKMojoHandler>(
725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      mojo::WeakBindToRequest(new VKMojoHandler(), &request));
735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
756d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
766d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// VKWebUIControllerFactory:
776d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
786d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)content::WebUI::TypeID VKWebUIControllerFactory::GetWebUIType(
796d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    content::BrowserContext* browser_context,
806d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    const GURL& url) const {
815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (url == GURL(kKeyboardURL))
826d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    return const_cast<VKWebUIControllerFactory*>(this);
836d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
846d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  return content::WebUI::kNoWebUI;
856d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
866d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
876d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)bool VKWebUIControllerFactory::UseWebUIForURL(
886d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    content::BrowserContext* browser_context,
896d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    const GURL& url) const {
906d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  return GetWebUIType(browser_context, url) != content::WebUI::kNoWebUI;
916d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
926d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
936d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)bool VKWebUIControllerFactory::UseWebUIBindingsForURL(
946d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    content::BrowserContext* browser_context,
956d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    const GURL& url) const {
966d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  return UseWebUIForURL(browser_context, url);
976d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
986d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
996d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)content::WebUIController* VKWebUIControllerFactory::CreateWebUIControllerForURL(
1006d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    content::WebUI* web_ui,
1016d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    const GURL& url) const {
1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (url == GURL(kKeyboardURL))
1036d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    return new VKWebUIController(web_ui);
1046d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  return NULL;
1056d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
1066d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1076d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// static
1086d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)VKWebUIControllerFactory* VKWebUIControllerFactory::GetInstance() {
1096d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  return Singleton<VKWebUIControllerFactory>::get();
1106d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
1116d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1126d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// protected
1136d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)VKWebUIControllerFactory::VKWebUIControllerFactory() {
1146d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
1156d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1166d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)VKWebUIControllerFactory::~VKWebUIControllerFactory() {
1176d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
1186d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}  // namespace keyboard
120