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