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

Side by Side Diff: ppapi/proxy/ppb_url_loader_proxy.cc

Issue 6282007: First pass at making the proxy handle multiple renderers. This associates the... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 9 years, 11 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
« no previous file with comments | « ppapi/proxy/ppb_url_loader_proxy.h ('k') | ppapi/proxy/ppb_url_request_info_proxy.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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 "ppapi/proxy/ppb_url_loader_proxy.h" 5 #include "ppapi/proxy/ppb_url_loader_proxy.h"
6 6
7 #include <vector> 7 #include <vector>
8 8
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "build/build_config.h" 10 #include "build/build_config.h"
(...skipping 10 matching lines...) Expand all
21 21
22 #if defined(OS_LINUX) 22 #if defined(OS_LINUX)
23 #include <sys/shm.h> 23 #include <sys/shm.h>
24 #endif 24 #endif
25 25
26 namespace pp { 26 namespace pp {
27 namespace proxy { 27 namespace proxy {
28 28
29 class URLLoader : public PluginResource { 29 class URLLoader : public PluginResource {
30 public: 30 public:
31 URLLoader(); 31 URLLoader(PP_Instance instance);
32 virtual ~URLLoader(); 32 virtual ~URLLoader();
33 33
34 // Resource overrides. 34 // Resource overrides.
35 virtual URLLoader* AsURLLoader() { return this; } 35 virtual URLLoader* AsURLLoader() { return this; }
36 36
37 // Initialized to -1. Will be set to nonnegative values by the UpdateProgress 37 // Initialized to -1. Will be set to nonnegative values by the UpdateProgress
38 // message when the values are known. 38 // message when the values are known.
39 int64_t bytes_sent_; 39 int64_t bytes_sent_;
40 int64_t total_bytes_to_be_sent_; 40 int64_t total_bytes_to_be_sent_;
41 int64_t bytes_received_; 41 int64_t bytes_received_;
42 int64_t total_bytes_to_be_received_; 42 int64_t total_bytes_to_be_received_;
43 43
44 // When an asynchronous read is pending, this will contain the callback and 44 // When an asynchronous read is pending, this will contain the callback and
45 // the buffer to put the data. 45 // the buffer to put the data.
46 PP_CompletionCallback current_read_callback_; 46 PP_CompletionCallback current_read_callback_;
47 char* current_read_buffer_; 47 char* current_read_buffer_;
48 48
49 private: 49 private:
50 DISALLOW_COPY_AND_ASSIGN(URLLoader); 50 DISALLOW_COPY_AND_ASSIGN(URLLoader);
51 }; 51 };
52 52
53 URLLoader::URLLoader() 53 URLLoader::URLLoader(PP_Instance instance)
54 : bytes_sent_(-1), 54 : PluginResource(instance),
55 bytes_sent_(-1),
55 total_bytes_to_be_sent_(-1), 56 total_bytes_to_be_sent_(-1),
56 bytes_received_(-1), 57 bytes_received_(-1),
57 total_bytes_to_be_received_(-1), 58 total_bytes_to_be_received_(-1),
58 current_read_callback_(PP_MakeCompletionCallback(NULL, NULL)), 59 current_read_callback_(PP_MakeCompletionCallback(NULL, NULL)),
59 current_read_buffer_(NULL) { 60 current_read_buffer_(NULL) {
60 } 61 }
61 62
62 URLLoader::~URLLoader() { 63 URLLoader::~URLLoader() {
63 } 64 }
64 65
65 namespace { 66 namespace {
66 67
68 // Converts the given loader ID to the dispatcher associated with it, or NULL
69 // if it couldn't be found.
70 PluginDispatcher* DispatcherFromURLLoader(PP_Resource loader_id) {
71 URLLoader* object = PluginResource::GetAs<URLLoader>(loader_id);
72 if (!object)
73 return NULL;
74 return PluginDispatcher::GetForInstance(object->instance());
75 }
76
67 // Plugin PPB_URLLoader implmentation ------------------------------------------ 77 // Plugin PPB_URLLoader implmentation ------------------------------------------
68 78
69 PP_Resource Create(PP_Instance instance_id) { 79 PP_Resource Create(PP_Instance instance_id) {
70 PluginDispatcher* dispatcher = PluginDispatcher::Get(); 80 PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance_id);
81 if (!dispatcher)
82 return 0;
83
71 PP_Resource result = 0; 84 PP_Resource result = 0;
72 dispatcher->Send(new PpapiHostMsg_PPBURLLoader_Create( 85 dispatcher->Send(new PpapiHostMsg_PPBURLLoader_Create(
73 INTERFACE_ID_PPB_URL_LOADER, instance_id, &result)); 86 INTERFACE_ID_PPB_URL_LOADER, instance_id, &result));
74 if (result) 87 if (result)
75 PPB_URLLoader_Proxy::TrackPluginResource(result); 88 PPB_URLLoader_Proxy::TrackPluginResource(instance_id, result);
76 return result; 89 return result;
77 } 90 }
78 91
79 PP_Bool IsURLLoader(PP_Resource resource) { 92 PP_Bool IsURLLoader(PP_Resource resource) {
80 URLLoader* object = PluginResource::GetAs<URLLoader>(resource); 93 URLLoader* object = PluginResource::GetAs<URLLoader>(resource);
81 return BoolToPPBool(!!object); 94 return BoolToPPBool(!!object);
82 } 95 }
83 96
84 int32_t Open(PP_Resource loader_id, 97 int32_t Open(PP_Resource loader_id,
85 PP_Resource request_id, 98 PP_Resource request_id,
86 PP_CompletionCallback callback) { 99 PP_CompletionCallback callback) {
87 Dispatcher* dispatcher = PluginDispatcher::Get(); 100 PluginDispatcher* dispatcher = DispatcherFromURLLoader(loader_id);
101 if (!dispatcher)
102 return PP_ERROR_BADRESOURCE;
103
88 dispatcher->Send(new PpapiHostMsg_PPBURLLoader_Open( 104 dispatcher->Send(new PpapiHostMsg_PPBURLLoader_Open(
89 INTERFACE_ID_PPB_URL_LOADER, loader_id, request_id, 105 INTERFACE_ID_PPB_URL_LOADER, loader_id, request_id,
90 dispatcher->callback_tracker().SendCallback(callback))); 106 dispatcher->callback_tracker().SendCallback(callback)));
91 return PP_ERROR_WOULDBLOCK; 107 return PP_ERROR_WOULDBLOCK;
92 } 108 }
93 109
94 int32_t FollowRedirect(PP_Resource loader_id, 110 int32_t FollowRedirect(PP_Resource loader_id,
95 PP_CompletionCallback callback) { 111 PP_CompletionCallback callback) {
96 Dispatcher* dispatcher = PluginDispatcher::Get(); 112 PluginDispatcher* dispatcher = DispatcherFromURLLoader(loader_id);
113 if (!dispatcher)
114 return PP_ERROR_BADRESOURCE;
115
97 dispatcher->Send(new PpapiHostMsg_PPBURLLoader_FollowRedirect( 116 dispatcher->Send(new PpapiHostMsg_PPBURLLoader_FollowRedirect(
98 INTERFACE_ID_PPB_URL_LOADER, loader_id, 117 INTERFACE_ID_PPB_URL_LOADER, loader_id,
99 dispatcher->callback_tracker().SendCallback(callback))); 118 dispatcher->callback_tracker().SendCallback(callback)));
100 return PP_ERROR_WOULDBLOCK; 119 return PP_ERROR_WOULDBLOCK;
101 } 120 }
102 121
103 PP_Bool GetUploadProgress(PP_Resource loader_id, 122 PP_Bool GetUploadProgress(PP_Resource loader_id,
104 int64_t* bytes_sent, 123 int64_t* bytes_sent,
105 int64_t* total_bytes_to_be_sent) { 124 int64_t* total_bytes_to_be_sent) {
106 URLLoader* object = PluginResource::GetAs<URLLoader>(loader_id); 125 URLLoader* object = PluginResource::GetAs<URLLoader>(loader_id);
(...skipping 15 matching lines...) Expand all
122 *bytes_received = 0; 141 *bytes_received = 0;
123 *total_bytes_to_be_received = 0; 142 *total_bytes_to_be_received = 0;
124 return PP_FALSE; 143 return PP_FALSE;
125 } 144 }
126 *bytes_received = object->bytes_received_; 145 *bytes_received = object->bytes_received_;
127 *total_bytes_to_be_received = object->total_bytes_to_be_received_; 146 *total_bytes_to_be_received = object->total_bytes_to_be_received_;
128 return PP_TRUE; 147 return PP_TRUE;
129 } 148 }
130 149
131 PP_Resource GetResponseInfo(PP_Resource loader_id) { 150 PP_Resource GetResponseInfo(PP_Resource loader_id) {
151 URLLoader* object = PluginResource::GetAs<URLLoader>(loader_id);
152 if (!object)
153 return 0;
154
132 // If we find that plugins are frequently requesting the response info, we 155 // If we find that plugins are frequently requesting the response info, we
133 // can improve performance by caching the PP_Resource in the URLLoader 156 // can improve performance by caching the PP_Resource in the URLLoader
134 // object. This way we only have to do IPC for the first request. However, 157 // object. This way we only have to do IPC for the first request. However,
135 // it seems that most plugins will only call this once so there's no use 158 // it seems that most plugins will only call this once so there's no use
136 // optimizing this case. 159 // optimizing this case.
137 160
138 PP_Resource result; 161 PP_Resource result;
139 PluginDispatcher* dispatcher = PluginDispatcher::Get(); 162 PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(
163 object->instance());
164 if (!dispatcher)
165 return PP_ERROR_BADRESOURCE;
166
140 dispatcher->Send(new PpapiHostMsg_PPBURLLoader_GetResponseInfo( 167 dispatcher->Send(new PpapiHostMsg_PPBURLLoader_GetResponseInfo(
141 INTERFACE_ID_PPB_URL_LOADER, loader_id, &result)); 168 INTERFACE_ID_PPB_URL_LOADER, loader_id, &result));
142 if (dispatcher->plugin_resource_tracker()->PreparePreviouslyTrackedResource( 169 if (PluginResourceTracker::GetInstance()->
143 result)) 170 PreparePreviouslyTrackedResource(result))
144 return result; 171 return result;
145 172
146 // Tell the response info to create a tracking object and add it to the 173 // Tell the response info to create a tracking object and add it to the
147 // resource tracker. 174 // resource tracker.
148 PPB_URLResponseInfo_Proxy::TrackPluginResource(result); 175 PPB_URLResponseInfo_Proxy::TrackPluginResource(object->instance(), result);
149 return result; 176 return result;
150 } 177 }
151 178
152 int32_t ReadResponseBody(PP_Resource loader_id, 179 int32_t ReadResponseBody(PP_Resource loader_id,
153 char* buffer, 180 char* buffer,
154 int32_t bytes_to_read, 181 int32_t bytes_to_read,
155 PP_CompletionCallback callback) { 182 PP_CompletionCallback callback) {
156 URLLoader* object = PluginResource::GetAs<URLLoader>(loader_id); 183 URLLoader* object = PluginResource::GetAs<URLLoader>(loader_id);
157 if (!object) 184 if (!object)
158 return PP_ERROR_BADRESOURCE; 185 return PP_ERROR_BADRESOURCE;
186 PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(
187 object->instance());
188 if (!dispatcher)
189 return PP_ERROR_BADRESOURCE;
159 190
160 if (!buffer) 191 if (!buffer)
161 return PP_ERROR_BADARGUMENT; // Must specify an output buffer. 192 return PP_ERROR_BADARGUMENT; // Must specify an output buffer.
162 if (object->current_read_callback_.func) 193 if (object->current_read_callback_.func)
163 return PP_ERROR_INPROGRESS; // Can only have one request pending. 194 return PP_ERROR_INPROGRESS; // Can only have one request pending.
164 195
165 // Currently we don't support sync calls to read. We'll need to revisit 196 // Currently we don't support sync calls to read. We'll need to revisit
166 // how this works when we allow blocking calls (from background threads). 197 // how this works when we allow blocking calls (from background threads).
167 if (!callback.func) 198 if (!callback.func)
168 return PP_ERROR_BADARGUMENT; 199 return PP_ERROR_BADARGUMENT;
169 200
170 object->current_read_callback_ = callback; 201 object->current_read_callback_ = callback;
171 object->current_read_buffer_ = buffer; 202 object->current_read_buffer_ = buffer;
172 203
173 PluginDispatcher::Get()->Send(new PpapiHostMsg_PPBURLLoader_ReadResponseBody( 204 dispatcher->Send(new PpapiHostMsg_PPBURLLoader_ReadResponseBody(
174 INTERFACE_ID_PPB_URL_LOADER, loader_id, bytes_to_read)); 205 INTERFACE_ID_PPB_URL_LOADER, loader_id, bytes_to_read));
175 return PP_ERROR_WOULDBLOCK; 206 return PP_ERROR_WOULDBLOCK;
176 } 207 }
177 208
178 int32_t FinishStreamingToFile(PP_Resource loader_id, 209 int32_t FinishStreamingToFile(PP_Resource loader_id,
179 PP_CompletionCallback callback) { 210 PP_CompletionCallback callback) {
180 Dispatcher* dispatcher = PluginDispatcher::Get(); 211 PluginDispatcher* dispatcher = DispatcherFromURLLoader(loader_id);
212 if (!dispatcher)
213 return PP_ERROR_BADRESOURCE;
214
181 dispatcher->Send(new PpapiHostMsg_PPBURLLoader_FinishStreamingToFile( 215 dispatcher->Send(new PpapiHostMsg_PPBURLLoader_FinishStreamingToFile(
182 INTERFACE_ID_PPB_URL_LOADER, loader_id, 216 INTERFACE_ID_PPB_URL_LOADER, loader_id,
183 dispatcher->callback_tracker().SendCallback(callback))); 217 dispatcher->callback_tracker().SendCallback(callback)));
184 return PP_ERROR_WOULDBLOCK; 218 return PP_ERROR_WOULDBLOCK;
185 } 219 }
186 220
187 void Close(PP_Resource loader_id) { 221 void Close(PP_Resource loader_id) {
188 PluginDispatcher::Get()->Send(new PpapiHostMsg_PPBURLLoader_Close( 222 PluginDispatcher* dispatcher = DispatcherFromURLLoader(loader_id);
223 if (!dispatcher)
224 return;
225
226 dispatcher->Send(new PpapiHostMsg_PPBURLLoader_Close(
189 INTERFACE_ID_PPB_URL_LOADER, loader_id)); 227 INTERFACE_ID_PPB_URL_LOADER, loader_id));
190 } 228 }
191 229
192 const PPB_URLLoader ppb_urlloader = { 230 const PPB_URLLoader ppb_urlloader = {
193 &Create, 231 &Create,
194 &IsURLLoader, 232 &IsURLLoader,
195 &Open, 233 &Open,
196 &FollowRedirect, 234 &FollowRedirect,
197 &GetUploadProgress, 235 &GetUploadProgress,
198 &GetDownloadProgress, 236 &GetDownloadProgress,
(...skipping 28 matching lines...) Expand all
227 PPB_URLLoader_Proxy::PPB_URLLoader_Proxy(Dispatcher* dispatcher, 265 PPB_URLLoader_Proxy::PPB_URLLoader_Proxy(Dispatcher* dispatcher,
228 const void* target_interface) 266 const void* target_interface)
229 : InterfaceProxy(dispatcher, target_interface), 267 : InterfaceProxy(dispatcher, target_interface),
230 callback_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { 268 callback_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) {
231 } 269 }
232 270
233 PPB_URLLoader_Proxy::~PPB_URLLoader_Proxy() { 271 PPB_URLLoader_Proxy::~PPB_URLLoader_Proxy() {
234 } 272 }
235 273
236 // static 274 // static
237 void PPB_URLLoader_Proxy::TrackPluginResource(PP_Resource url_loader_resource) { 275 void PPB_URLLoader_Proxy::TrackPluginResource(PP_Instance instance,
238 linked_ptr<URLLoader> object(new URLLoader); 276 PP_Resource url_loader_resource) {
239 PluginDispatcher::Get()->plugin_resource_tracker()->AddResource( 277 linked_ptr<URLLoader> object(new URLLoader(instance));
240 url_loader_resource, object); 278 PluginResourceTracker::GetInstance()->AddResource(url_loader_resource,
279 object);
241 } 280 }
242 281
243 const void* PPB_URLLoader_Proxy::GetSourceInterface() const { 282 const void* PPB_URLLoader_Proxy::GetSourceInterface() const {
244 return &ppb_urlloader; 283 return &ppb_urlloader;
245 } 284 }
246 285
247 InterfaceID PPB_URLLoader_Proxy::GetInterfaceId() const { 286 InterfaceID PPB_URLLoader_Proxy::GetInterfaceId() const {
248 return INTERFACE_ID_PPB_URL_LOADER; 287 return INTERFACE_ID_PPB_URL_LOADER;
249 } 288 }
250 289
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after
440 // TODO(brettw) handle bad messages! 479 // TODO(brettw) handle bad messages!
441 return handled; 480 return handled;
442 } 481 }
443 482
444 void PPB_URLLoaderTrusted_Proxy::OnMsgGrantUniversalAccess(PP_Resource loader) { 483 void PPB_URLLoaderTrusted_Proxy::OnMsgGrantUniversalAccess(PP_Resource loader) {
445 ppb_url_loader_trusted_target()->GrantUniversalAccess(loader); 484 ppb_url_loader_trusted_target()->GrantUniversalAccess(loader);
446 } 485 }
447 486
448 } // namespace proxy 487 } // namespace proxy
449 } // namespace pp 488 } // namespace pp
OLDNEW
« no previous file with comments | « ppapi/proxy/ppb_url_loader_proxy.h ('k') | ppapi/proxy/ppb_url_request_info_proxy.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698