⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 215384 in webkit


Ignore:
Timestamp:
Apr 14, 2017, 5:52:10 PM (9 years ago)
Author:
beidson@apple.com
Message:

Fix basic WKURLSchemeHandler bugs.
<rdar://problem/30647559> and ​https://bugs.webkit.org/show_bug.cgi?id=170862

Reviewed by Andy Estes.

Source/WebCore:

Covered by new API tests.

  • loader/SubresourceLoader.cpp:

(WebCore::SubresourceLoader::didReceiveDataOrBuffer):

Source/WebKit2:

  • UIProcess/Cocoa/NavigationState.mm:

(WebKit::NavigationState::NavigationClient::decidePolicyForNavigationAction):

  • UIProcess/WebURLSchemeHandlerTask.cpp:

(WebKit::WebURLSchemeHandlerTask::didReceiveResponse):

  • WebProcess/Network/WebLoaderStrategy.cpp:

(WebKit::WebLoaderStrategy::addURLSchemeHandlerTaskProxy):
(WebKit::WebLoaderStrategy::removeURLSchemeHandlerTaskProxy):
(WebKit::WebLoaderStrategy::remove):

  • WebProcess/Network/WebLoaderStrategy.h:
  • WebProcess/WebPage/WebURLSchemeHandlerProxy.cpp:

(WebKit::WebURLSchemeHandlerProxy::startNewTask):
(WebKit::WebURLSchemeHandlerProxy::taskDidComplete):
(WebKit::WebURLSchemeHandlerProxy::taskDidStopLoading):

  • WebProcess/WebPage/WebURLSchemeHandlerProxy.h:
  • WebProcess/WebPage/WebURLSchemeHandlerTaskProxy.cpp:

(WebKit::WebURLSchemeHandlerTaskProxy::WebURLSchemeHandlerTaskProxy):
(WebKit::WebURLSchemeHandlerTaskProxy::stopLoading):
(WebKit::WebURLSchemeHandlerTaskProxy::didReceiveResponse):
(WebKit::WebURLSchemeHandlerTaskProxy::didReceiveData):
(WebKit::WebURLSchemeHandlerTaskProxy::didComplete):
(WebKit::WebURLSchemeHandlerTaskProxy::hasLoader):

  • WebProcess/WebPage/WebURLSchemeHandlerTaskProxy.h:

(WebKit::WebURLSchemeHandlerTaskProxy::identifier):

Tools:

  • TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
  • TestWebKitAPI/Tests/WebKit2Cocoa/WKURLSchemeHandler-1.mm: Added.

(-[SchemeHandler initWithData:mimeType:]):
(-[SchemeHandler dealloc]):
(-[SchemeHandler webView:startTask:]):
(-[SchemeHandler webView:stopTask:]):
(TEST):

Location:
trunk
Files:
1 added
13 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r215382 r215384  
     12017-04-14  Brady Eidson  <beidson@apple.com>
     2
     3        Fix basic WKURLSchemeHandler bugs.
     4        <rdar://problem/30647559> and https://bugs.webkit.org/show_bug.cgi?id=170862
     5
     6        Reviewed by Andy Estes.
     7
     8        Covered by new API tests.
     9
     10        * loader/SubresourceLoader.cpp:
     11        (WebCore::SubresourceLoader::didReceiveDataOrBuffer):
     12
    1132017-04-14  Jiewen Tan  <jiewen_tan@apple.com>
    214
  • trunk/Source/WebCore/loader/SubresourceLoader.cpp

    r214266 r215384  
    391391void SubresourceLoader::didReceiveDataOrBuffer(const char* data, int length, RefPtr<SharedBuffer>&& buffer, long long encodedDataLength, DataPayloadType dataPayloadType)
    392392{
     393    ASSERT(m_resource);
     394
    393395    if (m_resource->response().httpStatusCode() >= 400 && !m_resource->shouldIgnoreHTTPStatusCodeErrors())
    394396        return;
  • trunk/Source/WebKit2/ChangeLog

    r215362 r215384  
     12017-04-14  Brady Eidson  <beidson@apple.com>
     2
     3        Fix basic WKURLSchemeHandler bugs.
     4        <rdar://problem/30647559> and https://bugs.webkit.org/show_bug.cgi?id=170862
     5
     6        Reviewed by Andy Estes.
     7
     8        * UIProcess/Cocoa/NavigationState.mm:
     9        (WebKit::NavigationState::NavigationClient::decidePolicyForNavigationAction):
     10
     11        * UIProcess/WebURLSchemeHandlerTask.cpp:
     12        (WebKit::WebURLSchemeHandlerTask::didReceiveResponse):
     13
     14        * WebProcess/Network/WebLoaderStrategy.cpp:
     15        (WebKit::WebLoaderStrategy::addURLSchemeHandlerTaskProxy):
     16        (WebKit::WebLoaderStrategy::removeURLSchemeHandlerTaskProxy):
     17        (WebKit::WebLoaderStrategy::remove):
     18        * WebProcess/Network/WebLoaderStrategy.h:
     19
     20        * WebProcess/WebPage/WebURLSchemeHandlerProxy.cpp:
     21        (WebKit::WebURLSchemeHandlerProxy::startNewTask):
     22        (WebKit::WebURLSchemeHandlerProxy::taskDidComplete):
     23        (WebKit::WebURLSchemeHandlerProxy::taskDidStopLoading):
     24        * WebProcess/WebPage/WebURLSchemeHandlerProxy.h:
     25
     26        * WebProcess/WebPage/WebURLSchemeHandlerTaskProxy.cpp:
     27        (WebKit::WebURLSchemeHandlerTaskProxy::WebURLSchemeHandlerTaskProxy):
     28        (WebKit::WebURLSchemeHandlerTaskProxy::stopLoading):
     29        (WebKit::WebURLSchemeHandlerTaskProxy::didReceiveResponse):
     30        (WebKit::WebURLSchemeHandlerTaskProxy::didReceiveData):
     31        (WebKit::WebURLSchemeHandlerTaskProxy::didComplete):
     32        (WebKit::WebURLSchemeHandlerTaskProxy::hasLoader):
     33        * WebProcess/WebPage/WebURLSchemeHandlerTaskProxy.h:
     34        (WebKit::WebURLSchemeHandlerTaskProxy::identifier):
     35
    1362017-04-14  Jer Noble  <jer.noble@apple.com>
    237
  • trunk/Source/WebKit2/UIProcess/Cocoa/NavigationState.mm

    r215173 r215384  
    312312        RefPtr<WebFramePolicyListenerProxy> localListener = WTFMove(listener);
    313313
    314         tryAppLink(WTFMove(localNavigationAction), mainFrameURLString, [localListener, localNavigationAction = RefPtr<API::NavigationAction>(&navigationAction)] (bool followedLinkToApp) {
     314        tryAppLink(WTFMove(localNavigationAction), mainFrameURLString, [webPage = RefPtr<WebPageProxy>(&webPageProxy), localListener, localNavigationAction = RefPtr<API::NavigationAction>(&navigationAction)] (bool followedLinkToApp) {
    315315            if (followedLinkToApp) {
    316316                localListener->ignore();
    … …  
    324324
    325325            RetainPtr<NSURLRequest> nsURLRequest = adoptNS(wrapper(API::URLRequest::create(localNavigationAction->request()).leakRef()));
    326             if ([NSURLConnection canHandleRequest:nsURLRequest.get()]) {
     326            if ([NSURLConnection canHandleRequest:nsURLRequest.get()] || webPage->urlSchemeHandlerForScheme([nsURLRequest URL].scheme)) {
    327327                if (localNavigationAction->shouldPerformDownload())
    328328                    localListener->download();
  • trunk/Source/WebKit2/UIProcess/WebURLSchemeHandlerTask.cpp

    r213686 r215384  
    6161
    6262    m_responseSent = true;
     63
     64    response.includeCertificateInfo();
    6365    m_page->send(Messages::WebPage::URLSchemeHandlerTaskDidReceiveResponse(m_urlSchemeHandler->identifier(), m_identifier, response));
    6466    return WebURLSchemeHandlerTask::ExceptionType::None;
  • trunk/Source/WebKit2/WebProcess/Network/WebLoaderStrategy.cpp

    r215160 r215384  
    265265}
    266266
     267void WebLoaderStrategy::addURLSchemeHandlerTaskProxy(WebURLSchemeHandlerTaskProxy& task)
     268{
     269    auto result = m_urlSchemeHandlerTasks.add(task.identifier(), &task);
     270    ASSERT_UNUSED(result, result.isNewEntry);
     271}
     272
     273void WebLoaderStrategy::removeURLSchemeHandlerTaskProxy(WebURLSchemeHandlerTaskProxy& task)
     274{
     275    m_urlSchemeHandlerTasks.remove(task.identifier());
     276}
     277
    267278void WebLoaderStrategy::remove(ResourceLoader* resourceLoader)
    268279{
    … …  
    270281    LOG(NetworkScheduling, "(WebProcess) WebLoaderStrategy::remove, url '%s'", resourceLoader->url().string().utf8().data());
    271282
     283    if (auto task = m_urlSchemeHandlerTasks.take(resourceLoader->identifier())) {
     284        ASSERT(!m_internallyFailedResourceLoaders.contains(resourceLoader));
     285        task->stopLoading();
     286        return;
     287    }
     288
    272289    if (m_internallyFailedResourceLoaders.contains(resourceLoader)) {
    273290        m_internallyFailedResourceLoaders.remove(resourceLoader);
    274         return;
    275     }
    276 
    277     if (auto task = m_urlSchemeHandlerTasks.take(resourceLoader->identifier())) {
    278         task->stopLoading();
    279291        return;
    280292    }
  • trunk/Source/WebKit2/WebProcess/Network/WebLoaderStrategy.h

    r215255 r215384  
    6767    void networkProcessCrashed();
    6868
     69    void addURLSchemeHandlerTaskProxy(WebURLSchemeHandlerTaskProxy&);
     70    void removeURLSchemeHandlerTaskProxy(WebURLSchemeHandlerTaskProxy&);
     71
    6972private:
    7073    void scheduleLoad(WebCore::ResourceLoader&, WebCore::CachedResource*, bool shouldClearReferrerOnHTTPSToHTTPRedirect);
    … …  
    7780   
    7881    HashMap<unsigned long, RefPtr<WebResourceLoader>> m_webResourceLoaders;
    79     HashMap<unsigned long, std::unique_ptr<WebURLSchemeHandlerTaskProxy>> m_urlSchemeHandlerTasks;
     82    HashMap<unsigned long, WebURLSchemeHandlerTaskProxy*> m_urlSchemeHandlerTasks;
    8083};
    8184
  • trunk/Source/WebKit2/WebProcess/WebPage/WebURLSchemeHandlerProxy.cpp

    r213686 r215384  
    2828
    2929#include "WebErrors.h"
     30#include "WebLoaderStrategy.h"
     31#include "WebProcess.h"
    3032#include <WebCore/ResourceLoader.h>
    3133
    … …  
    5052    ASSERT(result.isNewEntry);
    5153
     54    WebProcess::singleton().webLoaderStrategy().addURLSchemeHandlerTaskProxy(*result.iterator->value);
    5255    result.iterator->value->startLoading();
    5356}
    … …  
    7881        return;
    7982
     83    WebProcess::singleton().webLoaderStrategy().removeURLSchemeHandlerTaskProxy(*task);
    8084    task->didComplete(error);
    8185}
    8286
     87void WebURLSchemeHandlerProxy::taskDidStopLoading(WebURLSchemeHandlerTaskProxy& task)
     88{
     89    ASSERT(m_tasks.get(task.identifier()) == &task);
     90    m_tasks.remove(task.identifier());
     91}
     92
    8393} // namespace WebKit
  • trunk/Source/WebKit2/WebProcess/WebPage/WebURLSchemeHandlerProxy.h

    r213686 r215384  
    5353    void taskDidReceiveData(uint64_t taskIdentifier, size_t, const uint8_t* data);
    5454    void taskDidComplete(uint64_t taskIdentifier, const WebCore::ResourceError&);
     55    void taskDidStopLoading(WebURLSchemeHandlerTaskProxy&);
    5556
    5657private:
  • trunk/Source/WebKit2/WebProcess/WebPage/WebURLSchemeHandlerTaskProxy.cpp

    r213686 r215384  
    4343    , m_coreLoader(&loader)
    4444    , m_request(loader.request())
     45    , m_identifier(loader.identifier())
    4546{
    4647}
    … …  
    5455void WebURLSchemeHandlerTaskProxy::stopLoading()
    5556{
    56     if (!m_coreLoader)
    57         return;
    58 
     57    ASSERT(m_coreLoader);
    5958    m_urlSchemeHandler.page().send(Messages::WebPageProxy::StopURLSchemeHandlerTask(m_urlSchemeHandler.identifier(), m_coreLoader->identifier()));
    6059    m_coreLoader = nullptr;
     60
     61    // This line will result in this being deleted.
     62    m_urlSchemeHandler.taskDidStopLoading(*this);
    6163}
    6264
    6365void WebURLSchemeHandlerTaskProxy::didReceiveResponse(const ResourceResponse& response)
    6466{
    65     if (!m_coreLoader)
     67    if (!hasLoader())
    6668        return;
    6769
    … …  
    7173void WebURLSchemeHandlerTaskProxy::didReceiveData(size_t size, const uint8_t* data)
    7274{
    73     if (!m_coreLoader)
     75    if (!hasLoader())
    7476        return;
    7577
    … …  
    7981void WebURLSchemeHandlerTaskProxy::didComplete(const ResourceError& error)
    8082{
    81     if (!m_coreLoader)
     83    if (!hasLoader())
    8284        return;
    8385
    … …  
    9092}
    9193
     94bool WebURLSchemeHandlerTaskProxy::hasLoader()
     95{
     96    if (m_coreLoader && m_coreLoader->reachedTerminalState())
     97        m_coreLoader = nullptr;
     98
     99    return m_coreLoader;
     100}
     101
    92102} // namespace WebKit
  • trunk/Source/WebKit2/WebProcess/WebPage/WebURLSchemeHandlerTaskProxy.h

    r213686 r215384  
    5252    void didComplete(const WebCore::ResourceError&);
    5353
     54    unsigned long identifier() const { return m_identifier; }
     55
    5456private:
     57    bool hasLoader();
     58
    5559    WebURLSchemeHandlerProxy& m_urlSchemeHandler;
    5660    RefPtr<WebCore::ResourceLoader> m_coreLoader;
    5761    WebCore::ResourceRequest m_request;
    58 
     62    unsigned long m_identifier;
    5963};
    6064
  • trunk/Tools/ChangeLog

    r215381 r215384  
     12017-04-14  Brady Eidson  <beidson@apple.com>
     2
     3        Fix basic WKURLSchemeHandler bugs.
     4        <rdar://problem/30647559> and https://bugs.webkit.org/show_bug.cgi?id=170862
     5
     6        Reviewed by Andy Estes.
     7
     8        * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
     9        * TestWebKitAPI/Tests/WebKit2Cocoa/WKURLSchemeHandler-1.mm: Added.
     10        (-[SchemeHandler initWithData:mimeType:]):
     11        (-[SchemeHandler dealloc]):
     12        (-[SchemeHandler webView:startTask:]):
     13        (-[SchemeHandler webView:stopTask:]):
     14        (TEST):
     15
    1162017-04-14  Bill Ming  <mbbill@gmail.com>
    217
  • trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj

    r215355 r215384  
    155155                51BCEE4E1C84F53B0042C82E /* IndexedDBMultiProcess-1.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 51BCEE4C1C84F52C0042C82E /* IndexedDBMultiProcess-1.html */; };
    156156                51BCEE4F1C84F53B0042C82E /* IndexedDBMultiProcess-2.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 51BCEE4D1C84F52C0042C82E /* IndexedDBMultiProcess-2.html */; };
     157                51C683DE1EA134E800650183 /* WKURLSchemeHandler-1.mm in Sources */ = {isa = PBXBuildFile; fileRef = 51C683DD1EA134DB00650183 /* WKURLSchemeHandler-1.mm */; };
    157158                51CD1C6C1B38CE4300142CA5 /* ModalAlerts.mm in Sources */ = {isa = PBXBuildFile; fileRef = 51CD1C6A1B38CE3600142CA5 /* ModalAlerts.mm */; };
    158159                51CD1C721B38D48400142CA5 /* modal-alerts-in-new-about-blank-window.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 51CD1C711B38D48400142CA5 /* modal-alerts-in-new-about-blank-window.html */; };
    … …  
    10771078                51BCEE4C1C84F52C0042C82E /* IndexedDBMultiProcess-1.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = "IndexedDBMultiProcess-1.html"; sourceTree = "<group>"; };
    10781079                51BCEE4D1C84F52C0042C82E /* IndexedDBMultiProcess-2.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = "IndexedDBMultiProcess-2.html"; sourceTree = "<group>"; };
     1080                51C683DD1EA134DB00650183 /* WKURLSchemeHandler-1.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "WKURLSchemeHandler-1.mm"; sourceTree = "<group>"; };
    10791081                51CB4AD71B3A079C00C1B1C6 /* ModalAlertsSPI.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ModalAlertsSPI.cpp; sourceTree = "<group>"; };
    10801082                51CD1C6A1B38CE3600142CA5 /* ModalAlerts.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ModalAlerts.mm; sourceTree = "<group>"; };
    … …  
    17141716                                2D00065D1C1F58940088E6A7 /* WKPDFViewResizeCrash.mm */,
    17151717                                5E4B1D2C1D404C6100053621 /* WKScrollViewDelegateCrash.mm */,
     1718                                51C683DD1EA134DB00650183 /* WKURLSchemeHandler-1.mm */,
    17161719                                5CE354D81E70D9C300BEFE3B /* WKUserContentExtensionStore.mm */,
    17171720                                2EFF06D61D8AF34A0004BB30 /* WKWebViewCandidateTests.mm */,
    … …  
    29212924                                5769C50B1D9B0002000847FB /* SerializedCryptoKeyWrap.mm in Sources */,
    29222925                                7CCE7ECB1A411A7E00447C4C /* SetAndUpdateCacheModel.mm in Sources */,
     2926                                51C683DE1EA134E800650183 /* WKURLSchemeHandler-1.mm in Sources */,
    29232927                                7CCE7ECC1A411A7E00447C4C /* SetDocumentURI.mm in Sources */,
    29242928                                7C83E0521D0A641800FEBCF3 /* SharedBuffer.cpp in Sources */,
Note: See TracChangeset for help on using the changeset viewer.