| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved. | 2 * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved. |
| 3 * Copyright (C) 2011 Google Inc. All rights reserved. | 3 * Copyright (C) 2011 Google Inc. All rights reserved. |
| 4 * | 4 * |
| 5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
| 6 * modification, are permitted provided that the following conditions | 6 * modification, are permitted provided that the following conditions |
| 7 * are met: | 7 * are met: |
| 8 * | 8 * |
| 9 * 1. Redistributions of source code must retain the above copyright | 9 * 1. Redistributions of source code must retain the above copyright |
| 10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 93 , m_cachedResourceLoader(CachedResourceLoader::create(this)) | 93 , m_cachedResourceLoader(CachedResourceLoader::create(this)) |
| 94 , m_writer(m_frame) | 94 , m_writer(m_frame) |
| 95 , m_originalRequest(req) | 95 , m_originalRequest(req) |
| 96 , m_substituteData(substituteData) | 96 , m_substituteData(substituteData) |
| 97 , m_originalRequestCopy(req) | 97 , m_originalRequestCopy(req) |
| 98 , m_request(req) | 98 , m_request(req) |
| 99 , m_committed(false) | 99 , m_committed(false) |
| 100 , m_isStopping(false) | 100 , m_isStopping(false) |
| 101 , m_gotFirstByte(false) | 101 , m_gotFirstByte(false) |
| 102 , m_isClientRedirect(false) | 102 , m_isClientRedirect(false) |
| 103 , m_isLoadingMultipartContent(false) | |
| 104 , m_wasOnloadHandled(false) | 103 , m_wasOnloadHandled(false) |
| 105 , m_loadingMainResource(false) | 104 , m_loadingMainResource(false) |
| 106 , m_timeOfLastDataReceived(0.0) | 105 , m_timeOfLastDataReceived(0.0) |
| 107 , m_identifierForLoadWithoutResourceLoader(0) | 106 , m_identifierForLoadWithoutResourceLoader(0) |
| 108 , m_dataLoadTimer(this, &DocumentLoader::handleSubstituteDataLoadNow) | 107 , m_dataLoadTimer(this, &DocumentLoader::handleSubstituteDataLoadNow) |
| 109 , m_applicationCacheHost(adoptPtr(new ApplicationCacheHost(this))) | 108 , m_applicationCacheHost(adoptPtr(new ApplicationCacheHost(this))) |
| 110 { | 109 { |
| 111 } | 110 } |
| 112 | 111 |
| 113 FrameLoader* DocumentLoader::frameLoader() const | 112 FrameLoader* DocumentLoader::frameLoader() const |
| (...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 324 { | 323 { |
| 325 ASSERT(!m_frame->page()->defersLoading() || InspectorInstrumentation::isDebu
ggerPaused(m_frame)); | 324 ASSERT(!m_frame->page()->defersLoading() || InspectorInstrumentation::isDebu
ggerPaused(m_frame)); |
| 326 | 325 |
| 327 RefPtr<DocumentLoader> protect(this); | 326 RefPtr<DocumentLoader> protect(this); |
| 328 | 327 |
| 329 if (m_identifierForLoadWithoutResourceLoader) { | 328 if (m_identifierForLoadWithoutResourceLoader) { |
| 330 frameLoader()->notifier()->dispatchDidFinishLoading(this, m_identifierFo
rLoadWithoutResourceLoader, finishTime); | 329 frameLoader()->notifier()->dispatchDidFinishLoading(this, m_identifierFo
rLoadWithoutResourceLoader, finishTime); |
| 331 m_identifierForLoadWithoutResourceLoader = 0; | 330 m_identifierForLoadWithoutResourceLoader = 0; |
| 332 } | 331 } |
| 333 | 332 |
| 334 maybeFinishLoadingMultipartContent(); | |
| 335 | |
| 336 double responseEndTime = finishTime; | 333 double responseEndTime = finishTime; |
| 337 if (!responseEndTime) | 334 if (!responseEndTime) |
| 338 responseEndTime = m_timeOfLastDataReceived; | 335 responseEndTime = m_timeOfLastDataReceived; |
| 339 if (!responseEndTime) | 336 if (!responseEndTime) |
| 340 responseEndTime = monotonicallyIncreasingTime(); | 337 responseEndTime = monotonicallyIncreasingTime(); |
| 341 timing()->setResponseEnd(responseEndTime); | 338 timing()->setResponseEnd(responseEndTime); |
| 342 | 339 |
| 343 commitIfReady(); | 340 commitIfReady(); |
| 344 if (!frameLoader()) | 341 if (!frameLoader()) |
| 345 return; | 342 return; |
| (...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 557 | 554 |
| 558 // The load event might have detached this frame. In that case, the
load will already have been cancelled during detach. | 555 // The load event might have detached this frame. In that case, the
load will already have been cancelled during detach. |
| 559 if (frameLoader()) | 556 if (frameLoader()) |
| 560 cancelMainResourceLoad(frameLoader()->cancelledError(m_request))
; | 557 cancelMainResourceLoad(frameLoader()->cancelledError(m_request))
; |
| 561 return; | 558 return; |
| 562 } | 559 } |
| 563 } | 560 } |
| 564 | 561 |
| 565 ASSERT(!mainResourceLoader() || !mainResourceLoader()->defersLoading()); | 562 ASSERT(!mainResourceLoader() || !mainResourceLoader()->defersLoading()); |
| 566 | 563 |
| 567 if (m_isLoadingMultipartContent) { | |
| 568 setupForReplace(); | |
| 569 m_mainResource->clear(); | |
| 570 } else if (response.isMultipart()) { | |
| 571 UseCounter::count(m_frame->document(), UseCounter::MultipartMainResource
); | |
| 572 m_isLoadingMultipartContent = true; | |
| 573 } | |
| 574 | |
| 575 m_response = response; | 564 m_response = response; |
| 576 | 565 |
| 577 if (m_identifierForLoadWithoutResourceLoader) | 566 if (m_identifierForLoadWithoutResourceLoader) |
| 578 frameLoader()->notifier()->dispatchDidReceiveResponse(this, m_identifier
ForLoadWithoutResourceLoader, m_response, 0); | 567 frameLoader()->notifier()->dispatchDidReceiveResponse(this, m_identifier
ForLoadWithoutResourceLoader, m_response, 0); |
| 579 | 568 |
| 580 if (!shouldContinueForResponse()) { | 569 if (!shouldContinueForResponse()) { |
| 581 InspectorInstrumentation::continueWithPolicyIgnore(m_frame, this, m_main
Resource->identifier(), m_response); | 570 InspectorInstrumentation::continueWithPolicyIgnore(m_frame, this, m_main
Resource->identifier(), m_response); |
| 582 stopLoadingForPolicyChange(); | 571 stopLoadingForPolicyChange(); |
| 583 return; | 572 return; |
| 584 } | 573 } |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 646 m_writer.setDocumentWasLoadedAsPartOfNavigation(); | 635 m_writer.setDocumentWasLoadedAsPartOfNavigation(); |
| 647 | 636 |
| 648 if (frameLoader()->stateMachine()->creatingInitialEmptyDocument()) | 637 if (frameLoader()->stateMachine()->creatingInitialEmptyDocument()) |
| 649 return; | 638 return; |
| 650 | 639 |
| 651 // The origin is the MHTML file, we need to set the base URL to the docu
ment encoded in the MHTML so | 640 // The origin is the MHTML file, we need to set the base URL to the docu
ment encoded in the MHTML so |
| 652 // relative URLs are resolved properly. | 641 // relative URLs are resolved properly. |
| 653 if (m_archive) | 642 if (m_archive) |
| 654 m_frame->document()->setBaseURLOverride(m_archive->mainResource()->u
rl()); | 643 m_frame->document()->setBaseURLOverride(m_archive->mainResource()->u
rl()); |
| 655 | 644 |
| 656 // Call receivedFirstData() exactly once per load. We should only reach
this point multiple times | 645 // Call receivedFirstData() exactly once per load. |
| 657 // for multipart loads, and FrameLoader::isReplacing() will be true afte
r the first time. | 646 frameLoader()->receivedFirstData(); |
| 658 if (!isMultipartReplacingLoad()) | |
| 659 frameLoader()->receivedFirstData(); | |
| 660 | 647 |
| 661 bool userChosen = true; | 648 bool userChosen = true; |
| 662 String encoding = overrideEncoding(); | 649 String encoding = overrideEncoding(); |
| 663 if (encoding.isNull()) { | 650 if (encoding.isNull()) { |
| 664 userChosen = false; | 651 userChosen = false; |
| 665 encoding = response().textEncodingName(); | 652 encoding = response().textEncodingName(); |
| 666 } | 653 } |
| 667 m_writer.setEncoding(encoding, userChosen); | 654 m_writer.setEncoding(encoding, userChosen); |
| 668 } | 655 } |
| 669 ASSERT(m_frame->document()->parsing()); | 656 ASSERT(m_frame->document()->parsing()); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 697 ASSERT_UNUSED(resource, resource == m_mainResource); | 684 ASSERT_UNUSED(resource, resource == m_mainResource); |
| 698 ASSERT(!m_response.isNull()); | 685 ASSERT(!m_response.isNull()); |
| 699 ASSERT(!mainResourceLoader() || !mainResourceLoader()->defersLoading()); | 686 ASSERT(!mainResourceLoader() || !mainResourceLoader()->defersLoading()); |
| 700 | 687 |
| 701 if (m_identifierForLoadWithoutResourceLoader) | 688 if (m_identifierForLoadWithoutResourceLoader) |
| 702 frameLoader()->notifier()->dispatchDidReceiveData(this, m_identifierForL
oadWithoutResourceLoader, data, length, -1); | 689 frameLoader()->notifier()->dispatchDidReceiveData(this, m_identifierForL
oadWithoutResourceLoader, data, length, -1); |
| 703 | 690 |
| 704 m_applicationCacheHost->mainResourceDataReceived(data, length); | 691 m_applicationCacheHost->mainResourceDataReceived(data, length); |
| 705 m_timeOfLastDataReceived = monotonicallyIncreasingTime(); | 692 m_timeOfLastDataReceived = monotonicallyIncreasingTime(); |
| 706 | 693 |
| 707 if (!isMultipartReplacingLoad()) | 694 commitLoad(data, length); |
| 708 commitLoad(data, length); | |
| 709 } | |
| 710 | |
| 711 void DocumentLoader::setupForReplace() | |
| 712 { | |
| 713 if (!mainResourceData()) | |
| 714 return; | |
| 715 | |
| 716 maybeFinishLoadingMultipartContent(); | |
| 717 maybeCreateArchive(); | |
| 718 m_writer.end(); | |
| 719 frameLoader()->setReplacing(); | |
| 720 m_gotFirstByte = false; | |
| 721 | |
| 722 stopLoadingSubresources(); | |
| 723 clearArchiveResources(); | |
| 724 } | 695 } |
| 725 | 696 |
| 726 void DocumentLoader::checkLoadComplete() | 697 void DocumentLoader::checkLoadComplete() |
| 727 { | 698 { |
| 728 if (!m_frame || isLoading()) | 699 if (!m_frame || isLoading()) |
| 729 return; | 700 return; |
| 730 // FIXME: This ASSERT is always triggered. | 701 // FIXME: This ASSERT is always triggered. |
| 731 // See https://bugs.webkit.org/show_bug.cgi?id=110937 | 702 // See https://bugs.webkit.org/show_bug.cgi?id=110937 |
| 732 // ASSERT(this == frameLoader()->activeDocumentLoader()) | 703 // ASSERT(this == frameLoader()->activeDocumentLoader()) |
| 733 m_frame->document()->domWindow()->finishedLoading(); | 704 m_frame->document()->domWindow()->finishedLoading(); |
| (...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 938 void DocumentLoader::removeResourceLoader(ResourceLoader* loader) | 909 void DocumentLoader::removeResourceLoader(ResourceLoader* loader) |
| 939 { | 910 { |
| 940 if (!m_resourceLoaders.contains(loader)) | 911 if (!m_resourceLoaders.contains(loader)) |
| 941 return; | 912 return; |
| 942 m_resourceLoaders.remove(loader); | 913 m_resourceLoaders.remove(loader); |
| 943 checkLoadComplete(); | 914 checkLoadComplete(); |
| 944 if (Frame* frame = m_frame) | 915 if (Frame* frame = m_frame) |
| 945 frame->loader()->checkLoadComplete(); | 916 frame->loader()->checkLoadComplete(); |
| 946 } | 917 } |
| 947 | 918 |
| 948 bool DocumentLoader::isMultipartReplacingLoad() const | |
| 949 { | |
| 950 return isLoadingMultipartContent() && frameLoader()->isReplacing(); | |
| 951 } | |
| 952 | |
| 953 bool DocumentLoader::maybeLoadEmpty() | 919 bool DocumentLoader::maybeLoadEmpty() |
| 954 { | 920 { |
| 955 bool shouldLoadEmpty = !m_substituteData.isValid() && (m_request.url().isEmp
ty() || SchemeRegistry::shouldLoadURLSchemeAsEmptyDocument(m_request.url().proto
col())); | 921 bool shouldLoadEmpty = !m_substituteData.isValid() && (m_request.url().isEmp
ty() || SchemeRegistry::shouldLoadURLSchemeAsEmptyDocument(m_request.url().proto
col())); |
| 956 if (!shouldLoadEmpty) | 922 if (!shouldLoadEmpty) |
| 957 return false; | 923 return false; |
| 958 | 924 |
| 959 if (m_request.url().isEmpty() && !frameLoader()->stateMachine()->creatingIni
tialEmptyDocument()) | 925 if (m_request.url().isEmpty() && !frameLoader()->stateMachine()->creatingIni
tialEmptyDocument()) |
| 960 m_request.setURL(blankURL()); | 926 m_request.setURL(blankURL()); |
| 961 String mimeType = shouldLoadEmpty ? "text/html" : frameLoader()->client()->g
eneratedMIMETypeForURLScheme(m_request.url().protocol()); | 927 String mimeType = shouldLoadEmpty ? "text/html" : frameLoader()->client()->g
eneratedMIMETypeForURLScheme(m_request.url().protocol()); |
| 962 m_response = ResourceResponse(m_request.url(), mimeType, 0, String(), String
()); | 928 m_response = ResourceResponse(m_request.url(), mimeType, 0, String(), String
()); |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1034 | 1000 |
| 1035 void DocumentLoader::subresourceLoaderFinishedLoadingOnePart(ResourceLoader* loa
der) | 1001 void DocumentLoader::subresourceLoaderFinishedLoadingOnePart(ResourceLoader* loa
der) |
| 1036 { | 1002 { |
| 1037 m_multipartResourceLoaders.add(loader); | 1003 m_multipartResourceLoaders.add(loader); |
| 1038 m_resourceLoaders.remove(loader); | 1004 m_resourceLoaders.remove(loader); |
| 1039 checkLoadComplete(); | 1005 checkLoadComplete(); |
| 1040 if (Frame* frame = m_frame) | 1006 if (Frame* frame = m_frame) |
| 1041 frame->loader()->checkLoadComplete(); | 1007 frame->loader()->checkLoadComplete(); |
| 1042 } | 1008 } |
| 1043 | 1009 |
| 1044 void DocumentLoader::maybeFinishLoadingMultipartContent() | |
| 1045 { | |
| 1046 if (!isMultipartReplacingLoad()) | |
| 1047 return; | |
| 1048 | |
| 1049 frameLoader()->setupForReplace(); | |
| 1050 m_committed = false; | |
| 1051 RefPtr<SharedBuffer> resourceData = mainResourceData(); | |
| 1052 commitLoad(resourceData->data(), resourceData->size()); | |
| 1053 } | |
| 1054 | |
| 1055 void DocumentLoader::handledOnloadEvents() | 1010 void DocumentLoader::handledOnloadEvents() |
| 1056 { | 1011 { |
| 1057 m_wasOnloadHandled = true; | 1012 m_wasOnloadHandled = true; |
| 1058 applicationCacheHost()->stopDeferringEvents(); | 1013 applicationCacheHost()->stopDeferringEvents(); |
| 1059 } | 1014 } |
| 1060 | 1015 |
| 1061 } // namespace WebCore | 1016 } // namespace WebCore |
| OLD | NEW |