Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(250)

Side by Side Diff: chrome/browser/ui/webui/offline_internals_ui.cc

Issue 2038963002: [Offline Pages] Link the internals page with the offline model and request (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Download JSON rather than CSV Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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"
14 #include "base/strings/string_number_conversions.h"
12 #include "base/values.h" 15 #include "base/values.h"
16 #include "chrome/browser/android/offline_pages/offline_page_model_factory.h"
17 #include "chrome/browser/android/offline_pages/request_coordinator_factory.h"
13 #include "chrome/browser/profiles/profile.h" 18 #include "chrome/browser/profiles/profile.h"
14 #include "chrome/common/url_constants.h" 19 #include "chrome/common/url_constants.h"
20 #include "components/offline_pages/background/request_coordinator.h"
21 #include "components/offline_pages/background/save_page_request.h"
22 #include "components/offline_pages/offline_page_model.h"
15 #include "content/public/browser/web_ui.h" 23 #include "content/public/browser/web_ui.h"
16 #include "content/public/browser/web_ui_controller.h" 24 #include "content/public/browser/web_ui_controller.h"
17 #include "content/public/browser/web_ui_data_source.h" 25 #include "content/public/browser/web_ui_data_source.h"
18 #include "content/public/browser/web_ui_message_handler.h" 26 #include "content/public/browser/web_ui_message_handler.h"
19 #include "grit/browser_resources.h" 27 #include "grit/browser_resources.h"
20 28
21 namespace { 29 namespace {
22 30
23 // Class acting as a controller of the chrome://offline-internals WebUI. 31 // Class acting as a controller of the chrome://offline-internals WebUI.
24 class OfflineInternalsUIMessageHandler : public content::WebUIMessageHandler { 32 class OfflineInternalsUIMessageHandler : public content::WebUIMessageHandler {
25 public: 33 public:
26 OfflineInternalsUIMessageHandler(); 34 OfflineInternalsUIMessageHandler();
27 ~OfflineInternalsUIMessageHandler() override; 35 ~OfflineInternalsUIMessageHandler() override;
28 36
29 // WebUIMessageHandler implementation. 37 // WebUIMessageHandler implementation.
30 void RegisterMessages() override; 38 void RegisterMessages() override;
31 39
32 private: 40 private:
33 // Deletes all the pages in the store. 41 // Deletes all the pages in the store.
34 void HandleDeleteAllPages(const base::ListValue* args); 42 void HandleDeleteAllPages(const base::ListValue* args);
35 43
36 // Delete selected list of page ids from the store. 44 // Delete selected list of page ids from the store.
37 void HandleDeleteSelectedPages(const base::ListValue* args); 45 void HandleDeleteSelectedPages(const base::ListValue* args);
38 46
39 // Load all information. 47 // Load Request Queue info.
40 void HandleGetOfflineInternalsInfo(const base::ListValue* args); 48 void HandleGetRequestQueueInfo(const base::ListValue* args);
49
50 // Load Stored pages info.
51 void HandleGetStoredPagesInfo(const base::ListValue* args);
52
53 // Callback for async GetAllPages calls.
54 void HandleStoredPagesCallback(
55 std::string callback_id,
56 const offline_pages::MultipleOfflinePageItemResult& pages);
57
58 // Callback for async GetRequests calls.
59 void HandleRequestQueueCallback(
60 std::string callback_id,
61 offline_pages::RequestQueue::GetRequestsResult result,
62 const std::vector<offline_pages::SavePageRequest>& requests);
63
64 // Callback for DeletePage/ClearAll calls.
65 void HandleDeletedPagesCallback(std::string callback_id,
66 const offline_pages::DeletePageResult result);
67
68 // Turns a DeletePageResult enum into logical string.
69 std::string GetStringFromDeletePageResult(
70 offline_pages::DeletePageResult value);
71
72 // Turns a SavePageRequest::Status into logical string.
73 std::string GetStringFromSavePageStatus(
74 offline_pages::SavePageRequest::Status status);
75
76 // Offline page model to call methods on.
77 offline_pages::OfflinePageModel* offline_page_model_;
Dan Beam 2016/06/14 15:43:37 this should be initialized to nullptr
chili 2016/06/14 17:25:43 Done.
78
79 // Request coordinator for background offline actions.
80 offline_pages::RequestCoordinator* request_coordinator_;
Dan Beam 2016/06/14 15:43:37 this should be initialized to nullptr
chili 2016/06/14 17:25:43 Done.
41 81
42 // Factory for creating references in callbacks. 82 // Factory for creating references in callbacks.
43 base::WeakPtrFactory<OfflineInternalsUIMessageHandler> weak_ptr_factory_; 83 base::WeakPtrFactory<OfflineInternalsUIMessageHandler> weak_ptr_factory_;
44 84
45 DISALLOW_COPY_AND_ASSIGN(OfflineInternalsUIMessageHandler); 85 DISALLOW_COPY_AND_ASSIGN(OfflineInternalsUIMessageHandler);
46 }; 86 };
47 87
48 OfflineInternalsUIMessageHandler::OfflineInternalsUIMessageHandler() 88 OfflineInternalsUIMessageHandler::OfflineInternalsUIMessageHandler()
49 : weak_ptr_factory_(this) {} 89 : weak_ptr_factory_(this) {}
50 90
51 OfflineInternalsUIMessageHandler::~OfflineInternalsUIMessageHandler() {} 91 OfflineInternalsUIMessageHandler::~OfflineInternalsUIMessageHandler() {}
52 92
93 std::string OfflineInternalsUIMessageHandler::GetStringFromDeletePageResult(
94 offline_pages::DeletePageResult value) {
95 switch (value) {
96 case offline_pages::DeletePageResult::SUCCESS:
97 return "Success";
98 case offline_pages::DeletePageResult::CANCELLED:
99 return "Cancelled";
100 case offline_pages::DeletePageResult::STORE_FAILURE:
101 return "Store failure";
102 case offline_pages::DeletePageResult::DEVICE_FAILURE:
103 return "Device failure";
104 case offline_pages::DeletePageResult::NOT_FOUND:
105 return "Not found";
106 case offline_pages::DeletePageResult::RESULT_COUNT:
107 NOTREACHED();
108 return "Moooooooo"; // Cows, because why not.
Dan Beam 2016/06/14 15:43:37 nit: just put a break; here and fall through to th
chili 2016/06/14 17:25:43 Done.
109 }
110 NOTREACHED();
111 return "Unknown";
112 }
113
114 std::string OfflineInternalsUIMessageHandler::GetStringFromSavePageStatus(
115 offline_pages::SavePageRequest::Status status) {
116 switch (status) {
117 case offline_pages::SavePageRequest::Status::NOT_READY:
118 return "Not ready";
119 case offline_pages::SavePageRequest::Status::PENDING:
120 return "Pending";
121 case offline_pages::SavePageRequest::Status::STARTED:
122 return "Started";
123 case offline_pages::SavePageRequest::Status::FAILED:
124 return "Failed";
125 case offline_pages::SavePageRequest::Status::EXPIRED:
126 return "Expired";
127 }
128 NOTREACHED();
129 return "Unknown";
130 }
131
53 void OfflineInternalsUIMessageHandler::HandleDeleteAllPages( 132 void OfflineInternalsUIMessageHandler::HandleDeleteAllPages(
54 const base::ListValue* args) { 133 const base::ListValue* args) {
55 const base::Value* callback_id; 134 std::string callback_id;
56 args->Get(0, &callback_id); 135 CHECK(args->GetString(0, &callback_id));
57 CallJavascriptFunction("cr.webUIResponse", 136
58 *callback_id, 137 // Pass back success because ClearAll doesn't return a status.
59 base::FundamentalValue(true), 138 offline_page_model_->ClearAll(
60 base::StringValue("success")); 139 base::Bind(&OfflineInternalsUIMessageHandler::HandleDeletedPagesCallback,
140 weak_ptr_factory_.GetWeakPtr(), callback_id,
141 offline_pages::DeletePageResult::SUCCESS));
61 } 142 }
62 143
63 void OfflineInternalsUIMessageHandler::HandleDeleteSelectedPages( 144 void OfflineInternalsUIMessageHandler::HandleDeleteSelectedPages(
64 const base::ListValue* args) { 145 const base::ListValue* args) {
65 const base::Value* callback_id; 146 std::string callback_id;
66 args->Get(0, &callback_id); 147 CHECK(args->GetString(0, &callback_id));
67 CallJavascriptFunction("cr.webUIResponse", 148
68 *callback_id, 149 std::vector<int64_t> offline_ids;
69 base::FundamentalValue(true), 150 const base::ListValue* offline_ids_from_arg;
70 base::StringValue("success")); 151 args->GetList(1, &offline_ids_from_arg);
152
153 for (size_t i = 0; i < offline_ids_from_arg->GetSize(); i++) {
154 std::string value;
155 offline_ids_from_arg->GetString(i, &value);
156 int64_t intValue;
Dan Beam 2016/06/14 15:43:37 int_value
chili 2016/06/14 17:25:44 Done.
157 base::StringToInt64(value, &intValue);
158 offline_ids.push_back(intValue);
159 }
160
161 offline_page_model_->DeletePagesByOfflineId(
162 offline_ids,
163 base::Bind(&OfflineInternalsUIMessageHandler::HandleDeletedPagesCallback,
164 weak_ptr_factory_.GetWeakPtr(), callback_id));
71 } 165 }
72 166
73 void OfflineInternalsUIMessageHandler::HandleGetOfflineInternalsInfo( 167 void OfflineInternalsUIMessageHandler::HandleDeletedPagesCallback(
168 std::string callback_id,
169 offline_pages::DeletePageResult result) {
170 ResolveJavascriptCallback(
171 base::StringValue(callback_id),
172 base::StringValue(GetStringFromDeletePageResult(result)));
173 }
174
175 void OfflineInternalsUIMessageHandler::HandleStoredPagesCallback(
176 std::string callback_id,
177 const offline_pages::MultipleOfflinePageItemResult& pages) {
178 base::ListValue results;
179
180 for (const auto& page : pages) {
181 base::DictionaryValue* js_page_object = new base::DictionaryValue();
Dan Beam 2016/06/14 15:43:37 js_page_object -> offline_page
chili 2016/06/14 17:25:44 Done.
182 results.Append(js_page_object);
183 js_page_object->SetString("onlineUrl", page.url.spec());
184 js_page_object->SetString("namespace", page.client_id.name_space);
185 js_page_object->SetDouble("size", page.file_size);
186 js_page_object->SetString("id", std::to_string(page.offline_id));
187 js_page_object->SetString("filePath", page.file_path.value());
188 js_page_object->SetDouble("creationTime", page.creation_time.ToJsTime());
189 js_page_object->SetDouble("lastAccessTime",
190 page.last_access_time.ToJsTime());
191 js_page_object->SetInteger("accessCount", page.access_count);
192 }
193 ResolveJavascriptCallback(base::StringValue(callback_id), results);
194 }
195
196 void OfflineInternalsUIMessageHandler::HandleRequestQueueCallback(
197 std::string callback_id,
198 offline_pages::RequestQueue::GetRequestsResult result,
199 const std::vector<offline_pages::SavePageRequest>& requests) {
200 base::ListValue js_requests;
Dan Beam 2016/06/14 15:43:37 save_page_request or page_request
chili 2016/06/14 17:25:44 Done.
201 if (result == offline_pages::RequestQueue::GetRequestsResult::SUCCESS) {
202 for (const auto& request : requests) {
203 base::DictionaryValue* js_request_object = new base::DictionaryValue();
Dan Beam 2016/06/14 15:43:37 page_request or save_page_request
chili 2016/06/14 17:25:44 Done.
204 js_requests.Append(js_request_object);
205 js_request_object->SetString("onlineUrl", request.url().spec());
206 js_request_object->SetDouble("creationTime",
207 request.creation_time().ToJsTime());
208 js_request_object->SetString(
209 "status",
210 GetStringFromSavePageStatus(request.GetStatus(base::Time::Now())));
211 js_request_object->SetString("namespace", request.client_id().name_space);
212 js_request_object->SetDouble("lastAttempt",
213 request.last_attempt_time().ToJsTime());
214 js_request_object->SetString("id", std::to_string(request.request_id()));
215 }
216 }
217 ResolveJavascriptCallback(base::StringValue(callback_id), js_requests);
218 }
219
220 void OfflineInternalsUIMessageHandler::HandleGetRequestQueueInfo(
74 const base::ListValue* args) { 221 const base::ListValue* args) {
75 AllowJavascript(); 222 AllowJavascript();
76 const base::Value* callback_id; 223 std::string callback_id;
77 args->Get(0, &callback_id); 224 CHECK(args->GetString(0, &callback_id));
78 base::DictionaryValue results;
79 results.Set("AllPages", new base::ListValue());
80 results.Set("Queue", new base::ListValue());
81 225
82 CallJavascriptFunction("cr.webUIResponse", 226 if (request_coordinator_) {
83 *callback_id, 227 request_coordinator_->queue()->GetRequests(base::Bind(
Dan Beam 2016/06/14 15:43:37 nit: can request_coordinator_ exist but without re
chili 2016/06/14 17:25:44 nope. a queue is required to construct a request c
84 base::FundamentalValue(true), 228 &OfflineInternalsUIMessageHandler::HandleRequestQueueCallback,
85 results); 229 weak_ptr_factory_.GetWeakPtr(), callback_id));
230 } else {
231 base::ListValue results;
232 ResolveJavascriptCallback(base::StringValue(callback_id), results);
233 }
234 }
235
236 void OfflineInternalsUIMessageHandler::HandleGetStoredPagesInfo(
237 const base::ListValue* args) {
238 AllowJavascript();
239 std::string callback_id;
240 CHECK(args->GetString(0, &callback_id));
241
242 if (offline_page_model_) {
243 offline_page_model_->GetAllPages(
244 base::Bind(&OfflineInternalsUIMessageHandler::HandleStoredPagesCallback,
245 weak_ptr_factory_.GetWeakPtr(), callback_id));
246 } else {
247 base::ListValue results;
248 ResolveJavascriptCallback(base::StringValue(callback_id), results);
249 }
86 } 250 }
87 251
88 void OfflineInternalsUIMessageHandler::RegisterMessages() { 252 void OfflineInternalsUIMessageHandler::RegisterMessages() {
89 web_ui()->RegisterMessageCallback( 253 web_ui()->RegisterMessageCallback(
90 "deleteAllPages", 254 "deleteAllPages",
91 base::Bind(&OfflineInternalsUIMessageHandler::HandleDeleteAllPages, 255 base::Bind(&OfflineInternalsUIMessageHandler::HandleDeleteAllPages,
92 weak_ptr_factory_.GetWeakPtr())); 256 weak_ptr_factory_.GetWeakPtr()));
93 web_ui()->RegisterMessageCallback( 257 web_ui()->RegisterMessageCallback(
94 "deleteSelectedPages", 258 "deleteSelectedPages",
95 base::Bind(&OfflineInternalsUIMessageHandler::HandleDeleteSelectedPages, 259 base::Bind(&OfflineInternalsUIMessageHandler::HandleDeleteSelectedPages,
96 weak_ptr_factory_.GetWeakPtr())); 260 weak_ptr_factory_.GetWeakPtr()));
97 web_ui()->RegisterMessageCallback( 261 web_ui()->RegisterMessageCallback(
98 "getOfflineInternalsInfo", 262 "getRequestQueueInfo",
99 base::Bind( 263 base::Bind(&OfflineInternalsUIMessageHandler::HandleGetRequestQueueInfo,
100 &OfflineInternalsUIMessageHandler::HandleGetOfflineInternalsInfo, 264 weak_ptr_factory_.GetWeakPtr()));
101 weak_ptr_factory_.GetWeakPtr())); 265 web_ui()->RegisterMessageCallback(
266 "getStoredPagesInfo",
267 base::Bind(&OfflineInternalsUIMessageHandler::HandleGetStoredPagesInfo,
268 weak_ptr_factory_.GetWeakPtr()));
269
270 // Get the offline page model associated with this web ui.
271 Profile* profile = Profile::FromWebUI(web_ui());
272 offline_page_model_ =
273 offline_pages::OfflinePageModelFactory::GetForBrowserContext(profile);
274 request_coordinator_ =
275 offline_pages::RequestCoordinatorFactory::GetForBrowserContext(profile);
102 } 276 }
103 277
104 } // namespace 278 } // namespace
105 279
106 OfflineInternalsUI::OfflineInternalsUI(content::WebUI* web_ui) 280 OfflineInternalsUI::OfflineInternalsUI(content::WebUI* web_ui)
107 : content::WebUIController(web_ui) { 281 : content::WebUIController(web_ui) {
108 // chrome://offline-internals source. 282 // chrome://offline-internals source.
109 content::WebUIDataSource* html_source = 283 content::WebUIDataSource* html_source =
110 content::WebUIDataSource::Create(chrome::kChromeUIOfflineInternalsHost); 284 content::WebUIDataSource::Create(chrome::kChromeUIOfflineInternalsHost);
111 285
112 // Required resources. 286 // Required resources.
113 html_source->SetJsonPath("strings.js"); 287 html_source->SetJsonPath("strings.js");
114 html_source->AddResourcePath("offline_internals.css", 288 html_source->AddResourcePath("offline_internals.css",
115 IDR_OFFLINE_INTERNALS_CSS); 289 IDR_OFFLINE_INTERNALS_CSS);
116 html_source->AddResourcePath("offline_internals.js", 290 html_source->AddResourcePath("offline_internals.js",
117 IDR_OFFLINE_INTERNALS_JS); 291 IDR_OFFLINE_INTERNALS_JS);
118 html_source->SetDefaultResource(IDR_OFFLINE_INTERNALS_HTML); 292 html_source->SetDefaultResource(IDR_OFFLINE_INTERNALS_HTML);
119 293
120 content::WebUIDataSource::Add(Profile::FromWebUI(web_ui), html_source); 294 content::WebUIDataSource::Add(Profile::FromWebUI(web_ui), html_source);
121 295
122 web_ui->AddMessageHandler(new OfflineInternalsUIMessageHandler()); 296 web_ui->AddMessageHandler(new OfflineInternalsUIMessageHandler());
123 } 297 }
124 298
125 OfflineInternalsUI::~OfflineInternalsUI() {} 299 OfflineInternalsUI::~OfflineInternalsUI() {}
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698