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

Side by Side Diff: third_party/WebKit/Source/core/inspector/InspectorNetworkAgent.cpp

Issue 2900613002: Support DevTools for off-main-thread-fetch (Closed)
Patch Set: incorporated dgozman's comment Created 3 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
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2011 Google Inc. All rights reserved. 2 * Copyright (C) 2011 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
44 #include "core/inspector/ConsoleMessage.h" 44 #include "core/inspector/ConsoleMessage.h"
45 #include "core/inspector/IdentifiersFactory.h" 45 #include "core/inspector/IdentifiersFactory.h"
46 #include "core/inspector/InspectedFrames.h" 46 #include "core/inspector/InspectedFrames.h"
47 #include "core/inspector/NetworkResourcesData.h" 47 #include "core/inspector/NetworkResourcesData.h"
48 #include "core/loader/DocumentLoader.h" 48 #include "core/loader/DocumentLoader.h"
49 #include "core/loader/FrameLoader.h" 49 #include "core/loader/FrameLoader.h"
50 #include "core/loader/MixedContentChecker.h" 50 #include "core/loader/MixedContentChecker.h"
51 #include "core/loader/ThreadableLoaderClient.h" 51 #include "core/loader/ThreadableLoaderClient.h"
52 #include "core/page/Page.h" 52 #include "core/page/Page.h"
53 #include "core/probe/CoreProbes.h" 53 #include "core/probe/CoreProbes.h"
54 #include "core/workers/WorkerGlobalScope.h"
54 #include "core/xmlhttprequest/XMLHttpRequest.h" 55 #include "core/xmlhttprequest/XMLHttpRequest.h"
55 #include "platform/RuntimeEnabledFeatures.h" 56 #include "platform/RuntimeEnabledFeatures.h"
56 #include "platform/blob/BlobData.h" 57 #include "platform/blob/BlobData.h"
57 #include "platform/loader/fetch/FetchInitiatorInfo.h" 58 #include "platform/loader/fetch/FetchInitiatorInfo.h"
58 #include "platform/loader/fetch/FetchInitiatorTypeNames.h" 59 #include "platform/loader/fetch/FetchInitiatorTypeNames.h"
59 #include "platform/loader/fetch/MemoryCache.h" 60 #include "platform/loader/fetch/MemoryCache.h"
60 #include "platform/loader/fetch/Resource.h" 61 #include "platform/loader/fetch/Resource.h"
61 #include "platform/loader/fetch/ResourceError.h" 62 #include "platform/loader/fetch/ResourceError.h"
62 #include "platform/loader/fetch/ResourceFetcher.h" 63 #include "platform/loader/fetch/ResourceFetcher.h"
63 #include "platform/loader/fetch/ResourceLoadTiming.h" 64 #include "platform/loader/fetch/ResourceLoadTiming.h"
(...skipping 481 matching lines...) Expand 10 before | Expand all | Expand 10 after
545 response_object->setSecurityDetails(std::move(security_details)); 546 response_object->setSecurityDetails(std::move(security_details));
546 } 547 }
547 548
548 return response_object; 549 return response_object;
549 } 550 }
550 551
551 InspectorNetworkAgent::~InspectorNetworkAgent() {} 552 InspectorNetworkAgent::~InspectorNetworkAgent() {}
552 553
553 DEFINE_TRACE(InspectorNetworkAgent) { 554 DEFINE_TRACE(InspectorNetworkAgent) {
554 visitor->Trace(inspected_frames_); 555 visitor->Trace(inspected_frames_);
556 visitor->Trace(execution_context_);
555 visitor->Trace(resources_data_); 557 visitor->Trace(resources_data_);
556 visitor->Trace(replay_xhrs_); 558 visitor->Trace(replay_xhrs_);
557 visitor->Trace(replay_xhrs_to_be_deleted_); 559 visitor->Trace(replay_xhrs_to_be_deleted_);
558 visitor->Trace(pending_xhr_replay_data_); 560 visitor->Trace(pending_xhr_replay_data_);
559 InspectorBaseAgent::Trace(visitor); 561 InspectorBaseAgent::Trace(visitor);
560 } 562 }
561 563
562 void InspectorNetworkAgent::ShouldBlockRequest(const ResourceRequest& request, 564 void InspectorNetworkAgent::ShouldBlockRequest(const ResourceRequest& request,
563 bool* result) { 565 bool* result) {
564 protocol::DictionaryValue* blocked_urls = 566 protocol::DictionaryValue* blocked_urls =
565 state_->getObject(NetworkAgentState::kBlockedURLs); 567 state_->getObject(NetworkAgentState::kBlockedURLs);
566 if (!blocked_urls) 568 if (!blocked_urls)
567 return; 569 return;
568 570
569 String url = request.Url().GetString(); 571 String url = request.Url().GetString();
570 for (size_t i = 0; i < blocked_urls->size(); ++i) { 572 for (size_t i = 0; i < blocked_urls->size(); ++i) {
571 auto entry = blocked_urls->at(i); 573 auto entry = blocked_urls->at(i);
572 if (Matches(url, entry.first)) { 574 if (Matches(url, entry.first)) {
573 *result = true; 575 *result = true;
574 return; 576 return;
575 } 577 }
576 } 578 }
577 return; 579 return;
578 } 580 }
579 581
580 void InspectorNetworkAgent::DidBlockRequest( 582 void InspectorNetworkAgent::DidBlockRequest(
581 LocalFrame* frame, 583 ExecutionContext* execution_context,
582 const ResourceRequest& request, 584 const ResourceRequest& request,
583 DocumentLoader* loader, 585 DocumentLoader* loader,
584 const FetchInitiatorInfo& initiator_info, 586 const FetchInitiatorInfo& initiator_info,
585 ResourceRequestBlockedReason reason) { 587 ResourceRequestBlockedReason reason) {
586 unsigned long identifier = CreateUniqueIdentifier(); 588 unsigned long identifier = CreateUniqueIdentifier();
587 WillSendRequestInternal(frame, identifier, loader, request, 589 WillSendRequestInternal(execution_context, identifier, loader, request,
588 ResourceResponse(), initiator_info); 590 ResourceResponse(), initiator_info);
589 591
590 String request_id = IdentifiersFactory::RequestId(identifier); 592 String request_id = IdentifiersFactory::RequestId(identifier);
591 String protocol_reason = BuildBlockedReason(reason); 593 String protocol_reason = BuildBlockedReason(reason);
592 GetFrontend()->loadingFailed( 594 GetFrontend()->loadingFailed(
593 request_id, MonotonicallyIncreasingTime(), 595 request_id, MonotonicallyIncreasingTime(),
594 InspectorPageAgent::ResourceTypeJson( 596 InspectorPageAgent::ResourceTypeJson(
595 resources_data_->GetResourceType(request_id)), 597 resources_data_->GetResourceType(request_id)),
596 String(), false, protocol_reason); 598 String(), false, protocol_reason);
597 } 599 }
598 600
599 void InspectorNetworkAgent::DidChangeResourcePriority( 601 void InspectorNetworkAgent::DidChangeResourcePriority(
600 unsigned long identifier, 602 unsigned long identifier,
601 ResourceLoadPriority load_priority) { 603 ResourceLoadPriority load_priority) {
602 String request_id = IdentifiersFactory::RequestId(identifier); 604 String request_id = IdentifiersFactory::RequestId(identifier);
603 GetFrontend()->resourceChangedPriority(request_id, 605 GetFrontend()->resourceChangedPriority(request_id,
604 ResourcePriorityJSON(load_priority), 606 ResourcePriorityJSON(load_priority),
605 MonotonicallyIncreasingTime()); 607 MonotonicallyIncreasingTime());
606 } 608 }
607 609
608 void InspectorNetworkAgent::WillSendRequestInternal( 610 void InspectorNetworkAgent::WillSendRequestInternal(
609 LocalFrame* frame, 611 ExecutionContext* execution_context,
610 unsigned long identifier, 612 unsigned long identifier,
611 DocumentLoader* loader, 613 DocumentLoader* loader,
612 const ResourceRequest& request, 614 const ResourceRequest& request,
613 const ResourceResponse& redirect_response, 615 const ResourceResponse& redirect_response,
614 const FetchInitiatorInfo& initiator_info) { 616 const FetchInitiatorInfo& initiator_info) {
615 String request_id = IdentifiersFactory::RequestId(identifier); 617 String request_id = IdentifiersFactory::RequestId(identifier);
616 String loader_id = IdentifiersFactory::LoaderId(loader); 618 String loader_id = loader ? IdentifiersFactory::LoaderId(loader) : "";
617 resources_data_->ResourceCreated(request_id, loader_id, request.Url()); 619 resources_data_->ResourceCreated(request_id, loader_id, request.Url());
618 620
619 InspectorPageAgent::ResourceType type = InspectorPageAgent::kOtherResource; 621 InspectorPageAgent::ResourceType type = InspectorPageAgent::kOtherResource;
620 if (initiator_info.name == FetchInitiatorTypeNames::xmlhttprequest) { 622 if (initiator_info.name == FetchInitiatorTypeNames::xmlhttprequest) {
621 type = InspectorPageAgent::kXHRResource; 623 type = InspectorPageAgent::kXHRResource;
622 resources_data_->SetResourceType(request_id, type); 624 resources_data_->SetResourceType(request_id, type);
623 } else if (initiator_info.name == FetchInitiatorTypeNames::document) { 625 } else if (initiator_info.name == FetchInitiatorTypeNames::document) {
624 type = InspectorPageAgent::kDocumentResource; 626 type = InspectorPageAgent::kDocumentResource;
625 resources_data_->SetResourceType(request_id, type); 627 resources_data_->SetResourceType(request_id, type);
626 } 628 }
627 629
628 String frame_id = 630 String frame_id = loader && loader->GetFrame()
629 loader->GetFrame() ? IdentifiersFactory::FrameId(loader->GetFrame()) : ""; 631 ? IdentifiersFactory::FrameId(loader->GetFrame())
632 : "";
630 std::unique_ptr<protocol::Network::Initiator> initiator_object = 633 std::unique_ptr<protocol::Network::Initiator> initiator_object =
631 BuildInitiatorObject( 634 BuildInitiatorObject(loader && loader->GetFrame()
632 loader->GetFrame() ? loader->GetFrame()->GetDocument() : 0, 635 ? loader->GetFrame()->GetDocument()
633 initiator_info); 636 : nullptr,
637 initiator_info);
634 if (initiator_info.name == FetchInitiatorTypeNames::document) { 638 if (initiator_info.name == FetchInitiatorTypeNames::document) {
635 FrameNavigationInitiatorMap::iterator it = 639 FrameNavigationInitiatorMap::iterator it =
636 frame_navigation_initiator_map_.find(frame_id); 640 frame_navigation_initiator_map_.find(frame_id);
637 if (it != frame_navigation_initiator_map_.end()) 641 if (it != frame_navigation_initiator_map_.end())
638 initiator_object = it->value->clone(); 642 initiator_object = it->value->clone();
639 } 643 }
640 644
641 std::unique_ptr<protocol::Network::Request> request_info( 645 std::unique_ptr<protocol::Network::Request> request_info(
642 BuildObjectForResourceRequest(request)); 646 BuildObjectForResourceRequest(request));
643 647
644 request_info->setMixedContentType(MixedContentTypeForContextType( 648 // |loader| is null while inspecting worker if off-main-thread-fetch is
645 MixedContentChecker::ContextTypeForInspector(frame, request))); 649 // enabled. TODO(horo): Refactor MixedContentChecker and set mixed content
650 // type even if |loader| is null.
651 if (loader) {
652 request_info->setMixedContentType(MixedContentTypeForContextType(
653 MixedContentChecker::ContextTypeForInspector(loader->GetFrame(),
654 request)));
655 }
646 656
647 request_info->setReferrerPolicy( 657 request_info->setReferrerPolicy(
648 GetReferrerPolicy(request.GetReferrerPolicy())); 658 GetReferrerPolicy(request.GetReferrerPolicy()));
649 if (initiator_info.is_link_preload) 659 if (initiator_info.is_link_preload)
650 request_info->setIsLinkPreload(true); 660 request_info->setIsLinkPreload(true);
651 661
652 String resource_type = InspectorPageAgent::ResourceTypeJson(type); 662 String resource_type = InspectorPageAgent::ResourceTypeJson(type);
653 GetFrontend()->requestWillBeSent( 663 String documentURL =
654 request_id, frame_id, loader_id, 664 loader ? UrlWithoutFragment(loader->Url()).GetString()
655 UrlWithoutFragment(loader->Url()).GetString(), std::move(request_info), 665 : UrlWithoutFragment(execution_context->Url()).GetString();
656 MonotonicallyIncreasingTime(), CurrentTime(), std::move(initiator_object), 666 if (!frame_id.IsEmpty()) {
657 BuildObjectForResourceResponse(redirect_response), resource_type); 667 GetFrontend()->requestWillBeSent(
668 request_id, loader_id, documentURL, std::move(request_info),
669 MonotonicallyIncreasingTime(), CurrentTime(),
670 std::move(initiator_object),
671 BuildObjectForResourceResponse(redirect_response), resource_type,
672 frame_id);
673 } else {
674 GetFrontend()->requestWillBeSent(
675 request_id, loader_id, documentURL, std::move(request_info),
676 MonotonicallyIncreasingTime(), CurrentTime(),
677 std::move(initiator_object),
678 BuildObjectForResourceResponse(redirect_response), resource_type);
679 }
dgozman 2017/06/28 22:50:32 I think it's possible to pass Maybe<String>() here
horo 2017/06/29 02:14:28 Done.
658 if (pending_xhr_replay_data_ && !pending_xhr_replay_data_->Async()) 680 if (pending_xhr_replay_data_ && !pending_xhr_replay_data_->Async())
659 GetFrontend()->flush(); 681 GetFrontend()->flush();
660 } 682 }
661 683
662 void InspectorNetworkAgent::WillSendRequest( 684 void InspectorNetworkAgent::WillSendRequest(
663 LocalFrame* frame, 685 ExecutionContext* execution_context,
664 unsigned long identifier, 686 unsigned long identifier,
665 DocumentLoader* loader, 687 DocumentLoader* loader,
666 ResourceRequest& request, 688 ResourceRequest& request,
667 const ResourceResponse& redirect_response, 689 const ResourceResponse& redirect_response,
668 const FetchInitiatorInfo& initiator_info) { 690 const FetchInitiatorInfo& initiator_info) {
669 // Ignore the request initiated internally. 691 // Ignore the request initiated internally.
670 if (initiator_info.name == FetchInitiatorTypeNames::internal) 692 if (initiator_info.name == FetchInitiatorTypeNames::internal)
671 return; 693 return;
672 694
673 if (initiator_info.name == FetchInitiatorTypeNames::document && 695 if (initiator_info.name == FetchInitiatorTypeNames::document &&
(...skipping 19 matching lines...) Expand all
693 request.GetRequestContext() != WebURLRequest::kRequestContextInternal) { 715 request.GetRequestContext() != WebURLRequest::kRequestContextInternal) {
694 request.SetCachePolicy(WebCachePolicy::kBypassCacheLoadOnlyFromCache); 716 request.SetCachePolicy(WebCachePolicy::kBypassCacheLoadOnlyFromCache);
695 } else { 717 } else {
696 request.SetCachePolicy(WebCachePolicy::kBypassingCache); 718 request.SetCachePolicy(WebCachePolicy::kBypassingCache);
697 } 719 }
698 request.SetShouldResetAppCache(true); 720 request.SetShouldResetAppCache(true);
699 } 721 }
700 if (state_->booleanProperty(NetworkAgentState::kBypassServiceWorker, false)) 722 if (state_->booleanProperty(NetworkAgentState::kBypassServiceWorker, false))
701 request.SetServiceWorkerMode(WebURLRequest::ServiceWorkerMode::kNone); 723 request.SetServiceWorkerMode(WebURLRequest::ServiceWorkerMode::kNone);
702 724
703 WillSendRequestInternal(frame, identifier, loader, request, redirect_response, 725 WillSendRequestInternal(execution_context, identifier, loader, request,
704 initiator_info); 726 redirect_response, initiator_info);
705 727
706 if (!host_id_.IsEmpty()) 728 if (!host_id_.IsEmpty())
707 request.AddHTTPHeaderField( 729 request.AddHTTPHeaderField(
708 HTTPNames::X_DevTools_Emulate_Network_Conditions_Client_Id, 730 HTTPNames::X_DevTools_Emulate_Network_Conditions_Client_Id,
709 AtomicString(host_id_)); 731 AtomicString(host_id_));
710 } 732 }
711 733
712 void InspectorNetworkAgent::MarkResourceAsCached(unsigned long identifier) { 734 void InspectorNetworkAgent::MarkResourceAsCached(unsigned long identifier) {
713 GetFrontend()->requestServedFromCache( 735 GetFrontend()->requestServedFromCache(
714 IdentifiersFactory::RequestId(identifier)); 736 IdentifiersFactory::RequestId(identifier));
715 } 737 }
716 738
717 void InspectorNetworkAgent::DidReceiveResourceResponse( 739 void InspectorNetworkAgent::DidReceiveResourceResponse(
718 LocalFrame* frame,
719 unsigned long identifier, 740 unsigned long identifier,
720 DocumentLoader* loader, 741 DocumentLoader* loader,
721 const ResourceResponse& response, 742 const ResourceResponse& response,
722 Resource* cached_resource) { 743 Resource* cached_resource) {
723 String request_id = IdentifiersFactory::RequestId(identifier); 744 String request_id = IdentifiersFactory::RequestId(identifier);
724 bool is_not_modified = response.HttpStatusCode() == 304; 745 bool is_not_modified = response.HttpStatusCode() == 304;
725 746
726 bool resource_is_empty = true; 747 bool resource_is_empty = true;
727 std::unique_ptr<protocol::Network::Response> resource_response = 748 std::unique_ptr<protocol::Network::Response> resource_response =
728 BuildObjectForResourceResponse(response, cached_resource, 749 BuildObjectForResourceResponse(response, cached_resource,
(...skipping 15 matching lines...) Expand all
744 if (type == InspectorPageAgent::kDocumentResource && loader && 765 if (type == InspectorPageAgent::kDocumentResource && loader &&
745 loader->GetSubstituteData().IsValid()) 766 loader->GetSubstituteData().IsValid())
746 return; 767 return;
747 768
748 // Resources are added to NetworkResourcesData as a WeakMember here and 769 // Resources are added to NetworkResourcesData as a WeakMember here and
749 // removed in willDestroyResource() called in the prefinalizer of Resource. 770 // removed in willDestroyResource() called in the prefinalizer of Resource.
750 // Because NetworkResourceData retains weak references only, it 771 // Because NetworkResourceData retains weak references only, it
751 // doesn't affect Resource lifetime. 772 // doesn't affect Resource lifetime.
752 if (cached_resource) 773 if (cached_resource)
753 resources_data_->AddResource(request_id, cached_resource); 774 resources_data_->AddResource(request_id, cached_resource);
754 String frame_id = IdentifiersFactory::FrameId(frame); 775 String frame_id = loader && loader->GetFrame()
776 ? IdentifiersFactory::FrameId(loader->GetFrame())
777 : "";
755 String loader_id = loader ? IdentifiersFactory::LoaderId(loader) : ""; 778 String loader_id = loader ? IdentifiersFactory::LoaderId(loader) : "";
756 resources_data_->ResponseReceived(request_id, frame_id, response); 779 resources_data_->ResponseReceived(request_id, frame_id, response);
757 resources_data_->SetResourceType(request_id, type); 780 resources_data_->SetResourceType(request_id, type);
758 781
759 if (response.GetSecurityStyle() != ResourceResponse::kSecurityStyleUnknown && 782 if (response.GetSecurityStyle() != ResourceResponse::kSecurityStyleUnknown &&
760 response.GetSecurityStyle() != 783 response.GetSecurityStyle() !=
761 ResourceResponse::kSecurityStyleUnauthenticated) { 784 ResourceResponse::kSecurityStyleUnauthenticated) {
762 const ResourceResponse::SecurityDetails* response_security_details = 785 const ResourceResponse::SecurityDetails* response_security_details =
763 response.GetSecurityDetails(); 786 response.GetSecurityDetails();
764 resources_data_->SetCertificate(request_id, 787 resources_data_->SetCertificate(request_id,
765 response_security_details->certificate); 788 response_security_details->certificate);
766 } 789 }
767 790
768 if (resource_response && !resource_is_empty) 791 if (resource_response && !resource_is_empty) {
769 GetFrontend()->responseReceived(request_id, frame_id, loader_id, 792 if (!frame_id.IsEmpty()) {
770 MonotonicallyIncreasingTime(), 793 GetFrontend()->responseReceived(
771 InspectorPageAgent::ResourceTypeJson(type), 794 request_id, loader_id, MonotonicallyIncreasingTime(),
772 std::move(resource_response)); 795 InspectorPageAgent::ResourceTypeJson(type),
796 std::move(resource_response), frame_id);
797 } else {
798 GetFrontend()->responseReceived(
799 request_id, loader_id, MonotonicallyIncreasingTime(),
800 InspectorPageAgent::ResourceTypeJson(type),
801 std::move(resource_response));
802 }
803 }
773 // If we revalidated the resource and got Not modified, send content length 804 // If we revalidated the resource and got Not modified, send content length
774 // following didReceiveResponse as there will be no calls to didReceiveData 805 // following didReceiveResponse as there will be no calls to didReceiveData
775 // from the network stack. 806 // from the network stack.
776 if (is_not_modified && cached_resource && cached_resource->EncodedSize()) 807 if (is_not_modified && cached_resource && cached_resource->EncodedSize())
777 DidReceiveData(frame, identifier, 0, cached_resource->EncodedSize()); 808 DidReceiveData(identifier, loader, 0, cached_resource->EncodedSize());
778 } 809 }
779 810
780 static bool IsErrorStatusCode(int status_code) { 811 static bool IsErrorStatusCode(int status_code) {
781 return status_code >= 400; 812 return status_code >= 400;
782 } 813 }
783 814
784 void InspectorNetworkAgent::DidReceiveData(LocalFrame*, 815 void InspectorNetworkAgent::DidReceiveData(unsigned long identifier,
785 unsigned long identifier, 816 DocumentLoader* loader,
786 const char* data, 817 const char* data,
787 int data_length) { 818 int data_length) {
788 String request_id = IdentifiersFactory::RequestId(identifier); 819 String request_id = IdentifiersFactory::RequestId(identifier);
789 820
790 if (data) { 821 if (data) {
791 NetworkResourcesData::ResourceData const* resource_data = 822 NetworkResourcesData::ResourceData const* resource_data =
792 resources_data_->Data(request_id); 823 resources_data_->Data(request_id);
793 if (resource_data && 824 if (resource_data &&
794 (!resource_data->CachedResource() || 825 (!resource_data->CachedResource() ||
795 resource_data->CachedResource()->GetDataBufferingPolicy() == 826 resource_data->CachedResource()->GetDataBufferingPolicy() ==
796 kDoNotBufferData || 827 kDoNotBufferData ||
797 IsErrorStatusCode(resource_data->HttpStatusCode()))) 828 IsErrorStatusCode(resource_data->HttpStatusCode())))
798 resources_data_->MaybeAddResourceData(request_id, data, data_length); 829 resources_data_->MaybeAddResourceData(request_id, data, data_length);
799 } 830 }
800 831
801 GetFrontend()->dataReceived( 832 GetFrontend()->dataReceived(
802 request_id, MonotonicallyIncreasingTime(), data_length, 833 request_id, MonotonicallyIncreasingTime(), data_length,
803 resources_data_->GetAndClearPendingEncodedDataLength(request_id)); 834 resources_data_->GetAndClearPendingEncodedDataLength(request_id));
804 } 835 }
805 836
806 void InspectorNetworkAgent::DidReceiveEncodedDataLength( 837 void InspectorNetworkAgent::DidReceiveEncodedDataLength(
807 LocalFrame*,
808 unsigned long identifier, 838 unsigned long identifier,
809 int encoded_data_length) { 839 int encoded_data_length) {
810 String request_id = IdentifiersFactory::RequestId(identifier); 840 String request_id = IdentifiersFactory::RequestId(identifier);
811 resources_data_->AddPendingEncodedDataLength(request_id, encoded_data_length); 841 resources_data_->AddPendingEncodedDataLength(request_id, encoded_data_length);
812 } 842 }
813 843
814 void InspectorNetworkAgent::DidFinishLoading(LocalFrame*, 844 void InspectorNetworkAgent::DidFinishLoading(unsigned long identifier,
815 unsigned long identifier, 845 DocumentLoader*,
816 double monotonic_finish_time, 846 double monotonic_finish_time,
817 int64_t encoded_data_length, 847 int64_t encoded_data_length,
818 int64_t decoded_body_length) { 848 int64_t decoded_body_length) {
819 String request_id = IdentifiersFactory::RequestId(identifier); 849 String request_id = IdentifiersFactory::RequestId(identifier);
820 NetworkResourcesData::ResourceData const* resource_data = 850 NetworkResourcesData::ResourceData const* resource_data =
821 resources_data_->Data(request_id); 851 resources_data_->Data(request_id);
822 852
823 int pending_encoded_data_length = 853 int pending_encoded_data_length =
824 resources_data_->GetAndClearPendingEncodedDataLength(request_id); 854 resources_data_->GetAndClearPendingEncodedDataLength(request_id);
825 if (pending_encoded_data_length > 0) { 855 if (pending_encoded_data_length > 0) {
(...skipping 16 matching lines...) Expand all
842 encoded_data_length); 872 encoded_data_length);
843 } 873 }
844 874
845 void InspectorNetworkAgent::DidReceiveCORSRedirectResponse( 875 void InspectorNetworkAgent::DidReceiveCORSRedirectResponse(
846 LocalFrame* frame, 876 LocalFrame* frame,
847 unsigned long identifier, 877 unsigned long identifier,
848 DocumentLoader* loader, 878 DocumentLoader* loader,
849 const ResourceResponse& response, 879 const ResourceResponse& response,
850 Resource* resource) { 880 Resource* resource) {
851 // Update the response and finish loading 881 // Update the response and finish loading
852 DidReceiveResourceResponse(frame, identifier, loader, response, resource); 882 DidReceiveResourceResponse(identifier, loader, response, resource);
853 DidFinishLoading(frame, identifier, 0, 883 DidFinishLoading(identifier, loader, 0,
854 WebURLLoaderClient::kUnknownEncodedDataLength, 0); 884 WebURLLoaderClient::kUnknownEncodedDataLength, 0);
855 } 885 }
856 886
857 void InspectorNetworkAgent::DidFailLoading(unsigned long identifier, 887 void InspectorNetworkAgent::DidFailLoading(unsigned long identifier,
858 const ResourceError& error) { 888 const ResourceError& error) {
859 String request_id = IdentifiersFactory::RequestId(identifier); 889 String request_id = IdentifiersFactory::RequestId(identifier);
860 bool canceled = error.IsCancellation(); 890 bool canceled = error.IsCancellation();
861 GetFrontend()->loadingFailed( 891 GetFrontend()->loadingFailed(
862 request_id, MonotonicallyIncreasingTime(), 892 request_id, MonotonicallyIncreasingTime(),
863 InspectorPageAgent::ResourceTypeJson( 893 InspectorPageAgent::ResourceTypeJson(
(...skipping 392 matching lines...) Expand 10 before | Expand all | Expand 10 after
1256 return Response::OK(); 1286 return Response::OK();
1257 } 1287 }
1258 1288
1259 bool InspectorNetworkAgent::CanGetResponseBodyBlob(const String& request_id) { 1289 bool InspectorNetworkAgent::CanGetResponseBodyBlob(const String& request_id) {
1260 NetworkResourcesData::ResourceData const* resource_data = 1290 NetworkResourcesData::ResourceData const* resource_data =
1261 resources_data_->Data(request_id); 1291 resources_data_->Data(request_id);
1262 BlobDataHandle* blob = 1292 BlobDataHandle* blob =
1263 resource_data ? resource_data->DownloadedFileBlob() : nullptr; 1293 resource_data ? resource_data->DownloadedFileBlob() : nullptr;
1264 if (!blob) 1294 if (!blob)
1265 return false; 1295 return false;
1296 if (execution_context_)
1297 return true;
1266 LocalFrame* frame = IdentifiersFactory::FrameById(inspected_frames_, 1298 LocalFrame* frame = IdentifiersFactory::FrameById(inspected_frames_,
1267 resource_data->FrameId()); 1299 resource_data->FrameId());
1268 return frame && frame->GetDocument(); 1300 return frame && frame->GetDocument();
1269 } 1301 }
1270 1302
1271 void InspectorNetworkAgent::GetResponseBodyBlob( 1303 void InspectorNetworkAgent::GetResponseBodyBlob(
1272 const String& request_id, 1304 const String& request_id,
1273 std::unique_ptr<GetResponseBodyCallback> callback) { 1305 std::unique_ptr<GetResponseBodyCallback> callback) {
1274 NetworkResourcesData::ResourceData const* resource_data = 1306 NetworkResourcesData::ResourceData const* resource_data =
1275 resources_data_->Data(request_id); 1307 resources_data_->Data(request_id);
1276 BlobDataHandle* blob = resource_data->DownloadedFileBlob(); 1308 BlobDataHandle* blob = resource_data->DownloadedFileBlob();
1309 InspectorFileReaderLoaderClient* client = new InspectorFileReaderLoaderClient(
1310 blob, resource_data->MimeType(), resource_data->TextEncodingName(),
1311 std::move(callback));
1312 if (execution_context_) {
1313 client->Start(execution_context_);
1314 return;
1315 }
1316 DCHECK(inspected_frames_);
1277 LocalFrame* frame = IdentifiersFactory::FrameById(inspected_frames_, 1317 LocalFrame* frame = IdentifiersFactory::FrameById(inspected_frames_,
1278 resource_data->FrameId()); 1318 resource_data->FrameId());
1279 Document* document = frame->GetDocument(); 1319 Document* document = frame->GetDocument();
1280 InspectorFileReaderLoaderClient* client = new InspectorFileReaderLoaderClient(
1281 blob, resource_data->MimeType(), resource_data->TextEncodingName(),
1282 std::move(callback));
1283 client->Start(document); 1320 client->Start(document);
1284 } 1321 }
1285 1322
1286 void InspectorNetworkAgent::getResponseBody( 1323 void InspectorNetworkAgent::getResponseBody(
1287 const String& request_id, 1324 const String& request_id,
1288 std::unique_ptr<GetResponseBodyCallback> pass_callback) { 1325 std::unique_ptr<GetResponseBodyCallback> pass_callback) {
1289 std::unique_ptr<GetResponseBodyCallback> callback = std::move(pass_callback); 1326 std::unique_ptr<GetResponseBodyCallback> callback = std::move(pass_callback);
1290 NetworkResourcesData::ResourceData const* resource_data = 1327 NetworkResourcesData::ResourceData const* resource_data =
1291 resources_data_->Data(request_id); 1328 resources_data_->Data(request_id);
1292 if (!resource_data) { 1329 if (!resource_data) {
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
1388 *result = true; 1425 *result = true;
1389 return Response::OK(); 1426 return Response::OK();
1390 } 1427 }
1391 1428
1392 Response InspectorNetworkAgent::emulateNetworkConditions( 1429 Response InspectorNetworkAgent::emulateNetworkConditions(
1393 bool offline, 1430 bool offline,
1394 double latency, 1431 double latency,
1395 double download_throughput, 1432 double download_throughput,
1396 double upload_throughput, 1433 double upload_throughput,
1397 Maybe<String> connection_type) { 1434 Maybe<String> connection_type) {
1435 if (!IsMainThread())
1436 return Response::Error("Not supported");
1437
1398 WebConnectionType type = kWebConnectionTypeUnknown; 1438 WebConnectionType type = kWebConnectionTypeUnknown;
1399 if (connection_type.isJust()) { 1439 if (connection_type.isJust()) {
1400 type = ToWebConnectionType(connection_type.fromJust()); 1440 type = ToWebConnectionType(connection_type.fromJust());
1401 if (type == kWebConnectionTypeUnknown) 1441 if (type == kWebConnectionTypeUnknown)
1402 return Response::Error("Unknown connection type"); 1442 return Response::Error("Unknown connection type");
1403 } 1443 }
1404 // TODO(dgozman): networkStateNotifier is per-process. It would be nice to 1444 // TODO(dgozman): networkStateNotifier is per-process. It would be nice to
1405 // have per-frame override instead. 1445 // have per-frame override instead.
1406 if (offline || latency || download_throughput || upload_throughput) 1446 if (offline || latency || download_throughput || upload_throughput)
1407 GetNetworkStateNotifier().SetNetworkConnectionInfoOverride( 1447 GetNetworkStateNotifier().SetNetworkConnectionInfoOverride(
1408 !offline, type, download_throughput / (1024 * 1024 / 8)); 1448 !offline, type, download_throughput / (1024 * 1024 / 8));
1409 else 1449 else
1410 GetNetworkStateNotifier().ClearOverride(); 1450 GetNetworkStateNotifier().ClearOverride();
1411 return Response::OK(); 1451 return Response::OK();
1412 } 1452 }
1413 1453
1414 Response InspectorNetworkAgent::setCacheDisabled(bool cache_disabled) { 1454 Response InspectorNetworkAgent::setCacheDisabled(bool cache_disabled) {
1415 // TODO(ananta) 1455 // TODO(ananta)
1416 // We should extract network cache state into a global entity which can be 1456 // We should extract network cache state into a global entity which can be
1417 // queried from FrameLoader and other places. 1457 // queried from FrameLoader and other places.
1418 state_->setBoolean(NetworkAgentState::kCacheDisabled, cache_disabled); 1458 state_->setBoolean(NetworkAgentState::kCacheDisabled, cache_disabled);
1419 if (cache_disabled) 1459 if (cache_disabled && IsMainThread())
1420 GetMemoryCache()->EvictResources(); 1460 GetMemoryCache()->EvictResources();
1421 return Response::OK(); 1461 return Response::OK();
1422 } 1462 }
1423 1463
1424 Response InspectorNetworkAgent::setBypassServiceWorker(bool bypass) { 1464 Response InspectorNetworkAgent::setBypassServiceWorker(bool bypass) {
1425 state_->setBoolean(NetworkAgentState::kBypassServiceWorker, bypass); 1465 state_->setBoolean(NetworkAgentState::kBypassServiceWorker, bypass);
1426 return Response::OK(); 1466 return Response::OK();
1427 } 1467 }
1428 1468
1429 Response InspectorNetworkAgent::setDataSizeLimitsForTest(int max_total, 1469 Response InspectorNetworkAgent::setDataSizeLimitsForTest(int max_total,
(...skipping 16 matching lines...) Expand all
1446 for (auto& cert : resource->Certificate()) 1486 for (auto& cert : resource->Certificate())
1447 certificate->get()->addItem(Base64Encode(cert.Latin1())); 1487 certificate->get()->addItem(Base64Encode(cert.Latin1()));
1448 return Response::OK(); 1488 return Response::OK();
1449 } 1489 }
1450 } 1490 }
1451 return Response::OK(); 1491 return Response::OK();
1452 } 1492 }
1453 1493
1454 void InspectorNetworkAgent::DidCommitLoad(LocalFrame* frame, 1494 void InspectorNetworkAgent::DidCommitLoad(LocalFrame* frame,
1455 DocumentLoader* loader) { 1495 DocumentLoader* loader) {
1496 DCHECK(inspected_frames_);
1497 DCHECK(IsMainThread());
1456 if (loader->GetFrame() != inspected_frames_->Root()) 1498 if (loader->GetFrame() != inspected_frames_->Root())
1457 return; 1499 return;
1458 1500
1459 if (state_->booleanProperty(NetworkAgentState::kCacheDisabled, false)) 1501 if (state_->booleanProperty(NetworkAgentState::kCacheDisabled, false))
1460 GetMemoryCache()->EvictResources(MemoryCache::kDoNotEvictUnusedPreloads); 1502 GetMemoryCache()->EvictResources(MemoryCache::kDoNotEvictUnusedPreloads);
1461 1503
1462 resources_data_->Clear(IdentifiersFactory::LoaderId(loader)); 1504 resources_data_->Clear(IdentifiersFactory::LoaderId(loader));
1463 } 1505 }
1464 1506
1465 void InspectorNetworkAgent::FrameScheduledNavigation(LocalFrame* frame, 1507 void InspectorNetworkAgent::FrameScheduledNavigation(LocalFrame* frame,
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
1499 } 1541 }
1500 1542
1501 void InspectorNetworkAgent::SetHostId(const String& host_id) { 1543 void InspectorNetworkAgent::SetHostId(const String& host_id) {
1502 host_id_ = host_id; 1544 host_id_ = host_id;
1503 } 1545 }
1504 1546
1505 bool InspectorNetworkAgent::FetchResourceContent(Document* document, 1547 bool InspectorNetworkAgent::FetchResourceContent(Document* document,
1506 const KURL& url, 1548 const KURL& url,
1507 String* content, 1549 String* content,
1508 bool* base64_encoded) { 1550 bool* base64_encoded) {
1551 DCHECK(document);
1552 DCHECK(IsMainThread());
1509 // First try to fetch content from the cached resource. 1553 // First try to fetch content from the cached resource.
1510 Resource* cached_resource = document->Fetcher()->CachedResource(url); 1554 Resource* cached_resource = document->Fetcher()->CachedResource(url);
1511 if (!cached_resource) 1555 if (!cached_resource) {
1512 cached_resource = GetMemoryCache()->ResourceForURL( 1556 cached_resource = GetMemoryCache()->ResourceForURL(
1513 url, document->Fetcher()->GetCacheIdentifier()); 1557 url, document->Fetcher()->GetCacheIdentifier());
1558 }
1514 if (cached_resource && InspectorPageAgent::CachedResourceContent( 1559 if (cached_resource && InspectorPageAgent::CachedResourceContent(
1515 cached_resource, content, base64_encoded)) 1560 cached_resource, content, base64_encoded))
1516 return true; 1561 return true;
1517 1562
1518 // Then fall back to resource data. 1563 // Then fall back to resource data.
1519 for (auto& resource : resources_data_->Resources()) { 1564 for (auto& resource : resources_data_->Resources()) {
1520 if (resource->RequestedURL() == url) { 1565 if (resource->RequestedURL() == url) {
1521 *content = resource->Content(); 1566 *content = resource->Content();
1522 *base64_encoded = resource->Base64Encoded(); 1567 *base64_encoded = resource->Base64Encoded();
1523 return true; 1568 return true;
1524 } 1569 }
1525 } 1570 }
1526 return false; 1571 return false;
1527 } 1572 }
1528 1573
1529 bool InspectorNetworkAgent::CacheDisabled() { 1574 bool InspectorNetworkAgent::CacheDisabled() {
1530 return state_->booleanProperty(NetworkAgentState::kNetworkAgentEnabled, 1575 return state_->booleanProperty(NetworkAgentState::kNetworkAgentEnabled,
1531 false) && 1576 false) &&
1532 state_->booleanProperty(NetworkAgentState::kCacheDisabled, false); 1577 state_->booleanProperty(NetworkAgentState::kCacheDisabled, false);
1533 } 1578 }
1534 1579
1535 void InspectorNetworkAgent::RemoveFinishedReplayXHRFired(TimerBase*) { 1580 void InspectorNetworkAgent::RemoveFinishedReplayXHRFired(TimerBase*) {
1536 replay_xhrs_to_be_deleted_.clear(); 1581 replay_xhrs_to_be_deleted_.clear();
1537 } 1582 }
1538 1583
1539 InspectorNetworkAgent::InspectorNetworkAgent(InspectedFrames* inspected_frames) 1584 InspectorNetworkAgent::InspectorNetworkAgent(InspectedFrames* inspected_frames)
dgozman 2017/06/28 22:50:32 nit: I'd just add second parameter to constructor,
horo 2017/06/29 02:14:28 Done.
1540 : inspected_frames_(inspected_frames), 1585 : inspected_frames_(inspected_frames),
1586 execution_context_(nullptr),
1541 resources_data_( 1587 resources_data_(
1542 NetworkResourcesData::Create(g_maximum_total_buffer_size, 1588 NetworkResourcesData::Create(g_maximum_total_buffer_size,
1543 g_maximum_resource_buffer_size)), 1589 g_maximum_resource_buffer_size)),
1544 pending_request_(nullptr), 1590 pending_request_(nullptr),
1545 remove_finished_replay_xhr_timer_( 1591 remove_finished_replay_xhr_timer_(
1546 TaskRunnerHelper::Get(TaskType::kUnspecedLoading, 1592 TaskRunnerHelper::Get(TaskType::kUnspecedLoading,
1547 inspected_frames->Root()), 1593 inspected_frames->Root()),
1548 this, 1594 this,
1549 &InspectorNetworkAgent::RemoveFinishedReplayXHRFired) {} 1595 &InspectorNetworkAgent::RemoveFinishedReplayXHRFired) {
1596 DCHECK(IsMainThread());
1597 }
1598
1599 InspectorNetworkAgent::InspectorNetworkAgent(
1600 ExecutionContext* execution_context)
1601 : inspected_frames_(nullptr),
1602 execution_context_(execution_context),
1603 resources_data_(
1604 NetworkResourcesData::Create(g_maximum_total_buffer_size,
1605 g_maximum_resource_buffer_size)),
1606 pending_request_(nullptr),
1607 remove_finished_replay_xhr_timer_(
1608 TaskRunnerHelper::Get(TaskType::kUnspecedLoading, execution_context),
1609 this,
1610 &InspectorNetworkAgent::RemoveFinishedReplayXHRFired) {
1611 DCHECK(!IsMainThread());
1612 }
1550 1613
1551 void InspectorNetworkAgent::ShouldForceCORSPreflight(bool* result) { 1614 void InspectorNetworkAgent::ShouldForceCORSPreflight(bool* result) {
1552 if (state_->booleanProperty(NetworkAgentState::kCacheDisabled, false)) 1615 if (state_->booleanProperty(NetworkAgentState::kCacheDisabled, false))
1553 *result = true; 1616 *result = true;
1554 } 1617 }
1555 1618
1556 } // namespace blink 1619 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698