Changeset 245038 in webkit


Ignore:
Timestamp:
May 7, 2019 2:51:43 PM (5 years ago)
Author:
commit-queue@webkit.org
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

Patch by Alex Christensen <achristensen@webkit.org> on 2019-05-07
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:
5 added
23 edited
1 copied

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r245036 r245038  
     12019-05-07  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-07  Andy Estes  <aestes@apple.com>
    233
  • trunk/Source/WebCore/Headers.cmake

    r245025 r245038  
    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

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

    r245025 r245038  
    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, ); }; };
     
    88318833                5C5381B31D87E08100E2EBE6 /* JSURLSearchParams.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSURLSearchParams.cpp; sourceTree = "<group>"; };
    88328834                5C5381B41D87E08100E2EBE6 /* JSURLSearchParams.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSURLSearchParams.h; sourceTree = "<group>"; };
     8835                5C5D2383227A063A000B9BDA /* CustomHeaderFields.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CustomHeaderFields.h; sourceTree = "<group>"; };
     8836                5C5D2386227A077C000B9BDA /* CustomHeaderFields.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CustomHeaderFields.cpp; sourceTree = "<group>"; };
    88338837                5C668E641E7C6C3500D32B3B /* SocketStreamHandleImpl.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SocketStreamHandleImpl.cpp; sourceTree = "<group>"; };
    88348838                5C688AA01D380509000B54FA /* ThreadableWebSocketChannel.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ThreadableWebSocketChannel.cpp; sourceTree = "<group>"; };
     
    2501025014                                E1C415DD0F655D7C0092D2FB /* CrossOriginPreflightResultCache.cpp */,
    2501125015                                E1C415D90F655D6F0092D2FB /* CrossOriginPreflightResultCache.h */,
     25016                                5C5D2386227A077C000B9BDA /* CustomHeaderFields.cpp */,
     25017                                5C5D2383227A063A000B9BDA /* CustomHeaderFields.h */,
    2501225018                                93E227DB0AF589AD00D48324 /* DocumentLoader.cpp */,
    2501325019                                656D371E0ADBA5DE00A4554D /* DocumentLoader.h */,
     
    2868228688                                9BD4E91B1C462CFC005065BC /* CustomElementRegistry.h in Headers */,
    2868328689                                62CD325A1157E57C0063B0A7 /* CustomEvent.h in Headers */,
     28690                                5C5D2385227A0652000B9BDA /* CustomHeaderFields.h in Headers */,
    2868428691                                4B1E13E721790D660042CF98 /* CustomPaintCanvas.h in Headers */,
    2868528692                                4B7AE4932177B56F00C59959 /* CustomPaintImage.h in Headers */,
     
    3260632613                                46C696CC1E7205FC00597937 /* CPUMonitor.cpp in Sources */,
    3260732614                                1ABA76CA11D20E50004C201C /* CSSPropertyNames.cpp in Sources */,
     32615                                5CBD59592280E926002B22AA /* CustomHeaderFields.cpp in Sources */,
    3260832616                                BE23480C18A9870B00E4B6E8 /* DataCue.cpp in Sources */,
    3260932617                                4463CF682212FA68001A8577 /* DataDetectorsCoreSoftLink.mm in Sources */,
  • trunk/Source/WebCore/loader/DocumentLoader.cpp

    r244589 r245038  
    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{
  • trunk/Source/WebCore/loader/DocumentLoader.h

    r244382 r245038  
    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    void setCustomHeaderFields(Vector<CustomHeaderFields>&& fields) { m_customHeaderFields = WTFMove(fields); }
     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

    r244700 r245038  
    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

    r245027 r245038  
     12019-05-07  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-07  Adrian Perez de Castro  <aperez@igalia.com>
    249
  • trunk/Source/WebKit/Shared/API/APIObject.h

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

    r244307 r245038  
    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

    r244382 r245038  
    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

    r244382 r245038  
    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

    r245021 r245038  
    242242UIProcess/API/Cocoa/_WKContentRuleListAction.mm
    243243UIProcess/API/Cocoa/_WKContextMenuElementInfo.mm
     244UIProcess/API/Cocoa/_WKCustomHeaderFields.mm @no-unify
    244245UIProcess/API/Cocoa/_WKDownload.mm
    245246UIProcess/API/Cocoa/_WKElementAction.mm
  • trunk/Source/WebKit/UIProcess/API/APIWebsitePolicies.cpp

    r244966 r245038  
    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);
     
    8189WebKit::WebsitePoliciesData WebsitePolicies::data()
    8290{
     91    bool hasLegacyCustomHeaderFields = legacyCustomHeaderFields().size();
     92    Vector<WebCore::CustomHeaderFields> customHeaderFields;
     93    customHeaderFields.reserveInitialCapacity(this->customHeaderFields().size() + hasLegacyCustomHeaderFields);
     94    for (auto& field : this->customHeaderFields())
     95        customHeaderFields.uncheckedAppend(field);
     96    if (hasLegacyCustomHeaderFields)
     97        customHeaderFields.uncheckedAppend({ legacyCustomHeaderFields(), { }});
     98
    8399    return {
    84100        contentBlockersEnabled(),
     
    88104        deviceOrientationAndMotionAccessState(),
    89105#endif
    90         customHeaderFields(),
     106        WTFMove(customHeaderFields),
    91107        popUpPolicy(),
    92108        m_websiteDataStore ? Optional<WebKit::WebsiteDataStoreParameters> { m_websiteDataStore->websiteDataStore().parameters() } : WTF::nullopt,
  • trunk/Source/WebKit/UIProcess/API/APIWebsitePolicies.h

    r244966 r245038  
    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; }
     
    106109
    107110private:
    108     WebsitePolicies(bool contentBlockersEnabled, OptionSet<WebKit::WebsiteAutoplayQuirk>, WebKit::WebsiteAutoplayPolicy, Vector<WebCore::HTTPHeaderField>&&, WebKit::WebsitePopUpPolicy, RefPtr<WebsiteDataStore>&&);
     111    WebsitePolicies(bool contentBlockersEnabled, OptionSet<WebKit::WebsiteAutoplayQuirk>, WebKit::WebsiteAutoplayPolicy, Vector<WebCore::HTTPHeaderField>&&, Vector<WebCore::CustomHeaderFields>&&, WebKit::WebsitePopUpPolicy, RefPtr<WebsiteDataStore>&&);
    109112
    110113    bool m_contentBlockersEnabled { true };
     
    114117    WebCore::DeviceOrientationOrMotionPermissionState m_deviceOrientationAndMotionAccessState { WebCore::DeviceOrientationOrMotionPermissionState::Prompt };
    115118#endif
    116     Vector<WebCore::HTTPHeaderField> m_customHeaderFields;
     119    Vector<WebCore::HTTPHeaderField> m_legacyCustomHeaderFields;
     120    Vector<WebCore::CustomHeaderFields> m_customHeaderFields;
    117121    WebKit::WebsitePopUpPolicy m_popUpPolicy { WebKit::WebsitePopUpPolicy::Default };
    118122    RefPtr<WebsiteDataStore> m_websiteDataStore;
  • trunk/Source/WebKit/UIProcess/API/C/WKWebsitePolicies.cpp

    r239830 r245038  
    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

    r244966 r245038  
    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

    r244966 r245038  
    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/_WKCustomHeaderFields.h

    r245037 r245038  
    11/*
    2  * Copyright (C) 2016 Apple Inc. All rights reserved.
     2 * Copyright (C) 2019 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    2525
    2626#import <WebKit/WKFoundation.h>
    27 #import <WebKit/WKWebpagePreferencesPrivate.h>
    2827
    29 @class WKWebsiteDataStore;
     28NS_ASSUME_NONNULL_BEGIN
    3029
    31 WK_CLASS_AVAILABLE(macos(10.12.3), ios(10.3))
    32 @interface _WKWebsitePolicies : NSObject
     30WK_CLASS_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA))
     31@interface _WKCustomHeaderFields : NSObject
    3332
    34 @property (nonatomic) BOOL contentBlockersEnabled;
    35 @property (nonatomic) _WKWebsiteAutoplayQuirk allowedAutoplayQuirks WK_API_AVAILABLE(macos(10.13), ios(11.0));
    36 @property (nonatomic) _WKWebsiteAutoplayPolicy autoplayPolicy WK_API_AVAILABLE(macos(10.13), ios(11.0));
    37 @property (nonatomic, copy) NSDictionary<NSString *, NSString *> *customHeaderFields WK_API_AVAILABLE(macos(10.13.4), ios(11.3));
    38 @property (nonatomic) _WKWebsitePopUpPolicy popUpPolicy WK_API_AVAILABLE(macos(10.14), ios(12.0));
    39 @property (nonatomic, strong) WKWebsiteDataStore *websiteDataStore WK_API_AVAILABLE(macos(10.13.4), ios(11.3));
    40 @property (nonatomic, copy) NSString *customUserAgent WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA));
    41 @property (nonatomic, copy) NSString *customJavaScriptUserAgentAsSiteSpecificQuirks WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA));
    42 @property (nonatomic, copy) NSString *customNavigatorPlatform WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA));
    43 @property (nonatomic) _WKWebsiteDeviceOrientationAndMotionAccessPolicy deviceOrientationAndMotionAccessPolicy WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA));
     33@property (nonatomic, copy) NSDictionary<NSString *, NSString *> *fields;
     34@property (nonatomic, copy) NSArray<NSString *> *thirdPartyDomains;
    4435
    4536@end
     37
     38NS_ASSUME_NONNULL_END
  • trunk/Source/WebKit/UIProcess/API/Cocoa/_WKWebsitePolicies.h

    r243726 r245038  
    3535@property (nonatomic) _WKWebsiteAutoplayQuirk allowedAutoplayQuirks WK_API_AVAILABLE(macos(10.13), ios(11.0));
    3636@property (nonatomic) _WKWebsiteAutoplayPolicy autoplayPolicy WK_API_AVAILABLE(macos(10.13), ios(11.0));
    37 @property (nonatomic, copy) NSDictionary<NSString *, NSString *> *customHeaderFields WK_API_AVAILABLE(macos(10.13.4), ios(11.3));
    3837@property (nonatomic) _WKWebsitePopUpPolicy popUpPolicy WK_API_AVAILABLE(macos(10.14), ios(12.0));
    3938@property (nonatomic, strong) WKWebsiteDataStore *websiteDataStore WK_API_AVAILABLE(macos(10.13.4), ios(11.3));
  • trunk/Source/WebKit/UIProcess/API/Cocoa/_WKWebsitePolicies.mm

    r243726 r245038  
    9696}
    9797
    98 - (NSDictionary<NSString *, NSString *> *)customHeaderFields
    99 {
    100     return [_webpagePreferences _customHeaderFields];
    101 }
    102 
    103 - (void)setCustomHeaderFields:(NSDictionary<NSString *, NSString *> *)fields
    104 {
    105     [_webpagePreferences _setCustomHeaderFields:fields];
    106 }
    107 
    10898- (WKWebsiteDataStore *)websiteDataStore
    10999{
  • trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj

    r245021 r245038  
    10781078                5C5CEC34220912B400D6BBB0 /* AuxiliaryProcessMain.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5C5CEC31220912AF00D6BBB0 /* AuxiliaryProcessMain.cpp */; };
    10791079                5C5CEC35220912B400D6BBB0 /* AuxiliaryProcessMain.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5C5CEC31220912AF00D6BBB0 /* AuxiliaryProcessMain.cpp */; };
     1080                5C5D238C227A2CDA000B9BDA /* _WKCustomHeaderFields.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C5D2389227A1892000B9BDA /* _WKCustomHeaderFields.h */; settings = {ATTRIBUTES = (Private, ); }; };
    10801081                5C62FDF91EFC271C00CE072E /* WKURLSchemeTaskPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C62FDF81EFC263C00CE072E /* WKURLSchemeTaskPrivate.h */; settings = {ATTRIBUTES = (Private, ); }; };
    10811082                5C7FB47021E97DC5009E3241 /* WebCookieJar.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C7FB46F21E97C0C009E3241 /* WebCookieJar.h */; };
     
    10921093                5CB2378E1DF0E0D300117AA3 /* _WKWebsitePoliciesInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 5CB2378D1DF0E0C200117AA3 /* _WKWebsitePoliciesInternal.h */; };
    10931094                5CBC9B8E1C652CA000A8FDCF /* NetworkDataTask.h in Headers */ = {isa = PBXBuildFile; fileRef = 5CBC9B891C6524A500A8FDCF /* NetworkDataTask.h */; };
     1095                5CBD595C2280EDF4002B22AA /* _WKCustomHeaderFields.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5C5D2388227A1892000B9BDA /* _WKCustomHeaderFields.mm */; };
    10941096                5CD286511E7235990094FDC8 /* WKContentRuleListStore.h in Headers */ = {isa = PBXBuildFile; fileRef = 5CD2864D1E722F440094FDC8 /* WKContentRuleListStore.h */; settings = {ATTRIBUTES = (Public, ); }; };
    10951097                5CD286531E7235AA0094FDC8 /* _WKUserContentFilterPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 5CD286491E722F440094FDC8 /* _WKUserContentFilterPrivate.h */; settings = {ATTRIBUTES = (Private, ); }; };
     
    35253527                5C5CEC382209583200D6BBB0 /* DaemonEntryPoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DaemonEntryPoint.h; sourceTree = "<group>"; };
    35263528                5C5CEC392209583200D6BBB0 /* DaemonEntryPoint.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = DaemonEntryPoint.mm; sourceTree = "<group>"; };
     3529                5C5D2387227A1891000B9BDA /* _WKCustomHeaderFieldsInternal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _WKCustomHeaderFieldsInternal.h; sourceTree = "<group>"; };
     3530                5C5D2388227A1892000B9BDA /* _WKCustomHeaderFields.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = _WKCustomHeaderFields.mm; sourceTree = "<group>"; };
     3531                5C5D2389227A1892000B9BDA /* _WKCustomHeaderFields.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _WKCustomHeaderFields.h; sourceTree = "<group>"; };
     3532                5C5D238A227A1D9B000B9BDA /* APICustomHeaderFields.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APICustomHeaderFields.h; sourceTree = "<group>"; };
    35273533                5C62FDF81EFC263C00CE072E /* WKURLSchemeTaskPrivate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WKURLSchemeTaskPrivate.h; sourceTree = "<group>"; };
    35283534                5C6CE6D01F59BC460007C6CB /* PageClientImplCocoa.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = PageClientImplCocoa.mm; sourceTree = "<group>"; };
     
    61336139                                1A5704F61BE01FF400874AF1 /* _WKContextMenuElementInfo.h */,
    61346140                                1A5704F51BE01FF400874AF1 /* _WKContextMenuElementInfo.mm */,
     6141                                5C5D2389227A1892000B9BDA /* _WKCustomHeaderFields.h */,
     6142                                5C5D2388227A1892000B9BDA /* _WKCustomHeaderFields.mm */,
     6143                                5C5D2387227A1891000B9BDA /* _WKCustomHeaderFieldsInternal.h */,
    61356144                                83891B681A68BEBC0030F386 /* _WKDiagnosticLoggingDelegate.h */,
    61366145                                A1A4FE5718DCE9FA00B5EA8A /* _WKDownload.h */,
     
    76957704                                7C3A06A61AAB903E009D74BA /* APIContentRuleListStore.h */,
    76967705                                076E884D1A13CADF005E90FC /* APIContextMenuClient.h */,
     7706                                5C5D238A227A1D9B000B9BDA /* APICustomHeaderFields.h */,
    76977707                                7A821F4F1E2F7A5C00604577 /* APICustomProtocolManagerClient.h */,
    76987708                                83891B621A68B3420030F386 /* APIDiagnosticLoggingClient.h */,
     
    90069016                                5C4609E8224317BB009943C2 /* _WKContentRuleListActionInternal.h in Headers */,
    90079017                                1A5704F81BE01FF400874AF1 /* _WKContextMenuElementInfo.h in Headers */,
     9018                                5C5D238C227A2CDA000B9BDA /* _WKCustomHeaderFields.h in Headers */,
    90089019                                83891B691A68BEBC0030F386 /* _WKDiagnosticLoggingDelegate.h in Headers */,
    90099020                                A1A4FE5A18DCE9FA00B5EA8A /* _WKDownload.h in Headers */,
     
    1094210953                        buildActionMask = 2147483647;
    1094310954                        files = (
     10955                                5CBD595C2280EDF4002B22AA /* _WKCustomHeaderFields.mm in Sources */,
    1094410956                                99E7189A21F79D9E0055E975 /* _WKTouchEventGenerator.mm in Sources */,
    1094510957                                2D92A784212B6AB100F493FD /* ActivityAssertion.cpp in Sources */,
  • trunk/Tools/ChangeLog

    r245037 r245038  
     12019-05-07  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-07  Keith Rollin  <krollin@apple.com>
    217
  • trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WebsitePolicies.mm

    r244390 r245038  
    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.