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

Changeset 259392 in webkit


Ignore:
Timestamp:
Apr 2, 2020, 10:51:06 AM (6 years ago)
Author:
commit-queue@webkit.org
Message:

Add SPI to restrict loading to main resources or non-network loads
https://bugs.webkit.org/show_bug.cgi?id=209893

Patch by Alex Christensen <achristensen@webkit.org> on 2020-04-02
Reviewed by Tim Horton.

Source/WebCore:

This will allow two projects that currently use the injected bundle SPI to use these instead.
Covered by API tests.

  • Modules/websockets/ThreadableWebSocketChannel.cpp:

(WebCore::ThreadableWebSocketChannel::validateURL):

  • loader/ResourceLoadNotifier.cpp:

(WebCore::ResourceLoadNotifier::assignIdentifierToInitialRequest):
(WebCore::ResourceLoadNotifier::dispatchWillSendRequest):

  • loader/ResourceLoadNotifier.h:
  • page/Page.cpp:

(WebCore::m_loadsFromNetwork):
(WebCore::m_deviceOrientationUpdateProvider): Deleted.

  • page/Page.h:

(WebCore::Page::loadsSubresources const):
(WebCore::Page::loadsFromNetwork const):

  • page/PageConfiguration.h:

Source/WebKit:

  • Shared/WebPageCreationParameters.cpp:

(WebKit::WebPageCreationParameters::encode const):
(WebKit::WebPageCreationParameters::decode):

  • Shared/WebPageCreationParameters.h:
  • UIProcess/API/APIPageConfiguration.cpp:

(API::PageConfiguration::copy const):

  • UIProcess/API/APIPageConfiguration.h:

(API::PageConfiguration::loadsSubresources const):
(API::PageConfiguration::setLoadsSubresources):
(API::PageConfiguration::loadsFromNetwork const):
(API::PageConfiguration::setLoadsFromNetwork):

  • UIProcess/API/Cocoa/WKWebViewConfiguration.mm:

(-[WKWebViewConfiguration _setLoadsFromNetwork:]):
(-[WKWebViewConfiguration _loadsFromNetwork]):
(-[WKWebViewConfiguration _setLoadsSubresources:]):
(-[WKWebViewConfiguration _loadsSubresources]):

  • UIProcess/API/Cocoa/WKWebViewConfigurationPrivate.h:
  • UIProcess/WebPageProxy.cpp:
  • WebProcess/WebPage/WebPage.cpp:

(WebKit::m_processDisplayName):

Tools:

  • TestWebKitAPI/Tests/WebKitCocoa/WKURLSchemeHandler-1.mm:
  • TestWebKitAPI/cocoa/HTTPServer.h:

(TestWebKitAPI::HTTPServer::totalRequests const):

  • TestWebKitAPI/cocoa/HTTPServer.mm:

(TestWebKitAPI::HTTPServer::respondToRequests):

Location:
trunk
Files:
20 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r259388 r259392  
     12020-04-02  Alex Christensen  <achristensen@webkit.org>
     2
     3        Add SPI to restrict loading to main resources or non-network loads
     4        https://bugs.webkit.org/show_bug.cgi?id=209893
     5
     6        Reviewed by Tim Horton.
     7
     8        This will allow two projects that currently use the injected bundle SPI to use these instead.
     9        Covered by API tests.
     10
     11        * Modules/websockets/ThreadableWebSocketChannel.cpp:
     12        (WebCore::ThreadableWebSocketChannel::validateURL):
     13        * loader/ResourceLoadNotifier.cpp:
     14        (WebCore::ResourceLoadNotifier::assignIdentifierToInitialRequest):
     15        (WebCore::ResourceLoadNotifier::dispatchWillSendRequest):
     16        * loader/ResourceLoadNotifier.h:
     17        * page/Page.cpp:
     18        (WebCore::m_loadsFromNetwork):
     19        (WebCore::m_deviceOrientationUpdateProvider): Deleted.
     20        * page/Page.h:
     21        (WebCore::Page::loadsSubresources const):
     22        (WebCore::Page::loadsFromNetwork const):
     23        * page/PageConfiguration.h:
     24
    1252020-04-02  Eric Carlson  <eric.carlson@apple.com>
    226
  • trunk/Source/WebCore/Modules/websockets/ThreadableWebSocketChannel.cpp

    r253965 r259392  
    8383{
    8484    ValidatedURL validatedURL { requestedURL, true };
     85    if (auto* page = document.page()) {
     86        if (!page->loadsFromNetwork())
     87            return { };
    8588#if ENABLE(CONTENT_EXTENSIONS)
    86     if (auto* page = document.page()) {
    8789        if (auto* documentLoader = document.loader()) {
    8890            auto results = page->userContentProvider().processContentRuleListsForLoad(validatedURL.url, ContentExtensions::ResourceType::Raw, *documentLoader);
     
    9597            validatedURL.areCookiesAllowed = !results.summary.blockedCookies;
    9698        }
     99#else
     100        UNUSED_PARAM(document);
     101#endif
    97102    }
    98 #else
    99     UNUSED_PARAM(document);
    100 #endif
    101103    return validatedURL;
    102104}
  • trunk/Source/WebCore/loader/ResourceLoadNotifier.cpp

    r251041 r259392  
    110110void ResourceLoadNotifier::assignIdentifierToInitialRequest(unsigned long identifier, DocumentLoader* loader, const ResourceRequest& request)
    111111{
     112    bool pageIsProvisionallyLoading = false;
     113    if (auto* frameLoader = loader ? loader->frameLoader() : nullptr)
     114        pageIsProvisionallyLoading = frameLoader->provisionalDocumentLoader() == loader;
     115
     116    if (pageIsProvisionallyLoading)
     117        m_initialRequestIdentifier = identifier;
     118
    112119    m_frame.loader().client().assignIdentifierToInitialRequest(identifier, loader, request);
    113120}
     
    127134        m_frame.loader().documentLoader()->didTellClientAboutLoad(request.url());
    128135
     136    if (auto* page = m_frame.page()) {
     137        if (!page->loadsSubresources()) {
     138            if (!m_frame.isMainFrame() || (m_initialRequestIdentifier && *m_initialRequestIdentifier != identifier))
     139                request = { };
     140        } else if (!page->loadsFromNetwork() && request.url().protocolIsInHTTPFamily())
     141            request = { };
     142    }
     143   
    129144    // Notifying the FrameLoaderClient may cause the frame to be destroyed.
    130145    Ref<Frame> protect(m_frame);
  • trunk/Source/WebCore/loader/ResourceLoadNotifier.h

    r213917 r259392  
    6868private:
    6969    Frame& m_frame;
     70    Optional<unsigned long> m_initialRequestIdentifier;
    7071};
    7172
  • trunk/Source/WebCore/page/Page.cpp

    r259347 r259392  
    291291    , m_deviceOrientationUpdateProvider(WTFMove(pageConfiguration.deviceOrientationUpdateProvider))
    292292#endif
     293    , m_loadsSubresources(pageConfiguration.loadsSubresources)
     294    , m_loadsFromNetwork(pageConfiguration.loadsFromNetwork)
    293295{
    294296    updateTimerThrottlingState();
  • trunk/Source/WebCore/page/Page.h

    r259347 r259392  
    703703    bool isUtilityPage() const { return m_isUtilityPage; }
    704704
     705    bool loadsSubresources() const { return m_loadsSubresources; }
     706    bool loadsFromNetwork() const { return m_loadsFromNetwork; }
     707
    705708    bool isLowPowerModeEnabled() const;
    706709    WEBCORE_EXPORT void setLowPowerModeEnabledOverrideForTesting(Optional<bool>);
     
    10111014    Vector<UserStyleSheet> m_userStyleSheetsPendingInjection;
    10121015    bool m_shouldFireResizeEvents { true };
     1016    bool m_loadsSubresources { true };
     1017    bool m_loadsFromNetwork { true };
    10131018};
    10141019
  • trunk/Source/WebCore/page/PageConfiguration.h

    r258628 r259392  
    128128    Vector<String> corsDisablingPatterns;
    129129    UniqueRef<MediaRecorderProvider> mediaRecorderProvider;
     130    bool loadsSubresources { true };
     131    bool loadsFromNetwork { true };
    130132};
    131133
  • trunk/Source/WebKit/ChangeLog

    r259384 r259392  
     12020-04-02  Alex Christensen  <achristensen@webkit.org>
     2
     3        Add SPI to restrict loading to main resources or non-network loads
     4        https://bugs.webkit.org/show_bug.cgi?id=209893
     5
     6        Reviewed by Tim Horton.
     7
     8        * Shared/WebPageCreationParameters.cpp:
     9        (WebKit::WebPageCreationParameters::encode const):
     10        (WebKit::WebPageCreationParameters::decode):
     11        * Shared/WebPageCreationParameters.h:
     12        * UIProcess/API/APIPageConfiguration.cpp:
     13        (API::PageConfiguration::copy const):
     14        * UIProcess/API/APIPageConfiguration.h:
     15        (API::PageConfiguration::loadsSubresources const):
     16        (API::PageConfiguration::setLoadsSubresources):
     17        (API::PageConfiguration::loadsFromNetwork const):
     18        (API::PageConfiguration::setLoadsFromNetwork):
     19        * UIProcess/API/Cocoa/WKWebViewConfiguration.mm:
     20        (-[WKWebViewConfiguration _setLoadsFromNetwork:]):
     21        (-[WKWebViewConfiguration _loadsFromNetwork]):
     22        (-[WKWebViewConfiguration _setLoadsSubresources:]):
     23        (-[WKWebViewConfiguration _loadsSubresources]):
     24        * UIProcess/API/Cocoa/WKWebViewConfigurationPrivate.h:
     25        * UIProcess/WebPageProxy.cpp:
     26        * WebProcess/WebPage/WebPage.cpp:
     27        (WebKit::m_processDisplayName):
     28
    1292020-04-02  youenn fablet  <youenn@apple.com>
    230
  • trunk/Source/WebKit/Shared/WebPageCreationParameters.cpp

    r259324 r259392  
    134134    encoder << overriddenMediaType;
    135135    encoder << corsDisablingPatterns;
     136    encoder << loadsSubresources;
     137    encoder << loadsFromNetwork;
    136138    encoder << crossOriginAccessControlCheckEnabled;
    137139    encoder << processDisplayName;
     
    417419    parameters.corsDisablingPatterns = WTFMove(*corsDisablingPatterns);
    418420
     421    Optional<bool> loadsSubresources;
     422    decoder >> loadsSubresources;
     423    if (!loadsSubresources)
     424        return WTF::nullopt;
     425    parameters.loadsSubresources = *loadsSubresources;
     426
     427    Optional<bool> loadsFromNetwork;
     428    decoder >> loadsFromNetwork;
     429    if (!loadsFromNetwork)
     430        return WTF::nullopt;
     431    parameters.loadsFromNetwork = *loadsFromNetwork;
     432
    419433    Optional<bool> crossOriginAccessControlCheckEnabled;
    420434    decoder >> crossOriginAccessControlCheckEnabled;
  • trunk/Source/WebKit/Shared/WebPageCreationParameters.h

    r259324 r259392  
    203203    String overriddenMediaType;
    204204    Vector<String> corsDisablingPatterns;
     205    bool loadsSubresources { true };
     206    bool loadsFromNetwork { true };
     207
    205208    bool crossOriginAccessControlCheckEnabled { true };
    206209    String processDisplayName;
  • trunk/Source/WebKit/UIProcess/API/APIPageConfiguration.cpp

    r258296 r259392  
    9696    copy->m_processDisplayName = this->m_processDisplayName;
    9797    copy->m_ignoresAppBoundDomains = this->m_ignoresAppBoundDomains;
     98    copy->m_loadsSubresources = this->m_loadsSubresources;
     99    copy->m_loadsFromNetwork = this->m_loadsFromNetwork;
    98100
    99101    return copy;
  • trunk/Source/WebKit/UIProcess/API/APIPageConfiguration.h

    r259243 r259392  
    150150    bool ignoresAppBoundDomains() const { return m_ignoresAppBoundDomains; }
    151151    void setIgnoresAppBoundDomains(bool shouldIgnore) { m_ignoresAppBoundDomains = shouldIgnore; }
    152    
     152
     153    bool loadsSubresources() const { return m_loadsSubresources; }
     154    void setLoadsSubresources(bool loads) { m_loadsSubresources = loads; }
     155
     156    bool loadsFromNetwork() const { return m_loadsFromNetwork; }
     157    void setLoadsFromNetwork(bool loads) { m_loadsFromNetwork = loads; }
     158
    153159private:
    154160
     
    192198    WebKit::WebViewCategory m_webViewCategory { WebKit::WebViewCategory::AppBoundDomain };
    193199    bool m_ignoresAppBoundDomains { false };
     200    bool m_loadsSubresources { true };
     201    bool m_loadsFromNetwork { true };
    194202};
    195203
  • trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewConfiguration.mm

    r258296 r259392  
    914914}
    915915
     916- (void)_setLoadsFromNetwork:(BOOL)loads
     917{
     918    _pageConfiguration->setLoadsFromNetwork(loads);
     919}
     920
     921- (BOOL)_loadsFromNetwork
     922{
     923    return _pageConfiguration->loadsFromNetwork();
     924}
     925
     926- (void)_setLoadsSubresources:(BOOL)loads
     927{
     928    _pageConfiguration->setLoadsSubresources(loads);
     929}
     930
     931- (BOOL)_loadsSubresources
     932{
     933    return _pageConfiguration->loadsSubresources();
     934}
     935
    916936- (void)_setCrossOriginAccessControlCheckEnabled:(BOOL)enabled
    917937{
  • trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewConfigurationPrivate.h

    r259351 r259392  
    8787@property (nonatomic, setter=_setCrossOriginAccessControlCheckEnabled:) BOOL _crossOriginAccessControlCheckEnabled WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA));
    8888
     89@property (nonatomic, setter=_setLoadsFromNetwork:) BOOL _loadsFromNetwork WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA));
     90@property (nonatomic, setter=_setLoadsSubresources:) BOOL _loadsSubresources WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA));
     91
    8992#if TARGET_OS_IPHONE
    9093@property (nonatomic, setter=_setClientNavigationsRunAtForegroundPriority:) BOOL _clientNavigationsRunAtForegroundPriority WK_API_AVAILABLE(ios(WK_IOS_TBA));
  • trunk/Source/WebKit/UIProcess/WebPageProxy.cpp

    r259324 r259392  
    77827782    parameters.overriddenMediaType = m_overriddenMediaType;
    77837783    parameters.corsDisablingPatterns = m_configuration->corsDisablingPatterns();
     7784    parameters.loadsFromNetwork = m_configuration->loadsFromNetwork();
     7785    parameters.loadsSubresources = m_configuration->loadsSubresources();
    77847786    parameters.crossOriginAccessControlCheckEnabled = m_configuration->crossOriginAccessControlCheckEnabled();
    77857787    parameters.hasResourceLoadClient = !!m_resourceLoadClient;
  • trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp

    r259324 r259392  
    530530
    531531    pageConfiguration.corsDisablingPatterns = WTFMove(parameters.corsDisablingPatterns);
     532    pageConfiguration.loadsSubresources = parameters.loadsSubresources;
     533    pageConfiguration.loadsFromNetwork = parameters.loadsFromNetwork;
     534
    532535    if (!parameters.crossOriginAccessControlCheckEnabled)
    533536        CrossOriginAccessControlCheckDisabler::singleton().setCrossOriginAccessControlCheckEnabled(false);
  • trunk/Tools/ChangeLog

    r259386 r259392  
     12020-04-02  Alex Christensen  <achristensen@webkit.org>
     2
     3        Add SPI to restrict loading to main resources or non-network loads
     4        https://bugs.webkit.org/show_bug.cgi?id=209893
     5
     6        Reviewed by Tim Horton.
     7
     8        * TestWebKitAPI/Tests/WebKitCocoa/WKURLSchemeHandler-1.mm:
     9        * TestWebKitAPI/cocoa/HTTPServer.h:
     10        (TestWebKitAPI::HTTPServer::totalRequests const):
     11        * TestWebKitAPI/cocoa/HTTPServer.mm:
     12        (TestWebKitAPI::HTTPServer::respondToRequests):
     13
    1142020-04-02  Kate Cheney  <katherine_cheney@apple.com>
    215
  • trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WKURLSchemeHandler-1.mm

    r258798 r259392  
    10051005}
    10061006
     1007TEST(URLSchemeHandler, LoadsFromNetwork)
     1008{
     1009    TestWebKitAPI::HTTPServer server({
     1010        { "/", { {{ "Access-Control-Allow-Origin", "*" }}, "test content" } }
     1011    });
     1012
     1013    bool loadSuccess = false;
     1014    bool loadFail = false;
     1015    bool done = false;
     1016
     1017    auto handler = adoptNS([TestURLSchemeHandler new]);
     1018
     1019    WKWebViewConfiguration *configuration = [[[WKWebViewConfiguration alloc] init] autorelease];
     1020    [configuration setURLSchemeHandler:handler.get() forURLScheme:@"test"];
     1021
     1022    [handler setStartURLSchemeTaskHandler:[&](WKWebView *, id<WKURLSchemeTask> task) {
     1023        if ([task.request.URL.path isEqualToString:@"/main.html"]) {
     1024            NSData *data = [[NSString stringWithFormat:@"<script>"
     1025                "fetch('http://127.0.0.1:%d/').then(()=>{"
     1026                    "fetch('/loadSuccess')"
     1027                "}).catch(()=>{"
     1028                    "var ws = new WebSocket('ws://127.0.0.1:%d');"
     1029                    "ws.onerror = function() { fetch('/loadFail') };"
     1030                "})"
     1031                "</script>", server.port(), server.port()] dataUsingEncoding:NSUTF8StringEncoding];
     1032            [task didReceiveResponse:[[[NSURLResponse alloc] initWithURL:task.request.URL MIMEType:@"text/html" expectedContentLength:data.length textEncodingName:nil] autorelease]];
     1033            [task didReceiveData:data];
     1034            [task didFinish];
     1035        } else if ([task.request.URL.path isEqualToString:@"/loadSuccess"]) {
     1036            loadSuccess = true;
     1037            done = true;
     1038        } else if ([task.request.URL.path isEqualToString:@"/loadFail"]) {
     1039            loadFail = true;
     1040            done = true;
     1041        } else
     1042            ASSERT_NOT_REACHED();
     1043    }];
     1044   
     1045    {
     1046        auto webView = adoptNS([[WKWebView alloc] initWithFrame:CGRectMake(0, 0, 800, 600) configuration:configuration]);
     1047        [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"test://host1/main.html"]]];
     1048        TestWebKitAPI::Util::run(&done);
     1049    }
     1050    EXPECT_TRUE(loadSuccess);
     1051    EXPECT_FALSE(loadFail);
     1052    EXPECT_EQ(server.totalRequests(), 1u);
     1053   
     1054    loadSuccess = false;
     1055    loadFail = false;
     1056    done = false;
     1057
     1058    configuration._loadsFromNetwork = NO;
     1059    {
     1060        auto webView = adoptNS([[WKWebView alloc] initWithFrame:CGRectMake(0, 0, 800, 600) configuration:configuration]);
     1061        [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"test://host1/main.html"]]];
     1062        TestWebKitAPI::Util::run(&done);
     1063    }
     1064    EXPECT_FALSE(loadSuccess);
     1065    EXPECT_TRUE(loadFail);
     1066    EXPECT_EQ(server.totalRequests(), 1u);
     1067}
     1068
     1069TEST(URLSchemeHandler, LoadsSubresources)
     1070{
     1071    bool loadedImage = false;
     1072    bool loadedIFrame = false;
     1073
     1074    auto handler = adoptNS([TestURLSchemeHandler new]);
     1075
     1076    WKWebViewConfiguration *configuration = [[[WKWebViewConfiguration alloc] init] autorelease];
     1077    [configuration setURLSchemeHandler:handler.get() forURLScheme:@"test"];
     1078
     1079    [handler setStartURLSchemeTaskHandler:[&](WKWebView *, id<WKURLSchemeTask> task) {
     1080        NSString *response = nil;
     1081        if ([task.request.URL.path isEqualToString:@"/main.html"])
     1082            response = @"<img src='/imgsrc'></img><iframe src='/iframesrc'></iframe>";
     1083        else if ([task.request.URL.path isEqualToString:@"/imgsrc"]) {
     1084            response = @"image content";
     1085            loadedImage = true;
     1086        } else if ([task.request.URL.path isEqualToString:@"/iframesrc"]) {
     1087            response = @"iframe content";
     1088            loadedIFrame = true;
     1089        } else
     1090            ASSERT_NOT_REACHED();
     1091        [task didReceiveResponse:[[[NSURLResponse alloc] initWithURL:task.request.URL MIMEType:@"text/html" expectedContentLength:response.length textEncodingName:nil] autorelease]];
     1092        [task didReceiveData:[response dataUsingEncoding:NSUTF8StringEncoding]];
     1093        [task didFinish];
     1094    }];
     1095   
     1096    {
     1097        auto webView = adoptNS([[WKWebView alloc] initWithFrame:CGRectMake(0, 0, 800, 600) configuration:configuration]);
     1098        [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"test://host1/main.html"]]];
     1099        TestWebKitAPI::Util::run(&loadedImage);
     1100        TestWebKitAPI::Util::run(&loadedIFrame);
     1101    }
     1102   
     1103    loadedImage = false;
     1104    loadedIFrame = false;
     1105
     1106    configuration._loadsSubresources = NO;
     1107    {
     1108        auto webView = adoptNS([[WKWebView alloc] initWithFrame:CGRectMake(0, 0, 800, 600) configuration:configuration]);
     1109        auto delegate = adoptNS([TestNavigationDelegate new]);
     1110        webView.get().navigationDelegate = delegate.get();
     1111        [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"test://host1/main.html"]]];
     1112        [delegate waitForDidFinishNavigation];
     1113        TestWebKitAPI::Util::spinRunLoop(100);
     1114        EXPECT_FALSE(loadedIFrame);
     1115        EXPECT_FALSE(loadedImage);
     1116    }
     1117}
     1118
    10071119#endif // HAVE(NETWORK_FRAMEWORK)
    10081120
  • trunk/Tools/TestWebKitAPI/cocoa/HTTPServer.h

    r255863 r259392  
    4444    uint16_t port() const;
    4545    NSURLRequest *request() const;
     46    size_t totalRequests() const { return m_totalRequests; }
    4647   
    4748private:
     
    5152    const Protocol m_protocol;
    5253    const HashMap<String, HTTPResponse> m_requestResponseMap;
     54    size_t m_totalRequests { 0 };
    5355};
    5456
  • trunk/Tools/TestWebKitAPI/cocoa/HTTPServer.mm

    r258004 r259392  
    101101        request.append('\0');
    102102
     103        m_totalRequests++;
     104
    103105        const char* getPathPrefix = "GET ";
    104106        const char* postPathPrefix = "POST ";
Note: See TracChangeset for help on using the changeset viewer.