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 <algorithm> | 5 #include <algorithm> |
6 | 6 |
7 #include "base/file_util.h" | 7 #include "base/file_util.h" |
8 #include "base/files/scoped_temp_dir.h" | 8 #include "base/files/scoped_temp_dir.h" |
9 #include "base/json/json_reader.h" | 9 #include "base/json/json_reader.h" |
10 #include "base/message_loop.h" | 10 #include "base/message_loop.h" |
(...skipping 28 matching lines...) Expand all Loading... |
39 #include "content/public/test/download_test_observer.h" | 39 #include "content/public/test/download_test_observer.h" |
40 #include "content/test/net/url_request_slow_download_job.h" | 40 #include "content/test/net/url_request_slow_download_job.h" |
41 #include "net/base/data_url.h" | 41 #include "net/base/data_url.h" |
42 #include "net/base/net_util.h" | 42 #include "net/base/net_util.h" |
43 #include "net/url_request/url_request.h" | 43 #include "net/url_request/url_request.h" |
44 #include "net/url_request/url_request_context.h" | 44 #include "net/url_request/url_request_context.h" |
45 #include "net/url_request/url_request_job.h" | 45 #include "net/url_request/url_request_job.h" |
46 #include "net/url_request/url_request_job_factory.h" | 46 #include "net/url_request/url_request_job_factory.h" |
47 #include "net/url_request/url_request_job_factory_impl.h" | 47 #include "net/url_request/url_request_job_factory_impl.h" |
48 #include "webkit/blob/blob_data.h" | 48 #include "webkit/blob/blob_data.h" |
49 #include "webkit/blob/blob_storage_controller.h" | 49 #include "webkit/blob/blob_storage_context.h" |
50 #include "webkit/blob/blob_url_request_job.h" | 50 #include "webkit/blob/blob_url_request_job.h" |
51 #include "webkit/fileapi/file_system_context.h" | 51 #include "webkit/fileapi/file_system_context.h" |
52 #include "webkit/fileapi/file_system_operation.h" | 52 #include "webkit/fileapi/file_system_operation.h" |
53 #include "webkit/fileapi/file_system_url.h" | 53 #include "webkit/fileapi/file_system_url.h" |
54 | 54 |
55 using content::BrowserContext; | 55 using content::BrowserContext; |
56 using content::BrowserThread; | 56 using content::BrowserThread; |
57 using content::DownloadItem; | 57 using content::DownloadItem; |
58 using content::DownloadManager; | 58 using content::DownloadManager; |
59 using content::URLRequestSlowDownloadJob; | 59 using content::URLRequestSlowDownloadJob; |
(...skipping 555 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
615 (*item), base::Bind(&ItemNotInProgress)); | 615 (*item), base::Bind(&ItemNotInProgress)); |
616 observer.WaitForEvent(); | 616 observer.WaitForEvent(); |
617 } | 617 } |
618 } | 618 } |
619 | 619 |
620 private: | 620 private: |
621 DownloadManager::DownloadVector* items_; | 621 DownloadManager::DownloadVector* items_; |
622 DISALLOW_COPY_AND_ASSIGN(ScopedItemVectorCanceller); | 622 DISALLOW_COPY_AND_ASSIGN(ScopedItemVectorCanceller); |
623 }; | 623 }; |
624 | 624 |
| 625 #if 0 |
625 class TestProtocolHandler : public net::URLRequestJobFactory::ProtocolHandler { | 626 class TestProtocolHandler : public net::URLRequestJobFactory::ProtocolHandler { |
626 public: | 627 public: |
627 explicit TestProtocolHandler( | 628 explicit TestProtocolHandler( |
628 webkit_blob::BlobStorageController* blob_storage_controller, | 629 webkit_blob::BlobStorageContext* blob_storage_context, |
629 fileapi::FileSystemContext* file_system_context) | 630 fileapi::FileSystemContext* file_system_context) |
630 : blob_storage_controller_(blob_storage_controller), | 631 : blob_storage_context_(blob_storage_context), |
631 file_system_context_(file_system_context) {} | 632 file_system_context_(file_system_context) {} |
632 | 633 |
633 virtual ~TestProtocolHandler() {} | 634 virtual ~TestProtocolHandler() {} |
634 | 635 |
635 virtual net::URLRequestJob* MaybeCreateJob( | 636 virtual net::URLRequestJob* MaybeCreateJob( |
636 net::URLRequest* request, | 637 net::URLRequest* request, |
637 net::NetworkDelegate* network_delegate) const OVERRIDE { | 638 net::NetworkDelegate* network_delegate) const OVERRIDE { |
638 return new webkit_blob::BlobURLRequestJob( | 639 return new webkit_blob::BlobURLRequestJob( |
639 request, | 640 request, |
640 network_delegate, | 641 network_delegate, |
641 blob_storage_controller_->GetBlobDataFromUrl(request->url()), | 642 blob_storage_context_->GetBlobDataFromUrl(request->url()), |
642 file_system_context_, | 643 file_system_context_, |
643 base::MessageLoopProxy::current()); | 644 base::MessageLoopProxy::current()); |
644 } | 645 } |
645 | 646 |
646 private: | 647 private: |
647 webkit_blob::BlobStorageController* const blob_storage_controller_; | 648 webkit_blob::BlobStorageContext* const blob_storage_context_; |
648 fileapi::FileSystemContext* const file_system_context_; | 649 fileapi::FileSystemContext* const file_system_context_; |
649 | 650 |
650 DISALLOW_COPY_AND_ASSIGN(TestProtocolHandler); | 651 DISALLOW_COPY_AND_ASSIGN(TestProtocolHandler); |
651 }; | 652 }; |
652 | 653 |
653 class TestURLRequestContext : public net::URLRequestContext { | 654 class TestURLRequestContext : public net::URLRequestContext { |
654 public: | 655 public: |
655 explicit TestURLRequestContext( | 656 explicit TestURLRequestContext( |
656 fileapi::FileSystemContext* file_system_context) | 657 fileapi::FileSystemContext* file_system_context) |
657 : blob_storage_controller_(new webkit_blob::BlobStorageController) { | 658 : blob_storage_context_(new webkit_blob::BlobStorageContext) { |
658 // Job factory owns the protocol handler. | 659 // Job factory owns the protocol handler. |
659 job_factory_.SetProtocolHandler( | 660 job_factory_.SetProtocolHandler( |
660 "blob", new TestProtocolHandler(blob_storage_controller_.get(), | 661 "blob", new TestProtocolHandler(blob_storage_context_.get(), |
661 file_system_context)); | 662 file_system_context)); |
662 set_job_factory(&job_factory_); | 663 set_job_factory(&job_factory_); |
663 } | 664 } |
664 | 665 |
665 virtual ~TestURLRequestContext() {} | 666 virtual ~TestURLRequestContext() {} |
666 | 667 |
667 webkit_blob::BlobStorageController* blob_storage_controller() const { | 668 webkit_blob::BlobStorageContext* blob_storage_context() const { |
668 return blob_storage_controller_.get(); | 669 return blob_storage_context_.get(); |
669 } | 670 } |
670 | 671 |
671 private: | 672 private: |
672 net::URLRequestJobFactoryImpl job_factory_; | 673 net::URLRequestJobFactoryImpl job_factory_; |
673 scoped_ptr<webkit_blob::BlobStorageController> blob_storage_controller_; | 674 scoped_ptr<webkit_blob::BlobStorageContext> blob_storage_context_; |
674 | 675 |
675 DISALLOW_COPY_AND_ASSIGN(TestURLRequestContext); | 676 DISALLOW_COPY_AND_ASSIGN(TestURLRequestContext); |
676 }; | 677 }; |
677 | 678 |
678 // TODO(benjhayden): Comment. | 679 // TODO(benjhayden): Comment. |
| 680 // |
| 681 // TODO(michaeln): Wow, lots of complexity to create a filesystem file as a |
| 682 // precondition for the DownloadExtensionTest_Download_FileSystemURL. |
| 683 // Some alternatives come to mind: |
| 684 // - load an html page that will produce the file |
| 685 // - more directly write and create the file using lower level |
| 686 // fileapi::FileSystemFileUtilProxy to create the dir entry |
| 687 // and write directly into the platform file path using base file_utils. |
679 class HTML5FileWriter { | 688 class HTML5FileWriter { |
680 public: | 689 public: |
681 HTML5FileWriter( | 690 HTML5FileWriter( |
682 Profile* profile, | 691 Profile* profile, |
683 const std::string& filename, | 692 const std::string& filename, |
684 const std::string& origin, | 693 const std::string& origin, |
685 DownloadsEventsListener* events_listener, | 694 DownloadsEventsListener* events_listener, |
686 const std::string& payload) | 695 const std::string& payload) |
687 : profile_(profile), | 696 : profile_(profile), |
688 filename_(filename), | 697 filename_(filename), |
689 origin_(origin), | 698 origin_(origin), |
690 events_listener_(events_listener), | 699 events_listener_(events_listener), |
691 blob_data_(new webkit_blob::BlobData()), | 700 blob_data_(new webkit_blob::BlobData()), |
692 payload_(payload), | 701 payload_(payload), |
693 fs_(BrowserContext::GetDefaultStoragePartition(profile_)-> | 702 fs_(BrowserContext::GetDefaultStoragePartition(profile_)-> |
694 GetFileSystemContext()) { | 703 GetFileSystemContext()) { |
695 CHECK(profile_); | 704 CHECK(profile_); |
696 CHECK(events_listener_); | 705 CHECK(events_listener_); |
697 CHECK(fs_); | 706 CHECK(fs_); |
698 } | 707 } |
699 | 708 |
700 ~HTML5FileWriter() { | 709 ~HTML5FileWriter() { |
701 CHECK(BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, base::Bind( | 710 CHECK(BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, base::Bind( |
702 &HTML5FileWriter::TearDownURLRequestContext, base::Unretained(this)))); | 711 &HTML5FileWriter::TearDownURLRequestContext, base::Unretained(this)))); |
703 events_listener_->WaitFor(profile_, kURLRequestContextToreDown, ""); | 712 events_listener_->WaitFor(profile_, kURLRequestContextToreDown, ""); |
704 } | 713 } |
705 | 714 |
706 bool WriteFile() { | 715 bool WriteFile() { |
707 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 716 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 717 // TODO(michaeln): FSContext should not be used on the UI thread, |
| 718 // this part of the sequence should also be invoked on the IO thread. |
708 fs_->OpenFileSystem( | 719 fs_->OpenFileSystem( |
709 GURL(origin_), | 720 GURL(origin_), |
710 fileapi::kFileSystemTypeTemporary, | 721 fileapi::kFileSystemTypeTemporary, |
711 kCreateFileSystem, | 722 kCreateFileSystem, |
712 base::Bind(&HTML5FileWriter::OpenFileSystemCallback, | 723 base::Bind(&HTML5FileWriter::OpenFileSystemCallback, |
713 base::Unretained(this))); | 724 base::Unretained(this))); |
714 return events_listener_->WaitFor(profile_, kHTML5FileWritten, filename_); | 725 return events_listener_->WaitFor(profile_, kHTML5FileWritten, filename_); |
715 } | 726 } |
716 | 727 |
717 private: | 728 private: |
(...skipping 23 matching lines...) Expand all Loading... |
741 operation()->CreateFile(fs_->CrackURL(GURL(root_ + filename_)), | 752 operation()->CreateFile(fs_->CrackURL(GURL(root_ + filename_)), |
742 kExclusive, base::Bind( | 753 kExclusive, base::Bind( |
743 &HTML5FileWriter::CreateFileCallback, base::Unretained(this))); | 754 &HTML5FileWriter::CreateFileCallback, base::Unretained(this))); |
744 } | 755 } |
745 | 756 |
746 void CreateFileCallback(base::PlatformFileError result) { | 757 void CreateFileCallback(base::PlatformFileError result) { |
747 CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 758 CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
748 CHECK_EQ(base::PLATFORM_FILE_OK, result); | 759 CHECK_EQ(base::PLATFORM_FILE_OK, result); |
749 blob_data_->AppendData(payload_); | 760 blob_data_->AppendData(payload_); |
750 url_request_context_.reset(new TestURLRequestContext(fs_)); | 761 url_request_context_.reset(new TestURLRequestContext(fs_)); |
751 url_request_context_->blob_storage_controller()->AddFinishedBlob( | 762 url_request_context_->blob_storage_context()->AddFinishedBlob( |
752 blob_url(), blob_data_); | 763 blob_url(), blob_data_); |
753 operation()->Write( | 764 operation()->Write( |
754 url_request_context_.get(), | 765 url_request_context_.get(), |
755 fs_->CrackURL(GURL(root_ + filename_)), | 766 fs_->CrackURL(GURL(root_ + filename_)), |
756 blob_url(), | 767 blob_url(), |
757 0, // offset | 768 0, // offset |
758 base::Bind(&HTML5FileWriter::WriteCallback, base::Unretained(this))); | 769 base::Bind(&HTML5FileWriter::WriteCallback, base::Unretained(this))); |
759 } | 770 } |
760 | 771 |
761 void WriteCallback( | 772 void WriteCallback( |
(...skipping 13 matching lines...) Expand all Loading... |
775 notification_source.profile = profile_; | 786 notification_source.profile = profile_; |
776 content::NotificationService::current()->Notify( | 787 content::NotificationService::current()->Notify( |
777 chrome::NOTIFICATION_EXTENSION_DOWNLOADS_EVENT, | 788 chrome::NOTIFICATION_EXTENSION_DOWNLOADS_EVENT, |
778 content::Source<DownloadsEventsListener::DownloadsNotificationSource>( | 789 content::Source<DownloadsEventsListener::DownloadsNotificationSource>( |
779 ¬ification_source), | 790 ¬ification_source), |
780 content::Details<std::string>(&filename_)); | 791 content::Details<std::string>(&filename_)); |
781 } | 792 } |
782 | 793 |
783 void TearDownURLRequestContext() { | 794 void TearDownURLRequestContext() { |
784 CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 795 CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
785 url_request_context_->blob_storage_controller()->RemoveBlob(blob_url()); | 796 url_request_context_->blob_storage_context()->RemoveBlob(blob_url()); |
786 url_request_context_.reset(); | 797 url_request_context_.reset(); |
787 CHECK(BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, base::Bind( | 798 CHECK(BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, base::Bind( |
788 &HTML5FileWriter::NotifyURLRequestContextToreDown, | 799 &HTML5FileWriter::NotifyURLRequestContextToreDown, |
789 base::Unretained(this)))); | 800 base::Unretained(this)))); |
790 } | 801 } |
791 | 802 |
792 void NotifyURLRequestContextToreDown() { | 803 void NotifyURLRequestContextToreDown() { |
793 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 804 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
794 DownloadsEventsListener::DownloadsNotificationSource notification_source; | 805 DownloadsEventsListener::DownloadsNotificationSource notification_source; |
795 notification_source.event_name = kURLRequestContextToreDown; | 806 notification_source.event_name = kURLRequestContextToreDown; |
(...skipping 15 matching lines...) Expand all Loading... |
811 std::string payload_; | 822 std::string payload_; |
812 scoped_ptr<TestURLRequestContext> url_request_context_; | 823 scoped_ptr<TestURLRequestContext> url_request_context_; |
813 fileapi::FileSystemContext* fs_; | 824 fileapi::FileSystemContext* fs_; |
814 | 825 |
815 DISALLOW_COPY_AND_ASSIGN(HTML5FileWriter); | 826 DISALLOW_COPY_AND_ASSIGN(HTML5FileWriter); |
816 }; | 827 }; |
817 | 828 |
818 const char HTML5FileWriter::kHTML5FileWritten[] = "html5_file_written"; | 829 const char HTML5FileWriter::kHTML5FileWritten[] = "html5_file_written"; |
819 const char HTML5FileWriter::kURLRequestContextToreDown[] = | 830 const char HTML5FileWriter::kURLRequestContextToreDown[] = |
820 "url_request_context_tore_down"; | 831 "url_request_context_tore_down"; |
| 832 #endif |
821 | 833 |
822 } // namespace | 834 } // namespace |
823 | 835 |
824 IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, | 836 IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, |
825 DownloadExtensionTest_Open) { | 837 DownloadExtensionTest_Open) { |
826 EXPECT_STREQ(download_extension_errors::kInvalidOperationError, | 838 EXPECT_STREQ(download_extension_errors::kInvalidOperationError, |
827 RunFunctionAndReturnError( | 839 RunFunctionAndReturnError( |
828 new DownloadsOpenFunction(), | 840 new DownloadsOpenFunction(), |
829 "[-42]").c_str()); | 841 "[-42]").c_str()); |
830 | 842 |
(...skipping 1256 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2087 item->Cancel(true); | 2099 item->Cancel(true); |
2088 ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, | 2100 ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, |
2089 base::StringPrintf("[{\"id\": %d," | 2101 base::StringPrintf("[{\"id\": %d," |
2090 " \"error\": {\"current\": 40}," | 2102 " \"error\": {\"current\": 40}," |
2091 " \"state\": {" | 2103 " \"state\": {" |
2092 " \"previous\": \"in_progress\"," | 2104 " \"previous\": \"in_progress\"," |
2093 " \"current\": \"interrupted\"}}]", | 2105 " \"current\": \"interrupted\"}}]", |
2094 result_id))); | 2106 result_id))); |
2095 } | 2107 } |
2096 | 2108 |
| 2109 #if 0 |
2097 // Test downloading filesystem: URLs. | 2110 // Test downloading filesystem: URLs. |
2098 // NOTE: chrome disallows creating HTML5 FileSystem Files in incognito. | 2111 // NOTE: chrome disallows creating HTML5 FileSystem Files in incognito. |
2099 IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, | 2112 IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, |
2100 DownloadExtensionTest_Download_FileSystemURL) { | 2113 DownloadExtensionTest_Download_FileSystemURL) { |
2101 static const char* kPayloadData = "on the record\ndata"; | 2114 static const char* kPayloadData = "on the record\ndata"; |
2102 GoOnTheRecord(); | 2115 GoOnTheRecord(); |
2103 LoadExtension("downloads_split"); | 2116 LoadExtension("downloads_split"); |
2104 HTML5FileWriter html5_file_writer( | 2117 HTML5FileWriter html5_file_writer( |
2105 browser()->profile(), | 2118 browser()->profile(), |
2106 "on_record.txt", | 2119 "on_record.txt", |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2138 " \"state\": {" | 2151 " \"state\": {" |
2139 " \"previous\": \"in_progress\"," | 2152 " \"previous\": \"in_progress\"," |
2140 " \"current\": \"complete\"}}]", | 2153 " \"current\": \"complete\"}}]", |
2141 result_id, | 2154 result_id, |
2142 GetFilename("on_record.txt.crdownload").c_str(), | 2155 GetFilename("on_record.txt.crdownload").c_str(), |
2143 GetFilename("on_record.txt").c_str()))); | 2156 GetFilename("on_record.txt").c_str()))); |
2144 std::string disk_data; | 2157 std::string disk_data; |
2145 EXPECT_TRUE(file_util::ReadFileToString(item->GetFullPath(), &disk_data)); | 2158 EXPECT_TRUE(file_util::ReadFileToString(item->GetFullPath(), &disk_data)); |
2146 EXPECT_STREQ(kPayloadData, disk_data.c_str()); | 2159 EXPECT_STREQ(kPayloadData, disk_data.c_str()); |
2147 } | 2160 } |
| 2161 #endif |
OLD | NEW |