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)#ifndef CHROME_BROWSER_UI_WEBUI_NTP_NEW_TAB_UI_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_UI_WEBUI_NTP_NEW_TAB_UI_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/gtest_prod_util.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_change_registrar.h" 12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/timer/timer.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_observer.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_registrar.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/url_data_source.h" 179ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "content/public/browser/web_contents.h" 184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/public/browser/web_contents_observer.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_ui_controller.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GURL; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Profile; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace base { 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class DictionaryValue; 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace user_prefs { 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class PrefRegistrySyncable; 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The WebUIController used for the New Tab page. 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NewTabUI : public content::WebUIController, 344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public content::WebContentsObserver, 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public content::NotificationObserver { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit NewTabUI(content::WebUI* web_ui); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~NewTabUI(); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns whether or not to show apps pages. 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool ShouldShowApps(); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns whether or not "Discovery" in the NTP is Enabled. 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool IsDiscoveryInNTPEnabled(); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adds "url", "title", and "direction" keys on incoming dictionary, setting 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // title as the url as a fallback on empty title. 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void SetUrlTitleAndDirection(base::DictionaryValue* dictionary, 51a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& title, 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& gurl); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Adds "full_name" and "full_name_direction" keys on incoming dictionary. 55a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) static void SetFullNameAndDirection(const base::string16& full_name, 56d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::DictionaryValue* dictionary); 57d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns a pointer to a NewTabUI if the WebUIController object is a new tab 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // page. 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static NewTabUI* FromWebUIController(content::WebUIController* ui); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The current preference version. 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static int current_pref_version() { return current_pref_version_; } 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebUIController implementation: 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void RenderViewCreated( 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RenderViewHost* render_view_host) OVERRIDE; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void RenderViewReused( 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RenderViewHost* render_view_host) OVERRIDE; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // WebContentsObserver implementation: 724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void WasHidden() OVERRIDE; 734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool showing_sync_bubble() { return showing_sync_bubble_; } 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_showing_sync_bubble(bool showing) { showing_sync_bubble_ = showing; } 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) class NewTabHTMLSource : public content::URLDataSource { 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit NewTabHTMLSource(Profile* profile); 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~NewTabHTMLSource(); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // content::URLDataSource implementation. 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual std::string GetSource() const OVERRIDE; 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void StartDataRequest( 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& path, 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int render_process_id, 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int render_frame_id, 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::URLDataSource::GotDataCallback& callback) OVERRIDE; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual std::string GetMimeType(const std::string&) const OVERRIDE; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool ShouldReplaceExistingSource() const OVERRIDE; 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool ShouldAddContentSecurityPolicy() const OVERRIDE; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adds |resource| to the source. |resource_id| is resource id or 0, 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // which means return empty data set. |mime_type| is mime type of the 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // resource. 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddResource(const char* resource, 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char* mime_type, 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int resource_id); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pointer back to the original profile. 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile_; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Maps resource files to mime types an resource ids. 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::map<std::string, std::pair<std::string, int> > resource_map_; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(NewTabHTMLSource); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(NewTabUITest, UpdateUserPrefsVersion); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // content::NotificationObserver implementation. 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Observe(int type, 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationSource& source, 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationDetails& details) OVERRIDE; 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 118a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // If |web_contents| has an NTP URL, emits a number of NTP statistics (like 119a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // mouseovers counts) associated with |web_contents|, to be logged in UMA 120a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // histograms. 121a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void EmitNtpStatistics(); 1229ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void OnShowBookmarkBarChanged(); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void StartTimingPaint(content::RenderViewHost* render_view_host); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void PaintTimeout(); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* GetProfile() const; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationRegistrar registrar_; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The time when we started benchmarking. 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeTicks start_; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The last time we got a paint notification. 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeTicks last_paint_; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Scoping so we can be sure our timeouts don't outlive us. 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::OneShotTimer<NewTabUI> timer_; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The preference version. This used for migrating prefs of the NTP. 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int current_pref_version_ = 3; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the sync promo NTP bubble is being shown. 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool showing_sync_bubble_; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrefChangeRegistrar pref_change_registrar_; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(NewTabUI); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_UI_WEBUI_NTP_NEW_TAB_UI_H_ 150