Changeset 245481 in webkit


Ignore:
Timestamp:
May 17, 2019 2:50:02 PM (5 years ago)
Author:
achristensen@apple.com
Message:

Add SPI to set a list of hosts to which to send custom header fields cross-origin
https://bugs.webkit.org/show_bug.cgi?id=197397

Reviewed by Geoff Garen.

Source/WebCore:

In r223001 I added the ability to send custom headers, but with a restriction that they will not be sent except to the origin of the main document.
We need the ability to specify what origins to send these headers to even if they are not first party requests.
We get this information in a list of strings which are the hosts to send the headers to. Some of the strings have an asterisk at the beginning,
indicating that the headers are to be sent to all subdomains.

I repurposed some ObjC SPI that was never adopted, but I keep testing the C API that was to verify no regression.
I also added some new API tests for the new behavior.

  • Sources.txt:
  • WebCore.xcodeproj/project.pbxproj:
  • loader/CustomHeaderFields.cpp: Added.

(WebCore::CustomHeaderFields::thirdPartyDomainsMatch const):

  • loader/CustomHeaderFields.h: Added.

(WebCore::CustomHeaderFields::encode const):
(WebCore::CustomHeaderFields::decode):

  • loader/DocumentLoader.cpp:

(WebCore::DocumentLoader::setCustomHeaderFields): Deleted.

  • loader/DocumentLoader.h:

(WebCore::DocumentLoader::setCustomHeaderFields):
(WebCore::DocumentLoader::customHeaderFields const):
(WebCore::DocumentLoader::customHeaderFields): Deleted.

  • loader/cache/CachedResourceLoader.cpp:

(WebCore::CachedResourceLoader::requestResource):

Source/WebKit:

  • Shared/API/APIObject.h:
  • Shared/Cocoa/APIObject.mm:

(API::Object::newObject):

  • Shared/WebsitePoliciesData.cpp:

(WebKit::WebsitePoliciesData::decode):

  • Shared/WebsitePoliciesData.h:
  • SourcesCocoa.txt:
  • UIProcess/API/APICustomHeaderFields.h: Added.
  • UIProcess/API/APIWebsitePolicies.cpp:

(API::WebsitePolicies::WebsitePolicies):
(API::WebsitePolicies::copy const):
(API::WebsitePolicies::data):

  • UIProcess/API/APIWebsitePolicies.h:
  • UIProcess/API/C/WKWebsitePolicies.cpp:

(WKWebsitePoliciesCopyCustomHeaderFields):
(WKWebsitePoliciesSetCustomHeaderFields):

  • UIProcess/API/Cocoa/WKWebpagePreferences.mm:

(-[WKWebpagePreferences _customHeaderFields]):
(-[WKWebpagePreferences _setCustomHeaderFields:]):

  • UIProcess/API/Cocoa/WKWebpagePreferencesPrivate.h:
  • UIProcess/API/Cocoa/_WKCustomHeaderFields.h: Added.
  • UIProcess/API/Cocoa/_WKCustomHeaderFields.mm: Added.

(-[_WKCustomHeaderFields init]):
(-[_WKCustomHeaderFields dealloc]):
(-[_WKCustomHeaderFields fields]):
(-[_WKCustomHeaderFields setFields:]):
(-[_WKCustomHeaderFields thirdPartyDomains]):
(-[_WKCustomHeaderFields setThirdPartyDomains:]):
(-[_WKCustomHeaderFields _apiObject]):

  • UIProcess/API/Cocoa/_WKCustomHeaderFieldsInternal.h: Added.
  • UIProcess/API/Cocoa/_WKWebsitePolicies.h:
  • UIProcess/API/Cocoa/_WKWebsitePolicies.mm:

(-[_WKWebsitePolicies customHeaderFields]): Deleted.
(-[_WKWebsitePolicies setCustomHeaderFields:]): Deleted.

  • UIProcess/Cocoa/WebViewImpl.h:
  • UIProcess/Cocoa/WebViewImpl.mm:

(WebKit::WebViewImpl::takeFocus):
(WebKit::WebViewImpl::accessibilityAttributeValue):

  • WebKit.xcodeproj/project.pbxproj:

Tools:

  • TestWebKitAPI/Tests/WebKitCocoa/WebsitePolicies.mm:

(TEST):
(expectLegacyHeaders):
(expectHeaders):
(-[CustomHeaderFieldsDelegate webView:decidePolicyForNavigationAction:preferences:decisionHandler:]):
(-[CustomHeaderFieldsDelegate webView:startURLSchemeTask:]):
(-[CustomHeaderFieldsDelegate _webView:decidePolicyForNavigationAction:decisionHandler:]): Deleted.

Location:
trunk
Files:
6 added
22 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r245478 r245481  
     12019-05-17  Alex Christensen  <achristensen@webkit.org>
     2
     3        Add SPI to set a list of hosts to which to send custom header fields cross-origin
     4        https://bugs.webkit.org/show_bug.cgi?id=197397
     5
     6        Reviewed by Geoff Garen.
     7
     8        In r223001 I added the ability to send custom headers, but with a restriction that they will not be sent except to the origin of the main document.
     9        We need the ability to specify what origins to send these headers to even if they are not first party requests.
     10        We get this information in a list of strings which are the hosts to send the headers to.  Some of the strings have an asterisk at the beginning,
     11        indicating that the headers are to be sent to all subdomains.
     12
     13        I repurposed some ObjC SPI that was never adopted, but I keep testing the C API that was to verify no regression.
     14        I also added some new API tests for the new behavior.
     15
     16        * Sources.txt:
     17        * WebCore.xcodeproj/project.pbxproj:
     18        * loader/CustomHeaderFields.cpp: Added.
     19        (WebCore::CustomHeaderFields::thirdPartyDomainsMatch const):
     20        * loader/CustomHeaderFields.h: Added.
     21        (WebCore::CustomHeaderFields::encode const):
     22        (WebCore::CustomHeaderFields::decode):
     23        * loader/DocumentLoader.cpp:
     24        (WebCore::DocumentLoader::setCustomHeaderFields): Deleted.
     25        * loader/DocumentLoader.h:
     26        (WebCore::DocumentLoader::setCustomHeaderFields):
     27        (WebCore::DocumentLoader::customHeaderFields const):
     28        (WebCore::DocumentLoader::customHeaderFields): Deleted.
     29        * loader/cache/CachedResourceLoader.cpp:
     30        (WebCore::CachedResourceLoader::requestResource):
     31
    1322019-05-17  Youenn Fablet  <youenn@apple.com>
    233
  • trunk/Source/WebCore/Headers.cmake

    r245470 r245481  
    655655    loader/CrossOriginAccessControl.h
    656656    loader/CrossOriginPreflightResultCache.h
     657    loader/CustomHeaderFields.h
    657658    loader/DocumentLoader.h
    658659    loader/DocumentWriter.h
  • trunk/Source/WebCore/Sources.txt

    r245470 r245481  
    13651365loader/CrossOriginPreflightChecker.cpp
    13661366loader/CrossOriginPreflightResultCache.cpp
     1367loader/CustomHeaderFields.cpp @no-unify
    13671368loader/DocumentLoader.cpp
    13681369loader/DocumentThreadableLoader.cpp
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r245470 r245481  
    18731873                5C4304B1191AC908000E2BC0 /* EXTShaderTextureLOD.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C4304AE191AC908000E2BC0 /* EXTShaderTextureLOD.h */; };
    18741874                5C4304B6191AEF46000E2BC0 /* JSEXTShaderTextureLOD.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C4304B4191AEF46000E2BC0 /* JSEXTShaderTextureLOD.h */; };
     1875                5C5D2385227A0652000B9BDA /* CustomHeaderFields.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C5D2383227A063A000B9BDA /* CustomHeaderFields.h */; settings = {ATTRIBUTES = (Private, ); }; };
    18751876                5C7C88D81D0F1F4A009D2F6D /* SocketProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C7C88D71D0F1F2B009D2F6D /* SocketProvider.h */; settings = {ATTRIBUTES = (Private, ); }; };
    18761877                5C9C2DB52241A67B00996B0B /* ContentRuleListResults.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C9C2DB32241A67300996B0B /* ContentRuleListResults.h */; settings = {ATTRIBUTES = (Private, ); }; };
     
    18791880                5CB37FFF1C62D2A100F20188 /* ScrollAnimatorMock.h in Headers */ = {isa = PBXBuildFile; fileRef = 5CB37FFD1C62D27800F20188 /* ScrollAnimatorMock.h */; };
    18801881                5CBC8DAD1AAA302200E1C803 /* MediaAccessibilitySoftLink.h in Headers */ = {isa = PBXBuildFile; fileRef = 5CBC8DAB1AAA302200E1C803 /* MediaAccessibilitySoftLink.h */; };
     1882                5CBD59592280E926002B22AA /* CustomHeaderFields.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5C5D2386227A077C000B9BDA /* CustomHeaderFields.cpp */; };
    18811883                5CD9F5661AA0F73C00DA45FF /* DFABytecode.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C39305D1AA0F6A90029C816 /* DFABytecode.h */; settings = {ATTRIBUTES = (Private, ); }; };
    18821884                5CD9F5671AA0F74200DA45FF /* DFABytecodeCompiler.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C39305F1AA0F6A90029C816 /* DFABytecodeCompiler.h */; settings = {ATTRIBUTES = (Private, ); }; };
     
    88338835                5C5381B31D87E08100E2EBE6 /* JSURLSearchParams.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSURLSearchParams.cpp; sourceTree = "<group>"; };
    88348836                5C5381B41D87E08100E2EBE6 /* JSURLSearchParams.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSURLSearchParams.h; sourceTree = "<group>"; };
     8837                5C5D2383227A063A000B9BDA /* CustomHeaderFields.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CustomHeaderFields.h; sourceTree = "<group>"; };
     8838                5C5D2386227A077C000B9BDA /* CustomHeaderFields.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CustomHeaderFields.cpp; sourceTree = "<group>"; };
    88358839                5C668E641E7C6C3500D32B3B /* SocketStreamHandleImpl.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SocketStreamHandleImpl.cpp; sourceTree = "<group>"; };
    88368840                5C688AA01D380509000B54FA /* ThreadableWebSocketChannel.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ThreadableWebSocketChannel.cpp; sourceTree = "<group>"; };
     
    2501225016                                E1C415DD0F655D7C0092D2FB /* CrossOriginPreflightResultCache.cpp */,
    2501325017                                E1C415D90F655D6F0092D2FB /* CrossOriginPreflightResultCache.h */,
     25018                                5C5D2386227A077C000B9BDA /* CustomHeaderFields.cpp */,
     25019                                5C5D2383227A063A000B9BDA /* CustomHeaderFields.h */,
    2501425020                                93E227DB0AF589AD00D48324 /* DocumentLoader.cpp */,
    2501525021                                656D371E0ADBA5DE00A4554D /* DocumentLoader.h */,
     
    2868628692                                9BD4E91B1C462CFC005065BC /* CustomElementRegistry.h in Headers */,
    2868728693                                62CD325A1157E57C0063B0A7 /* CustomEvent.h in Headers */,
     28694                                5C5D2385227A0652000B9BDA /* CustomHeaderFields.h in Headers */,
    2868828695                                4B1E13E721790D660042CF98 /* CustomPaintCanvas.h in Headers */,
    2868928696                                4B7AE4932177B56F00C59959 /* CustomPaintImage.h in Headers */,
     
    3261032617                                46C696CC1E7205FC00597937 /* CPUMonitor.cpp in Sources */,
    3261132618                                1ABA76CA11D20E50004C201C /* CSSPropertyNames.cpp in Sources */,
     32619                                5CBD59592280E926002B22AA /* CustomHeaderFields.cpp in Sources */,
    3261232620                                BE23480C18A9870B00E4B6E8 /* DataCue.cpp in Sources */,
    3261332621                                4463CF682212FA68001A8577 /* DataDetectorsCoreSoftLink.mm in Sources */,
  • trunk/Source/WebCore/loader/DocumentLoader.cpp

    r245470 r245481  
    3939#include "ContentExtensionError.h"
    4040#include "ContentSecurityPolicy.h"
     41#include "CustomHeaderFields.h"
    4142#include "DOMWindow.h"
    4243#include "Document.h"
     
    5455#include "HTMLFormElement.h"
    5556#include "HTMLFrameOwnerElement.h"
    56 #include "HTTPHeaderField.h"
    5757#include "HTTPHeaderNames.h"
    5858#include "HistoryItem.h"
     
    13231323#endif
    13241324
    1325 void DocumentLoader::setCustomHeaderFields(Vector<HTTPHeaderField>&& fields)
    1326 {
    1327     m_customHeaderFields = WTFMove(fields);
    1328 }
    1329 
    13301325bool DocumentLoader::isLoadingInAPISense() const
    13311326{
     
    15741569    m_stopRecordingResponses = true;
    15751570    m_responses.shrinkToFit();
     1571}
     1572
     1573void DocumentLoader::setCustomHeaderFields(Vector<CustomHeaderFields>&& fields)
     1574{
     1575    m_customHeaderFields = WTFMove(fields);
    15761576}
    15771577
  • trunk/Source/WebCore/loader/DocumentLoader.h

    r245470 r245481  
    7777class CachedResourceLoader;
    7878class ContentFilter;
     79struct CustomHeaderFields;
    7980class FormState;
    8081class Frame;
    8182class FrameLoader;
    82 class HTTPHeaderField;
    8383class IconLoader;
    8484class Page;
     
    372372#endif
    373373
    374     WEBCORE_EXPORT void setCustomHeaderFields(Vector<HTTPHeaderField>&& fields);
    375     const Vector<HTTPHeaderField>& customHeaderFields() { return m_customHeaderFields; }
     374    WEBCORE_EXPORT void setCustomHeaderFields(Vector<CustomHeaderFields>&&);
     375    const Vector<CustomHeaderFields>& customHeaderFields() const { return m_customHeaderFields; }
    376376
    377377    void setAllowsWebArchiveForMainFrame(bool allowsWebArchiveForMainFrame) { m_allowsWebArchiveForMainFrame = allowsWebArchiveForMainFrame; }
     
    565565#endif
    566566
    567     Vector<HTTPHeaderField> m_customHeaderFields;
     567    Vector<CustomHeaderFields> m_customHeaderFields;
    568568   
    569569    bool m_subresourceLoadersArePageCacheAcceptable { false };
  • trunk/Source/WebCore/loader/cache/CachedResourceLoader.cpp

    r245470 r245481  
    4444#include "ContentSecurityPolicy.h"
    4545#include "CrossOriginAccessControl.h"
     46#include "CustomHeaderFields.h"
    4647#include "DOMWindow.h"
    4748#include "DiagnosticLoggingClient.h"
     
    859860                && document()->securityOrigin().isSameSchemeHostPort(requestedOrigin.get());
    860861        }
    861         if (sameOriginRequest) {
    862             for (auto& field : m_documentLoader->customHeaderFields())
    863                 request.resourceRequest().setHTTPHeaderField(field.name(), field.value());
     862        for (auto& fields : m_documentLoader->customHeaderFields()) {
     863            if (sameOriginRequest || fields.thirdPartyDomainsMatch(url)) {
     864                for (auto& field : fields.fields)
     865                    request.resourceRequest().setHTTPHeaderField(field.name(), field.value());
     866            }
    864867        }
    865868    }
  • trunk/Source/WebKit/ChangeLog

    r245480 r245481  
     12019-05-17  Alex Christensen  <achristensen@webkit.org>
     2
     3        Add SPI to set a list of hosts to which to send custom header fields cross-origin
     4        https://bugs.webkit.org/show_bug.cgi?id=197397
     5
     6        Reviewed by Geoff Garen.
     7
     8        * Shared/API/APIObject.h:
     9        * Shared/Cocoa/APIObject.mm:
     10        (API::Object::newObject):
     11        * Shared/WebsitePoliciesData.cpp:
     12        (WebKit::WebsitePoliciesData::decode):
     13        * Shared/WebsitePoliciesData.h:
     14        * SourcesCocoa.txt:
     15        * UIProcess/API/APICustomHeaderFields.h: Added.
     16        * UIProcess/API/APIWebsitePolicies.cpp:
     17        (API::WebsitePolicies::WebsitePolicies):
     18        (API::WebsitePolicies::copy const):
     19        (API::WebsitePolicies::data):
     20        * UIProcess/API/APIWebsitePolicies.h:
     21        * UIProcess/API/C/WKWebsitePolicies.cpp:
     22        (WKWebsitePoliciesCopyCustomHeaderFields):
     23        (WKWebsitePoliciesSetCustomHeaderFields):
     24        * UIProcess/API/Cocoa/WKWebpagePreferences.mm:
     25        (-[WKWebpagePreferences _customHeaderFields]):
     26        (-[WKWebpagePreferences _setCustomHeaderFields:]):
     27        * UIProcess/API/Cocoa/WKWebpagePreferencesPrivate.h:
     28        * UIProcess/API/Cocoa/_WKCustomHeaderFields.h: Added.
     29        * UIProcess/API/Cocoa/_WKCustomHeaderFields.mm: Added.
     30        (-[_WKCustomHeaderFields init]):
     31        (-[_WKCustomHeaderFields dealloc]):
     32        (-[_WKCustomHeaderFields fields]):
     33        (-[_WKCustomHeaderFields setFields:]):
     34        (-[_WKCustomHeaderFields thirdPartyDomains]):
     35        (-[_WKCustomHeaderFields setThirdPartyDomains:]):
     36        (-[_WKCustomHeaderFields _apiObject]):
     37        * UIProcess/API/Cocoa/_WKCustomHeaderFieldsInternal.h: Added.
     38        * UIProcess/API/Cocoa/_WKWebsitePolicies.h:
     39        * UIProcess/API/Cocoa/_WKWebsitePolicies.mm:
     40        (-[_WKWebsitePolicies customHeaderFields]): Deleted.
     41        (-[_WKWebsitePolicies setCustomHeaderFields:]): Deleted.
     42        * UIProcess/Cocoa/WebViewImpl.h:
     43        * UIProcess/Cocoa/WebViewImpl.mm:
     44        (WebKit::WebViewImpl::takeFocus):
     45        (WebKit::WebViewImpl::accessibilityAttributeValue):
     46        * WebKit.xcodeproj/project.pbxproj:
     47
    1482019-05-17  Brady Eidson  <beidson@apple.com>
    249
  • trunk/Source/WebKit/Shared/API/APIObject.h

    r245470 r245481  
    112112        ContextMenuListener,
    113113        CookieManager,
     114        CustomHeaderFields,
    114115        InternalDebugFeature,
    115116        Download,
  • trunk/Source/WebKit/Shared/Cocoa/APIObject.mm

    r245470 r245481  
    7171#import "_WKAutomationSessionInternal.h"
    7272#import "_WKContentRuleListActionInternal.h"
     73#import "_WKCustomHeaderFieldsInternal.h"
    7374#import "_WKDownloadInternal.h"
    7475#import "_WKExperimentalFeatureInternal.h"
     
    313314        break;
    314315
     316    case Type::CustomHeaderFields:
     317        wrapper = [_WKCustomHeaderFields alloc];
     318        break;
     319
    315320    case Type::UserContentWorld:
    316321        wrapper = [_WKUserContentWorld alloc];
  • trunk/Source/WebKit/Shared/WebsitePoliciesData.cpp

    r245470 r245481  
    2929#include "ArgumentCoders.h"
    3030#include "WebProcess.h"
     31#include <WebCore/CustomHeaderFields.h>
    3132#include <WebCore/DocumentLoader.h>
    3233#include <WebCore/Frame.h>
     
    7879        return WTF::nullopt;
    7980   
    80     Optional<Vector<WebCore::HTTPHeaderField>> customHeaderFields;
     81    Optional<Vector<WebCore::CustomHeaderFields>> customHeaderFields;
    8182    decoder >> customHeaderFields;
    8283    if (!customHeaderFields)
  • trunk/Source/WebKit/Shared/WebsitePoliciesData.h

    r245470 r245481  
    3333#include "WebsitePopUpPolicy.h"
    3434#include "WebsiteSimulatedMouseEventsDispatchPolicy.h"
     35#include <WebCore/CustomHeaderFields.h>
    3536#include <WebCore/DeviceOrientationOrMotionPermissionState.h>
    36 #include <WebCore/HTTPHeaderField.h>
    3737#include <wtf/OptionSet.h>
    3838
     
    5757    WebCore::DeviceOrientationOrMotionPermissionState deviceOrientationAndMotionAccessState;
    5858#endif
    59     Vector<WebCore::HTTPHeaderField> customHeaderFields;
     59    Vector<WebCore::CustomHeaderFields> customHeaderFields;
    6060    WebsitePopUpPolicy popUpPolicy { WebsitePopUpPolicy::Default };
    6161    Optional<WebsiteDataStoreParameters> websiteDataStoreParameters;
  • trunk/Source/WebKit/SourcesCocoa.txt

    r245470 r245481  
    243243UIProcess/API/Cocoa/_WKContentRuleListAction.mm
    244244UIProcess/API/Cocoa/_WKContextMenuElementInfo.mm
     245UIProcess/API/Cocoa/_WKCustomHeaderFields.mm @no-unify
    245246UIProcess/API/Cocoa/_WKDownload.mm
    246247UIProcess/API/Cocoa/_WKElementAction.mm
  • trunk/Source/WebKit/UIProcess/API/APIWebsitePolicies.cpp

    r245470 r245481  
    3434WebsitePolicies::WebsitePolicies() = default;
    3535
    36 WebsitePolicies::WebsitePolicies(bool contentBlockersEnabled, OptionSet<WebKit::WebsiteAutoplayQuirk> allowedAutoplayQuirks, WebKit::WebsiteAutoplayPolicy autoplayPolicy, Vector<WebCore::HTTPHeaderField>&& customHeaderFields, WebKit::WebsitePopUpPolicy popUpPolicy, RefPtr<WebsiteDataStore>&& websiteDataStore)
     36WebsitePolicies::WebsitePolicies(bool contentBlockersEnabled, OptionSet<WebKit::WebsiteAutoplayQuirk> allowedAutoplayQuirks, WebKit::WebsiteAutoplayPolicy autoplayPolicy, Vector<WebCore::HTTPHeaderField>&& legacyCustomHeaderFields, Vector<WebCore::CustomHeaderFields>&& customHeaderFields, WebKit::WebsitePopUpPolicy popUpPolicy, RefPtr<WebsiteDataStore>&& websiteDataStore)
    3737    : m_contentBlockersEnabled(contentBlockersEnabled)
    3838    , m_allowedAutoplayQuirks(allowedAutoplayQuirks)
    3939    , m_autoplayPolicy(autoplayPolicy)
     40    , m_legacyCustomHeaderFields(WTFMove(legacyCustomHeaderFields))
    4041    , m_customHeaderFields(WTFMove(customHeaderFields))
    4142    , m_popUpPolicy(popUpPolicy)
     
    6162    policies->setMediaSourcePolicy(m_mediaSourcePolicy);
    6263    policies->setSimulatedMouseEventsDispatchPolicy(m_simulatedMouseEventsDispatchPolicy);
    63     Vector<WebCore::HTTPHeaderField> customHeaderFields;
     64   
     65    Vector<WebCore::HTTPHeaderField> legacyCustomHeaderFields;
     66    legacyCustomHeaderFields.reserveInitialCapacity(m_legacyCustomHeaderFields.size());
     67    for (auto& field : m_legacyCustomHeaderFields)
     68        legacyCustomHeaderFields.uncheckedAppend(field);
     69    policies->setLegacyCustomHeaderFields(WTFMove(legacyCustomHeaderFields));
     70
     71    Vector<WebCore::CustomHeaderFields> customHeaderFields;
    6472    customHeaderFields.reserveInitialCapacity(m_customHeaderFields.size());
    6573    for (auto& field : m_customHeaderFields)
    66         customHeaderFields.append(WebCore::HTTPHeaderField(field));
     74        customHeaderFields.uncheckedAppend(field);
    6775    policies->setCustomHeaderFields(WTFMove(customHeaderFields));
    6876    policies->setAllowSiteSpecificQuirksToOverrideCompatibilityMode(m_allowSiteSpecificQuirksToOverrideCompatibilityMode);
     
    8290WebKit::WebsitePoliciesData WebsitePolicies::data()
    8391{
     92    bool hasLegacyCustomHeaderFields = legacyCustomHeaderFields().size();
     93    Vector<WebCore::CustomHeaderFields> customHeaderFields;
     94    customHeaderFields.reserveInitialCapacity(this->customHeaderFields().size() + hasLegacyCustomHeaderFields);
     95    for (auto& field : this->customHeaderFields())
     96        customHeaderFields.uncheckedAppend(field);
     97    if (hasLegacyCustomHeaderFields)
     98        customHeaderFields.uncheckedAppend({ legacyCustomHeaderFields(), { }});
     99
    84100    return {
    85101        contentBlockersEnabled(),
     
    89105        deviceOrientationAndMotionAccessState(),
    90106#endif
    91         customHeaderFields(),
     107        WTFMove(customHeaderFields),
    92108        popUpPolicy(),
    93109        m_websiteDataStore ? Optional<WebKit::WebsiteDataStoreParameters> { m_websiteDataStore->websiteDataStore().parameters() } : WTF::nullopt,
  • trunk/Source/WebKit/UIProcess/API/APIWebsitePolicies.h

    r245470 r245481  
    3434#include "WebsitePopUpPolicy.h"
    3535#include "WebsiteSimulatedMouseEventsDispatchPolicy.h"
     36#include <WebCore/CustomHeaderFields.h>
    3637#include <WebCore/DeviceOrientationOrMotionPermissionState.h>
    3738#include <WebCore/HTTPHeaderField.h>
     
    6970#endif
    7071
    71     const Vector<WebCore::HTTPHeaderField>& customHeaderFields() const { return m_customHeaderFields; }
    72     Vector<WebCore::HTTPHeaderField>&& takeCustomHeaderFields() { return WTFMove(m_customHeaderFields); }
    73     void setCustomHeaderFields(Vector<WebCore::HTTPHeaderField>&& fields) { m_customHeaderFields = WTFMove(fields); }
     72    const Vector<WebCore::HTTPHeaderField>& legacyCustomHeaderFields() const { return m_legacyCustomHeaderFields; }
     73    void setLegacyCustomHeaderFields(Vector<WebCore::HTTPHeaderField>&& fields) { m_legacyCustomHeaderFields = WTFMove(fields); }
     74
     75    const Vector<WebCore::CustomHeaderFields>& customHeaderFields() const { return m_customHeaderFields; }
     76    void setCustomHeaderFields(Vector<WebCore::CustomHeaderFields>&& fields) { m_customHeaderFields = WTFMove(fields); }
    7477
    7578    WebKit::WebsitePopUpPolicy popUpPolicy() const { return m_popUpPolicy; }
     
    109112
    110113private:
    111     WebsitePolicies(bool contentBlockersEnabled, OptionSet<WebKit::WebsiteAutoplayQuirk>, WebKit::WebsiteAutoplayPolicy, Vector<WebCore::HTTPHeaderField>&&, WebKit::WebsitePopUpPolicy, RefPtr<WebsiteDataStore>&&);
     114    WebsitePolicies(bool contentBlockersEnabled, OptionSet<WebKit::WebsiteAutoplayQuirk>, WebKit::WebsiteAutoplayPolicy, Vector<WebCore::HTTPHeaderField>&&, Vector<WebCore::CustomHeaderFields>&&, WebKit::WebsitePopUpPolicy, RefPtr<WebsiteDataStore>&&);
    112115
    113116    bool m_contentBlockersEnabled { true };
     
    117120    WebCore::DeviceOrientationOrMotionPermissionState m_deviceOrientationAndMotionAccessState { WebCore::DeviceOrientationOrMotionPermissionState::Prompt };
    118121#endif
    119     Vector<WebCore::HTTPHeaderField> m_customHeaderFields;
     122    Vector<WebCore::HTTPHeaderField> m_legacyCustomHeaderFields;
     123    Vector<WebCore::CustomHeaderFields> m_customHeaderFields;
    120124    WebKit::WebsitePopUpPolicy m_popUpPolicy { WebKit::WebsitePopUpPolicy::Default };
    121125    RefPtr<WebsiteDataStore> m_websiteDataStore;
  • trunk/Source/WebKit/UIProcess/API/C/WKWebsitePolicies.cpp

    r245470 r245481  
    6060{
    6161    HashMap<WTF::String, RefPtr<API::Object>> fields;
    62     for (const auto& field : toImpl(websitePolicies)->customHeaderFields())
     62    for (const auto& field : toImpl(websitePolicies)->legacyCustomHeaderFields())
    6363        fields.add(field.name(), API::String::create(field.value()));
    6464    return toAPI(API::Dictionary::create(WTFMove(fields)).ptr());
     
    7777            fields.uncheckedAppend(WTFMove(*field));
    7878    }
    79     toImpl(websitePolicies)->setCustomHeaderFields(WTFMove(fields));
     79    toImpl(websitePolicies)->setLegacyCustomHeaderFields(WTFMove(fields));
    8080}
    8181
  • trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebpagePreferences.mm

    r245470 r245481  
    2727#import "WKWebpagePreferences.h"
    2828
     29#import "APICustomHeaderFields.h"
    2930#import "WKWebpagePreferencesInternal.h"
    3031#import "WKWebsiteDataStoreInternal.h"
    3132#import "WebCompatibilityMode.h"
     33#import "_WKCustomHeaderFieldsInternal.h"
    3234#import "_WKWebsitePoliciesInternal.h"
    3335#import <wtf/RetainPtr.h>
     
    215217}
    216218
    217 - (NSDictionary<NSString *, NSString *> *)_customHeaderFields
     219- (NSArray<_WKCustomHeaderFields *> *)_customHeaderFields
    218220{
    219221    const auto& fields = _websitePolicies->customHeaderFields();
    220     auto dictionary = adoptNS([[NSMutableDictionary alloc] initWithCapacity:fields.size()]);
     222    NSMutableArray *array = [[[NSMutableArray alloc] initWithCapacity:fields.size()] autorelease];
    221223    for (const auto& field : fields)
    222         [dictionary setObject:field.value() forKey:field.name()];
    223     return dictionary.autorelease();
    224 }
    225 
    226 - (void)_setCustomHeaderFields:(NSDictionary<NSString *, NSString *> *)fields
    227 {
    228     Vector<WebCore::HTTPHeaderField> parsedFields;
    229     parsedFields.reserveInitialCapacity(fields.count);
    230 
    231     for (NSString *name in fields) {
    232         auto field = WebCore::HTTPHeaderField::create(name, [fields objectForKey:name]);
    233         if (field && startsWithLettersIgnoringASCIICase(field->name(), "x-"))
    234             parsedFields.uncheckedAppend(WTFMove(*field));
    235     }
    236     _websitePolicies->setCustomHeaderFields(WTFMove(parsedFields));
     224        [array addObject:wrapper(API::CustomHeaderFields::create(field))];
     225    return array;
     226}
     227
     228- (void)_setCustomHeaderFields:(NSArray<_WKCustomHeaderFields *> *)fields
     229{
     230    Vector<WebCore::CustomHeaderFields> vector;
     231    vector.reserveInitialCapacity(fields.count);
     232    for (_WKCustomHeaderFields *element in fields)
     233        vector.uncheckedAppend(static_cast<API::CustomHeaderFields&>([element _apiObject]).coreFields());
     234    _websitePolicies->setCustomHeaderFields(WTFMove(vector));
    237235}
    238236
  • trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebpagePreferencesPrivate.h

    r245470 r245481  
    5656} WK_API_AVAILABLE(macos(10.14), ios(12.0));
    5757
     58@class _WKCustomHeaderFields;
     59
    5860@interface WKWebpagePreferences (WKPrivate)
    5961
     
    6163@property (nonatomic, setter=_setAllowedAutoplayQuirks:) _WKWebsiteAutoplayQuirk _allowedAutoplayQuirks;
    6264@property (nonatomic, setter=_setAutoplayPolicy:) _WKWebsiteAutoplayPolicy _autoplayPolicy;
    63 @property (nonatomic, copy, setter=_setCustomHeaderFields:) NSDictionary<NSString *, NSString *> *_customHeaderFields;
     65@property (nonatomic, copy, setter=_setCustomHeaderFields:) NSArray<_WKCustomHeaderFields *> *_customHeaderFields;
    6466@property (nonatomic, setter=_setPopUpPolicy:) _WKWebsitePopUpPolicy _popUpPolicy;
    6567@property (nonatomic, strong, setter=_setWebsiteDataStore:) WKWebsiteDataStore *_websiteDataStore;
  • trunk/Source/WebKit/UIProcess/API/Cocoa/_WKWebsitePolicies.mm

    r245470 r245481  
    9898- (NSDictionary<NSString *, NSString *> *)customHeaderFields
    9999{
    100     return [_webpagePreferences _customHeaderFields];
     100    auto& fields = static_cast<API::WebsitePolicies&>([_webpagePreferences _apiObject]).legacyCustomHeaderFields();
     101    auto dictionary = [NSMutableDictionary dictionaryWithCapacity:fields.size()];
     102    for (const auto& field : fields)
     103        [dictionary setObject:field.value() forKey:field.name()];
     104    return dictionary;
    101105}
    102106
    103107- (void)setCustomHeaderFields:(NSDictionary<NSString *, NSString *> *)fields
    104108{
    105     [_webpagePreferences _setCustomHeaderFields:fields];
     109    auto websitePolicies = static_cast<API::WebsitePolicies&>([_webpagePreferences _apiObject]);
     110    Vector<WebCore::HTTPHeaderField> parsedFields;
     111    parsedFields.reserveInitialCapacity(fields.count);
     112    for (NSString *name in fields) {
     113        auto field = WebCore::HTTPHeaderField::create(name, [fields objectForKey:name]);
     114        if (field && startsWithLettersIgnoringASCIICase(field->name(), "x-"))
     115            parsedFields.uncheckedAppend(WTFMove(*field));
     116    }
     117    websitePolicies.setLegacyCustomHeaderFields(WTFMove(parsedFields));
    106118}
    107119
  • trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj

    r245470 r245481  
    10791079                5C5CEC34220912B400D6BBB0 /* AuxiliaryProcessMain.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5C5CEC31220912AF00D6BBB0 /* AuxiliaryProcessMain.cpp */; };
    10801080                5C5CEC35220912B400D6BBB0 /* AuxiliaryProcessMain.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5C5CEC31220912AF00D6BBB0 /* AuxiliaryProcessMain.cpp */; };
     1081                5C5D238C227A2CDA000B9BDA /* _WKCustomHeaderFields.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C5D2389227A1892000B9BDA /* _WKCustomHeaderFields.h */; settings = {ATTRIBUTES = (Private, ); }; };
    10811082                5C62FDF91EFC271C00CE072E /* WKURLSchemeTaskPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C62FDF81EFC263C00CE072E /* WKURLSchemeTaskPrivate.h */; settings = {ATTRIBUTES = (Private, ); }; };
    10821083                5C7FB47021E97DC5009E3241 /* WebCookieJar.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C7FB46F21E97C0C009E3241 /* WebCookieJar.h */; };
     
    10931094                5CB2378E1DF0E0D300117AA3 /* _WKWebsitePoliciesInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 5CB2378D1DF0E0C200117AA3 /* _WKWebsitePoliciesInternal.h */; };
    10941095                5CBC9B8E1C652CA000A8FDCF /* NetworkDataTask.h in Headers */ = {isa = PBXBuildFile; fileRef = 5CBC9B891C6524A500A8FDCF /* NetworkDataTask.h */; };
     1096                5CBD595C2280EDF4002B22AA /* _WKCustomHeaderFields.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5C5D2388227A1892000B9BDA /* _WKCustomHeaderFields.mm */; };
    10951097                5CD286511E7235990094FDC8 /* WKContentRuleListStore.h in Headers */ = {isa = PBXBuildFile; fileRef = 5CD2864D1E722F440094FDC8 /* WKContentRuleListStore.h */; settings = {ATTRIBUTES = (Public, ); }; };
    10961098                5CD286531E7235AA0094FDC8 /* _WKUserContentFilterPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 5CD286491E722F440094FDC8 /* _WKUserContentFilterPrivate.h */; settings = {ATTRIBUTES = (Private, ); }; };
     
    35293531                5C5CEC382209583200D6BBB0 /* DaemonEntryPoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DaemonEntryPoint.h; sourceTree = "<group>"; };
    35303532                5C5CEC392209583200D6BBB0 /* DaemonEntryPoint.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = DaemonEntryPoint.mm; sourceTree = "<group>"; };
     3533                5C5D2387227A1891000B9BDA /* _WKCustomHeaderFieldsInternal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _WKCustomHeaderFieldsInternal.h; sourceTree = "<group>"; };
     3534                5C5D2388227A1892000B9BDA /* _WKCustomHeaderFields.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = _WKCustomHeaderFields.mm; sourceTree = "<group>"; };
     3535                5C5D2389227A1892000B9BDA /* _WKCustomHeaderFields.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _WKCustomHeaderFields.h; sourceTree = "<group>"; };
     3536                5C5D238A227A1D9B000B9BDA /* APICustomHeaderFields.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APICustomHeaderFields.h; sourceTree = "<group>"; };
    35313537                5C62FDF81EFC263C00CE072E /* WKURLSchemeTaskPrivate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WKURLSchemeTaskPrivate.h; sourceTree = "<group>"; };
    35323538                5C6CE6D01F59BC460007C6CB /* PageClientImplCocoa.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = PageClientImplCocoa.mm; sourceTree = "<group>"; };
     
    61426148                                1A5704F61BE01FF400874AF1 /* _WKContextMenuElementInfo.h */,
    61436149                                1A5704F51BE01FF400874AF1 /* _WKContextMenuElementInfo.mm */,
     6150                                5C5D2389227A1892000B9BDA /* _WKCustomHeaderFields.h */,
     6151                                5C5D2388227A1892000B9BDA /* _WKCustomHeaderFields.mm */,
     6152                                5C5D2387227A1891000B9BDA /* _WKCustomHeaderFieldsInternal.h */,
    61446153                                83891B681A68BEBC0030F386 /* _WKDiagnosticLoggingDelegate.h */,
    61456154                                A1A4FE5718DCE9FA00B5EA8A /* _WKDownload.h */,
     
    77067715                                7C3A06A61AAB903E009D74BA /* APIContentRuleListStore.h */,
    77077716                                076E884D1A13CADF005E90FC /* APIContextMenuClient.h */,
     7717                                5C5D238A227A1D9B000B9BDA /* APICustomHeaderFields.h */,
    77087718                                7A821F4F1E2F7A5C00604577 /* APICustomProtocolManagerClient.h */,
    77097719                                83891B621A68B3420030F386 /* APIDiagnosticLoggingClient.h */,
     
    90199029                                5C4609E8224317BB009943C2 /* _WKContentRuleListActionInternal.h in Headers */,
    90209030                                1A5704F81BE01FF400874AF1 /* _WKContextMenuElementInfo.h in Headers */,
     9031                                5C5D238C227A2CDA000B9BDA /* _WKCustomHeaderFields.h in Headers */,
    90219032                                83891B691A68BEBC0030F386 /* _WKDiagnosticLoggingDelegate.h in Headers */,
    90229033                                A1A4FE5A18DCE9FA00B5EA8A /* _WKDownload.h in Headers */,
     
    1095810969                        buildActionMask = 2147483647;
    1095910970                        files = (
     10971                                5CBD595C2280EDF4002B22AA /* _WKCustomHeaderFields.mm in Sources */,
    1096010972                                99E7189A21F79D9E0055E975 /* _WKTouchEventGenerator.mm in Sources */,
    1096110973                                2D92A784212B6AB100F493FD /* ActivityAssertion.cpp in Sources */,
  • trunk/Tools/ChangeLog

    r245476 r245481  
     12019-05-17  Alex Christensen  <achristensen@webkit.org>
     2
     3        Add SPI to set a list of hosts to which to send custom header fields cross-origin
     4        https://bugs.webkit.org/show_bug.cgi?id=197397
     5
     6        Reviewed by Geoff Garen.
     7
     8        * TestWebKitAPI/Tests/WebKitCocoa/WebsitePolicies.mm:
     9        (TEST):
     10        (expectLegacyHeaders):
     11        (expectHeaders):
     12        (-[CustomHeaderFieldsDelegate webView:decidePolicyForNavigationAction:preferences:decisionHandler:]):
     13        (-[CustomHeaderFieldsDelegate webView:startURLSchemeTask:]):
     14        (-[CustomHeaderFieldsDelegate _webView:decidePolicyForNavigationAction:decisionHandler:]): Deleted.
     15
    1162019-05-17  Keith Rollin  <krollin@apple.com>
    217
  • trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WebsitePolicies.mm

    r245470 r245481  
    2929#import "TestNavigationDelegate.h"
    3030#import "TestWKWebView.h"
     31#import <WebKit/WKMutableDictionary.h>
    3132#import <WebKit/WKNavigationDelegatePrivate.h>
    3233#import <WebKit/WKPagePrivate.h>
    3334#import <WebKit/WKPreferencesPrivate.h>
    3435#import <WebKit/WKPreferencesRefPrivate.h>
     36#import <WebKit/WKString.h>
    3537#import <WebKit/WKUIDelegatePrivate.h>
    3638#import <WebKit/WKURLSchemeTaskPrivate.h>
     
    3941#import <WebKit/WKWebsiteDataStorePrivate.h>
    4042#import <WebKit/WKWebsitePolicies.h>
     43#import <WebKit/_WKCustomHeaderFields.h>
    4144#import <WebKit/_WKUserContentExtensionStorePrivate.h>
    4245#import <WebKit/_WKWebsiteDataStoreConfiguration.h>
     
    908911TEST(WebKit, InvalidCustomHeaders)
    909912{
    910     auto websitePolicies = adoptNS([[_WKWebsitePolicies alloc] init]);
    911     [websitePolicies setCustomHeaderFields:@{@"invalidheader" : @"", @"noncustom" : @"header", @"    x-Custom ":@"  Needs Canonicalization\t ", @"x-other" : @"other value"}];
    912     NSDictionary<NSString *, NSString *> *canonicalized = [websitePolicies customHeaderFields];
     913    auto customHeaderFields = adoptNS([[_WKCustomHeaderFields alloc] init]);
     914    [customHeaderFields setFields:@{@"invalidheader" : @"", @"noncustom" : @"header", @"    x-Custom ":@"  Needs Canonicalization\t ", @"x-other" : @"other value"}];
     915    NSDictionary<NSString *, NSString *> *canonicalized = [customHeaderFields fields];
    913916    EXPECT_EQ(canonicalized.count, 2u);
    914917    EXPECT_STREQ([canonicalized objectForKey:@"x-Custom"].UTF8String, "Needs Canonicalization");
     
    920923static bool thirdTestDone;
    921924static bool fourthTestDone;
    922 
    923 static void expectHeaders(id <WKURLSchemeTask> task, bool expected)
     925static bool fifthTestDone;
     926
     927static void expectLegacyHeaders(id <WKURLSchemeTask> task, bool expected)
    924928{
    925929    NSURLRequest *request = task.request;
     
    933937}
    934938
     939static void expectHeaders(id <WKURLSchemeTask> task, bool expected)
     940{
     941    NSURLRequest *request = task.request;
     942    if (expected) {
     943        EXPECT_STREQ([[request valueForHTTPHeaderField:@"X-key3"] UTF8String], "value3");
     944        EXPECT_STREQ([[request valueForHTTPHeaderField:@"X-key4"] UTF8String], "value4");
     945    } else {
     946        EXPECT_TRUE([request valueForHTTPHeaderField:@"X-key3"] == nil);
     947        EXPECT_TRUE([request valueForHTTPHeaderField:@"X-key4"] == nil);
     948    }
     949}
     950
    935951static void respond(id <WKURLSchemeTask>task, NSString *html = nil)
    936952{
     
    945961@implementation CustomHeaderFieldsDelegate
    946962
    947 IGNORE_WARNINGS_BEGIN("deprecated-implementations")
    948 - (void)_webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy, _WKWebsitePolicies *))decisionHandler
    949 IGNORE_WARNINGS_END
    950 {
    951     _WKWebsitePolicies *websitePolicies = [[[_WKWebsitePolicies alloc] init] autorelease];
    952     [websitePolicies setCustomHeaderFields:@{@"X-key1": @"value1", @"X-key2": @"value2"}];
     963- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction preferences:(WKWebpagePreferences *)preferences decisionHandler:(void (^)(WKNavigationActionPolicy, WKWebpagePreferences *))decisionHandler
     964{
     965    auto legacyHeaderFieldDictionary = adoptWK(WKMutableDictionaryCreate());
     966    WKDictionarySetItem(legacyHeaderFieldDictionary.get(), adoptWK(WKStringCreateWithUTF8CString("X-key1")).get(), adoptWK(WKStringCreateWithUTF8CString("value1")).get());
     967    WKDictionarySetItem(legacyHeaderFieldDictionary.get(), adoptWK(WKStringCreateWithUTF8CString("X-key2")).get(), adoptWK(WKStringCreateWithUTF8CString("value2")).get());
     968    WKWebsitePoliciesSetCustomHeaderFields((WKWebsitePoliciesRef)preferences, legacyHeaderFieldDictionary.get());
     969
     970    _WKCustomHeaderFields *headerFields = [[[_WKCustomHeaderFields alloc] init] autorelease];
     971    [headerFields setFields:@{@"X-key3": @"value3", @"X-key4": @"value4"}];
     972    [headerFields setThirdPartyDomains:@[
     973        @"*.hostwithasterisk.com",
     974        @"hostwithoutasterisk.com",
     975        @"*.com" // should be ignored.
     976    ]];
     977   
     978    [preferences _setCustomHeaderFields:@[headerFields]];
     979   
    953980    if ([navigationAction.request.URL.path isEqualToString:@"/mainresource"]) {
    954981        dispatch_async(dispatch_get_main_queue(), ^{
    955             decisionHandler(WKNavigationActionPolicyAllow, websitePolicies);
     982            decisionHandler(WKNavigationActionPolicyAllow, preferences);
    956983        });
    957984    } else
    958         decisionHandler(WKNavigationActionPolicyAllow, websitePolicies);
     985        decisionHandler(WKNavigationActionPolicyAllow, preferences);
    959986}
    960987
     
    963990    NSString *path = urlSchemeTask.request.URL.path;
    964991    if ([path isEqualToString:@"/mainresource"]) {
    965         expectHeaders(urlSchemeTask, true);
     992        expectLegacyHeaders(urlSchemeTask, true);
    966993        respond(urlSchemeTask, @"<script>fetch('subresource').then(function(response){fetch('test://differentsecurityorigin/crossoriginsubresource',{mode:'no-cors'})})</script>");
    967994    } else if ([path isEqualToString:@"/subresource"]) {
    968         expectHeaders(urlSchemeTask, true);
     995        expectLegacyHeaders(urlSchemeTask, true);
    969996        respond(urlSchemeTask);
    970997    } else if ([path isEqualToString:@"/crossoriginsubresource"]) {
    971         expectHeaders(urlSchemeTask, false);
     998        expectLegacyHeaders(urlSchemeTask, false);
    972999        respond(urlSchemeTask);
    9731000        firstTestDone = true;
    9741001    } else if ([path isEqualToString:@"/mainresourcewithiframe"]) {
    975         expectHeaders(urlSchemeTask, true);
     1002        expectLegacyHeaders(urlSchemeTask, true);
    9761003        respond(urlSchemeTask, @"<iframe src='test://iframeorigin/iframemainresource'></iframe>");
    9771004    } else if ([path isEqualToString:@"/iframemainresource"]) {
    978         expectHeaders(urlSchemeTask, false);
     1005        expectLegacyHeaders(urlSchemeTask, false);
    9791006        respond(urlSchemeTask, @"<script>fetch('iframesubresource').then(function(response){fetch('test://mainframeorigin/originaloriginsubresource',{mode:'no-cors'})})</script>");
    9801007    } else if ([path isEqualToString:@"/iframesubresource"]) {
    981         expectHeaders(urlSchemeTask, false);
     1008        expectLegacyHeaders(urlSchemeTask, false);
    9821009        respond(urlSchemeTask);
    9831010    } else if ([path isEqualToString:@"/originaloriginsubresource"]) {
    984         expectHeaders(urlSchemeTask, false);
     1011        expectLegacyHeaders(urlSchemeTask, false);
    9851012        respond(urlSchemeTask);
    9861013        secondTestDone = true;
    9871014    } else if ([path isEqualToString:@"/nestedtop"]) {
    988         expectHeaders(urlSchemeTask, true);
     1015        expectLegacyHeaders(urlSchemeTask, true);
    9891016        respond(urlSchemeTask, @"<iframe src='test://otherorigin/nestedmid'></iframe>");
    9901017    } else if ([path isEqualToString:@"/nestedmid"]) {
    991         expectHeaders(urlSchemeTask, false);
     1018        expectLegacyHeaders(urlSchemeTask, false);
    9921019        respond(urlSchemeTask, @"<iframe src='test://toporigin/nestedbottom'></iframe>");
    9931020    } else if ([path isEqualToString:@"/nestedbottom"]) {
    994         expectHeaders(urlSchemeTask, true);
     1021        expectLegacyHeaders(urlSchemeTask, true);
    9951022        respond(urlSchemeTask);
    9961023        thirdTestDone = true;
    9971024    } else if ([path isEqualToString:@"/requestfromaboutblank"]) {
     1025        expectLegacyHeaders(urlSchemeTask, true);
     1026        respond(urlSchemeTask);
     1027        fourthTestDone = true;
     1028    } else if ([path isEqualToString:@"/testcustomheaderfieldhosts"]) {
     1029        expectHeaders(urlSchemeTask, true);
     1030        NSString *html = @"<script>fetch('test://a.b.c.sub.hostwithasterisk.com/hosttest1',{mode:'no-cors'})"
     1031            ".then(function(response){fetch('test://subhostwithasterisk.com/hosttest2',{mode:'no-cors'})})"
     1032            ".then(function(response){fetch('test://hostwithoutasterisk.com/hosttest3',{mode:'no-cors'})})"
     1033            ".then(function(response){fetch('test://a.b.c.sub.hostwithoutasterisk.com/hosttest4',{mode:'no-cors'})})</script>";
     1034        respond(urlSchemeTask, html);
     1035    } else if ([path isEqualToString:@"/hosttest1"]) {
    9981036        expectHeaders(urlSchemeTask, true);
    9991037        respond(urlSchemeTask);
    1000         fourthTestDone = true;
    1001     } else
     1038    } else if ([path isEqualToString:@"/hosttest2"]) {
     1039        expectHeaders(urlSchemeTask, false);
     1040        respond(urlSchemeTask);
     1041    } else if ([path isEqualToString:@"/hosttest3"]) {
     1042        expectHeaders(urlSchemeTask, true);
     1043        respond(urlSchemeTask);
     1044    } else if ([path isEqualToString:@"/hosttest4"]) {
     1045        expectHeaders(urlSchemeTask, false);
     1046        respond(urlSchemeTask);
     1047        fifthTestDone = true;
     1048    } else if ([path isEqualToString:@"/testcustomheaderfieldhosts"])
    10021049        EXPECT_TRUE(false);
    10031050}
     
    10241071    [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"test://toporigin/nestedtop"]]];
    10251072    TestWebKitAPI::Util::run(&thirdTestDone);
     1073
     1074    [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"test://host/testcustomheaderfieldhosts"]]];
     1075    TestWebKitAPI::Util::run(&fifthTestDone);
    10261076}
    10271077
Note: See TracChangeset for help on using the changeset viewer.