| OLD | NEW |
| 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/json/json_string_value_serializer.h" | 10 #include "base/json/json_string_value_serializer.h" |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 43 using google_apis::FileResource; | 43 using google_apis::FileResource; |
| 44 using google_apis::FileResourceCallback; | 44 using google_apis::FileResourceCallback; |
| 45 using google_apis::GDATA_FILE_ERROR; | 45 using google_apis::GDATA_FILE_ERROR; |
| 46 using google_apis::GDATA_NO_CONNECTION; | 46 using google_apis::GDATA_NO_CONNECTION; |
| 47 using google_apis::GDATA_OTHER_ERROR; | 47 using google_apis::GDATA_OTHER_ERROR; |
| 48 using google_apis::GDataErrorCode; | 48 using google_apis::GDataErrorCode; |
| 49 using google_apis::GetContentCallback; | 49 using google_apis::GetContentCallback; |
| 50 using google_apis::GetShareUrlCallback; | 50 using google_apis::GetShareUrlCallback; |
| 51 using google_apis::HTTP_BAD_REQUEST; | 51 using google_apis::HTTP_BAD_REQUEST; |
| 52 using google_apis::HTTP_CREATED; | 52 using google_apis::HTTP_CREATED; |
| 53 using google_apis::HTTP_FORBIDDEN; |
| 53 using google_apis::HTTP_NOT_FOUND; | 54 using google_apis::HTTP_NOT_FOUND; |
| 54 using google_apis::HTTP_NO_CONTENT; | 55 using google_apis::HTTP_NO_CONTENT; |
| 55 using google_apis::HTTP_PRECONDITION; | 56 using google_apis::HTTP_PRECONDITION; |
| 56 using google_apis::HTTP_RESUME_INCOMPLETE; | 57 using google_apis::HTTP_RESUME_INCOMPLETE; |
| 57 using google_apis::HTTP_SUCCESS; | 58 using google_apis::HTTP_SUCCESS; |
| 58 using google_apis::InitiateUploadCallback; | 59 using google_apis::InitiateUploadCallback; |
| 59 using google_apis::ParentReference; | 60 using google_apis::ParentReference; |
| 60 using google_apis::ProgressCallback; | 61 using google_apis::ProgressCallback; |
| 61 using google_apis::UploadRangeResponse; | 62 using google_apis::UploadRangeResponse; |
| 62 using google_apis::drive::UploadRangeCallback; | 63 using google_apis::drive::UploadRangeCallback; |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 124 file_list->set_next_link(change_list->next_link()); | 125 file_list->set_next_link(change_list->next_link()); |
| 125 for (size_t i = 0; i < change_list->items().size(); ++i) { | 126 for (size_t i = 0; i < change_list->items().size(); ++i) { |
| 126 const ChangeResource& entry = *change_list->items()[i]; | 127 const ChangeResource& entry = *change_list->items()[i]; |
| 127 if (entry.file()) | 128 if (entry.file()) |
| 128 file_list->mutable_items()->push_back(new FileResource(*entry.file())); | 129 file_list->mutable_items()->push_back(new FileResource(*entry.file())); |
| 129 } | 130 } |
| 130 } | 131 } |
| 131 callback.Run(error, file_list.Pass()); | 132 callback.Run(error, file_list.Pass()); |
| 132 } | 133 } |
| 133 | 134 |
| 135 bool UserHasWriteAccess(google_apis::drive::PermissionRole user_permission) { |
| 136 switch (user_permission) { |
| 137 case google_apis::drive::PERMISSION_ROLE_OWNER: |
| 138 case google_apis::drive::PERMISSION_ROLE_WRITER: |
| 139 return true; |
| 140 case google_apis::drive::PERMISSION_ROLE_READER: |
| 141 case google_apis::drive::PERMISSION_ROLE_COMMENTER: |
| 142 break; |
| 143 } |
| 144 return false; |
| 145 } |
| 146 |
| 134 } // namespace | 147 } // namespace |
| 135 | 148 |
| 136 struct FakeDriveService::EntryInfo { | 149 struct FakeDriveService::EntryInfo { |
| 150 EntryInfo() : user_permission(google_apis::drive::PERMISSION_ROLE_OWNER) {} |
| 151 |
| 137 google_apis::ChangeResource change_resource; | 152 google_apis::ChangeResource change_resource; |
| 138 GURL share_url; | 153 GURL share_url; |
| 139 std::string content_data; | 154 std::string content_data; |
| 155 |
| 156 // Behaves in the same way as "userPermission" described in |
| 157 // https://developers.google.com/drive/v2/reference/files |
| 158 google_apis::drive::PermissionRole user_permission; |
| 140 }; | 159 }; |
| 141 | 160 |
| 142 struct FakeDriveService::UploadSession { | 161 struct FakeDriveService::UploadSession { |
| 143 std::string content_type; | 162 std::string content_type; |
| 144 int64 content_length; | 163 int64 content_length; |
| 145 std::string parent_resource_id; | 164 std::string parent_resource_id; |
| 146 std::string resource_id; | 165 std::string resource_id; |
| 147 std::string etag; | 166 std::string etag; |
| 148 std::string title; | 167 std::string title; |
| 149 | 168 |
| (...skipping 452 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 602 FROM_HERE, base::Bind(callback, HTTP_NOT_FOUND)); | 621 FROM_HERE, base::Bind(callback, HTTP_NOT_FOUND)); |
| 603 return CancelCallback(); | 622 return CancelCallback(); |
| 604 } | 623 } |
| 605 | 624 |
| 606 if (!etag.empty() && etag != file->etag()) { | 625 if (!etag.empty() && etag != file->etag()) { |
| 607 base::MessageLoop::current()->PostTask( | 626 base::MessageLoop::current()->PostTask( |
| 608 FROM_HERE, base::Bind(callback, HTTP_PRECONDITION)); | 627 FROM_HERE, base::Bind(callback, HTTP_PRECONDITION)); |
| 609 return CancelCallback(); | 628 return CancelCallback(); |
| 610 } | 629 } |
| 611 | 630 |
| 631 if (entry->user_permission != google_apis::drive::PERMISSION_ROLE_OWNER) { |
| 632 base::MessageLoop::current()->PostTask( |
| 633 FROM_HERE, base::Bind(callback, HTTP_FORBIDDEN)); |
| 634 return CancelCallback(); |
| 635 } |
| 636 |
| 612 change->set_deleted(true); | 637 change->set_deleted(true); |
| 613 AddNewChangestamp(change); | 638 AddNewChangestamp(change); |
| 614 change->set_file(scoped_ptr<FileResource>()); | 639 change->set_file(scoped_ptr<FileResource>()); |
| 615 base::MessageLoop::current()->PostTask( | 640 base::MessageLoop::current()->PostTask( |
| 616 FROM_HERE, base::Bind(callback, HTTP_NO_CONTENT)); | 641 FROM_HERE, base::Bind(callback, HTTP_NO_CONTENT)); |
| 617 return CancelCallback(); | 642 return CancelCallback(); |
| 618 } | 643 } |
| 619 | 644 |
| 620 base::MessageLoop::current()->PostTask( | 645 base::MessageLoop::current()->PostTask( |
| 621 FROM_HERE, base::Bind(callback, HTTP_NOT_FOUND)); | 646 FROM_HERE, base::Bind(callback, HTTP_NOT_FOUND)); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 634 return CancelCallback(); | 659 return CancelCallback(); |
| 635 } | 660 } |
| 636 | 661 |
| 637 EntryInfo* entry = FindEntryByResourceId(resource_id); | 662 EntryInfo* entry = FindEntryByResourceId(resource_id); |
| 638 if (entry) { | 663 if (entry) { |
| 639 ChangeResource* change = &entry->change_resource; | 664 ChangeResource* change = &entry->change_resource; |
| 640 FileResource* file = change->mutable_file(); | 665 FileResource* file = change->mutable_file(); |
| 641 GDataErrorCode error = google_apis::GDATA_OTHER_ERROR; | 666 GDataErrorCode error = google_apis::GDATA_OTHER_ERROR; |
| 642 if (change->is_deleted() || file->labels().is_trashed()) { | 667 if (change->is_deleted() || file->labels().is_trashed()) { |
| 643 error = HTTP_NOT_FOUND; | 668 error = HTTP_NOT_FOUND; |
| 669 } else if (entry->user_permission != |
| 670 google_apis::drive::PERMISSION_ROLE_OWNER) { |
| 671 error = HTTP_FORBIDDEN; |
| 644 } else { | 672 } else { |
| 645 file->mutable_labels()->set_trashed(true); | 673 file->mutable_labels()->set_trashed(true); |
| 646 AddNewChangestamp(change); | 674 AddNewChangestamp(change); |
| 647 error = HTTP_SUCCESS; | 675 error = HTTP_SUCCESS; |
| 648 } | 676 } |
| 649 base::MessageLoop::current()->PostTask( | 677 base::MessageLoop::current()->PostTask( |
| 650 FROM_HERE, base::Bind(callback, error)); | 678 FROM_HERE, base::Bind(callback, error)); |
| 651 return CancelCallback(); | 679 return CancelCallback(); |
| 652 } | 680 } |
| 653 | 681 |
| (...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 807 | 835 |
| 808 if (offline_) { | 836 if (offline_) { |
| 809 base::MessageLoop::current()->PostTask( | 837 base::MessageLoop::current()->PostTask( |
| 810 FROM_HERE, base::Bind(callback, GDATA_NO_CONNECTION, | 838 FROM_HERE, base::Bind(callback, GDATA_NO_CONNECTION, |
| 811 base::Passed(scoped_ptr<FileResource>()))); | 839 base::Passed(scoped_ptr<FileResource>()))); |
| 812 return CancelCallback(); | 840 return CancelCallback(); |
| 813 } | 841 } |
| 814 | 842 |
| 815 EntryInfo* entry = FindEntryByResourceId(resource_id); | 843 EntryInfo* entry = FindEntryByResourceId(resource_id); |
| 816 if (entry) { | 844 if (entry) { |
| 845 if (!UserHasWriteAccess(entry->user_permission)) { |
| 846 base::MessageLoop::current()->PostTask( |
| 847 FROM_HERE, |
| 848 base::Bind(callback, HTTP_FORBIDDEN, |
| 849 base::Passed(scoped_ptr<FileResource>()))); |
| 850 return CancelCallback(); |
| 851 } |
| 852 |
| 817 ChangeResource* change = &entry->change_resource; | 853 ChangeResource* change = &entry->change_resource; |
| 818 FileResource* file = change->mutable_file(); | 854 FileResource* file = change->mutable_file(); |
| 819 | 855 |
| 820 if (!new_title.empty()) | 856 if (!new_title.empty()) |
| 821 file->set_title(new_title); | 857 file->set_title(new_title); |
| 822 | 858 |
| 823 // Set parent if necessary. | 859 // Set parent if necessary. |
| 824 if (!parent_resource_id.empty()) { | 860 if (!parent_resource_id.empty()) { |
| 825 ParentReference parent; | 861 ParentReference parent; |
| 826 parent.set_file_id(parent_resource_id); | 862 parent.set_file_id(parent_resource_id); |
| (...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 993 } | 1029 } |
| 994 | 1030 |
| 995 EntryInfo* entry = FindEntryByResourceId(resource_id); | 1031 EntryInfo* entry = FindEntryByResourceId(resource_id); |
| 996 if (!entry) { | 1032 if (!entry) { |
| 997 base::MessageLoop::current()->PostTask( | 1033 base::MessageLoop::current()->PostTask( |
| 998 FROM_HERE, | 1034 FROM_HERE, |
| 999 base::Bind(callback, HTTP_NOT_FOUND, GURL())); | 1035 base::Bind(callback, HTTP_NOT_FOUND, GURL())); |
| 1000 return CancelCallback(); | 1036 return CancelCallback(); |
| 1001 } | 1037 } |
| 1002 | 1038 |
| 1039 if (!UserHasWriteAccess(entry->user_permission)) { |
| 1040 base::MessageLoop::current()->PostTask( |
| 1041 FROM_HERE, |
| 1042 base::Bind(callback, HTTP_FORBIDDEN, GURL())); |
| 1043 return CancelCallback(); |
| 1044 } |
| 1045 |
| 1003 FileResource* file = entry->change_resource.mutable_file(); | 1046 FileResource* file = entry->change_resource.mutable_file(); |
| 1004 if (!options.etag.empty() && options.etag != file->etag()) { | 1047 if (!options.etag.empty() && options.etag != file->etag()) { |
| 1005 base::MessageLoop::current()->PostTask( | 1048 base::MessageLoop::current()->PostTask( |
| 1006 FROM_HERE, | 1049 FROM_HERE, |
| 1007 base::Bind(callback, HTTP_PRECONDITION, GURL())); | 1050 base::Bind(callback, HTTP_PRECONDITION, GURL())); |
| 1008 return CancelCallback(); | 1051 return CancelCallback(); |
| 1009 } | 1052 } |
| 1010 // TODO(hashimoto): Update |file|'s metadata with |options|. | 1053 // TODO(hashimoto): Update |file|'s metadata with |options|. |
| 1011 | 1054 |
| 1012 GURL session_url = GetNewUploadSessionUrl(); | 1055 GURL session_url = GetNewUploadSessionUrl(); |
| (...skipping 296 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1309 ChangeResource* change = &entry->change_resource; | 1352 ChangeResource* change = &entry->change_resource; |
| 1310 FileResource* file = change->mutable_file(); | 1353 FileResource* file = change->mutable_file(); |
| 1311 file->set_modified_date(last_modified_time); | 1354 file->set_modified_date(last_modified_time); |
| 1312 | 1355 |
| 1313 base::MessageLoop::current()->PostTask( | 1356 base::MessageLoop::current()->PostTask( |
| 1314 FROM_HERE, | 1357 FROM_HERE, |
| 1315 base::Bind(callback, HTTP_SUCCESS, | 1358 base::Bind(callback, HTTP_SUCCESS, |
| 1316 base::Passed(make_scoped_ptr(new FileResource(*file))))); | 1359 base::Passed(make_scoped_ptr(new FileResource(*file))))); |
| 1317 } | 1360 } |
| 1318 | 1361 |
| 1362 google_apis::GDataErrorCode FakeDriveService::SetUserPermission( |
| 1363 const std::string& resource_id, |
| 1364 google_apis::drive::PermissionRole user_permission) { |
| 1365 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 1366 |
| 1367 EntryInfo* entry = FindEntryByResourceId(resource_id); |
| 1368 if (!entry) |
| 1369 return HTTP_NOT_FOUND; |
| 1370 |
| 1371 entry->user_permission = user_permission; |
| 1372 return HTTP_SUCCESS; |
| 1373 } |
| 1374 |
| 1319 FakeDriveService::EntryInfo* FakeDriveService::FindEntryByResourceId( | 1375 FakeDriveService::EntryInfo* FakeDriveService::FindEntryByResourceId( |
| 1320 const std::string& resource_id) { | 1376 const std::string& resource_id) { |
| 1321 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 1377 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 1322 | 1378 |
| 1323 EntryInfoMap::iterator it = entries_.find(resource_id); | 1379 EntryInfoMap::iterator it = entries_.find(resource_id); |
| 1324 // Deleted entries don't have FileResource. | 1380 // Deleted entries don't have FileResource. |
| 1325 return it != entries_.end() && it->second->change_resource.file() ? | 1381 return it != entries_.end() && it->second->change_resource.file() ? |
| 1326 it->second : NULL; | 1382 it->second : NULL; |
| 1327 } | 1383 } |
| 1328 | 1384 |
| (...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1557 google_apis::drive::PermissionRole role, | 1613 google_apis::drive::PermissionRole role, |
| 1558 const google_apis::EntryActionCallback& callback) { | 1614 const google_apis::EntryActionCallback& callback) { |
| 1559 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 1615 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 1560 DCHECK(!callback.is_null()); | 1616 DCHECK(!callback.is_null()); |
| 1561 | 1617 |
| 1562 NOTREACHED(); | 1618 NOTREACHED(); |
| 1563 return CancelCallback(); | 1619 return CancelCallback(); |
| 1564 } | 1620 } |
| 1565 | 1621 |
| 1566 } // namespace drive | 1622 } // namespace drive |
| OLD | NEW |