• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef CHROME_BROWSER_UI_WEBUI_MOST_VISITED_HANDLER_H_
6 #define CHROME_BROWSER_UI_WEBUI_MOST_VISITED_HANDLER_H_
7 #pragma once
8 
9 #include <string>
10 #include <vector>
11 
12 #include "chrome/browser/history/history_types.h"
13 #include "content/browser/cancelable_request.h"
14 #include "content/browser/webui/web_ui.h"
15 #include "content/common/notification_observer.h"
16 #include "content/common/notification_registrar.h"
17 
18 class GURL;
19 class ListValue;
20 class PageUsageData;
21 class PrefService;
22 class Value;
23 
24 // The handler for Javascript messages related to the "most visited" view.
25 //
26 // This class manages two preferences:
27 // - The URL blacklist: URLs we do not want to show in the thumbnails list.  It
28 //   is a dictionary for quick access (it associates a dummy boolean to the URL
29 //   string).
30 // - Pinned URLs: This is a dictionary for the pinned URLs for the the most
31 //   visited part of the new tab page. The key of the dictionary is a hash of
32 //   the URL and the value is a dictionary with title, url and index.  This is
33 //   owned by the PrefService.
34 class MostVisitedHandler : public WebUIMessageHandler,
35                            public NotificationObserver {
36  public:
37 
38   MostVisitedHandler();
39   virtual ~MostVisitedHandler();
40 
41   // WebUIMessageHandler override and implementation.
42   virtual WebUIMessageHandler* Attach(WebUI* web_ui);
43   virtual void RegisterMessages();
44 
45   // Callback for the "getMostVisited" message.
46   void HandleGetMostVisited(const ListValue* args);
47 
48   // Callback for the "blacklistURLFromMostVisited" message.
49   void HandleBlacklistURL(const ListValue* args);
50 
51   // Callback for the "removeURLsFromMostVisitedBlacklist" message.
52   void HandleRemoveURLsFromBlacklist(const ListValue* args);
53 
54   // Callback for the "clearMostVisitedURLsBlacklist" message.
55   void HandleClearBlacklist(const ListValue* args);
56 
57   // Callback for the "addPinnedURL" message.
58   void HandleAddPinnedURL(const ListValue* args);
59 
60   // Callback for the "removePinnedURL" message.
61   void HandleRemovePinnedURL(const ListValue* args);
62 
63   // NotificationObserver implementation.
64   virtual void Observe(NotificationType type,
65                        const NotificationSource& source,
66                        const NotificationDetails& details);
67 
most_visited_urls()68   const std::vector<GURL>& most_visited_urls() const {
69     return most_visited_urls_;
70   }
71 
72   static void RegisterUserPrefs(PrefService* prefs);
73 
74   // Returns a vector containing the urls for the prepopulated pages.
75   // Used only in testing.
76   static std::vector<GURL> GetPrePopulatedUrls();
77 
78  private:
79   struct MostVisitedPage;
80 
81   // Send a request to the HistoryService to get the most visited pages.
82   void StartQueryForMostVisited();
83 
84   // Sets pages_value_ from a format produced by TopSites.
85   void SetPagesValueFromTopSites(const history::MostVisitedURLList& data);
86 
87   // Callback for TopSites.
88   void OnMostVisitedURLsAvailable(const history::MostVisitedURLList& data);
89 
90   // Puts the passed URL in the blacklist (so it does not show as a thumbnail).
91   void BlacklistURL(const GURL& url);
92 
93   // Returns the key used in url_blacklist_ and pinned_urls_ for the passed
94   // |url|.
95   std::string GetDictionaryKeyForURL(const std::string& url);
96 
97   // Gets the page data for a pinned URL at a given index. This returns
98   // true if found.
99   bool GetPinnedURLAtIndex(int index, MostVisitedPage* page);
100 
101   void AddPinnedURL(const MostVisitedPage& page, int index);
102   void RemovePinnedURL(const GURL& url);
103 
104   // Sends pages_value_ to the javascript side to and resets page_value_.
105   void SendPagesValue();
106 
107   // Returns true if we should treat this as the first run of the new tab page.
108   bool IsFirstRun();
109 
110   static const std::vector<MostVisitedPage>& GetPrePopulatedPages();
111 
112   NotificationRegistrar registrar_;
113 
114   // Our consumer for the history service.
115   CancelableRequestConsumerTSimple<PageUsageData*> cancelable_consumer_;
116   CancelableRequestConsumer topsites_consumer_;
117 
118   // The most visited URLs, in priority order.
119   // Only used for matching up clicks on the page to which most visited entry
120   // was clicked on for metrics purposes.
121   std::vector<GURL> most_visited_urls_;
122 
123   // We pre-fetch the first set of result pages.  This variable is false until
124   // we get the first getMostVisited() call.
125   bool got_first_most_visited_request_;
126 
127   // Keep the results of the db query here.
128   scoped_ptr<ListValue> pages_value_;
129 
130   DISALLOW_COPY_AND_ASSIGN(MostVisitedHandler);
131 };
132 
133 #endif  // CHROME_BROWSER_UI_WEBUI_MOST_VISITED_HANDLER_H_
134