OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/ui/webui/instant_ui.h" | 5 #include "chrome/browser/ui/webui/instant_ui.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/prefs/pref_service.h" | |
9 #include "base/stringprintf.h" | 8 #include "base/stringprintf.h" |
10 #include "base/time.h" | 9 #include "base/values.h" |
11 #include "chrome/browser/instant/instant_controller.h" | 10 #include "chrome/browser/instant/instant_service.h" |
| 11 #include "chrome/browser/instant/instant_service_factory.h" |
12 #include "chrome/browser/profiles/profile.h" | 12 #include "chrome/browser/profiles/profile.h" |
13 #include "chrome/browser/ui/browser.h" | |
14 #include "chrome/browser/ui/browser_finder.h" | |
15 #include "chrome/browser/ui/browser_instant_controller.h" | |
16 #include "chrome/common/pref_names.h" | |
17 #include "chrome/common/url_constants.h" | 13 #include "chrome/common/url_constants.h" |
18 #include "components/user_prefs/pref_registry_syncable.h" | |
19 #include "content/public/browser/web_ui.h" | 14 #include "content/public/browser/web_ui.h" |
20 #include "content/public/browser/web_ui_data_source.h" | 15 #include "content/public/browser/web_ui_data_source.h" |
21 #include "content/public/browser/web_ui_message_handler.h" | 16 #include "content/public/browser/web_ui_message_handler.h" |
22 #include "grit/browser_resources.h" | 17 #include "grit/browser_resources.h" |
23 | 18 |
24 namespace { | 19 namespace { |
25 | 20 |
26 content::WebUIDataSource* CreateInstantHTMLSource() { | 21 content::WebUIDataSource* CreateInstantHTMLSource() { |
27 content::WebUIDataSource* source = | 22 content::WebUIDataSource* source = |
28 content::WebUIDataSource::Create(chrome::kChromeUIInstantHost); | 23 content::WebUIDataSource::Create(chrome::kChromeUIInstantHost); |
29 source->SetJsonPath("strings.js"); | |
30 source->AddResourcePath("instant.js", IDR_INSTANT_JS); | 24 source->AddResourcePath("instant.js", IDR_INSTANT_JS); |
31 source->AddResourcePath("instant.css", IDR_INSTANT_CSS); | 25 source->AddResourcePath("instant.css", IDR_INSTANT_CSS); |
32 source->SetDefaultResource(IDR_INSTANT_HTML); | 26 source->SetDefaultResource(IDR_INSTANT_HTML); |
33 return source; | 27 return source; |
34 } | 28 } |
35 | 29 |
36 std::string FormatTime(int64 time) { | 30 std::string FormatTime(int64 time) { |
37 base::Time::Exploded exploded; | 31 base::Time::Exploded exploded; |
38 base::Time::FromInternalValue(time).UTCExplode(&exploded); | 32 base::Time::FromInternalValue(time).UTCExplode(&exploded); |
39 return base::StringPrintf("%04d-%02d-%02d %02d:%02d:%02d.%03d", | 33 return base::StringPrintf("%04d-%02d-%02d %02d:%02d:%02d.%03d", |
40 exploded.year, exploded.month, exploded.day_of_month, | 34 exploded.year, exploded.month, exploded.day_of_month, |
41 exploded.hour, exploded.minute, exploded.second, exploded.millisecond); | 35 exploded.hour, exploded.minute, exploded.second, exploded.millisecond); |
42 } | 36 } |
43 | 37 |
44 // This class receives JavaScript messages from the renderer. | 38 // This class receives JavaScript messages from the renderer. Note that the |
45 // Note that the WebUI infrastructure runs on the UI thread, therefore all of | 39 // WebUI infrastructure runs on the UI thread, therefore all of this class's |
46 // this class's methods are expected to run on the UI thread. | 40 // methods are expected to run on the UI thread. |
47 class InstantUIMessageHandler | 41 class InstantUIMessageHandler : public content::WebUIMessageHandler { |
48 : public content::WebUIMessageHandler, | |
49 public base::SupportsWeakPtr<InstantUIMessageHandler> { | |
50 public: | 42 public: |
51 InstantUIMessageHandler(); | 43 InstantUIMessageHandler(); |
52 virtual ~InstantUIMessageHandler(); | 44 virtual ~InstantUIMessageHandler(); |
53 | 45 |
54 // WebUIMessageHandler implementation. | 46 private: |
| 47 // Overridden from content::WebUIMessageHandler: |
55 virtual void RegisterMessages() OVERRIDE; | 48 virtual void RegisterMessages() OVERRIDE; |
56 | 49 |
57 private: | 50 void GetDebugEvents(const base::ListValue* value); |
58 void GetPreferenceValue(const base::ListValue* args); | 51 void ClearDebugEvents(const base::ListValue* value); |
59 void SetPreferenceValue(const base::ListValue* args); | |
60 void GetDebugInfo(const base::ListValue* value); | |
61 void ClearDebugInfo(const base::ListValue* value); | |
62 | 52 |
63 DISALLOW_COPY_AND_ASSIGN(InstantUIMessageHandler); | 53 DISALLOW_COPY_AND_ASSIGN(InstantUIMessageHandler); |
64 }; | 54 }; |
65 | 55 |
66 InstantUIMessageHandler::InstantUIMessageHandler() {} | 56 InstantUIMessageHandler::InstantUIMessageHandler() { |
| 57 } |
67 | 58 |
68 InstantUIMessageHandler::~InstantUIMessageHandler() {} | 59 InstantUIMessageHandler::~InstantUIMessageHandler() { |
| 60 } |
69 | 61 |
70 void InstantUIMessageHandler::RegisterMessages() { | 62 void InstantUIMessageHandler::RegisterMessages() { |
71 web_ui()->RegisterMessageCallback( | 63 web_ui()->RegisterMessageCallback( |
72 "getPreferenceValue", | 64 "getDebugEvents", |
73 base::Bind(&InstantUIMessageHandler::GetPreferenceValue, | 65 base::Bind(&InstantUIMessageHandler::GetDebugEvents, |
74 base::Unretained(this))); | 66 base::Unretained(this))); |
75 web_ui()->RegisterMessageCallback( | 67 web_ui()->RegisterMessageCallback( |
76 "setPreferenceValue", | 68 "clearDebugEvents", |
77 base::Bind(&InstantUIMessageHandler::SetPreferenceValue, | 69 base::Bind(&InstantUIMessageHandler::ClearDebugEvents, |
78 base::Unretained(this))); | |
79 web_ui()->RegisterMessageCallback( | |
80 "getDebugInfo", | |
81 base::Bind(&InstantUIMessageHandler::GetDebugInfo, | |
82 base::Unretained(this))); | |
83 web_ui()->RegisterMessageCallback( | |
84 "clearDebugInfo", | |
85 base::Bind(&InstantUIMessageHandler::ClearDebugInfo, | |
86 base::Unretained(this))); | 70 base::Unretained(this))); |
87 } | 71 } |
88 | 72 |
89 void InstantUIMessageHandler::GetPreferenceValue(const base::ListValue* args) { | 73 void InstantUIMessageHandler::GetDebugEvents( |
90 std::string pref_name; | 74 const base::ListValue* /* args */) { |
91 if (!args->GetString(0, &pref_name)) return; | 75 InstantService* service = |
| 76 InstantServiceFactory::GetForProfile(Profile::FromWebUI(web_ui())); |
| 77 if (!service) |
| 78 return; |
92 | 79 |
93 base::StringValue pref_name_value(pref_name); | 80 base::ListValue events; |
94 if (pref_name == prefs::kInstantUIZeroSuggestUrlPrefix) { | 81 const InstantService::DebugEventsList& source = service->debug_events(); |
95 PrefService* prefs = Profile::FromWebUI(web_ui())->GetPrefs(); | 82 |
96 base::StringValue arg(prefs->GetString(pref_name.c_str())); | 83 for (InstantService::DebugEventsList::const_iterator i = source.begin(); |
97 web_ui()->CallJavascriptFunction( | 84 i != source.end(); ++i) { |
98 "instantConfig.getPreferenceValueResult", pref_name_value, arg); | 85 scoped_ptr<base::DictionaryValue> event(new base::DictionaryValue()); |
| 86 event->SetString("time", FormatTime(i->first)); |
| 87 event->SetString("text", i->second); |
| 88 events.Append(event.release()); |
99 } | 89 } |
| 90 |
| 91 web_ui()->CallJavascriptFunction("instantConfig.setDebugEvents", events); |
100 } | 92 } |
101 | 93 |
102 void InstantUIMessageHandler::SetPreferenceValue(const base::ListValue* args) { | 94 void InstantUIMessageHandler::ClearDebugEvents( |
103 std::string pref_name; | 95 const base::ListValue* /* args */) { |
104 if (!args->GetString(0, &pref_name)) return; | 96 InstantService* service = |
105 | 97 InstantServiceFactory::GetForProfile(Profile::FromWebUI(web_ui())); |
106 if (pref_name == prefs::kInstantUIZeroSuggestUrlPrefix) { | 98 if (service) |
107 std::string value; | 99 service->ClearDebugEvents(); |
108 if (!args->GetString(1, &value)) | |
109 return; | |
110 PrefService* prefs = Profile::FromWebUI(web_ui())->GetPrefs(); | |
111 prefs->SetString(pref_name.c_str(), value); | |
112 } | |
113 } | |
114 | |
115 void InstantUIMessageHandler::GetDebugInfo(const base::ListValue* args) { | |
116 #if !defined(OS_ANDROID) | |
117 typedef std::pair<int64, std::string> DebugEvent; | |
118 | |
119 if (!web_ui()->GetWebContents()) | |
120 return; | |
121 Browser* browser = chrome::FindBrowserWithWebContents( | |
122 web_ui()->GetWebContents()); | |
123 if (!browser || !browser->instant_controller()) | |
124 return; | |
125 | |
126 InstantController* instant = browser->instant_controller()->instant(); | |
127 const std::list<DebugEvent>& events = instant->debug_events(); | |
128 | |
129 base::DictionaryValue data; | |
130 base::ListValue* entries = new base::ListValue(); | |
131 for (std::list<DebugEvent>::const_iterator it = events.begin(); | |
132 it != events.end(); ++it) { | |
133 base::DictionaryValue* entry = new base::DictionaryValue(); | |
134 entry->SetString("time", FormatTime(it->first)); | |
135 entry->SetString("text", it->second); | |
136 entries->Append(entry); | |
137 } | |
138 data.Set("entries", entries); | |
139 | |
140 web_ui()->CallJavascriptFunction("instantConfig.getDebugInfoResult", data); | |
141 #endif | |
142 } | |
143 | |
144 void InstantUIMessageHandler::ClearDebugInfo(const base::ListValue* args) { | |
145 #if !defined(OS_ANDROID) | |
146 if (!web_ui()->GetWebContents()) | |
147 return; | |
148 Browser* browser = chrome::FindBrowserWithWebContents( | |
149 web_ui()->GetWebContents()); | |
150 if (!browser || !browser->instant_controller()) | |
151 return; | |
152 | |
153 browser->instant_controller()->instant()->ClearDebugEvents(); | |
154 #endif | |
155 } | 100 } |
156 | 101 |
157 } // namespace | 102 } // namespace |
158 | 103 |
159 //////////////////////////////////////////////////////////////////////////////// | 104 //////////////////////////////////////////////////////////////////////////////// |
160 // InstantUI | 105 // InstantUI |
161 | 106 |
162 InstantUI::InstantUI(content::WebUI* web_ui) : WebUIController(web_ui) { | 107 InstantUI::InstantUI(content::WebUI* web_ui) : WebUIController(web_ui) { |
163 web_ui->AddMessageHandler(new InstantUIMessageHandler()); | 108 web_ui->AddMessageHandler(new InstantUIMessageHandler()); |
164 | 109 |
165 // Set up the chrome://instant/ source. | 110 // Set up the chrome://instant/ source. |
166 Profile* profile = Profile::FromWebUI(web_ui); | 111 Profile* profile = Profile::FromWebUI(web_ui); |
167 content::WebUIDataSource::Add(profile, CreateInstantHTMLSource()); | 112 content::WebUIDataSource::Add(profile, CreateInstantHTMLSource()); |
168 } | 113 } |
169 | 114 |
170 // static | 115 InstantUI::~InstantUI() { |
171 void InstantUI::RegisterUserPrefs(PrefRegistrySyncable* registry) { | |
172 registry->RegisterStringPref(prefs::kInstantUIZeroSuggestUrlPrefix, "", | |
173 PrefRegistrySyncable::UNSYNCABLE_PREF); | |
174 } | 116 } |
OLD | NEW |