12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/webui/app_launcher_page_ui.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/ref_counted_memory.h"
8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/metrics/histogram.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/profiles/profile.h"
10558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "chrome/browser/ui/webui/metrics_handler.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/webui/ntp/app_launcher_handler.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/webui/ntp/app_resource_cache_factory.h"
13558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "chrome/browser/ui/webui/ntp/core_app_launcher_handler.h"
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/ui/webui/ntp/favicon_webui_handler.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/webui/ntp/ntp_login_handler.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/webui/ntp/ntp_resource_cache.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/url_constants.h"
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/grit/generated_resources.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/browser_thread.h"
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/render_process_host.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_ui.h"
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "extensions/browser/extension_system.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/theme_resources.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(ENABLE_THEMES)
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/webui/theme_handler.h"
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ExtensionService;
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using content::BrowserThread;
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// AppLauncherPageUI
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AppLauncherPageUI::AppLauncherPageUI(content::WebUI* web_ui)
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : content::WebUIController(web_ui) {
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  web_ui->OverrideTitle(l10n_util::GetStringUTF16(IDS_APP_LAUNCHER_TAB_TITLE));
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (NTPLoginHandler::ShouldShow(GetProfile()))
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    web_ui->AddMessageHandler(new NTPLoginHandler());
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!GetProfile()->IsOffTheRecord()) {
46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ExtensionService* service =
47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        extensions::ExtensionSystem::Get(GetProfile())->extension_service();
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // We should not be launched without an ExtensionService.
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(service);
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    web_ui->AddMessageHandler(new AppLauncherHandler(service));
51558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    web_ui->AddMessageHandler(new CoreAppLauncherHandler());
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    web_ui->AddMessageHandler(new FaviconWebUIHandler());
53558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    web_ui->AddMessageHandler(new MetricsHandler());
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(ENABLE_THEMES)
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The theme handler can require some CPU, so do it after hooking up the most
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // visited handler. This allows the DB query for the new tab thumbs to happen
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // earlier.
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  web_ui->AddMessageHandler(new ThemeHandler());
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<HTMLSource> html_source(
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new HTMLSource(GetProfile()->GetOriginalProfile()));
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::URLDataSource::Add(GetProfile(), html_source.release());
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AppLauncherPageUI::~AppLauncherPageUI() {
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::RefCountedMemory* AppLauncherPageUI::GetFaviconResourceBytes(
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui::ScaleFactor scale_factor) {
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return ui::ResourceBundle::GetSharedInstance().
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      LoadDataResourceBytesForScale(IDR_BOOKMARK_BAR_APPS_SHORTCUT,
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    scale_factor);
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Profile* AppLauncherPageUI::GetProfile() const {
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return Profile::FromWebUI(web_ui());
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// HTMLSource
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AppLauncherPageUI::HTMLSource::HTMLSource(Profile* profile)
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : profile_(profile) {
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)std::string AppLauncherPageUI::HTMLSource::GetSource() const {
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return chrome::kChromeUIAppLauncherPageHost;
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AppLauncherPageUI::HTMLSource::StartDataRequest(
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& path,
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    int render_process_id,
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    int render_frame_id,
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const content::URLDataSource::GotDataCallback& callback) {
99e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  DCHECK_CURRENTLY_ON(BrowserThread::UI);
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NTPResourceCache* resource = AppResourceCacheFactory::GetForProfile(profile_);
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resource->set_should_show_most_visited_page(false);
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resource->set_should_show_other_devices_menu(false);
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resource->set_should_show_recently_closed_menu(false);
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  content::RenderProcessHost* render_host =
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      content::RenderProcessHost::FromID(render_process_id);
1083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  NTPResourceCache::WindowType win_type = NTPResourceCache::GetWindowType(
1093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      profile_, render_host);
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<base::RefCountedMemory> html_bytes(
1113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      resource->GetNewTabHTML(win_type));
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
113868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  callback.Run(html_bytes.get());
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string AppLauncherPageUI::HTMLSource::GetMimeType(
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& resource) const {
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return "text/html";
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool AppLauncherPageUI::HTMLSource::ShouldReplaceExistingSource() const {
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool AppLauncherPageUI::HTMLSource::ShouldAddContentSecurityPolicy() const {
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AppLauncherPageUI::HTMLSource::~HTMLSource() {}
130