OLD | NEW |
---|---|
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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/offline_internals_ui.h" | 5 #include "chrome/browser/ui/webui/offline_internals_ui.h" |
6 | 6 |
7 #include <string> | 7 #include <stdint.h> |
8 #include <stdlib.h> | |
9 #include <vector> | |
8 | 10 |
9 #include "base/bind.h" | 11 #include "base/bind.h" |
10 #include "base/macros.h" | 12 #include "base/macros.h" |
11 #include "base/memory/weak_ptr.h" | 13 #include "base/memory/weak_ptr.h" |
12 #include "base/values.h" | 14 #include "base/values.h" |
15 #include "chrome/browser/android/offline_pages/offline_page_model_factory.h" | |
16 #include "chrome/browser/android/offline_pages/request_coordinator_factory.h" | |
13 #include "chrome/browser/profiles/profile.h" | 17 #include "chrome/browser/profiles/profile.h" |
14 #include "chrome/common/url_constants.h" | 18 #include "chrome/common/url_constants.h" |
19 #include "components/offline_pages/background/request_coordinator.h" | |
20 #include "components/offline_pages/background/save_page_request.h" | |
21 #include "components/offline_pages/offline_page_model.h" | |
15 #include "content/public/browser/web_ui.h" | 22 #include "content/public/browser/web_ui.h" |
16 #include "content/public/browser/web_ui_controller.h" | 23 #include "content/public/browser/web_ui_controller.h" |
17 #include "content/public/browser/web_ui_data_source.h" | 24 #include "content/public/browser/web_ui_data_source.h" |
18 #include "content/public/browser/web_ui_message_handler.h" | 25 #include "content/public/browser/web_ui_message_handler.h" |
19 #include "grit/browser_resources.h" | 26 #include "grit/browser_resources.h" |
20 | 27 |
21 namespace { | 28 namespace { |
22 | 29 |
23 // Class acting as a controller of the chrome://offline-internals WebUI. | 30 // Class acting as a controller of the chrome://offline-internals WebUI. |
24 class OfflineInternalsUIMessageHandler : public content::WebUIMessageHandler { | 31 class OfflineInternalsUIMessageHandler : public content::WebUIMessageHandler { |
25 public: | 32 public: |
26 OfflineInternalsUIMessageHandler(); | 33 OfflineInternalsUIMessageHandler(); |
27 ~OfflineInternalsUIMessageHandler() override; | 34 ~OfflineInternalsUIMessageHandler() override; |
28 | 35 |
29 // WebUIMessageHandler implementation. | 36 // WebUIMessageHandler implementation. |
30 void RegisterMessages() override; | 37 void RegisterMessages() override; |
31 | 38 |
32 private: | 39 private: |
33 // Deletes all the pages in the store. | 40 // Deletes all the pages in the store. |
34 void DeleteAllPages(const base::ListValue* args); | 41 void DeleteAllPages(const base::ListValue* args); |
35 | 42 |
36 // Delete selected list of page ids from the store. | 43 // Delete selected list of page ids from the store. |
37 void DeleteSelectedPages(const base::ListValue* args); | 44 void DeleteSelectedPages(const base::ListValue* args); |
38 | 45 |
39 // Load all information. | 46 // Load Request Queue info. |
40 void GetOfflineInternalsInfo(const base::ListValue* args); | 47 void GetRequestQueue(const base::ListValue* args); |
48 | |
49 // Load Stored pages info. | |
50 void GetStoredPages(const base::ListValue* args); | |
51 | |
52 // Callback for async GetAllPages calls. | |
53 void HandleStoredPages( | |
54 std::string callback_id, | |
55 const offline_pages::MultipleOfflinePageItemResult& pages); | |
56 | |
57 // Callback for async GetRequests calls. | |
58 void HandleRequestQueue( | |
59 std::string callback_id, | |
60 offline_pages::RequestQueue::GetRequestsResult result, | |
61 const std::vector<offline_pages::SavePageRequest>& requests); | |
62 | |
63 // Callback for DeletePage/ClearAll calls. | |
64 void HandleDeletedPages(std::string callback_id, | |
65 const offline_pages::DeletePageResult result); | |
66 | |
67 std::string GetStringFromDeletePageResult( | |
dewittj
2016/06/03 23:12:06
Please define out of line.
This might be better d
chili
2016/06/09 22:29:16
I was hesitating between putting this here vs offl
dewittj
2016/06/09 23:41:25
Not everyone is going to necessarily use this page
| |
68 offline_pages::DeletePageResult value) { | |
69 const std::string kDeletePageResultToString[] = { | |
70 "Success", "Canceled", "Store failure", "Device failure", "Not found"}; | |
71 int int_value = static_cast<int>(value); | |
72 if (int_value >= 5) | |
73 return "Unknown"; | |
74 else | |
75 return kDeletePageResultToString[int_value]; | |
76 } | |
77 | |
78 std::string GetStringFromSavePageStatus( | |
79 offline_pages::SavePageRequest::Status status) { | |
80 const std::string kRequestStatusToString[] = { | |
81 "Not ready", "Pending", "Started", "Failed", "Expired"}; | |
82 int int_value = static_cast<int>(status); | |
83 if (int_value >= 5) | |
84 return "Unknown"; | |
85 else | |
86 return kRequestStatusToString[int_value]; | |
87 } | |
88 | |
89 // Offline page model to call methods on. | |
90 offline_pages::OfflinePageModel* offline_page_model_; | |
91 // Request coordinator for background offline actions. | |
92 offline_pages::RequestCoordinator* request_coordinator_; | |
41 | 93 |
42 // Factory for creating references in callbacks. | 94 // Factory for creating references in callbacks. |
43 base::WeakPtrFactory<OfflineInternalsUIMessageHandler> weak_ptr_factory_; | 95 base::WeakPtrFactory<OfflineInternalsUIMessageHandler> weak_ptr_factory_; |
44 | 96 |
45 DISALLOW_COPY_AND_ASSIGN(OfflineInternalsUIMessageHandler); | 97 DISALLOW_COPY_AND_ASSIGN(OfflineInternalsUIMessageHandler); |
46 }; | 98 }; |
47 | 99 |
48 OfflineInternalsUIMessageHandler::OfflineInternalsUIMessageHandler() | 100 OfflineInternalsUIMessageHandler::OfflineInternalsUIMessageHandler() |
49 : weak_ptr_factory_(this) {} | 101 : weak_ptr_factory_(this) {} |
50 | 102 |
51 OfflineInternalsUIMessageHandler::~OfflineInternalsUIMessageHandler() {} | 103 OfflineInternalsUIMessageHandler::~OfflineInternalsUIMessageHandler() {} |
52 | 104 |
53 void OfflineInternalsUIMessageHandler::DeleteAllPages( | 105 void OfflineInternalsUIMessageHandler::DeleteAllPages( |
54 const base::ListValue* args) { | 106 const base::ListValue* args) { |
55 std::string callback_id; | 107 std::string callback_id; |
56 args->GetString(0, &callback_id); | 108 args->GetString(0, &callback_id); |
57 web_ui()->CallJavascriptFunction("cr.webUIResponse", | 109 |
58 base::StringValue(callback_id), | 110 offline_page_model_->ClearAll( |
59 base::FundamentalValue(true), | 111 base::Bind(&OfflineInternalsUIMessageHandler::HandleDeletedPages, |
60 base::StringValue("success")); | 112 weak_ptr_factory_.GetWeakPtr(), callback_id, |
113 offline_pages::DeletePageResult::SUCCESS)); | |
dewittj
2016/06/03 23:12:06
Please add a comment that this is here because Cle
chili
2016/06/09 22:29:16
Done.
| |
61 } | 114 } |
62 | 115 |
63 void OfflineInternalsUIMessageHandler::DeleteSelectedPages( | 116 void OfflineInternalsUIMessageHandler::DeleteSelectedPages( |
64 const base::ListValue* args) { | 117 const base::ListValue* args) { |
65 std::string callback_id; | 118 std::string callback_id; |
66 args->GetString(0, &callback_id); | 119 args->GetString(0, &callback_id); |
67 web_ui()->CallJavascriptFunction("cr.webUIResponse", | 120 |
68 base::StringValue(callback_id), | 121 std::vector<int64_t> offline_ids; |
69 base::FundamentalValue(true), | 122 const base::ListValue* offline_ids_from_arg; |
70 base::StringValue("success")); | 123 args->GetList(1, &offline_ids_from_arg); |
124 | |
125 for (size_t i = 0; i < offline_ids_from_arg->GetSize(); i++) { | |
126 std::string value; | |
127 offline_ids_from_arg->GetString(i, &value); | |
128 offline_ids.push_back(atoll(value.c_str())); | |
dewittj
2016/06/03 23:12:06
not sure if there is some function in Chromium to
chili
2016/06/09 22:29:16
you can set base in strtoll, but I didn't think th
| |
129 } | |
130 | |
131 offline_page_model_->DeletePagesByOfflineId( | |
132 offline_ids, | |
133 base::Bind(&OfflineInternalsUIMessageHandler::HandleDeletedPages, | |
134 weak_ptr_factory_.GetWeakPtr(), callback_id)); | |
71 } | 135 } |
72 | 136 |
73 void OfflineInternalsUIMessageHandler::GetOfflineInternalsInfo( | 137 void OfflineInternalsUIMessageHandler::HandleDeletedPages( |
138 std::string callback_id, | |
139 offline_pages::DeletePageResult result) { | |
140 web_ui()->CallJavascriptFunction( | |
141 "cr.webUIResponse", base::StringValue(callback_id), | |
142 base::FundamentalValue(true), | |
143 base::StringValue(GetStringFromDeletePageResult(result))); | |
144 } | |
145 | |
146 void OfflineInternalsUIMessageHandler::HandleStoredPages( | |
147 std::string callback_id, | |
148 const offline_pages::MultipleOfflinePageItemResult& pages) { | |
149 base::ListValue results; | |
150 | |
151 for (const auto& page : pages) { | |
152 base::DictionaryValue* js_page_object = new base::DictionaryValue(); | |
153 results.Append(js_page_object); | |
154 js_page_object->SetString("onlineUrl", page.url.spec()); | |
dewittj
2016/06/03 23:12:06
I wish we didn't have so many hard-coded strings a
chili
2016/06/09 22:29:16
I do too, but I chose to hard-code them here rathe
| |
155 js_page_object->SetString("namespace", page.client_id.name_space); | |
156 js_page_object->SetDouble("size", page.file_size); | |
157 js_page_object->SetString("id", std::to_string(page.offline_id)); | |
158 js_page_object->SetString("filePath", page.file_path.value()); | |
159 js_page_object->SetDouble("creationTime", page.creation_time.ToJsTime()); | |
160 js_page_object->SetDouble("lastAccessedTime", | |
161 page.last_access_time.ToJsTime()); | |
162 js_page_object->SetInteger("accessCount", page.access_count); | |
163 } | |
164 web_ui()->CallJavascriptFunction("cr.webUIResponse", | |
165 base::StringValue(callback_id), | |
166 base::FundamentalValue(true), results); | |
167 } | |
168 | |
169 void OfflineInternalsUIMessageHandler::HandleRequestQueue( | |
170 std::string callback_id, | |
171 offline_pages::RequestQueue::GetRequestsResult result, | |
172 const std::vector<offline_pages::SavePageRequest>& requests) { | |
173 base::ListValue js_requests; | |
174 if (result == offline_pages::RequestQueue::GetRequestsResult::kSuccess) { | |
175 for (const auto& request : requests) { | |
176 base::DictionaryValue* js_request_object = new base::DictionaryValue(); | |
177 js_requests.Append(js_request_object); | |
178 js_request_object->SetString("onlineUrl", request.url().spec()); | |
179 js_request_object->SetDouble("creationTime", | |
180 request.creation_time().ToJsTime()); | |
181 js_request_object->SetString( | |
182 "status", | |
183 GetStringFromSavePageStatus(request.GetStatus(base::Time::Now()))); | |
184 js_request_object->SetString("namespace", request.client_id().name_space); | |
185 js_request_object->SetDouble("lastAttempt", | |
186 request.last_attempt_time().ToJsTime()); | |
187 js_request_object->SetString("id", std::to_string(request.request_id())); | |
188 } | |
189 } | |
190 web_ui()->CallJavascriptFunction("cr.webUIResponse", | |
191 base::StringValue(callback_id), | |
192 base::FundamentalValue(true), js_requests); | |
193 } | |
194 | |
195 void OfflineInternalsUIMessageHandler::GetRequestQueue( | |
74 const base::ListValue* args) { | 196 const base::ListValue* args) { |
75 std::string callback_id; | 197 std::string callback_id; |
76 args->GetString(0, &callback_id); | 198 args->GetString(0, &callback_id); |
77 base::DictionaryValue results; | 199 base::ListValue results; |
78 results.Set("AllPages", new base::ListValue()); | |
79 results.Set("Queue", new base::ListValue()); | |
80 | 200 |
81 web_ui()->CallJavascriptFunction("cr.webUIResponse", | 201 if (request_coordinator_ != nullptr) |
82 base::StringValue(callback_id), | 202 request_coordinator_->queue()->GetRequests( |
83 base::FundamentalValue(true), | 203 base::Bind(&OfflineInternalsUIMessageHandler::HandleRequestQueue, |
84 results); | 204 weak_ptr_factory_.GetWeakPtr(), callback_id)); |
205 } | |
206 | |
207 void OfflineInternalsUIMessageHandler::GetStoredPages( | |
208 const base::ListValue* args) { | |
209 std::string callback_id; | |
210 args->GetString(0, &callback_id); | |
211 base::ListValue results; | |
212 | |
213 if (offline_page_model_ != nullptr) | |
214 offline_page_model_->GetAllPages( | |
215 base::Bind(&OfflineInternalsUIMessageHandler::HandleStoredPages, | |
216 weak_ptr_factory_.GetWeakPtr(), callback_id)); | |
85 } | 217 } |
86 | 218 |
87 void OfflineInternalsUIMessageHandler::RegisterMessages() { | 219 void OfflineInternalsUIMessageHandler::RegisterMessages() { |
88 web_ui()->RegisterMessageCallback( | 220 web_ui()->RegisterMessageCallback( |
89 "deleteAllPages", | 221 "deleteAllPages", |
90 base::Bind(&OfflineInternalsUIMessageHandler::DeleteAllPages, | 222 base::Bind(&OfflineInternalsUIMessageHandler::DeleteAllPages, |
91 weak_ptr_factory_.GetWeakPtr())); | 223 weak_ptr_factory_.GetWeakPtr())); |
92 web_ui()->RegisterMessageCallback( | 224 web_ui()->RegisterMessageCallback( |
93 "deleteSelectedPages", | 225 "deleteSelectedPages", |
94 base::Bind(&OfflineInternalsUIMessageHandler::DeleteSelectedPages, | 226 base::Bind(&OfflineInternalsUIMessageHandler::DeleteSelectedPages, |
95 weak_ptr_factory_.GetWeakPtr())); | 227 weak_ptr_factory_.GetWeakPtr())); |
96 web_ui()->RegisterMessageCallback( | 228 web_ui()->RegisterMessageCallback( |
97 "getOfflineInternalsInfo", | 229 "getRequestQueueInfo", |
98 base::Bind(&OfflineInternalsUIMessageHandler::GetOfflineInternalsInfo, | 230 base::Bind(&OfflineInternalsUIMessageHandler::GetRequestQueue, |
99 weak_ptr_factory_.GetWeakPtr())); | 231 weak_ptr_factory_.GetWeakPtr())); |
232 web_ui()->RegisterMessageCallback( | |
233 "getStoredPagesInfo", | |
234 base::Bind(&OfflineInternalsUIMessageHandler::GetStoredPages, | |
235 weak_ptr_factory_.GetWeakPtr())); | |
236 | |
237 // Get the offline page model associated with this web ui. | |
238 Profile* profile = Profile::FromWebUI(web_ui()); | |
239 offline_page_model_ = | |
240 offline_pages::OfflinePageModelFactory::GetForBrowserContext(profile); | |
241 request_coordinator_ = | |
242 offline_pages::RequestCoordinatorFactory::GetForBrowserContext(profile); | |
100 } | 243 } |
101 | 244 |
102 } // namespace | 245 } // namespace |
103 | 246 |
104 OfflineInternalsUI::OfflineInternalsUI(content::WebUI* web_ui) | 247 OfflineInternalsUI::OfflineInternalsUI(content::WebUI* web_ui) |
105 : content::WebUIController(web_ui) { | 248 : content::WebUIController(web_ui) { |
106 // chrome://offline-internals source. | 249 // chrome://offline-internals source. |
107 content::WebUIDataSource* html_source = | 250 content::WebUIDataSource* html_source = |
108 content::WebUIDataSource::Create(chrome::kChromeUIOfflineInternalsHost); | 251 content::WebUIDataSource::Create(chrome::kChromeUIOfflineInternalsHost); |
109 | 252 |
110 // Required resources. | 253 // Required resources. |
111 html_source->SetJsonPath("strings.js"); | 254 html_source->SetJsonPath("strings.js"); |
112 html_source->AddResourcePath("offline_internals.css", | 255 html_source->AddResourcePath("offline_internals.css", |
113 IDR_OFFLINE_INTERNALS_CSS); | 256 IDR_OFFLINE_INTERNALS_CSS); |
114 html_source->AddResourcePath("offline_internals.js", | 257 html_source->AddResourcePath("offline_internals.js", |
115 IDR_OFFLINE_INTERNALS_JS); | 258 IDR_OFFLINE_INTERNALS_JS); |
116 html_source->SetDefaultResource(IDR_OFFLINE_INTERNALS_HTML); | 259 html_source->SetDefaultResource(IDR_OFFLINE_INTERNALS_HTML); |
117 | 260 |
118 content::WebUIDataSource::Add(Profile::FromWebUI(web_ui), html_source); | 261 content::WebUIDataSource::Add(Profile::FromWebUI(web_ui), html_source); |
119 | 262 |
120 web_ui->AddMessageHandler(new OfflineInternalsUIMessageHandler()); | 263 web_ui->AddMessageHandler(new OfflineInternalsUIMessageHandler()); |
121 } | 264 } |
122 | 265 |
123 OfflineInternalsUI::~OfflineInternalsUI() {} | 266 OfflineInternalsUI::~OfflineInternalsUI() {} |
OLD | NEW |