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