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 "content/browser/loader/buffered_resource_handler.h" | 5 #include "content/browser/loader/buffered_resource_handler.h" |
6 | 6 |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
(...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
290 type_hint, &new_type); | 290 type_hint, &new_type); |
291 | 291 |
292 // SniffMimeType() returns false if there is not enough data to determine | 292 // SniffMimeType() returns false if there is not enough data to determine |
293 // the mime type. However, even if it returns false, it returns a new type | 293 // the mime type. However, even if it returns false, it returns a new type |
294 // that is probably better than the current one. | 294 // that is probably better than the current one. |
295 response_->head.mime_type.assign(new_type); | 295 response_->head.mime_type.assign(new_type); |
296 | 296 |
297 return made_final_decision; | 297 return made_final_decision; |
298 } | 298 } |
299 | 299 |
300 bool BufferedResourceHandler::IsHandledByPlugin(bool* defer, | |
301 bool* request_handled) { | |
302 #if defined(ENABLE_PLUGINS) | |
303 bool stale; | |
304 WebPluginInfo plugin; | |
305 bool allow_wildcard = false; | |
306 ResourceRequestInfoImpl* info = GetRequestInfo(); | |
307 bool has_plugin = plugin_service_->GetPluginInfo( | |
308 info->GetChildID(), info->GetRenderFrameID(), info->GetContext(), | |
309 request()->url(), GURL(), response_->head.mime_type, allow_wildcard, | |
310 &stale, &plugin, NULL); | |
311 | |
312 if (stale) { | |
313 // Refresh the plugins asynchronously. | |
314 plugin_service_->GetPlugins( | |
315 base::Bind(&BufferedResourceHandler::OnPluginsLoaded, | |
316 weak_ptr_factory_.GetWeakPtr())); | |
317 request()->LogBlockedBy("BufferedResourceHandler"); | |
318 *defer = true; | |
319 return true; | |
320 } | |
321 | |
322 if (has_plugin) { | |
323 if (plugin.type == WebPluginInfo::PLUGIN_TYPE_BROWSER_PLUGIN) { | |
324 // If it is a MimeHandlerView plugin, intercept the stream. | |
325 std::string payload; | |
326 scoped_ptr<ResourceHandler> handler(host_->MaybeInterceptAsStream( | |
327 plugin.path, request(), response_.get(), &payload)); | |
328 if (handler) { | |
329 *request_handled = UseAlternateNextHandler(handler.Pass(), payload); | |
330 return true; | |
331 } | |
332 return false; | |
333 } else { | |
334 return true; | |
335 } | |
336 } | |
337 | |
338 // If execution reaches here then we should try intercepting the stream for | |
339 // the old streamsPrivate extensions API. This API is deprecated and should | |
340 // go away. | |
341 std::string payload; | |
342 scoped_ptr<ResourceHandler> handler(host_->MaybeInterceptAsStream( | |
343 base::FilePath(), request(), response_.get(), &payload)); | |
344 if (handler) { | |
345 *request_handled = UseAlternateNextHandler(handler.Pass(), payload); | |
346 return true; | |
347 } | |
348 #endif | |
349 return false; | |
350 } | |
351 | |
352 bool BufferedResourceHandler::SelectNextHandler(bool* defer) { | 300 bool BufferedResourceHandler::SelectNextHandler(bool* defer) { |
353 DCHECK(!response_->head.mime_type.empty()); | 301 DCHECK(!response_->head.mime_type.empty()); |
354 | 302 |
355 ResourceRequestInfoImpl* info = GetRequestInfo(); | 303 ResourceRequestInfoImpl* info = GetRequestInfo(); |
356 const std::string& mime_type = response_->head.mime_type; | 304 const std::string& mime_type = response_->head.mime_type; |
357 | 305 |
358 if (net::IsSupportedCertificateMimeType(mime_type)) { | 306 if (net::IsSupportedCertificateMimeType(mime_type)) { |
359 // Install certificate file. | 307 // Install certificate file. |
360 info->set_is_download(true); | 308 info->set_is_download(true); |
361 scoped_ptr<ResourceHandler> handler( | 309 scoped_ptr<ResourceHandler> handler( |
362 new CertificateResourceHandler(request())); | 310 new CertificateResourceHandler(request())); |
363 return UseAlternateNextHandler(handler.Pass(), std::string()); | 311 return UseAlternateNextHandler(handler.Pass(), std::string()); |
364 } | 312 } |
365 | 313 |
366 // Allow requests for object/embed tags to be intercepted as streams. | 314 // Allow requests for object/embed tags to be intercepted as streams. |
367 if (info->GetResourceType() == content::RESOURCE_TYPE_OBJECT) { | 315 if (info->GetResourceType() == content::RESOURCE_TYPE_OBJECT) { |
368 DCHECK(!info->allow_download()); | 316 DCHECK(!info->allow_download()); |
369 | 317 std::string payload; |
370 bool request_handled = true; | 318 scoped_ptr<ResourceHandler> handler( |
371 bool handled_by_plugin = IsHandledByPlugin(defer, &request_handled); | 319 host_->MaybeInterceptAsStream(request(), response_.get(), &payload)); |
372 if (!request_handled) | 320 if (handler) { |
373 return false; | 321 DCHECK(!net::IsSupportedMimeType(mime_type)); |
374 if (handled_by_plugin) | 322 return UseAlternateNextHandler(handler.Pass(), payload); |
375 return true; | 323 } |
376 } | 324 } |
377 | 325 |
378 if (!info->allow_download()) | 326 if (!info->allow_download()) |
379 return true; | 327 return true; |
380 | 328 |
381 // info->allow_download() == true implies | 329 // info->allow_download() == true implies |
382 // info->GetResourceType() == RESOURCE_TYPE_MAIN_FRAME or | 330 // info->GetResourceType() == RESOURCE_TYPE_MAIN_FRAME or |
383 // info->GetResourceType() == RESOURCE_TYPE_SUB_FRAME. | 331 // info->GetResourceType() == RESOURCE_TYPE_SUB_FRAME. |
384 DCHECK(info->GetResourceType() == RESOURCE_TYPE_MAIN_FRAME || | 332 DCHECK(info->GetResourceType() == RESOURCE_TYPE_MAIN_FRAME || |
385 info->GetResourceType() == RESOURCE_TYPE_SUB_FRAME); | 333 info->GetResourceType() == RESOURCE_TYPE_SUB_FRAME); |
386 | 334 |
387 bool must_download = MustDownload(); | 335 bool must_download = MustDownload(); |
388 if (!must_download) { | 336 if (!must_download) { |
389 if (net::IsSupportedMimeType(mime_type)) | 337 if (net::IsSupportedMimeType(mime_type)) |
390 return true; | 338 return true; |
391 | 339 |
392 bool request_handled = true; | 340 std::string payload; |
393 bool handled_by_plugin = IsHandledByPlugin(defer, &request_handled); | 341 scoped_ptr<ResourceHandler> handler( |
394 if (!request_handled) | 342 host_->MaybeInterceptAsStream(request(), response_.get(), &payload)); |
395 return false; | 343 if (handler) { |
396 if (handled_by_plugin) | 344 return UseAlternateNextHandler(handler.Pass(), payload); |
| 345 } |
| 346 |
| 347 #if defined(ENABLE_PLUGINS) |
| 348 bool stale; |
| 349 bool has_plugin = HasSupportingPlugin(&stale); |
| 350 if (stale) { |
| 351 // Refresh the plugins asynchronously. |
| 352 plugin_service_->GetPlugins( |
| 353 base::Bind(&BufferedResourceHandler::OnPluginsLoaded, |
| 354 weak_ptr_factory_.GetWeakPtr())); |
| 355 request()->LogBlockedBy("BufferedResourceHandler"); |
| 356 *defer = true; |
397 return true; | 357 return true; |
| 358 } |
| 359 if (has_plugin) |
| 360 return true; |
| 361 #endif |
398 } | 362 } |
399 | 363 |
400 // Install download handler | 364 // Install download handler |
401 info->set_is_download(true); | 365 info->set_is_download(true); |
402 scoped_ptr<ResourceHandler> handler( | 366 scoped_ptr<ResourceHandler> handler( |
403 host_->CreateResourceHandlerForDownload( | 367 host_->CreateResourceHandlerForDownload( |
404 request(), | 368 request(), |
405 true, // is_content_initiated | 369 true, // is_content_initiated |
406 must_download, | 370 must_download, |
407 DownloadItem::kInvalidId, | 371 DownloadItem::kInvalidId, |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
504 host_->delegate()->ShouldForceDownloadResource( | 468 host_->delegate()->ShouldForceDownloadResource( |
505 request()->url(), response_->head.mime_type)) { | 469 request()->url(), response_->head.mime_type)) { |
506 must_download_ = true; | 470 must_download_ = true; |
507 } else { | 471 } else { |
508 must_download_ = false; | 472 must_download_ = false; |
509 } | 473 } |
510 | 474 |
511 return must_download_; | 475 return must_download_; |
512 } | 476 } |
513 | 477 |
| 478 bool BufferedResourceHandler::HasSupportingPlugin(bool* stale) { |
| 479 #if defined(ENABLE_PLUGINS) |
| 480 ResourceRequestInfoImpl* info = GetRequestInfo(); |
| 481 |
| 482 bool allow_wildcard = false; |
| 483 WebPluginInfo plugin; |
| 484 return plugin_service_->GetPluginInfo( |
| 485 info->GetChildID(), info->GetRenderFrameID(), info->GetContext(), |
| 486 request()->url(), GURL(), response_->head.mime_type, allow_wildcard, |
| 487 stale, &plugin, NULL); |
| 488 #else |
| 489 if (stale) |
| 490 *stale = false; |
| 491 return false; |
| 492 #endif |
| 493 } |
| 494 |
514 bool BufferedResourceHandler::CopyReadBufferToNextHandler() { | 495 bool BufferedResourceHandler::CopyReadBufferToNextHandler() { |
515 if (!read_buffer_.get()) | 496 if (!read_buffer_.get()) |
516 return true; | 497 return true; |
517 | 498 |
518 scoped_refptr<net::IOBuffer> buf; | 499 scoped_refptr<net::IOBuffer> buf; |
519 int buf_len = 0; | 500 int buf_len = 0; |
520 if (!next_handler_->OnWillRead(&buf, &buf_len, bytes_read_)) | 501 if (!next_handler_->OnWillRead(&buf, &buf_len, bytes_read_)) |
521 return false; | 502 return false; |
522 | 503 |
523 CHECK((buf_len >= bytes_read_) && (bytes_read_ >= 0)); | 504 CHECK((buf_len >= bytes_read_) && (bytes_read_ >= 0)); |
524 memcpy(buf->data(), read_buffer_->data(), bytes_read_); | 505 memcpy(buf->data(), read_buffer_->data(), bytes_read_); |
525 return true; | 506 return true; |
526 } | 507 } |
527 | 508 |
528 void BufferedResourceHandler::OnPluginsLoaded( | 509 void BufferedResourceHandler::OnPluginsLoaded( |
529 const std::vector<WebPluginInfo>& plugins) { | 510 const std::vector<WebPluginInfo>& plugins) { |
530 request()->LogUnblocked(); | 511 request()->LogUnblocked(); |
531 bool defer = false; | 512 bool defer = false; |
532 if (!ProcessResponse(&defer)) { | 513 if (!ProcessResponse(&defer)) { |
533 controller()->Cancel(); | 514 controller()->Cancel(); |
534 } else if (!defer) { | 515 } else if (!defer) { |
535 controller()->Resume(); | 516 controller()->Resume(); |
536 } | 517 } |
537 } | 518 } |
538 | 519 |
539 } // namespace content | 520 } // namespace content |
OLD | NEW |