| OLD | NEW |
| 1 /* | 1 /* |
| 2 Copyright (C) 1998 Lars Knoll (knoll@mpi-hd.mpg.de) | 2 Copyright (C) 1998 Lars Knoll (knoll@mpi-hd.mpg.de) |
| 3 Copyright (C) 2001 Dirk Mueller (mueller@kde.org) | 3 Copyright (C) 2001 Dirk Mueller (mueller@kde.org) |
| 4 Copyright (C) 2002 Waldo Bastian (bastian@kde.org) | 4 Copyright (C) 2002 Waldo Bastian (bastian@kde.org) |
| 5 Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All | 5 Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All |
| 6 rights reserved. | 6 rights reserved. |
| 7 Copyright (C) 2009 Torch Mobile Inc. http://www.torchmobile.com/ | 7 Copyright (C) 2009 Torch Mobile Inc. http://www.torchmobile.com/ |
| 8 | 8 |
| 9 This library is free software; you can redistribute it and/or | 9 This library is free software; you can redistribute it and/or |
| 10 modify it under the terms of the GNU Library General Public | 10 modify it under the terms of the GNU Library General Public |
| (...skipping 348 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 359 Context().DispatchDidFinishLoading( | 359 Context().DispatchDidFinishLoading( |
| 360 identifier, 0, 0, resource->GetResponse().DecodedBodyLength()); | 360 identifier, 0, 0, resource->GetResponse().DecodedBodyLength()); |
| 361 } | 361 } |
| 362 | 362 |
| 363 static std::unique_ptr<TracedValue> UrlForTraceEvent(const KURL& url) { | 363 static std::unique_ptr<TracedValue> UrlForTraceEvent(const KURL& url) { |
| 364 std::unique_ptr<TracedValue> value = TracedValue::Create(); | 364 std::unique_ptr<TracedValue> value = TracedValue::Create(); |
| 365 value->SetString("url", url.GetString()); | 365 value->SetString("url", url.GetString()); |
| 366 return value; | 366 return value; |
| 367 } | 367 } |
| 368 | 368 |
| 369 Resource* ResourceFetcher::ResourceForStaticData( | 369 Resource* ResourceFetcher::ResourceForStaticDataFromCache( |
| 370 const FetchParameters& params, | 370 const FetchParameters& request) { |
| 371 if (Resource* old_resource = GetMemoryCache()->ResourceForURL( |
| 372 request.GetResourceRequest().Url(), GetCacheIdentifier())) { |
| 373 // There's no reason to re-parse if we saved the data from the previous |
| 374 // parse. |
| 375 if (request.Options().data_buffering_policy != kDoNotBufferData) |
| 376 return old_resource; |
| 377 GetMemoryCache()->Remove(old_resource); |
| 378 } |
| 379 return nullptr; |
| 380 } |
| 381 |
| 382 Resource* ResourceFetcher::ResourceForSubstituteData( |
| 383 const FetchParameters& request, |
| 371 const ResourceFactory& factory, | 384 const ResourceFactory& factory, |
| 372 const SubstituteData& substitute_data) { | 385 const SubstituteData& substitute_data) { |
| 373 const KURL& url = params.GetResourceRequest().Url(); | 386 DCHECK(substitute_data.IsValid()); |
| 374 DCHECK(url.ProtocolIsData() || substitute_data.IsValid() || archive_); | 387 // TODO(arthursonzogni): should we use the cache? Even with substitute data? |
| 388 if (Resource* resource = ResourceForStaticDataFromCache(request)) { |
| 389 return resource; |
| 390 } |
| 391 |
| 392 ResourceResponse response; |
| 393 RefPtr<SharedBuffer> data; |
| 394 data = substitute_data.Content(); |
| 395 response.SetURL(request.GetResourceRequest().Url()); |
| 396 response.SetMimeType(substitute_data.MimeType()); |
| 397 response.SetExpectedContentLength(data->size()); |
| 398 response.SetTextEncodingName(substitute_data.TextEncoding()); |
| 399 |
| 400 return CreateResourceFromStaticData(request, factory, response, data, |
| 401 substitute_data); |
| 402 } |
| 403 |
| 404 Resource* ResourceFetcher::ResourceForDataUrl( |
| 405 const FetchParameters& request, |
| 406 const ResourceFactory& factory, |
| 407 const SubstituteData& substitute_data) { |
| 408 const KURL& url = request.GetResourceRequest().Url(); |
| 409 DCHECK(url.ProtocolIsData()); |
| 410 if (Resource* resource = ResourceForStaticDataFromCache(request)) { |
| 411 return resource; |
| 412 } |
| 375 | 413 |
| 376 // TODO(japhet): We only send main resource data: urls through WebURLLoader | 414 // TODO(japhet): We only send main resource data: urls through WebURLLoader |
| 377 // for the benefit of a service worker test | 415 // for the benefit of a service worker test |
| 378 // (RenderViewImplTest.ServiceWorkerNetworkProviderSetup), which is at a layer | 416 // (RenderViewImplTest.ServiceWorkerNetworkProviderSetup), which is at a layer |
| 379 // where it isn't easy to mock out a network load. It uses data: urls to | 417 // where it isn't easy to mock out a network load. It uses data: urls to |
| 380 // emulate the behavior it wants to test, which would otherwise be reserved | 418 // emulate the behavior it wants to test, which would otherwise be reserved |
| 381 // for network loads. | 419 // for network loads. |
| 382 if (!archive_ && !substitute_data.IsValid() && | 420 if (factory.GetType() == Resource::kMainResource || |
| 383 (factory.GetType() == Resource::kMainResource || | 421 factory.GetType() == Resource::kRaw) { |
| 384 factory.GetType() == Resource::kRaw)) | |
| 385 return nullptr; | 422 return nullptr; |
| 386 | |
| 387 const String cache_identifier = GetCacheIdentifier(); | |
| 388 if (Resource* old_resource = | |
| 389 GetMemoryCache()->ResourceForURL(url, cache_identifier)) { | |
| 390 // There's no reason to re-parse if we saved the data from the previous | |
| 391 // parse. | |
| 392 if (params.Options().data_buffering_policy != kDoNotBufferData) | |
| 393 return old_resource; | |
| 394 GetMemoryCache()->Remove(old_resource); | |
| 395 } | 423 } |
| 396 | 424 |
| 397 ResourceResponse response; | 425 ResourceResponse response; |
| 398 RefPtr<SharedBuffer> data; | 426 if (RefPtr<SharedBuffer> data = |
| 399 if (substitute_data.IsValid()) { | 427 NetworkUtils::ParseDataURLAndPopulateResponse(url, response)) { |
| 400 data = substitute_data.Content(); | |
| 401 response.SetURL(url); | |
| 402 response.SetMimeType(substitute_data.MimeType()); | |
| 403 response.SetExpectedContentLength(data->size()); | |
| 404 response.SetTextEncodingName(substitute_data.TextEncoding()); | |
| 405 } else if (url.ProtocolIsData()) { | |
| 406 data = NetworkUtils::ParseDataURLAndPopulateResponse(url, response); | |
| 407 if (!data) | |
| 408 return nullptr; | |
| 409 // |response| is modified by parseDataURLAndPopulateResponse() and is | 428 // |response| is modified by parseDataURLAndPopulateResponse() and is |
| 410 // ready to be used. | 429 // ready to be used. |
| 411 } else { | 430 Resource* resource = CreateResourceFromStaticData( |
| 412 ArchiveResource* archive_resource = | 431 request, factory, response, data, substitute_data); |
| 413 archive_->SubresourceForURL(params.Url()); | 432 |
| 414 // Fall back to the network if the archive doesn't contain the resource. | 433 GetMemoryCache()->Add(resource); |
| 415 if (!archive_resource) | 434 return resource; |
| 416 return nullptr; | 435 } |
| 417 data = archive_resource->Data(); | 436 |
| 437 return nullptr; |
| 438 } |
| 439 |
| 440 Resource* ResourceFetcher::ResourceForArchive( |
| 441 const FetchParameters& request, |
| 442 const ResourceFactory& factory, |
| 443 const SubstituteData& substitute_data) { |
| 444 const KURL& url = request.GetResourceRequest().Url(); |
| 445 DCHECK(archive_); |
| 446 if (Resource* resource = ResourceForStaticDataFromCache(request)) { |
| 447 return resource; |
| 448 } |
| 449 |
| 450 if (ArchiveResource* archive_resource = |
| 451 archive_->SubresourceForURL(request.Url())) { |
| 452 RefPtr<SharedBuffer> data = archive_resource->Data(); |
| 453 ResourceResponse response; |
| 418 response.SetURL(url); | 454 response.SetURL(url); |
| 419 response.SetMimeType(archive_resource->MimeType()); | 455 response.SetMimeType(archive_resource->MimeType()); |
| 420 response.SetExpectedContentLength(data->size()); | 456 response.SetExpectedContentLength(data->size()); |
| 421 response.SetTextEncodingName(archive_resource->TextEncoding()); | 457 response.SetTextEncodingName(archive_resource->TextEncoding()); |
| 458 |
| 459 Resource* resource = CreateResourceFromStaticData( |
| 460 request, factory, response, data, substitute_data); |
| 461 |
| 462 GetMemoryCache()->Add(resource); |
| 463 return resource; |
| 422 } | 464 } |
| 423 | 465 |
| 424 Resource* resource = factory.Create(params.GetResourceRequest(), | 466 return nullptr; |
| 425 params.Options(), params.Charset()); | 467 } |
| 468 |
| 469 Resource* ResourceFetcher::CreateResourceFromStaticData( |
| 470 const FetchParameters& request, |
| 471 const ResourceFactory& factory, |
| 472 const ResourceResponse& response, |
| 473 const RefPtr<SharedBuffer>& data, |
| 474 const SubstituteData& substitute_data) { |
| 475 Resource* resource = factory.Create(request.GetResourceRequest(), |
| 476 request.Options(), request.Charset()); |
| 426 resource->SetNeedsSynchronousCacheHit(substitute_data.ForceSynchronousLoad()); | 477 resource->SetNeedsSynchronousCacheHit(substitute_data.ForceSynchronousLoad()); |
| 427 // FIXME: We should provide a body stream here. | 478 // FIXME: We should provide a body stream here. |
| 428 resource->ResponseReceived(response, nullptr); | 479 resource->ResponseReceived(response, nullptr); |
| 429 resource->SetDataBufferingPolicy(kBufferData); | 480 resource->SetDataBufferingPolicy(kBufferData); |
| 430 if (data->size()) | 481 if (data->size()) |
| 431 resource->SetResourceBuffer(data); | 482 resource->SetResourceBuffer(data); |
| 432 resource->SetIdentifier(CreateUniqueIdentifier()); | 483 resource->SetIdentifier(CreateUniqueIdentifier()); |
| 433 resource->SetCacheIdentifier(cache_identifier); | 484 resource->SetCacheIdentifier(GetCacheIdentifier()); |
| 434 resource->Finish(); | 485 resource->Finish(); |
| 435 | 486 |
| 436 if (!substitute_data.IsValid()) | |
| 437 GetMemoryCache()->Add(resource); | |
| 438 | |
| 439 return resource; | 487 return resource; |
| 440 } | 488 } |
| 441 | 489 |
| 442 Resource* ResourceFetcher::ResourceForBlockedRequest( | 490 Resource* ResourceFetcher::ResourceForBlockedRequest( |
| 443 const FetchParameters& params, | 491 const FetchParameters& params, |
| 444 const ResourceFactory& factory, | 492 const ResourceFactory& factory, |
| 445 ResourceRequestBlockedReason blocked_reason) { | 493 ResourceRequestBlockedReason blocked_reason) { |
| 446 Resource* resource = factory.Create(params.GetResourceRequest(), | 494 Resource* resource = factory.Create(params.GetResourceRequest(), |
| 447 params.Options(), params.Charset()); | 495 params.Options(), params.Charset()); |
| 448 resource->GetError(ResourceError::CancelledDueToAccessCheckError( | 496 resource->GetError(ResourceError::CancelledDueToAccessCheckError( |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 549 const SubstituteData& substitute_data) { | 597 const SubstituteData& substitute_data) { |
| 550 unsigned long identifier = CreateUniqueIdentifier(); | 598 unsigned long identifier = CreateUniqueIdentifier(); |
| 551 ResourceRequest& resource_request = params.MutableResourceRequest(); | 599 ResourceRequest& resource_request = params.MutableResourceRequest(); |
| 552 network_instrumentation::ScopedResourceLoadTracker | 600 network_instrumentation::ScopedResourceLoadTracker |
| 553 scoped_resource_load_tracker(identifier, resource_request); | 601 scoped_resource_load_tracker(identifier, resource_request); |
| 554 SCOPED_BLINK_UMA_HISTOGRAM_TIMER("Blink.Fetch.RequestResourceTime"); | 602 SCOPED_BLINK_UMA_HISTOGRAM_TIMER("Blink.Fetch.RequestResourceTime"); |
| 555 // TODO(dproy): Remove this. http://crbug.com/659666 | 603 // TODO(dproy): Remove this. http://crbug.com/659666 |
| 556 TRACE_EVENT1("blink", "ResourceFetcher::requestResource", "url", | 604 TRACE_EVENT1("blink", "ResourceFetcher::requestResource", "url", |
| 557 UrlForTraceEvent(params.Url())); | 605 UrlForTraceEvent(params.Url())); |
| 558 | 606 |
| 559 Resource* resource = nullptr; | |
| 560 ResourceRequestBlockedReason blocked_reason = | 607 ResourceRequestBlockedReason blocked_reason = |
| 561 ResourceRequestBlockedReason::kNone; | 608 ResourceRequestBlockedReason::kNone; |
| 562 | 609 |
| 563 PrepareRequestResult result = PrepareRequest(params, factory, substitute_data, | 610 PrepareRequestResult result = PrepareRequest(params, factory, substitute_data, |
| 564 identifier, blocked_reason); | 611 identifier, blocked_reason); |
| 565 if (result == kAbort) | 612 if (result == kAbort) |
| 566 return nullptr; | 613 return nullptr; |
| 567 if (result == kBlock) | 614 if (result == kBlock) |
| 568 return ResourceForBlockedRequest(params, factory, blocked_reason); | 615 return ResourceForBlockedRequest(params, factory, blocked_reason); |
| 569 | 616 |
| 570 if (!params.IsSpeculativePreload()) { | 617 if (!params.IsSpeculativePreload()) { |
| 571 // Only log if it's not for speculative preload. | 618 // Only log if it's not for speculative preload. |
| 572 Context().RecordLoadingActivity(identifier, resource_request, | 619 Context().RecordLoadingActivity(identifier, resource_request, |
| 573 factory.GetType(), | 620 factory.GetType(), |
| 574 params.Options().initiator_info.name); | 621 params.Options().initiator_info.name); |
| 575 } | 622 } |
| 576 | 623 |
| 624 Resource* resource = nullptr; |
| 577 bool is_data_url = resource_request.Url().ProtocolIsData(); | 625 bool is_data_url = resource_request.Url().ProtocolIsData(); |
| 578 bool is_static_data = is_data_url || substitute_data.IsValid() || archive_; | 626 bool is_static_data = is_data_url || substitute_data.IsValid() || archive_; |
| 579 if (is_static_data) { | 627 |
| 580 resource = ResourceForStaticData(params, factory, substitute_data); | 628 if (substitute_data.IsValid()) { |
| 581 // Abort the request if the archive doesn't contain the resource, except in | 629 resource = ResourceForSubstituteData(params, factory, substitute_data); |
| 582 // the case of data URLs which might have resources such as fonts that need | 630 } else if (is_data_url) { |
| 583 // to be decoded only on demand. These data URLs are allowed to be | 631 resource = ResourceForDataUrl(params, factory, substitute_data); |
| 632 // In the some cases, the data URLs might have resources such as fonts that |
| 633 // need to be decoded only on demand. These data URLs are allowed to be |
| 584 // processed using the normal ResourceFetcher machinery. | 634 // processed using the normal ResourceFetcher machinery. |
| 585 if (!resource && !is_data_url && archive_) | 635 } else if (archive_) { |
| 636 resource = ResourceForArchive(params, factory, substitute_data); |
| 637 // TODO(arthursonzogni): In past version of ResourceForStaticData, when |
| 638 // there is an |archive_| but the resource is not found. It is stated: |
| 639 // "Fall back to the network if the archive doesn't contain the resource.", |
| 640 // but then the caller abort the request whatever happens: |
| 641 // "Abort the request if the archive doesn't contain the resource". |
| 642 // It is contradictory. |
| 643 if (!resource) |
| 586 return nullptr; | 644 return nullptr; |
| 587 } | 645 } |
| 646 |
| 588 if (!resource) { | 647 if (!resource) { |
| 589 resource = | 648 resource = |
| 590 GetMemoryCache()->ResourceForURL(params.Url(), GetCacheIdentifier()); | 649 GetMemoryCache()->ResourceForURL(params.Url(), GetCacheIdentifier()); |
| 591 } | 650 } |
| 592 | 651 |
| 593 // If we got a preloaded resource from the cache for a non-preload request, | 652 // If we got a preloaded resource from the cache for a non-preload request, |
| 594 // we may need to make it block the onload event. | 653 // we may need to make it block the onload event. |
| 595 MakePreloadedResourceBlockOnloadIfNeeded(resource, params); | 654 MakePreloadedResourceBlockOnloadIfNeeded(resource, params); |
| 596 | 655 |
| 597 const RevalidationPolicy policy = DetermineRevalidationPolicy( | 656 const RevalidationPolicy policy = DetermineRevalidationPolicy( |
| (...skipping 979 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1577 visitor->Trace(context_); | 1636 visitor->Trace(context_); |
| 1578 visitor->Trace(archive_); | 1637 visitor->Trace(archive_); |
| 1579 visitor->Trace(loaders_); | 1638 visitor->Trace(loaders_); |
| 1580 visitor->Trace(non_blocking_loaders_); | 1639 visitor->Trace(non_blocking_loaders_); |
| 1581 visitor->Trace(document_resources_); | 1640 visitor->Trace(document_resources_); |
| 1582 visitor->Trace(preloads_); | 1641 visitor->Trace(preloads_); |
| 1583 visitor->Trace(resource_timing_info_map_); | 1642 visitor->Trace(resource_timing_info_map_); |
| 1584 } | 1643 } |
| 1585 | 1644 |
| 1586 } // namespace blink | 1645 } // namespace blink |
| OLD | NEW |