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

Side by Side Diff: content/child/webblobregistry_impl.cc

Issue 15817013: Add Stream support to WebBlobRegistry and FileAPIMessageFilter. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 5 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 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 "content/child/webblobregistry_impl.h" 5 #include "content/child/webblobregistry_impl.h"
6 6
7 #include "base/files/file_path.h" 7 #include "base/files/file_path.h"
8 #include "base/memory/ref_counted.h" 8 #include "base/memory/ref_counted.h"
9 #include "base/memory/shared_memory.h" 9 #include "base/memory/shared_memory.h"
10 #include "base/message_loop/message_loop.h" 10 #include "base/message_loop/message_loop.h"
11 #include "content/child/child_thread.h" 11 #include "content/child/child_thread.h"
12 #include "content/child/thread_safe_sender.h" 12 #include "content/child/thread_safe_sender.h"
13 #include "content/common/fileapi/webblob_messages.h" 13 #include "content/common/fileapi/webblob_messages.h"
14 #include "third_party/WebKit/public/platform/WebBlobData.h" 14 #include "third_party/WebKit/public/platform/WebBlobData.h"
15 #include "third_party/WebKit/public/platform/WebString.h" 15 #include "third_party/WebKit/public/platform/WebString.h"
16 #include "third_party/WebKit/public/platform/WebThreadSafeData.h" 16 #include "third_party/WebKit/public/platform/WebThreadSafeData.h"
17 #include "third_party/WebKit/public/platform/WebURL.h" 17 #include "third_party/WebKit/public/platform/WebURL.h"
18 #include "webkit/common/blob/blob_data.h" 18 #include "webkit/common/blob/blob_data.h"
19 19
20 using WebKit::WebBlobData; 20 using WebKit::WebBlobData;
21 using WebKit::WebString; 21 using WebKit::WebString;
22 using WebKit::WebThreadSafeData; 22 using WebKit::WebThreadSafeData;
23 using WebKit::WebURL; 23 using WebKit::WebURL;
24 24
25 namespace content { 25 namespace content {
26 26
27 namespace {
28
29 const size_t kLargeThresholdBytes = 250 * 1024;
30 const size_t kMaxSharedMemoryBytes = 10 * 1024 * 1024;
31
32 } // namespace
33
27 WebBlobRegistryImpl::WebBlobRegistryImpl(ThreadSafeSender* sender) 34 WebBlobRegistryImpl::WebBlobRegistryImpl(ThreadSafeSender* sender)
28 : sender_(sender) { 35 : sender_(sender) {
29 } 36 }
30 37
31 WebBlobRegistryImpl::~WebBlobRegistryImpl() { 38 WebBlobRegistryImpl::~WebBlobRegistryImpl() {
32 } 39 }
33 40
34 void WebBlobRegistryImpl::SendData(const WebURL& url, 41 void WebBlobRegistryImpl::SendDataForBlob(const WebURL& url,
35 const WebThreadSafeData& data, 42 const WebThreadSafeData& data) {
36 webkit_blob::BlobData::Item* item) {
37 const size_t kLargeThresholdBytes = 250 * 1024;
38 const size_t kMaxSharedMemoryBytes = 10 * 1024 * 1024;
39 43
40 if (data.size() == 0) 44 if (data.size() == 0)
41 return; 45 return;
42 if (data.size() < kLargeThresholdBytes) { 46 if (data.size() < kLargeThresholdBytes) {
43 item->SetToBytes(data.data(), data.size()); 47 webkit_blob::BlobData::Item item;
44 sender_->Send(new BlobHostMsg_AppendBlobDataItem(url, *item)); 48 item.SetToBytes(data.data(), data.size());
49 sender_->Send(new BlobHostMsg_AppendBlobDataItem(url, item));
45 } else { 50 } else {
46 // We handle larger amounts of data via SharedMemory instead of 51 // We handle larger amounts of data via SharedMemory instead of
47 // writing it directly to the IPC channel. 52 // writing it directly to the IPC channel.
48 size_t data_size = data.size();
49 const char* data_ptr = data.data();
50 size_t shared_memory_size = std::min( 53 size_t shared_memory_size = std::min(
51 data_size, kMaxSharedMemoryBytes); 54 data.size(), kMaxSharedMemoryBytes);
52 scoped_ptr<base::SharedMemory> shared_memory( 55 scoped_ptr<base::SharedMemory> shared_memory(
53 ChildThread::AllocateSharedMemory(shared_memory_size, 56 ChildThread::AllocateSharedMemory(shared_memory_size,
54 sender_.get())); 57 sender_.get()));
55 CHECK(shared_memory.get()); 58 CHECK(shared_memory.get());
59
60 size_t data_size = data.size();
61 const char* data_ptr = data.data();
56 while (data_size) { 62 while (data_size) {
57 size_t chunk_size = std::min(data_size, shared_memory_size); 63 size_t chunk_size = std::min(data_size, shared_memory_size);
58 memcpy(shared_memory->memory(), data_ptr, chunk_size); 64 memcpy(shared_memory->memory(), data_ptr, chunk_size);
59 sender_->Send(new BlobHostMsg_SyncAppendSharedMemory( 65 sender_->Send(new BlobHostMsg_SyncAppendSharedMemory(
60 url, shared_memory->handle(), chunk_size)); 66 url, shared_memory->handle(), chunk_size));
61 data_size -= chunk_size; 67 data_size -= chunk_size;
62 data_ptr += chunk_size; 68 data_ptr += chunk_size;
63 } 69 }
64 } 70 }
65 } 71 }
66 72
67 void WebBlobRegistryImpl::registerBlobURL( 73 void WebBlobRegistryImpl::registerBlobURL(
68 const WebURL& url, WebBlobData& data) { 74 const WebURL& url, WebBlobData& data) {
69 DCHECK(ChildThread::current()->message_loop() == 75 DCHECK(ChildThread::current());
70 base::MessageLoop::current()); 76 sender_->Send(new BlobHostMsg_StartBuilding(url));
71 sender_->Send(new BlobHostMsg_StartBuildingBlob(url));
72 size_t i = 0; 77 size_t i = 0;
73 WebBlobData::Item data_item; 78 WebBlobData::Item data_item;
74 while (data.itemAt(i++, data_item)) { 79 while (data.itemAt(i++, data_item)) {
75 webkit_blob::BlobData::Item item;
76 switch (data_item.type) { 80 switch (data_item.type) {
77 case WebBlobData::Item::TypeData: { 81 case WebBlobData::Item::TypeData: {
78 // WebBlobData does not allow partial data items. 82 // WebBlobData does not allow partial data items.
79 DCHECK(!data_item.offset && data_item.length == -1); 83 DCHECK(!data_item.offset && data_item.length == -1);
80 SendData(url, data_item.data, &item); 84 SendDataForBlob(url, data_item.data);
81 break; 85 break;
82 } 86 }
83 case WebBlobData::Item::TypeFile: 87 case WebBlobData::Item::TypeFile:
84 if (data_item.length) { 88 if (data_item.length) {
89 webkit_blob::BlobData::Item item;
85 item.SetToFilePathRange( 90 item.SetToFilePathRange(
86 base::FilePath::FromUTF16Unsafe(data_item.filePath), 91 base::FilePath::FromUTF16Unsafe(data_item.filePath),
87 static_cast<uint64>(data_item.offset), 92 static_cast<uint64>(data_item.offset),
88 static_cast<uint64>(data_item.length), 93 static_cast<uint64>(data_item.length),
89 base::Time::FromDoubleT(data_item.expectedModificationTime)); 94 base::Time::FromDoubleT(data_item.expectedModificationTime));
90 sender_->Send(new BlobHostMsg_AppendBlobDataItem(url, item)); 95 sender_->Send(
96 new BlobHostMsg_AppendBlobDataItem(url, item));
91 } 97 }
92 break; 98 break;
93 case WebBlobData::Item::TypeBlob: 99 case WebBlobData::Item::TypeBlob:
94 if (data_item.length) { 100 if (data_item.length) {
101 webkit_blob::BlobData::Item item;
95 item.SetToBlobUrlRange( 102 item.SetToBlobUrlRange(
96 data_item.blobURL, 103 data_item.blobURL,
97 static_cast<uint64>(data_item.offset), 104 static_cast<uint64>(data_item.offset),
98 static_cast<uint64>(data_item.length)); 105 static_cast<uint64>(data_item.length));
99 sender_->Send(new BlobHostMsg_AppendBlobDataItem(url, item)); 106 sender_->Send(
107 new BlobHostMsg_AppendBlobDataItem(url, item));
100 } 108 }
101 break; 109 break;
102 case WebBlobData::Item::TypeURL: 110 case WebBlobData::Item::TypeURL:
103 if (data_item.length) { 111 if (data_item.length) {
104 // We only support filesystem URL as of now. 112 // We only support filesystem URL as of now.
105 DCHECK(GURL(data_item.url).SchemeIsFileSystem()); 113 DCHECK(GURL(data_item.url).SchemeIsFileSystem());
114 webkit_blob::BlobData::Item item;
106 item.SetToFileSystemUrlRange( 115 item.SetToFileSystemUrlRange(
107 data_item.url, 116 data_item.url,
108 static_cast<uint64>(data_item.offset), 117 static_cast<uint64>(data_item.offset),
109 static_cast<uint64>(data_item.length), 118 static_cast<uint64>(data_item.length),
110 base::Time::FromDoubleT(data_item.expectedModificationTime)); 119 base::Time::FromDoubleT(data_item.expectedModificationTime));
111 sender_->Send(new BlobHostMsg_AppendBlobDataItem(url, item)); 120 sender_->Send(
121 new BlobHostMsg_AppendBlobDataItem(url, item));
112 } 122 }
113 break; 123 break;
114 default: 124 default:
115 NOTREACHED(); 125 NOTREACHED();
116 } 126 }
117 } 127 }
118 sender_->Send(new BlobHostMsg_FinishBuildingBlob( 128 sender_->Send(new BlobHostMsg_FinishBuilding(
119 url, data.contentType().utf8().data())); 129 url, data.contentType().utf8().data()));
120 } 130 }
121 131
122 void WebBlobRegistryImpl::registerBlobURL( 132 void WebBlobRegistryImpl::registerBlobURL(
123 const WebURL& url, const WebURL& src_url) { 133 const WebURL& url, const WebURL& src_url) {
124 DCHECK(ChildThread::current()->message_loop() == 134 DCHECK(ChildThread::current());
125 base::MessageLoop::current()); 135 sender_->Send(new BlobHostMsg_Clone(url, src_url));
126 sender_->Send(new BlobHostMsg_CloneBlob(url, src_url));
127 } 136 }
128 137
129 void WebBlobRegistryImpl::unregisterBlobURL(const WebURL& url) { 138 void WebBlobRegistryImpl::unregisterBlobURL(const WebURL& url) {
130 DCHECK(ChildThread::current()->message_loop() == 139 DCHECK(ChildThread::current());
131 base::MessageLoop::current()); 140 sender_->Send(new BlobHostMsg_Remove(url));
132 sender_->Send(new BlobHostMsg_RemoveBlob(url)); 141 }
142
143 void WebBlobRegistryImpl::registerStreamURL(
144 const WebURL& url, const WebString& content_type) {
145 DCHECK(ChildThread::current());
146 sender_->Send(new StreamHostMsg_StartBuilding(url, content_type.utf8()));
147 }
148
149 void WebBlobRegistryImpl::registerStreamURL(
150 const WebURL& url, const WebURL& src_url) {
151 DCHECK(ChildThread::current());
152 sender_->Send(new StreamHostMsg_Clone(url, src_url));
153 }
154
155 void WebBlobRegistryImpl::addDataToStream(const WebURL& url,
156 WebThreadSafeData& data) {
157 DCHECK(ChildThread::current());
158 if (data.size() == 0)
159 return;
160 if (data.size() < kLargeThresholdBytes) {
161 webkit_blob::BlobData::Item item;
162 item.SetToBytes(data.data(), data.size());
163 sender_->Send(new StreamHostMsg_AppendBlobDataItem(url, item));
164 } else {
165 // We handle larger amounts of data via SharedMemory instead of
166 // writing it directly to the IPC channel.
167 size_t shared_memory_size = std::min(
168 data.size(), kMaxSharedMemoryBytes);
169 scoped_ptr<base::SharedMemory> shared_memory(
170 ChildThread::AllocateSharedMemory(shared_memory_size,
171 sender_.get()));
172 CHECK(shared_memory.get());
173
174 size_t data_size = data.size();
175 const char* data_ptr = data.data();
176 while (data_size) {
177 size_t chunk_size = std::min(data_size, shared_memory_size);
178 memcpy(shared_memory->memory(), data_ptr, chunk_size);
179 sender_->Send(new StreamHostMsg_SyncAppendSharedMemory(
180 url, shared_memory->handle(), chunk_size));
181 data_size -= chunk_size;
182 data_ptr += chunk_size;
183 }
184 }
185 }
186
187 void WebBlobRegistryImpl::finalizeStream(const WebURL& url) {
188 DCHECK(ChildThread::current());
189 sender_->Send(new StreamHostMsg_FinishBuilding(url));
190 }
191
192 void WebBlobRegistryImpl::unregisterStreamURL(const WebURL& url) {
193 DCHECK(ChildThread::current());
194 sender_->Send(new StreamHostMsg_Remove(url));
133 } 195 }
134 196
135 } // namespace content 197 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698