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

Side by Side Diff: chrome/browser/drive/fake_drive_service.cc

Issue 305913002: drive: Replace GetResourceListCallback in DriveServiceInterface with FileListCallback (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 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/drive/fake_drive_service.h" 5 #include "chrome/browser/drive/fake_drive_service.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/file_util.h" 9 #include "base/file_util.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 20 matching lines...) Expand all
31 using google_apis::AppList; 31 using google_apis::AppList;
32 using google_apis::AppListCallback; 32 using google_apis::AppListCallback;
33 using google_apis::AuthStatusCallback; 33 using google_apis::AuthStatusCallback;
34 using google_apis::AuthorizeAppCallback; 34 using google_apis::AuthorizeAppCallback;
35 using google_apis::CancelCallback; 35 using google_apis::CancelCallback;
36 using google_apis::ChangeList; 36 using google_apis::ChangeList;
37 using google_apis::ChangeListCallback; 37 using google_apis::ChangeListCallback;
38 using google_apis::ChangeResource; 38 using google_apis::ChangeResource;
39 using google_apis::DownloadActionCallback; 39 using google_apis::DownloadActionCallback;
40 using google_apis::EntryActionCallback; 40 using google_apis::EntryActionCallback;
41 using google_apis::FileList;
42 using google_apis::FileListCallback;
41 using google_apis::FileResource; 43 using google_apis::FileResource;
42 using google_apis::GDATA_FILE_ERROR; 44 using google_apis::GDATA_FILE_ERROR;
43 using google_apis::GDATA_NO_CONNECTION; 45 using google_apis::GDATA_NO_CONNECTION;
44 using google_apis::GDATA_OTHER_ERROR; 46 using google_apis::GDATA_OTHER_ERROR;
45 using google_apis::GDataErrorCode; 47 using google_apis::GDataErrorCode;
46 using google_apis::GetContentCallback; 48 using google_apis::GetContentCallback;
47 using google_apis::GetResourceEntryCallback; 49 using google_apis::GetResourceEntryCallback;
48 using google_apis::GetResourceListCallback;
49 using google_apis::GetShareUrlCallback; 50 using google_apis::GetShareUrlCallback;
50 using google_apis::HTTP_BAD_REQUEST; 51 using google_apis::HTTP_BAD_REQUEST;
51 using google_apis::HTTP_CREATED; 52 using google_apis::HTTP_CREATED;
52 using google_apis::HTTP_NOT_FOUND; 53 using google_apis::HTTP_NOT_FOUND;
53 using google_apis::HTTP_NO_CONTENT; 54 using google_apis::HTTP_NO_CONTENT;
54 using google_apis::HTTP_PRECONDITION; 55 using google_apis::HTTP_PRECONDITION;
55 using google_apis::HTTP_RESUME_INCOMPLETE; 56 using google_apis::HTTP_RESUME_INCOMPLETE;
56 using google_apis::HTTP_SUCCESS; 57 using google_apis::HTTP_SUCCESS;
57 using google_apis::InitiateUploadCallback; 58 using google_apis::InitiateUploadCallback;
58 using google_apis::Link; 59 using google_apis::Link;
59 using google_apis::ParentReference; 60 using google_apis::ParentReference;
60 using google_apis::ProgressCallback; 61 using google_apis::ProgressCallback;
61 using google_apis::ResourceEntry; 62 using google_apis::ResourceEntry;
62 using google_apis::ResourceList;
63 using google_apis::UploadRangeCallback; 63 using google_apis::UploadRangeCallback;
64 using google_apis::UploadRangeResponse; 64 using google_apis::UploadRangeResponse;
65 namespace test_util = google_apis::test_util; 65 namespace test_util = google_apis::test_util;
66 66
67 namespace drive { 67 namespace drive {
68 namespace { 68 namespace {
69 69
70 // Returns true if a resource entry matches with the search query. 70 // Returns true if a resource entry matches with the search query.
71 // Supports queries consist of following format. 71 // Supports queries consist of following format.
72 // - Phrases quoted by double/single quotes 72 // - Phrases quoted by double/single quotes
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
116 end_position), 116 end_position),
117 base::Passed(&entry))); 117 base::Passed(&entry)));
118 } 118 }
119 119
120 void EntryActionCallbackAdapter( 120 void EntryActionCallbackAdapter(
121 const EntryActionCallback& callback, 121 const EntryActionCallback& callback,
122 GDataErrorCode error, scoped_ptr<ResourceEntry> resource_entry) { 122 GDataErrorCode error, scoped_ptr<ResourceEntry> resource_entry) {
123 callback.Run(error); 123 callback.Run(error);
124 } 124 }
125 125
126 void GetResourceListCallbackAdapter(const GetResourceListCallback& callback, 126 void FileListCallbackAdapter(const FileListCallback& callback,
127 GDataErrorCode error, 127 GDataErrorCode error,
128 scoped_ptr<ChangeList> change_list) { 128 scoped_ptr<ChangeList> change_list) {
129 callback.Run(error, change_list ? 129 scoped_ptr<FileList> file_list;
130 util::ConvertChangeListToResourceList(*change_list) : 130 if (change_list) {
131 scoped_ptr<ResourceList>()); 131 file_list.reset(new FileList);
132 file_list->set_next_link(change_list->next_link());
133 for (size_t i = 0; i < change_list->items().size(); ++i) {
134 const ChangeResource& entry = *change_list->items()[i];
135 if (entry.file())
136 file_list->mutable_items()->push_back(new FileResource(*entry.file()));
137 }
138 }
139 callback.Run(error, file_list.Pass());
132 } 140 }
133 141
134 } // namespace 142 } // namespace
135 143
136 struct FakeDriveService::EntryInfo { 144 struct FakeDriveService::EntryInfo {
137 google_apis::ChangeResource change_resource; 145 google_apis::ChangeResource change_resource;
138 GURL share_url; 146 GURL share_url;
139 std::string content_data; 147 std::string content_data;
140 }; 148 };
141 149
(...skipping 27 matching lines...) Expand all
169 uploaded_size(0) { 177 uploaded_size(0) {
170 } 178 }
171 }; 179 };
172 180
173 FakeDriveService::FakeDriveService() 181 FakeDriveService::FakeDriveService()
174 : about_resource_(new AboutResource), 182 : about_resource_(new AboutResource),
175 published_date_seq_(0), 183 published_date_seq_(0),
176 next_upload_sequence_number_(0), 184 next_upload_sequence_number_(0),
177 default_max_results_(0), 185 default_max_results_(0),
178 resource_id_count_(0), 186 resource_id_count_(0),
179 resource_list_load_count_(0), 187 file_list_load_count_(0),
180 change_list_load_count_(0), 188 change_list_load_count_(0),
181 directory_load_count_(0), 189 directory_load_count_(0),
182 about_resource_load_count_(0), 190 about_resource_load_count_(0),
183 app_list_load_count_(0), 191 app_list_load_count_(0),
184 blocked_resource_list_load_count_(0), 192 blocked_file_list_load_count_(0),
185 offline_(false), 193 offline_(false),
186 never_return_all_resource_list_(false), 194 never_return_all_file_list_(false),
187 share_url_base_("https://share_url/") { 195 share_url_base_("https://share_url/") {
188 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 196 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
189 197
190 about_resource_->set_largest_change_id(654321); 198 about_resource_->set_largest_change_id(654321);
191 about_resource_->set_quota_bytes_total(9876543210); 199 about_resource_->set_quota_bytes_total(9876543210);
192 about_resource_->set_quota_bytes_used(6789012345); 200 about_resource_->set_quota_bytes_used(6789012345);
193 about_resource_->set_root_folder_id(GetRootResourceId()); 201 about_resource_->set_root_folder_id(GetRootResourceId());
194 } 202 }
195 203
196 FakeDriveService::~FakeDriveService() { 204 FakeDriveService::~FakeDriveService() {
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
263 } 271 }
264 272
265 void FakeDriveService::ClearRefreshToken() { 273 void FakeDriveService::ClearRefreshToken() {
266 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 274 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
267 } 275 }
268 276
269 std::string FakeDriveService::GetRootResourceId() const { 277 std::string FakeDriveService::GetRootResourceId() const {
270 return "fake_root"; 278 return "fake_root";
271 } 279 }
272 280
273 CancelCallback FakeDriveService::GetAllResourceList( 281 CancelCallback FakeDriveService::GetAllFileList(
274 const GetResourceListCallback& callback) { 282 const FileListCallback& callback) {
275 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 283 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
276 DCHECK(!callback.is_null()); 284 DCHECK(!callback.is_null());
277 285
278 if (never_return_all_resource_list_) { 286 if (never_return_all_file_list_) {
279 ++blocked_resource_list_load_count_; 287 ++blocked_file_list_load_count_;
280 return CancelCallback(); 288 return CancelCallback();
281 } 289 }
282 290
283 GetResourceListInternal(0, // start changestamp 291 GetChangeListInternal(0, // start changestamp
284 std::string(), // empty search query 292 std::string(), // empty search query
285 std::string(), // no directory resource id, 293 std::string(), // no directory resource id,
286 0, // start offset 294 0, // start offset
287 default_max_results_, 295 default_max_results_,
288 &resource_list_load_count_, 296 &file_list_load_count_,
289 base::Bind(&GetResourceListCallbackAdapter, 297 base::Bind(&FileListCallbackAdapter, callback));
290 callback));
291 return CancelCallback(); 298 return CancelCallback();
292 } 299 }
293 300
294 CancelCallback FakeDriveService::GetResourceListInDirectory( 301 CancelCallback FakeDriveService::GetFileListInDirectory(
295 const std::string& directory_resource_id, 302 const std::string& directory_resource_id,
296 const GetResourceListCallback& callback) { 303 const FileListCallback& callback) {
297 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 304 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
298 DCHECK(!directory_resource_id.empty()); 305 DCHECK(!directory_resource_id.empty());
299 DCHECK(!callback.is_null()); 306 DCHECK(!callback.is_null());
300 307
301 GetResourceListInternal(0, // start changestamp 308 GetChangeListInternal(0, // start changestamp
302 std::string(), // empty search query 309 std::string(), // empty search query
303 directory_resource_id, 310 directory_resource_id,
304 0, // start offset 311 0, // start offset
305 default_max_results_, 312 default_max_results_,
306 &directory_load_count_, 313 &directory_load_count_,
307 base::Bind(&GetResourceListCallbackAdapter, 314 base::Bind(&FileListCallbackAdapter, callback));
308 callback));
309 return CancelCallback(); 315 return CancelCallback();
310 } 316 }
311 317
312 CancelCallback FakeDriveService::Search( 318 CancelCallback FakeDriveService::Search(
313 const std::string& search_query, 319 const std::string& search_query,
314 const GetResourceListCallback& callback) { 320 const FileListCallback& callback) {
315 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 321 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
316 DCHECK(!search_query.empty()); 322 DCHECK(!search_query.empty());
317 DCHECK(!callback.is_null()); 323 DCHECK(!callback.is_null());
318 324
319 GetResourceListInternal(0, // start changestamp 325 GetChangeListInternal(0, // start changestamp
320 search_query, 326 search_query,
321 std::string(), // no directory resource id, 327 std::string(), // no directory resource id,
322 0, // start offset 328 0, // start offset
323 default_max_results_, 329 default_max_results_,
324 NULL, 330 NULL,
325 base::Bind(&GetResourceListCallbackAdapter, 331 base::Bind(&FileListCallbackAdapter, callback));
326 callback));
327 return CancelCallback(); 332 return CancelCallback();
328 } 333 }
329 334
330 CancelCallback FakeDriveService::SearchByTitle( 335 CancelCallback FakeDriveService::SearchByTitle(
331 const std::string& title, 336 const std::string& title,
332 const std::string& directory_resource_id, 337 const std::string& directory_resource_id,
333 const GetResourceListCallback& callback) { 338 const FileListCallback& callback) {
334 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 339 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
335 DCHECK(!title.empty()); 340 DCHECK(!title.empty());
336 DCHECK(!callback.is_null()); 341 DCHECK(!callback.is_null());
337 342
338 // Note: the search implementation here doesn't support quotation unescape, 343 // Note: the search implementation here doesn't support quotation unescape,
339 // so don't escape here. 344 // so don't escape here.
340 GetResourceListInternal(0, // start changestamp 345 GetChangeListInternal(0, // start changestamp
341 base::StringPrintf("title:'%s'", title.c_str()), 346 base::StringPrintf("title:'%s'", title.c_str()),
342 directory_resource_id, 347 directory_resource_id,
343 0, // start offset 348 0, // start offset
344 default_max_results_, 349 default_max_results_,
345 NULL, 350 NULL,
346 base::Bind(&GetResourceListCallbackAdapter, 351 base::Bind(&FileListCallbackAdapter, callback));
347 callback));
348 return CancelCallback(); 352 return CancelCallback();
349 } 353 }
350 354
351 CancelCallback FakeDriveService::GetChangeList( 355 CancelCallback FakeDriveService::GetChangeList(
352 int64 start_changestamp, 356 int64 start_changestamp,
353 const ChangeListCallback& callback) { 357 const ChangeListCallback& callback) {
354 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 358 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
355 DCHECK(!callback.is_null()); 359 DCHECK(!callback.is_null());
356 360
357 GetResourceListInternal(start_changestamp, 361 GetChangeListInternal(start_changestamp,
358 std::string(), // empty search query 362 std::string(), // empty search query
359 std::string(), // no directory resource id, 363 std::string(), // no directory resource id,
360 0, // start offset 364 0, // start offset
361 default_max_results_, 365 default_max_results_,
362 &change_list_load_count_, 366 &change_list_load_count_,
363 callback); 367 callback);
364 return CancelCallback(); 368 return CancelCallback();
365 } 369 }
366 370
367 CancelCallback FakeDriveService::GetRemainingChangeList( 371 CancelCallback FakeDriveService::GetRemainingChangeList(
368 const GURL& next_link, 372 const GURL& next_link,
369 const ChangeListCallback& callback) { 373 const ChangeListCallback& callback) {
370 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 374 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
371 DCHECK(!next_link.is_empty()); 375 DCHECK(!next_link.is_empty());
372 DCHECK(!callback.is_null()); 376 DCHECK(!callback.is_null());
373 377
374 // "changestamp", "q", "parent" and "start-offset" are parameters to 378 // "changestamp", "q", "parent" and "start-offset" are parameters to
375 // implement "paging" of the result on FakeDriveService. 379 // implement "paging" of the result on FakeDriveService.
376 // The URL should be the one filled in GetResourceListInternal of the 380 // The URL should be the one filled in GetChangeListInternal of the
377 // previous method invocation, so it should start with "http://localhost/?". 381 // previous method invocation, so it should start with "http://localhost/?".
378 // See also GetResourceListInternal. 382 // See also GetChangeListInternal.
379 DCHECK_EQ(next_link.host(), "localhost"); 383 DCHECK_EQ(next_link.host(), "localhost");
380 DCHECK_EQ(next_link.path(), "/"); 384 DCHECK_EQ(next_link.path(), "/");
381 385
382 int64 start_changestamp = 0; 386 int64 start_changestamp = 0;
383 std::string search_query; 387 std::string search_query;
384 std::string directory_resource_id; 388 std::string directory_resource_id;
385 int start_offset = 0; 389 int start_offset = 0;
386 int max_results = default_max_results_; 390 int max_results = default_max_results_;
387 std::vector<std::pair<std::string, std::string> > parameters; 391 std::vector<std::pair<std::string, std::string> > parameters;
388 if (base::SplitStringIntoKeyValuePairs( 392 if (base::SplitStringIntoKeyValuePairs(
(...skipping 10 matching lines...) Expand all
399 net::UnescapeURLComponent(parameters[i].second, 403 net::UnescapeURLComponent(parameters[i].second,
400 net::UnescapeRule::URL_SPECIAL_CHARS); 404 net::UnescapeRule::URL_SPECIAL_CHARS);
401 } else if (parameters[i].first == "start-offset") { 405 } else if (parameters[i].first == "start-offset") {
402 base::StringToInt(parameters[i].second, &start_offset); 406 base::StringToInt(parameters[i].second, &start_offset);
403 } else if (parameters[i].first == "max-results") { 407 } else if (parameters[i].first == "max-results") {
404 base::StringToInt(parameters[i].second, &max_results); 408 base::StringToInt(parameters[i].second, &max_results);
405 } 409 }
406 } 410 }
407 } 411 }
408 412
409 GetResourceListInternal( 413 GetChangeListInternal(start_changestamp, search_query, directory_resource_id,
410 start_changestamp, search_query, directory_resource_id, 414 start_offset, max_results, NULL, callback);
411 start_offset, max_results, NULL, callback);
412 return CancelCallback(); 415 return CancelCallback();
413 } 416 }
414 417
415 CancelCallback FakeDriveService::GetRemainingFileList( 418 CancelCallback FakeDriveService::GetRemainingFileList(
416 const GURL& next_link, 419 const GURL& next_link,
417 const GetResourceListCallback& callback) { 420 const FileListCallback& callback) {
418 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 421 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
419 DCHECK(!next_link.is_empty()); 422 DCHECK(!next_link.is_empty());
420 DCHECK(!callback.is_null()); 423 DCHECK(!callback.is_null());
421 424
422 return GetRemainingChangeList( 425 return GetRemainingChangeList(
423 next_link, base::Bind(&GetResourceListCallbackAdapter, callback)); 426 next_link, base::Bind(&FileListCallbackAdapter, callback));
424 } 427 }
425 428
426 CancelCallback FakeDriveService::GetResourceEntry( 429 CancelCallback FakeDriveService::GetResourceEntry(
427 const std::string& resource_id, 430 const std::string& resource_id,
428 const GetResourceEntryCallback& callback) { 431 const GetResourceEntryCallback& callback) {
429 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 432 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
430 DCHECK(!callback.is_null()); 433 DCHECK(!callback.is_null());
431 434
432 if (offline_) { 435 if (offline_) {
433 scoped_ptr<ResourceEntry> null; 436 scoped_ptr<ResourceEntry> null;
(...skipping 944 matching lines...) Expand 10 before | Expand all | Expand 10 after
1378 1381
1379 base::Time published_date = 1382 base::Time published_date =
1380 base::Time() + base::TimeDelta::FromMilliseconds(++published_date_seq_); 1383 base::Time() + base::TimeDelta::FromMilliseconds(++published_date_seq_);
1381 new_file->set_created_date(published_date); 1384 new_file->set_created_date(published_date);
1382 1385
1383 EntryInfo* raw_new_entry = new_entry.release(); 1386 EntryInfo* raw_new_entry = new_entry.release();
1384 entries_[resource_id] = raw_new_entry; 1387 entries_[resource_id] = raw_new_entry;
1385 return raw_new_entry; 1388 return raw_new_entry;
1386 } 1389 }
1387 1390
1388 void FakeDriveService::GetResourceListInternal( 1391 void FakeDriveService::GetChangeListInternal(
1389 int64 start_changestamp, 1392 int64 start_changestamp,
1390 const std::string& search_query, 1393 const std::string& search_query,
1391 const std::string& directory_resource_id, 1394 const std::string& directory_resource_id,
1392 int start_offset, 1395 int start_offset,
1393 int max_results, 1396 int max_results,
1394 int* load_counter, 1397 int* load_counter,
1395 const ChangeListCallback& callback) { 1398 const ChangeListCallback& callback) {
1396 if (offline_) { 1399 if (offline_) {
1397 base::MessageLoop::current()->PostTask( 1400 base::MessageLoop::current()->PostTask(
1398 FROM_HERE, 1401 FROM_HERE,
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
1472 if (start_changestamp > 0 && start_offset == 0) { 1475 if (start_changestamp > 0 && start_offset == 0) {
1473 change_list->set_largest_change_id(about_resource_->largest_change_id()); 1476 change_list->set_largest_change_id(about_resource_->largest_change_id());
1474 } 1477 }
1475 1478
1476 // If |max_results| is set, trim the entries if the number exceeded the max 1479 // If |max_results| is set, trim the entries if the number exceeded the max
1477 // results. 1480 // results.
1478 if (max_results > 0 && entries.size() > static_cast<size_t>(max_results)) { 1481 if (max_results > 0 && entries.size() > static_cast<size_t>(max_results)) {
1479 entries.erase(entries.begin() + max_results, entries.end()); 1482 entries.erase(entries.begin() + max_results, entries.end());
1480 // Adds the next URL. 1483 // Adds the next URL.
1481 // Here, we embed information which is needed for continuing the 1484 // Here, we embed information which is needed for continuing the
1482 // GetResourceList request in the next invocation into url query 1485 // GetChangeList request in the next invocation into url query
1483 // parameters. 1486 // parameters.
1484 GURL next_url(base::StringPrintf( 1487 GURL next_url(base::StringPrintf(
1485 "http://localhost/?start-offset=%d&max-results=%d", 1488 "http://localhost/?start-offset=%d&max-results=%d",
1486 start_offset + max_results, 1489 start_offset + max_results,
1487 max_results)); 1490 max_results));
1488 if (start_changestamp > 0) { 1491 if (start_changestamp > 0) {
1489 next_url = net::AppendOrReplaceQueryParameter( 1492 next_url = net::AppendOrReplaceQueryParameter(
1490 next_url, "changestamp", 1493 next_url, "changestamp",
1491 base::Int64ToString(start_changestamp).c_str()); 1494 base::Int64ToString(start_changestamp).c_str());
1492 } 1495 }
(...skipping 28 matching lines...) Expand all
1521 google_apis::drive::PermissionRole role, 1524 google_apis::drive::PermissionRole role,
1522 const google_apis::EntryActionCallback& callback) { 1525 const google_apis::EntryActionCallback& callback) {
1523 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 1526 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1524 DCHECK(!callback.is_null()); 1527 DCHECK(!callback.is_null());
1525 1528
1526 NOTREACHED(); 1529 NOTREACHED();
1527 return CancelCallback(); 1530 return CancelCallback();
1528 } 1531 }
1529 1532
1530 } // namespace drive 1533 } // namespace drive
OLDNEW
« no previous file with comments | « chrome/browser/drive/fake_drive_service.h ('k') | chrome/browser/drive/fake_drive_service_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698