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

Changeset 245979 in webkit


Ignore:
Timestamp:
May 31, 2019, 1:00:07 PM (7 years ago)
Author:
timothy_horton@apple.com
Message:

Optionally respect device management restrictions when loading from the network
https://bugs.webkit.org/show_bug.cgi?id=198318
<rdar://problem/44263806>

Reviewed by Alex Christensen.

Source/WebCore:

  • en.lproj/Localizable.strings:

Source/WebKit:

  • Configurations/Network-iOS.entitlements:
  • Resources/SandboxProfiles/ios/com.apple.WebKit.Networking.sb:

Add some entitlements and sandbox holes required to talk to DeviceManagement.

  • NetworkProcess/NetworkCORSPreflightChecker.cpp:

(WebKit::NetworkCORSPreflightChecker::wasBlockedByRestrictions):

  • NetworkProcess/NetworkCORSPreflightChecker.h:
  • NetworkProcess/NetworkLoad.cpp:

(WebKit::NetworkLoad::wasBlockedByRestrictions):

  • NetworkProcess/NetworkLoad.h:
  • NetworkProcess/PingLoad.cpp:

(WebKit::PingLoad::wasBlockedByRestrictions):

  • NetworkProcess/PingLoad.h:
  • Shared/WebErrors.cpp:

(WebKit::wasBlockedByRestrictionsError):

  • Shared/WebErrors.h:
  • NetworkProcess/NetworkDataTask.cpp:

(WebKit::NetworkDataTask::create):
(WebKit::NetworkDataTask::failureTimerFired):

  • NetworkProcess/NetworkDataTask.h:
  • Shared/API/APIError.h:
  • Shared/API/c/WKErrorRef.cpp:

(WKErrorGetErrorCode):

  • Shared/API/c/WKErrorRef.h:

Plumb a new error for loads that are blocked by device management restrictions.

  • NetworkProcess/NetworkLoadParameters.h:
  • NetworkProcess/NetworkResourceLoadParameters.cpp:

(WebKit::NetworkResourceLoadParameters::encode const):
(WebKit::NetworkResourceLoadParameters::decode):

  • WebProcess/Network/WebLoaderStrategy.cpp:

(WebKit::WebLoaderStrategy::scheduleLoadFromNetworkProcess):
Plumb a new bit that indicates whether a load is for the main resource of a frame.
We will only apply device management restrictions to main resources.

  • NetworkProcess/NetworkSessionCreationParameters.cpp:

(WebKit::NetworkSessionCreationParameters::privateSessionParameters):
(WebKit::NetworkSessionCreationParameters::encode const):
(WebKit::NetworkSessionCreationParameters::decode):

  • NetworkProcess/NetworkSessionCreationParameters.h:
  • UIProcess/WebsiteData/Cocoa/WebsiteDataStoreCocoa.mm:

(WebKit::WebsiteDataStore::parameters):
Plumb a new bit indicating whether a network session should respect device mangement
restrictions.

  • NetworkProcess/cocoa/NetworkDataTaskCocoa.h:
  • NetworkProcess/cocoa/NetworkDataTaskCocoa.mm:

(WebKit::NetworkDataTaskCocoa::NetworkDataTaskCocoa):
(WebKit::NetworkDataTaskCocoa::resume):
Defer resuming the load until we have a reply from DeviceManagement framework
about whether the URL should be blocked. If it is blocked, instead fail the load.

  • NetworkProcess/cocoa/NetworkSessionCocoa.h:
  • NetworkProcess/cocoa/NetworkSessionCocoa.mm:

(-[WKNetworkSessionDelegate URLSession:dataTask:didReceiveResponse:completionHandler:]):
(WebKit::NetworkSessionCocoa::NetworkSessionCocoa):
(WebKit::NetworkSessionCocoa::deviceManagementPolicyMonitor):
Cache a single DMFWebsitePolicyMonitor instance per NetworkSession.

  • UIProcess/API/APIWebsiteDataStore.cpp:

(API::WebsiteDataStore::defaultDataStoreConfiguration):
The default data store is persistent; its configuration should reflect that.

  • UIProcess/API/Cocoa/WKProcessPool.mm:

(-[WKProcessPool _setAllowsAnySSLCertificateForServiceWorker:]): Style.

  • UIProcess/API/Cocoa/WKWebsiteDataStore.mm:

(-[WKWebsiteDataStore _initWithConfiguration:]):
Make it possible to create a non-persistent WKWebsiteDataStore from a
configuration, and ensure that it does not have any persistent storage directories set.

  • UIProcess/API/Cocoa/_WKWebsiteDataStoreConfiguration.h:
  • UIProcess/API/Cocoa/_WKWebsiteDataStoreConfiguration.mm:

(-[_WKWebsiteDataStoreConfiguration init]):
(-[_WKWebsiteDataStoreConfiguration initWithNonPersistentConfiguration]):
(-[_WKWebsiteDataStoreConfiguration isPersistent]):
(-[_WKWebsiteDataStoreConfiguration _setWebStorageDirectory:]):
(-[_WKWebsiteDataStoreConfiguration _setIndexedDBDatabaseDirectory:]):
(-[_WKWebsiteDataStoreConfiguration _setWebSQLDatabaseDirectory:]):
(-[_WKWebsiteDataStoreConfiguration _setCookieStorageFile:]):
(-[_WKWebsiteDataStoreConfiguration _setResourceLoadStatisticsDirectory:]):
(-[_WKWebsiteDataStoreConfiguration _setCacheStorageDirectory:]):
(-[_WKWebsiteDataStoreConfiguration _setServiceWorkerRegistrationDirectory:]):
(-[_WKWebsiteDataStoreConfiguration deviceManagementRestrictionsEnabled]):
(-[_WKWebsiteDataStoreConfiguration setDeviceManagementRestrictionsEnabled:]):

  • UIProcess/WebsiteData/WebsiteDataStoreConfiguration.cpp:

(WebKit::WebsiteDataStoreConfiguration::copy):

  • UIProcess/WebsiteData/WebsiteDataStoreConfiguration.h:

(WebKit::WebsiteDataStoreConfiguration::isPersistent const):
(WebKit::WebsiteDataStoreConfiguration::setPersistent):
(WebKit::WebsiteDataStoreConfiguration::perOriginStorageQuota const):
(WebKit::WebsiteDataStoreConfiguration::deviceManagementRestrictionsEnabled const):
(WebKit::WebsiteDataStoreConfiguration::setDeviceManagementRestrictionsEnabled):
(WebKit::WebsiteDataStoreConfiguration::perOriginStorageQuota): Deleted.
Make it possible to create a _WKWebsiteDataStoreConfiguration that will create a non-persistent
data store. Add a bit to _WKWebsiteDataStoreConfiguration that controls whether the network
session will respect device management restrictions.

  • WebKit.xcodeproj/project.pbxproj:
  • WebKit/NetworkProcess/cocoa/DeviceManagementSoftLink.h:
  • WebKit/NetworkProcess/cocoa/DeviceManagementSoftLink.mm:
  • WebKit/Platform/spi/Cocoa/DeviceManagementSPI.h:

Add some soft-linking and SPI headers.

Source/WTF:

  • wtf/Platform.h:

Add a HAVE flag for DeviceManagement.framework.
It does exist in the simulator, but does not function; pretend it doesn't exist.

Tools:

  • TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
  • TestWebKitAPI/Tests/WebKitCocoa/DeviceManagementRestrictions.mm: Added.

(TEST):

  • TestWebKitAPI/Tests/WebKitCocoa/WKWebsiteDatastore.mm:

(TestWebKitAPI::TEST):

  • TestWebKitAPI/Tests/WebKitCocoa/WebsiteDataStoreCustomPaths.mm:

(TEST):
Clone a test that tests non-persistent data stores and ensure
that it works if the data store is created via a configuration as well.

Add a test that ensures that you can't create a data store configuration
with an invalid set of options.

Add a test that device management restrictions (when mocked) correctly
fail the load with a new, appropriate error.

Location:
trunk
Files:
4 added
43 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WTF/ChangeLog

    r245972 r245979  
     12019-05-31  Tim Horton  <timothy_horton@apple.com>
     2
     3        Optionally respect device management restrictions when loading from the network
     4        https://bugs.webkit.org/show_bug.cgi?id=198318
     5        <rdar://problem/44263806>
     6
     7        Reviewed by Alex Christensen.
     8
     9        * wtf/Platform.h:
     10        Add a HAVE flag for DeviceManagement.framework.
     11        It does exist in the simulator, but does not function; pretend it doesn't exist.
     12
    1132019-05-31  Geoffrey Garen  <ggaren@apple.com>
    214
  • trunk/Source/WTF/wtf/Platform.h

    r245672 r245979  
    15481548#endif
    15491549
     1550#if (PLATFORM(IOS) && __IPHONE_OS_VERSION_MIN_REQUIRED >= 120000 && !PLATFORM(IOS_SIMULATOR))
     1551#define HAVE_DEVICE_MANAGEMENT 1
     1552#endif
     1553
    15501554#if PLATFORM(MAC) && __MAC_OS_X_VERSION_MAX_ALLOWED < 101500
    15511555#define USE_REALPATH_FOR_DLOPEN_PREFLIGHT 1
  • trunk/Source/WebCore/ChangeLog

    r245977 r245979  
     12019-05-31  Tim Horton  <timothy_horton@apple.com>
     2
     3        Optionally respect device management restrictions when loading from the network
     4        https://bugs.webkit.org/show_bug.cgi?id=198318
     5        <rdar://problem/44263806>
     6
     7        Reviewed by Alex Christensen.
     8
     9        * en.lproj/Localizable.strings:
     10
    1112019-05-31  Simon Fraser  <simon.fraser@apple.com>
    212
  • trunk/Source/WebCore/en.lproj/Localizable.strings

    r244742 r245979  
    803803"The URL was blocked by a content filter" = "The URL was blocked by a content filter";
    804804
     805/* WebKitErrorFrameLoadBlockedByRestrictions description */
     806"The URL was blocked by device restrictions" = "The URL was blocked by device restrictions";
     807
    805808/* WKErrorWebViewInvalidated description */
    806809"The WKWebView was invalidated" = "The WKWebView was invalidated";
  • trunk/Source/WebKit/ChangeLog

    r245978 r245979  
     12019-05-31  Tim Horton  <timothy_horton@apple.com>
     2
     3        Optionally respect device management restrictions when loading from the network
     4        https://bugs.webkit.org/show_bug.cgi?id=198318
     5        <rdar://problem/44263806>
     6
     7        Reviewed by Alex Christensen.
     8
     9        * Configurations/Network-iOS.entitlements:
     10        * Resources/SandboxProfiles/ios/com.apple.WebKit.Networking.sb:
     11        Add some entitlements and sandbox holes required to talk to DeviceManagement.
     12
     13        * NetworkProcess/NetworkCORSPreflightChecker.cpp:
     14        (WebKit::NetworkCORSPreflightChecker::wasBlockedByRestrictions):
     15        * NetworkProcess/NetworkCORSPreflightChecker.h:
     16        * NetworkProcess/NetworkLoad.cpp:
     17        (WebKit::NetworkLoad::wasBlockedByRestrictions):
     18        * NetworkProcess/NetworkLoad.h:
     19        * NetworkProcess/PingLoad.cpp:
     20        (WebKit::PingLoad::wasBlockedByRestrictions):
     21        * NetworkProcess/PingLoad.h:
     22        * Shared/WebErrors.cpp:
     23        (WebKit::wasBlockedByRestrictionsError):
     24        * Shared/WebErrors.h:
     25        * NetworkProcess/NetworkDataTask.cpp:
     26        (WebKit::NetworkDataTask::create):
     27        (WebKit::NetworkDataTask::failureTimerFired):
     28        * NetworkProcess/NetworkDataTask.h:
     29        * Shared/API/APIError.h:
     30        * Shared/API/c/WKErrorRef.cpp:
     31        (WKErrorGetErrorCode):
     32        * Shared/API/c/WKErrorRef.h:
     33        Plumb a new error for loads that are blocked by device management restrictions.
     34
     35        * NetworkProcess/NetworkLoadParameters.h:
     36        * NetworkProcess/NetworkResourceLoadParameters.cpp:
     37        (WebKit::NetworkResourceLoadParameters::encode const):
     38        (WebKit::NetworkResourceLoadParameters::decode):
     39        * WebProcess/Network/WebLoaderStrategy.cpp:
     40        (WebKit::WebLoaderStrategy::scheduleLoadFromNetworkProcess):
     41        Plumb a new bit that indicates whether a load is for the main resource of a frame.
     42        We will only apply device management restrictions to main resources.
     43
     44        * NetworkProcess/NetworkSessionCreationParameters.cpp:
     45        (WebKit::NetworkSessionCreationParameters::privateSessionParameters):
     46        (WebKit::NetworkSessionCreationParameters::encode const):
     47        (WebKit::NetworkSessionCreationParameters::decode):
     48        * NetworkProcess/NetworkSessionCreationParameters.h:
     49        * UIProcess/WebsiteData/Cocoa/WebsiteDataStoreCocoa.mm:
     50        (WebKit::WebsiteDataStore::parameters):
     51        Plumb a new bit indicating whether a network session should respect device mangement
     52        restrictions.
     53
     54        * NetworkProcess/cocoa/NetworkDataTaskCocoa.h:
     55        * NetworkProcess/cocoa/NetworkDataTaskCocoa.mm:
     56        (WebKit::NetworkDataTaskCocoa::NetworkDataTaskCocoa):
     57        (WebKit::NetworkDataTaskCocoa::resume):
     58        Defer resuming the load until we have a reply from DeviceManagement framework
     59        about whether the URL should be blocked. If it is blocked, instead fail the load.
     60
     61        * NetworkProcess/cocoa/NetworkSessionCocoa.h:
     62        * NetworkProcess/cocoa/NetworkSessionCocoa.mm:
     63        (-[WKNetworkSessionDelegate URLSession:dataTask:didReceiveResponse:completionHandler:]):
     64        (WebKit::NetworkSessionCocoa::NetworkSessionCocoa):
     65        (WebKit::NetworkSessionCocoa::deviceManagementPolicyMonitor):
     66        Cache a single DMFWebsitePolicyMonitor instance per NetworkSession.
     67       
     68        * UIProcess/API/APIWebsiteDataStore.cpp:
     69        (API::WebsiteDataStore::defaultDataStoreConfiguration):
     70        The default data store is persistent; its configuration should reflect that.
     71
     72        * UIProcess/API/Cocoa/WKProcessPool.mm:
     73        (-[WKProcessPool _setAllowsAnySSLCertificateForServiceWorker:]): Style.
     74
     75        * UIProcess/API/Cocoa/WKWebsiteDataStore.mm:
     76        (-[WKWebsiteDataStore _initWithConfiguration:]):
     77        Make it possible to create a non-persistent WKWebsiteDataStore from a
     78        configuration, and ensure that it does not have any persistent storage directories set.
     79
     80        * UIProcess/API/Cocoa/_WKWebsiteDataStoreConfiguration.h:
     81        * UIProcess/API/Cocoa/_WKWebsiteDataStoreConfiguration.mm:
     82        (-[_WKWebsiteDataStoreConfiguration init]):
     83        (-[_WKWebsiteDataStoreConfiguration initWithNonPersistentConfiguration]):
     84        (-[_WKWebsiteDataStoreConfiguration isPersistent]):
     85        (-[_WKWebsiteDataStoreConfiguration _setWebStorageDirectory:]):
     86        (-[_WKWebsiteDataStoreConfiguration _setIndexedDBDatabaseDirectory:]):
     87        (-[_WKWebsiteDataStoreConfiguration _setWebSQLDatabaseDirectory:]):
     88        (-[_WKWebsiteDataStoreConfiguration _setCookieStorageFile:]):
     89        (-[_WKWebsiteDataStoreConfiguration _setResourceLoadStatisticsDirectory:]):
     90        (-[_WKWebsiteDataStoreConfiguration _setCacheStorageDirectory:]):
     91        (-[_WKWebsiteDataStoreConfiguration _setServiceWorkerRegistrationDirectory:]):
     92        (-[_WKWebsiteDataStoreConfiguration deviceManagementRestrictionsEnabled]):
     93        (-[_WKWebsiteDataStoreConfiguration setDeviceManagementRestrictionsEnabled:]):
     94        * UIProcess/WebsiteData/WebsiteDataStoreConfiguration.cpp:
     95        (WebKit::WebsiteDataStoreConfiguration::copy):
     96        * UIProcess/WebsiteData/WebsiteDataStoreConfiguration.h:
     97        (WebKit::WebsiteDataStoreConfiguration::isPersistent const):
     98        (WebKit::WebsiteDataStoreConfiguration::setPersistent):
     99        (WebKit::WebsiteDataStoreConfiguration::perOriginStorageQuota const):
     100        (WebKit::WebsiteDataStoreConfiguration::deviceManagementRestrictionsEnabled const):
     101        (WebKit::WebsiteDataStoreConfiguration::setDeviceManagementRestrictionsEnabled):
     102        (WebKit::WebsiteDataStoreConfiguration::perOriginStorageQuota): Deleted.
     103        Make it possible to create a _WKWebsiteDataStoreConfiguration that will create a non-persistent
     104        data store. Add a bit to _WKWebsiteDataStoreConfiguration that controls whether the network
     105        session will respect device management restrictions.
     106
     107        * WebKit.xcodeproj/project.pbxproj:
     108        * WebKit/NetworkProcess/cocoa/DeviceManagementSoftLink.h:
     109        * WebKit/NetworkProcess/cocoa/DeviceManagementSoftLink.mm:
     110        * WebKit/Platform/spi/Cocoa/DeviceManagementSPI.h:
     111        Add some soft-linking and SPI headers.
     112
    11132019-05-31  Ryan Haddad  <ryanhaddad@apple.com>
    2114
  • trunk/Source/WebKit/NetworkProcess/NetworkCORSPreflightChecker.cpp

    r244225 r245979  
    164164}
    165165
     166void NetworkCORSPreflightChecker::wasBlockedByRestrictions()
     167{
     168    RELEASE_LOG_IF_ALLOWED("wasBlockedByRestrictions");
     169    m_completionCallback(ResourceError { errorDomainWebKitInternal, 0, m_parameters.originalRequest.url(), "Preflight response was blocked"_s, ResourceError::Type::AccessControl });
     170}
     171
    166172NetworkTransactionInformation NetworkCORSPreflightChecker::takeInformation()
    167173{
  • trunk/Source/WebKit/NetworkProcess/NetworkCORSPreflightChecker.h

    r245796 r245979  
    7373    void wasBlocked() final;
    7474    void cannotShowURL() final;
     75    void wasBlockedByRestrictions() final;
    7576
    7677    Parameters m_parameters;
  • trunk/Source/WebKit/NetworkProcess/NetworkDataTask.cpp

    r244225 r245979  
    5151    ASSERT(!parameters.request.url().protocolIsBlob());
    5252#if PLATFORM(COCOA)
    53     return NetworkDataTaskCocoa::create(session, client, parameters.request, parameters.webFrameID, parameters.webPageID, parameters.storedCredentialsPolicy, parameters.contentSniffingPolicy, parameters.contentEncodingSniffingPolicy, parameters.shouldClearReferrerOnHTTPSToHTTPRedirect, parameters.shouldPreconnectOnly, parameters.isMainFrameNavigation, parameters.networkActivityTracker);
     53    return NetworkDataTaskCocoa::create(session, client, parameters.request, parameters.webFrameID, parameters.webPageID, parameters.storedCredentialsPolicy, parameters.contentSniffingPolicy, parameters.contentEncodingSniffingPolicy, parameters.shouldClearReferrerOnHTTPSToHTTPRedirect, parameters.shouldPreconnectOnly, parameters.isMainFrameNavigation, parameters.isMainResourceNavigationForAnyFrame, parameters.networkActivityTracker);
    5454#endif
    5555#if USE(SOUP)
     
    134134            m_client->cannotShowURL();
    135135        return;
     136    case RestrictedURLFailure:
     137        m_scheduledFailureType = NoFailure;
     138        if (m_client)
     139            m_client->wasBlockedByRestrictions();
     140        return;
    136141    case NoFailure:
    137142        ASSERT_NOT_REACHED();
  • trunk/Source/WebKit/NetworkProcess/NetworkDataTask.h

    r242304 r245979  
    6666    virtual void wasBlocked() = 0;
    6767    virtual void cannotShowURL() = 0;
     68    virtual void wasBlockedByRestrictions() = 0;
    6869
    6970    virtual bool shouldCaptureExtraNetworkLoadMetrics() const { return false; }
     
    135136        NoFailure,
    136137        BlockedFailure,
    137         InvalidURLFailure
     138        InvalidURLFailure,
     139        RestrictedURLFailure
    138140    };
    139141    void failureTimerFired();
  • trunk/Source/WebKit/NetworkProcess/NetworkLoad.cpp

    r244910 r245979  
    277277}
    278278
     279void NetworkLoad::wasBlockedByRestrictions()
     280{
     281    m_client.get().didFailLoading(wasBlockedByRestrictionsError(m_currentRequest));
     282}
    279283
    280284String NetworkLoad::description() const
  • trunk/Source/WebKit/NetworkProcess/NetworkLoad.h

    r244910 r245979  
    8181    void wasBlocked() final;
    8282    void cannotShowURL() final;
     83    void wasBlockedByRestrictions() final;
    8384
    8485    void notifyDidReceiveResponse(WebCore::ResourceResponse&&, ResponseCompletionHandler&&);
  • trunk/Source/WebKit/NetworkProcess/NetworkLoadParameters.h

    r245796 r245979  
    5252    bool needsCertificateInfo { false };
    5353    bool isMainFrameNavigation { false };
     54    bool isMainResourceNavigationForAnyFrame { false };
    5455    Vector<RefPtr<WebCore::BlobDataFileReference>> blobFileReferences;
    5556    PreconnectOnly shouldPreconnectOnly { PreconnectOnly::No };
  • trunk/Source/WebKit/NetworkProcess/NetworkResourceLoadParameters.cpp

    r245796 r245979  
    7979    encoder << needsCertificateInfo;
    8080    encoder << isMainFrameNavigation;
     81    encoder << isMainResourceNavigationForAnyFrame;
    8182    encoder << maximumBufferingTime;
    8283
     
    170171    if (!decoder.decode(result.isMainFrameNavigation))
    171172        return false;
     173    if (!decoder.decode(result.isMainResourceNavigationForAnyFrame))
     174        return false;
    172175    if (!decoder.decode(result.maximumBufferingTime))
    173176        return false;
  • trunk/Source/WebKit/NetworkProcess/NetworkSessionCreationParameters.cpp

    r245540 r245979  
    5151        , { }, { }
    5252#endif
    53         , { }, { }, false, { }, { }, { }, { }, { }
     53        , { }, { }, false, { }, { }, { }, { }, { }, { }, { }
    5454    };
    5555}
     
    8585    encoder << resourceLoadStatisticsManualPrevalentResource;
    8686
    87     encoder << localStorageDirectory <<  localStorageDirectoryExtensionHandle;
     87    encoder << localStorageDirectory << localStorageDirectoryExtensionHandle;
     88
     89    encoder << deviceManagementRestrictionsEnabled;
     90    encoder << allLoadsBlockedByDeviceManagementRestrictionsForTesting;
    8891}
    8992
     
    207210    decoder >> localStorageDirectoryExtensionHandle;
    208211    if (!localStorageDirectoryExtensionHandle)
     212        return WTF::nullopt;
     213
     214    Optional<bool> deviceManagementRestrictionsEnabled;
     215    decoder >> deviceManagementRestrictionsEnabled;
     216    if (!deviceManagementRestrictionsEnabled)
     217        return WTF::nullopt;
     218
     219    Optional<bool> allLoadsBlockedByDeviceManagementRestrictionsForTesting;
     220    decoder >> allLoadsBlockedByDeviceManagementRestrictionsForTesting;
     221    if (!allLoadsBlockedByDeviceManagementRestrictionsForTesting)
    209222        return WTF::nullopt;
    210223
     
    236249        , WTFMove(*shouldIncludeLocalhostInResourceLoadStatistics)
    237250        , WTFMove(*enableResourceLoadStatisticsDebugMode)
     251        , WTFMove(*deviceManagementRestrictionsEnabled)
     252        , WTFMove(*allLoadsBlockedByDeviceManagementRestrictionsForTesting)
    238253        , WTFMove(*resourceLoadStatisticsManualPrevalentResource)
    239254        , WTFMove(*localStorageDirectory)
  • trunk/Source/WebKit/NetworkProcess/NetworkSessionCreationParameters.h

    r245540 r245979  
    8787    bool shouldIncludeLocalhostInResourceLoadStatistics { true };
    8888    bool enableResourceLoadStatisticsDebugMode { false };
     89    bool deviceManagementRestrictionsEnabled { false };
     90    bool allLoadsBlockedByDeviceManagementRestrictionsForTesting { false };
    8991    WebCore::RegistrableDomain resourceLoadStatisticsManualPrevalentResource { };
    9092
  • trunk/Source/WebKit/NetworkProcess/PingLoad.cpp

    r244389 r245979  
    201201}
    202202
     203void PingLoad::wasBlockedByRestrictions()
     204{
     205    RELEASE_LOG_IF_ALLOWED("wasBlockedByRestrictions");
     206    didFinish(wasBlockedByRestrictionsError(ResourceRequest { currentURL() }));
     207}
     208
    203209void PingLoad::timeoutTimerFired()
    204210{
  • trunk/Source/WebKit/NetworkProcess/PingLoad.h

    r244288 r245979  
    5959    void wasBlocked() final;
    6060    void cannotShowURL() final;
     61    void wasBlockedByRestrictions() final;
    6162    void timeoutTimerFired();
    6263
  • trunk/Source/WebKit/NetworkProcess/cocoa/NetworkDataTaskCocoa.h

    r245796 r245979  
    4343    friend class NetworkSessionCocoa;
    4444public:
    45     static Ref<NetworkDataTask> create(NetworkSession& session, NetworkDataTaskClient& client, const WebCore::ResourceRequest& request, uint64_t frameID, WebCore::PageIdentifier pageID, WebCore::StoredCredentialsPolicy storedCredentialsPolicy, WebCore::ContentSniffingPolicy shouldContentSniff, WebCore::ContentEncodingSniffingPolicy shouldContentEncodingSniff, bool shouldClearReferrerOnHTTPSToHTTPRedirect, PreconnectOnly shouldPreconnectOnly, bool dataTaskIsForMainFrameNavigation, Optional<NetworkActivityTracker> networkActivityTracker)
     45    static Ref<NetworkDataTask> create(NetworkSession& session, NetworkDataTaskClient& client, const WebCore::ResourceRequest& request, uint64_t frameID, WebCore::PageIdentifier pageID, WebCore::StoredCredentialsPolicy storedCredentialsPolicy, WebCore::ContentSniffingPolicy shouldContentSniff, WebCore::ContentEncodingSniffingPolicy shouldContentEncodingSniff, bool shouldClearReferrerOnHTTPSToHTTPRedirect, PreconnectOnly shouldPreconnectOnly, bool dataTaskIsForMainFrameNavigation, bool dataTaskIsForMainResourceNavigationForAnyFrame, Optional<NetworkActivityTracker> networkActivityTracker)
    4646    {
    47         return adoptRef(*new NetworkDataTaskCocoa(session, client, request, frameID, pageID, storedCredentialsPolicy, shouldContentSniff, shouldContentEncodingSniff, shouldClearReferrerOnHTTPSToHTTPRedirect, shouldPreconnectOnly, dataTaskIsForMainFrameNavigation, networkActivityTracker));
     47        return adoptRef(*new NetworkDataTaskCocoa(session, client, request, frameID, pageID, storedCredentialsPolicy, shouldContentSniff, shouldContentEncodingSniff, shouldClearReferrerOnHTTPSToHTTPRedirect, shouldPreconnectOnly, dataTaskIsForMainFrameNavigation, dataTaskIsForMainResourceNavigationForAnyFrame, networkActivityTracker));
    4848    }
    4949
     
    7676
    7777private:
    78     NetworkDataTaskCocoa(NetworkSession&, NetworkDataTaskClient&, const WebCore::ResourceRequest&, uint64_t frameID, WebCore::PageIdentifier, WebCore::StoredCredentialsPolicy, WebCore::ContentSniffingPolicy, WebCore::ContentEncodingSniffingPolicy, bool shouldClearReferrerOnHTTPSToHTTPRedirect, PreconnectOnly, bool dataTaskIsForMainFrameNavigation, Optional<NetworkActivityTracker>);
     78    NetworkDataTaskCocoa(NetworkSession&, NetworkDataTaskClient&, const WebCore::ResourceRequest&, uint64_t frameID, WebCore::PageIdentifier, WebCore::StoredCredentialsPolicy, WebCore::ContentSniffingPolicy, WebCore::ContentEncodingSniffingPolicy, bool shouldClearReferrerOnHTTPSToHTTPRedirect, PreconnectOnly, bool dataTaskIsForMainFrameNavigation, bool dataTaskIsForMainResourceNavigationForAnyFrame, Optional<NetworkActivityTracker>);
    7979
    8080    bool tryPasswordBasedAuthentication(const WebCore::AuthenticationChallenge&, ChallengeCompletionHandler&);
     
    9999    bool m_hasBeenSetToUseStatelessCookieStorage { false };
    100100#endif
     101
     102    bool m_isForMainResourceNavigationForAnyFrame { false };
    101103};
    102104
  • trunk/Source/WebKit/NetworkProcess/cocoa/NetworkDataTaskCocoa.mm

    r245796 r245979  
    2929#import "AuthenticationChallengeDisposition.h"
    3030#import "AuthenticationManager.h"
     31#import "DeviceManagementSPI.h"
    3132#import "Download.h"
    3233#import "DownloadProxyMessages.h"
     
    4041#import <WebCore/ResourceRequest.h>
    4142#import <pal/spi/cf/CFNetworkSPI.h>
     43#import <wtf/BlockPtr.h>
    4244#import <wtf/FileSystem.h>
    4345#import <wtf/MainThread.h>
     
    161163}
    162164
    163 NetworkDataTaskCocoa::NetworkDataTaskCocoa(NetworkSession& session, NetworkDataTaskClient& client, const WebCore::ResourceRequest& requestWithCredentials, uint64_t frameID, WebCore::PageIdentifier pageID, WebCore::StoredCredentialsPolicy storedCredentialsPolicy, WebCore::ContentSniffingPolicy shouldContentSniff, WebCore::ContentEncodingSniffingPolicy shouldContentEncodingSniff, bool shouldClearReferrerOnHTTPSToHTTPRedirect, PreconnectOnly shouldPreconnectOnly, bool dataTaskIsForMainFrameNavigation, Optional<NetworkActivityTracker> networkActivityTracker)
     165NetworkDataTaskCocoa::NetworkDataTaskCocoa(NetworkSession& session, NetworkDataTaskClient& client, const WebCore::ResourceRequest& requestWithCredentials, uint64_t frameID, WebCore::PageIdentifier pageID, WebCore::StoredCredentialsPolicy storedCredentialsPolicy, WebCore::ContentSniffingPolicy shouldContentSniff, WebCore::ContentEncodingSniffingPolicy shouldContentEncodingSniff, bool shouldClearReferrerOnHTTPSToHTTPRedirect, PreconnectOnly shouldPreconnectOnly, bool dataTaskIsForMainFrameNavigation, bool dataTaskIsForMainResourceNavigationForAnyFrame, Optional<NetworkActivityTracker> networkActivityTracker)
    164166    : NetworkDataTask(session, client, requestWithCredentials, storedCredentialsPolicy, shouldClearReferrerOnHTTPSToHTTPRedirect, dataTaskIsForMainFrameNavigation)
    165167    , m_frameID(frameID)
    166168    , m_pageID(pageID)
     169    , m_isForMainResourceNavigationForAnyFrame(dataTaskIsForMainResourceNavigationForAnyFrame)
    167170{
    168171    if (m_scheduledFailureType != NoFailure)
     
    490493    if (m_scheduledFailureType != NoFailure)
    491494        m_failureTimer.startOneShot(0_s);
     495
     496    auto& cocoaSession = static_cast<NetworkSessionCocoa&>(m_session.get());
     497    if (cocoaSession.deviceManagementRestrictionsEnabled() && m_isForMainResourceNavigationForAnyFrame) {
     498        auto didDetermineDeviceRestrictionPolicyForURL = makeBlockPtr([this, protectedThis = makeRef(*this)](BOOL isBlocked) {
     499            callOnMainThread([this, protectedThis = makeRef(*this), isBlocked] {
     500                if (isBlocked) {
     501                    scheduleFailure(RestrictedURLFailure);
     502                    return;
     503                }
     504
     505                [m_task resume];
     506            });
     507        });
     508
     509#if HAVE(DEVICE_MANAGEMENT)
     510        if (cocoaSession.allLoadsBlockedByDeviceManagementRestrictionsForTesting())
     511            didDetermineDeviceRestrictionPolicyForURL(true);
     512        else {
     513            RetainPtr<NSURL> urlToCheck = [m_task currentRequest].URL;
     514            [cocoaSession.deviceManagementPolicyMonitor() requestPoliciesForWebsites:@[ urlToCheck.get() ] completionHandler:makeBlockPtr([didDetermineDeviceRestrictionPolicyForURL, urlToCheck] (NSDictionary<NSURL *, NSNumber *> *policies, NSError *error) {
     515                bool isBlocked = error || policies[urlToCheck.get()].integerValue != DMFPolicyOK;
     516                didDetermineDeviceRestrictionPolicyForURL(isBlocked);
     517            }).get()];
     518        }
     519#else
     520        didDetermineDeviceRestrictionPolicyForURL(cocoaSession.allLoadsBlockedByDeviceManagementRestrictionsForTesting());
     521#endif
     522        return;
     523    }
     524
    492525    [m_task resume];
    493526}
  • trunk/Source/WebKit/NetworkProcess/cocoa/NetworkSessionCocoa.h

    r244475 r245979  
    2626#pragma once
    2727
     28OBJC_CLASS DMFWebsitePolicyMonitor;
    2829OBJC_CLASS NSData;
    2930OBJC_CLASS NSURLSession;
     
    7071    void continueDidReceiveChallenge(const WebCore::AuthenticationChallenge&, NetworkDataTaskCocoa::TaskIdentifier, NetworkDataTaskCocoa*, CompletionHandler<void(WebKit::AuthenticationChallengeDisposition, const WebCore::Credential&)>&&);
    7172
     73    bool deviceManagementRestrictionsEnabled() const { return m_deviceManagementRestrictionsEnabled; }
     74    bool allLoadsBlockedByDeviceManagementRestrictionsForTesting() const { return m_allLoadsBlockedByDeviceManagementRestrictionsForTesting; }
     75    DMFWebsitePolicyMonitor *deviceManagementPolicyMonitor();
     76
    7277private:
    7378    NetworkSessionCocoa(NetworkProcess&, NetworkSessionCreationParameters&&);
     
    9499    String m_sourceApplicationSecondaryIdentifier;
    95100    RetainPtr<CFDictionaryRef> m_proxyConfiguration;
     101    RetainPtr<DMFWebsitePolicyMonitor> m_deviceManagementPolicyMonitor;
     102    bool m_deviceManagementRestrictionsEnabled { false };
     103    bool m_allLoadsBlockedByDeviceManagementRestrictionsForTesting { false };
    96104    bool m_shouldLogCookieInformation { false };
    97105    Seconds m_loadThrottleLatency;
  • trunk/Source/WebKit/NetworkProcess/cocoa/NetworkSessionCocoa.mm

    r245901 r245979  
    5252#import <wtf/ObjCRuntimeExtras.h>
    5353#import <wtf/ProcessPrivilege.h>
     54#import <wtf/SoftLinking.h>
    5455#import <wtf/URL.h>
    5556#import <wtf/text/WTFString.h>
     
    5859#include <WebKitAdditions/NetworkSessionCocoaAdditions.h>
    5960#endif
     61
     62#import "DeviceManagementSoftLink.h"
    6063
    6164using namespace WebKit;
     
    722725       
    723726        // Avoid MIME type sniffing if the response comes back as 304 Not Modified.
    724         int statusCode = [response respondsToSelector:@selector(statusCode)] ? [(id)response statusCode] : 0;
     727        int statusCode = [response isKindOfClass:NSHTTPURLResponse.class] ? [(NSHTTPURLResponse *)response statusCode] : 0;
    725728        if (statusCode != 304) {
    726729            bool isMainResourceLoad = networkDataTask->firstRequest().requester() == WebCore::ResourceRequest::Requester::Main;
     
    989992    m_statelessSessionDelegate = adoptNS([[WKNetworkSessionDelegate alloc] initWithNetworkSession:*this withCredentials:false]);
    990993    m_statelessSession = [NSURLSession sessionWithConfiguration:configuration delegate:static_cast<id>(m_statelessSessionDelegate.get()) delegateQueue:[NSOperationQueue mainQueue]];
     994
     995    m_deviceManagementRestrictionsEnabled = parameters.deviceManagementRestrictionsEnabled;
     996    m_allLoadsBlockedByDeviceManagementRestrictionsForTesting = parameters.allLoadsBlockedByDeviceManagementRestrictionsForTesting;
    991997
    992998#if ENABLE(RESOURCE_LOAD_STATISTICS)
     
    11761182}
    11771183
    1178 }
     1184DMFWebsitePolicyMonitor *NetworkSessionCocoa::deviceManagementPolicyMonitor()
     1185{
     1186#if HAVE(DEVICE_MANAGEMENT)
     1187    ASSERT(m_deviceManagementRestrictionsEnabled);
     1188    if (!m_deviceManagementPolicyMonitor)
     1189        m_deviceManagementPolicyMonitor = adoptNS([allocDMFWebsitePolicyMonitorInstance() initWithPolicyChangeHandler:nil]);
     1190    return m_deviceManagementPolicyMonitor.get();
     1191#else
     1192    RELEASE_ASSERT_NOT_REACHED();
     1193    return nil;
     1194#endif
     1195}
     1196
     1197}
  • trunk/Source/WebKit/Resources/SandboxProfiles/ios/com.apple.WebKit.Networking.sb

    r243267 r245979  
    8383    (global-name "com.apple.passd.library"))
    8484
     85(allow mach-lookup
     86    (global-name "com.apple.dmd.policy")
     87    (global-name "com.apple.siri.context.service")
     88    (global-name "com.apple.ctcategories.service"))
     89
    8590(deny file-write-create
    8691       (vnode-type SYMLINK))
  • trunk/Source/WebKit/Shared/API/APIError.h

    r218250 r245979  
    6666        CannotUseRestrictedPort = 103,
    6767        FrameLoadBlockedByContentBlocker = 104,
    68         FrameLoadBlockedByContentFilter = 105
     68        FrameLoadBlockedByContentFilter = 105,
     69        FrameLoadBlockedByRestrictions = 106,
    6970    };
    7071    static const WTF::String& webKitPolicyErrorDomain();
  • trunk/Source/WebKit/Shared/API/c/WKErrorRef.cpp

    r238887 r245979  
    5959    case API::Error::Policy::FrameLoadBlockedByContentBlocker:
    6060        return kWKErrorCodeFrameLoadBlockedByContentBlocker;
     61    case API::Error::Policy::FrameLoadBlockedByRestrictions:
     62        return kWKErrorCodeFrameLoadBlockedByRestrictions;
    6163    case API::Error::Policy::FrameLoadBlockedByContentFilter:
    6264        return kWKErrorCodeFrameLoadBlockedByContentFilter;
  • trunk/Source/WebKit/Shared/API/c/WKErrorRef.h

    r203003 r245979  
    4040    kWKErrorCodeFrameLoadBlockedByContentBlocker =               104,
    4141    kWKErrorCodeFrameLoadBlockedByContentFilter =                105,
     42    kWKErrorCodeFrameLoadBlockedByRestrictions =                 106,
    4243    kWKErrorCodeCannotFindPlugIn =                               200,
    4344    kWKErrorCodeCannotLoadPlugIn =                               201,
  • trunk/Source/WebKit/Shared/WebErrors.cpp

    r233113 r245979  
    5353}
    5454
     55ResourceError wasBlockedByRestrictionsError(const ResourceRequest& request)
     56{
     57    return ResourceError(API::Error::webKitPolicyErrorDomain(), API::Error::Policy::FrameLoadBlockedByRestrictions, request.url(), WEB_UI_STRING("The URL was blocked by device restrictions", "WebKitErrorFrameLoadBlockedByRestrictions description"));
     58}
     59
    5560ResourceError interruptedForPolicyChangeError(const ResourceRequest& request)
    5661{
  • trunk/Source/WebKit/Shared/WebErrors.h

    r238771 r245979  
    4040WebCore::ResourceError blockedByContentBlockerError(const WebCore::ResourceRequest&);
    4141WebCore::ResourceError cannotShowURLError(const WebCore::ResourceRequest&);
     42WebCore::ResourceError wasBlockedByRestrictionsError(const WebCore::ResourceRequest&);
    4243WebCore::ResourceError interruptedForPolicyChangeError(const WebCore::ResourceRequest&);
    4344WebCore::ResourceError failedCustomProtocolSyncLoad(const WebCore::ResourceRequest&);
  • trunk/Source/WebKit/UIProcess/API/APIWebsiteDataStore.cpp

    r242289 r245979  
    146146    auto configuration = WebKit::WebsiteDataStoreConfiguration::create();
    147147
     148    configuration->setPersistent(true);
     149
    148150    configuration->setApplicationCacheDirectory(defaultApplicationCacheDirectory());
    149151    configuration->setApplicationCacheFlatFileSubdirectoryName("Files");
  • trunk/Source/WebKit/UIProcess/API/Cocoa/WKErrorPrivate.h

    r243376 r245979  
    3030typedef NS_ENUM(NSInteger, _WKLegacyErrorCode) {
    3131    _WKErrorCodeFrameLoadInterruptedByPolicyChange WK_API_AVAILABLE(macos(10.11), ios(9.0)) = 102,
     32    _WKErrorCodeFrameLoadBlockedByRestrictions WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA)) = 106,
    3233    _WKLegacyErrorPlugInWillHandleLoad = 204,
    3334} WK_API_AVAILABLE(macos(10.11), ios(8.3));
  • trunk/Source/WebKit/UIProcess/API/Cocoa/WKProcessPool.mm

    r245149 r245979  
    585585}
    586586
    587 - (void)_setAllowsAnySSLCertificateForServiceWorker:(BOOL) allows
     587- (void)_setAllowsAnySSLCertificateForServiceWorker:(BOOL)allows
    588588{
    589589#if ENABLE(SERVICE_WORKER)
  • trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataStore.mm

    r245328 r245979  
    230230        return nil;
    231231
    232     auto config = API::WebsiteDataStore::defaultDataStoreConfiguration();
    233 
    234     if (configuration._webStorageDirectory)
    235         config->setLocalStorageDirectory(configuration._webStorageDirectory.path);
    236     if (configuration._webSQLDatabaseDirectory)
    237         config->setWebSQLDatabaseDirectory(configuration._webSQLDatabaseDirectory.path);
    238     if (configuration._indexedDBDatabaseDirectory)
    239         config->setIndexedDBDatabaseDirectory(configuration._indexedDBDatabaseDirectory.path);
    240     if (configuration._cookieStorageFile)
    241         config->setCookieStorageFile(configuration._cookieStorageFile.path);
    242     if (configuration._resourceLoadStatisticsDirectory)
    243         config->setResourceLoadStatisticsDirectory(configuration._resourceLoadStatisticsDirectory.path);
    244     if (configuration._cacheStorageDirectory)
    245         config->setCacheStorageDirectory(configuration._cacheStorageDirectory.path);
    246     if (configuration._serviceWorkerRegistrationDirectory)
    247         config->setServiceWorkerRegistrationDirectory(configuration._serviceWorkerRegistrationDirectory.path);
     232    auto config = configuration.isPersistent ? API::WebsiteDataStore::defaultDataStoreConfiguration() : WebKit::WebsiteDataStoreConfiguration::create();
     233
     234    RELEASE_ASSERT(config->isPersistent() == configuration.isPersistent);
     235
     236    if (configuration.isPersistent) {
     237        if (configuration._webStorageDirectory)
     238            config->setLocalStorageDirectory(configuration._webStorageDirectory.path);
     239        if (configuration._webSQLDatabaseDirectory)
     240            config->setWebSQLDatabaseDirectory(configuration._webSQLDatabaseDirectory.path);
     241        if (configuration._indexedDBDatabaseDirectory)
     242            config->setIndexedDBDatabaseDirectory(configuration._indexedDBDatabaseDirectory.path);
     243        if (configuration._cookieStorageFile)
     244            config->setCookieStorageFile(configuration._cookieStorageFile.path);
     245        if (configuration._resourceLoadStatisticsDirectory)
     246            config->setResourceLoadStatisticsDirectory(configuration._resourceLoadStatisticsDirectory.path);
     247        if (configuration._cacheStorageDirectory)
     248            config->setCacheStorageDirectory(configuration._cacheStorageDirectory.path);
     249        if (configuration._serviceWorkerRegistrationDirectory)
     250            config->setServiceWorkerRegistrationDirectory(configuration._serviceWorkerRegistrationDirectory.path);
     251    } else {
     252        RELEASE_ASSERT(!configuration._webStorageDirectory);
     253        RELEASE_ASSERT(!configuration._webSQLDatabaseDirectory);
     254        RELEASE_ASSERT(!configuration._indexedDBDatabaseDirectory);
     255        RELEASE_ASSERT(!configuration._cookieStorageFile);
     256        RELEASE_ASSERT(!configuration._resourceLoadStatisticsDirectory);
     257        RELEASE_ASSERT(!configuration._cacheStorageDirectory);
     258        RELEASE_ASSERT(!configuration._serviceWorkerRegistrationDirectory);
     259    }
     260
    248261    if (configuration.sourceApplicationBundleIdentifier)
    249262        config->setSourceApplicationBundleIdentifier(configuration.sourceApplicationBundleIdentifier);
     
    254267    if (configuration.httpsProxy)
    255268        config->setHTTPSProxy(configuration.httpsProxy);
    256 
    257     API::Object::constructInWrapper<API::WebsiteDataStore>(self, WTFMove(config), PAL::SessionID::generatePersistentSessionID());
     269    config->setDeviceManagementRestrictionsEnabled(configuration.deviceManagementRestrictionsEnabled);
     270    config->setAllLoadsBlockedByDeviceManagementRestrictionsForTesting(configuration.allLoadsBlockedByDeviceManagementRestrictionsForTesting);
     271
     272    auto sessionID = configuration.isPersistent ? PAL::SessionID::generatePersistentSessionID() : PAL::SessionID::generateEphemeralSessionID();
     273
     274    API::Object::constructInWrapper<API::WebsiteDataStore>(self, WTFMove(config), sessionID);
    258275
    259276    return self;
  • trunk/Source/WebKit/UIProcess/API/Cocoa/_WKWebsiteDataStoreConfiguration.h

    r245294 r245979  
    3333@interface _WKWebsiteDataStoreConfiguration : NSObject
    3434
     35- (instancetype)init; // Creates a persistent configuration.
     36- (instancetype)initNonPersistentConfiguration WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA));
     37
     38@property (nonatomic, readonly, getter=isPersistent) BOOL persistent WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA));
     39
     40// These properties apply to both persistent and non-persistent data stores.
     41@property (nonatomic, nullable, copy) NSString *sourceApplicationBundleIdentifier WK_API_AVAILABLE(macos(10.14.4), ios(12.2));
     42@property (nonatomic, nullable, copy) NSString *sourceApplicationSecondaryIdentifier WK_API_AVAILABLE(macos(10.14.4), ios(12.2));
     43@property (nonatomic, nullable, copy, setter=setHTTPProxy:) NSURL *httpProxy WK_API_AVAILABLE(macos(10.14.4), ios(12.2));
     44@property (nonatomic, nullable, copy, setter=setHTTPSProxy:) NSURL *httpsProxy WK_API_AVAILABLE(macos(10.14.4), ios(12.2));
     45@property (nonatomic) BOOL deviceManagementRestrictionsEnabled WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA));
     46
     47// These properties only make sense for persistent data stores, and will throw
     48// an exception if set for non-persistent stores.
    3549@property (nonatomic, copy, setter=_setWebStorageDirectory:) NSURL *_webStorageDirectory;
    3650@property (nonatomic, copy, setter=_setIndexedDBDatabaseDirectory:) NSURL *_indexedDBDatabaseDirectory;
     
    4054@property (nonatomic, copy, setter=_setCacheStorageDirectory:) NSURL *_cacheStorageDirectory WK_API_AVAILABLE(macos(10.13.4), ios(11.3));
    4155@property (nonatomic, copy, setter=_setServiceWorkerRegistrationDirectory:) NSURL *_serviceWorkerRegistrationDirectory WK_API_AVAILABLE(macos(10.13.4), ios(11.3));
    42 @property (nonatomic, nullable, copy) NSString *sourceApplicationBundleIdentifier WK_API_AVAILABLE(macos(10.14.4), ios(12.2));
    43 @property (nonatomic, nullable, copy) NSString *sourceApplicationSecondaryIdentifier WK_API_AVAILABLE(macos(10.14.4), ios(12.2));
    44 @property (nonatomic, nullable, copy, setter=setHTTPProxy:) NSURL *httpProxy WK_API_AVAILABLE(macos(10.14.4), ios(12.2));
    45 @property (nonatomic, nullable, copy, setter=setHTTPSProxy:) NSURL *httpsProxy WK_API_AVAILABLE(macos(10.14.4), ios(12.2));
     56
     57// Testing only.
     58@property (nonatomic) BOOL allLoadsBlockedByDeviceManagementRestrictionsForTesting WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA));
    4659
    4760@end
  • trunk/Source/WebKit/UIProcess/API/Cocoa/_WKWebsiteDataStoreConfiguration.mm

    r242339 r245979  
    3737@implementation _WKWebsiteDataStoreConfiguration
    3838
     39- (instancetype)init
     40{
     41    self = [super init];
     42    if (!self)
     43        return nil;
     44
     45    _configuration->setPersistent(true);
     46
     47    return self;
     48}
     49
     50- (instancetype)initNonPersistentConfiguration
     51{
     52    self = [super init];
     53    if (!self)
     54        return nil;
     55
     56    _configuration->setPersistent(false);
     57
     58    return self;
     59}
     60
     61- (BOOL)isPersistent
     62{
     63    return _configuration->isPersistent();
     64}
     65
    3966- (NSURL *)_webStorageDirectory
    4067{
     
    4471- (void)_setWebStorageDirectory:(NSURL *)url
    4572{
     73    if (!_configuration->isPersistent())
     74        [NSException raise:NSInvalidArgumentException format:@"Cannot set _webStorageDirectory on a non-persistent _WKWebsiteDataStoreConfiguration."];
    4675    checkURLArgument(url);
    4776    _configuration->setWebStorageDirectory(url.path);
     
    5584- (void)_setIndexedDBDatabaseDirectory:(NSURL *)url
    5685{
     86    if (!_configuration->isPersistent())
     87        [NSException raise:NSInvalidArgumentException format:@"Cannot set _indexedDBDatabaseDirectory on a non-persistent _WKWebsiteDataStoreConfiguration."];
    5788    checkURLArgument(url);
    5889    _configuration->setIndexedDBDatabaseDirectory(url.path);
     
    6697- (void)_setWebSQLDatabaseDirectory:(NSURL *)url
    6798{
     99    if (!_configuration->isPersistent())
     100        [NSException raise:NSInvalidArgumentException format:@"Cannot set _webSQLDatabaseDirectory on a non-persistent _WKWebsiteDataStoreConfiguration."];
    68101    checkURLArgument(url);
    69102    _configuration->setWebSQLDatabaseDirectory(url.path);
     
    97130- (void)_setCookieStorageFile:(NSURL *)url
    98131{
     132    if (!_configuration->isPersistent())
     133        [NSException raise:NSInvalidArgumentException format:@"Cannot set _cookieStorageFile on a non-persistent _WKWebsiteDataStoreConfiguration."];
    99134    checkURLArgument(url);
    100135    if ([url hasDirectoryPath])
     
    111146- (void)_setResourceLoadStatisticsDirectory:(NSURL *)url
    112147{
     148    if (!_configuration->isPersistent())
     149        [NSException raise:NSInvalidArgumentException format:@"Cannot set _resourceLoadStatisticsDirectory on a non-persistent _WKWebsiteDataStoreConfiguration."];
    113150    checkURLArgument(url);
    114151    _configuration->setResourceLoadStatisticsDirectory(url.path);
     
    122159- (void)_setCacheStorageDirectory:(NSURL *)url
    123160{
     161    if (!_configuration->isPersistent())
     162        [NSException raise:NSInvalidArgumentException format:@"Cannot set _cacheStorageDirectory on a non-persistent _WKWebsiteDataStoreConfiguration."];
    124163    checkURLArgument(url);
    125164    _configuration->setCacheStorageDirectory(url.path);
     
    133172- (void)_setServiceWorkerRegistrationDirectory:(NSURL *)url
    134173{
     174    if (!_configuration->isPersistent())
     175        [NSException raise:NSInvalidArgumentException format:@"Cannot set _serviceWorkerRegistrationDirectory on a non-persistent _WKWebsiteDataStoreConfiguration."];
    135176    checkURLArgument(url);
    136177    _configuration->setServiceWorkerRegistrationDirectory(url.path);
     
    157198}
    158199
     200- (BOOL)deviceManagementRestrictionsEnabled
     201{
     202    return _configuration->deviceManagementRestrictionsEnabled();
     203}
     204
     205- (void)setDeviceManagementRestrictionsEnabled:(BOOL)enabled
     206{
     207    _configuration->setDeviceManagementRestrictionsEnabled(enabled);
     208}
     209
     210- (BOOL)allLoadsBlockedByDeviceManagementRestrictionsForTesting
     211{
     212    return _configuration->allLoadsBlockedByDeviceManagementRestrictionsForTesting();
     213}
     214
     215- (void)setAllLoadsBlockedByDeviceManagementRestrictionsForTesting:(BOOL)blocked
     216{
     217    _configuration->setAllLoadsBlockedByDeviceManagementRestrictionsForTesting(blocked);
     218}
     219
    159220- (API::Object&)_apiObject
    160221{
  • trunk/Source/WebKit/UIProcess/WebsiteData/Cocoa/WebsiteDataStoreCocoa.mm

    r245540 r245979  
    132132        shouldIncludeLocalhostInResourceLoadStatistics,
    133133        enableResourceLoadStatisticsDebugMode,
     134        m_configuration->deviceManagementRestrictionsEnabled(),
     135        m_configuration->allLoadsBlockedByDeviceManagementRestrictionsForTesting(),
    134136        WTFMove(resourceLoadStatisticsManualPrevalentResource),
    135137        WTFMove(localStorageDirectory),
  • trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStoreConfiguration.cpp

    r243911 r245979  
    4040    auto copy = WebsiteDataStoreConfiguration::create();
    4141
     42    copy->m_isPersistent = this->m_isPersistent;
     43
    4244    copy->m_cacheStorageDirectory = this->m_cacheStorageDirectory;
    4345    copy->m_perOriginStorageQuota = this->m_perOriginStorageQuota;
     
    6062    copy->m_httpProxy = this->m_httpProxy;
    6163    copy->m_httpsProxy = this->m_httpsProxy;
     64    copy->m_deviceManagementRestrictionsEnabled = this->m_deviceManagementRestrictionsEnabled;
     65    copy->m_allLoadsBlockedByDeviceManagementRestrictionsForTesting = this->m_allLoadsBlockedByDeviceManagementRestrictionsForTesting;
    6266
    6367    return copy;
  • trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStoreConfiguration.h

    r245698 r245979  
    3939    Ref<WebsiteDataStoreConfiguration> copy();
    4040
    41     uint64_t perOriginStorageQuota() { return m_perOriginStorageQuota; }
     41    bool isPersistent() const { return m_isPersistent; }
     42    void setPersistent(bool isPersistent) { m_isPersistent = isPersistent; }
     43
     44    uint64_t perOriginStorageQuota() const { return m_perOriginStorageQuota; }
    4245    void setPerOriginStorageQuota(uint64_t quota) { m_perOriginStorageQuota = quota; }
    4346
     
    99102    void setHTTPSProxy(URL&& proxy) { m_httpsProxy = WTFMove(proxy); }
    100103
     104    bool deviceManagementRestrictionsEnabled() const { return m_deviceManagementRestrictionsEnabled; }
     105    void setDeviceManagementRestrictionsEnabled(bool enabled) { m_deviceManagementRestrictionsEnabled = enabled; }
     106
     107    bool allLoadsBlockedByDeviceManagementRestrictionsForTesting() const { return m_allLoadsBlockedByDeviceManagementRestrictionsForTesting; }
     108    void setAllLoadsBlockedByDeviceManagementRestrictionsForTesting(bool blocked) { m_allLoadsBlockedByDeviceManagementRestrictionsForTesting = blocked; }
     109
    101110private:
    102111    WebsiteDataStoreConfiguration();
     112
     113    bool m_isPersistent { false };
    103114
    104115    String m_cacheStorageDirectory;
     
    122133    URL m_httpProxy;
    123134    URL m_httpsProxy;
     135    bool m_deviceManagementRestrictionsEnabled { false };
     136    bool m_allLoadsBlockedByDeviceManagementRestrictionsForTesting { false };
    124137};
    125138
  • trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj

    r245715 r245979  
    431431                29AD3093164B4C5D0072DEA9 /* LegacyCustomProtocolManagerProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = 29AD3092164B4C5D0072DEA9 /* LegacyCustomProtocolManagerProxy.h */; };
    432432                29CD55AA128E294F00133C85 /* WKAccessibilityWebPageObjectBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 29CD55A8128E294F00133C85 /* WKAccessibilityWebPageObjectBase.h */; };
     433                2D0C56FD229F1DEA00BD33E7 /* DeviceManagementSoftLink.h in Headers */ = {isa = PBXBuildFile; fileRef = 2D0C56FB229F1DEA00BD33E7 /* DeviceManagementSoftLink.h */; };
     434                2D0C56FE229F1DEA00BD33E7 /* DeviceManagementSoftLink.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2D0C56FC229F1DEA00BD33E7 /* DeviceManagementSoftLink.mm */; };
    433435                2D1087611D2C573E00B85F82 /* LoadParameters.h in Headers */ = {isa = PBXBuildFile; fileRef = 2D10875F1D2C573E00B85F82 /* LoadParameters.h */; };
    434436                2D11B7512126A282006F8878 /* UnifiedSource1-mm.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2D7DEC9421269E4C00B9F73C /* UnifiedSource1-mm.mm */; };
     
    703705                2DA944A01884E4F000ED86DB /* WebIOSEventFactory.h in Headers */ = {isa = PBXBuildFile; fileRef = 2DA944991884E4F000ED86DB /* WebIOSEventFactory.h */; };
    704706                2DA944A41884E4F000ED86DB /* GestureTypes.h in Headers */ = {isa = PBXBuildFile; fileRef = 2DA9449D1884E4F000ED86DB /* GestureTypes.h */; };
     707                2DAADA8F2298C21000E36B0C /* DeviceManagementSPI.h in Headers */ = {isa = PBXBuildFile; fileRef = 2DAADA8E2298C21000E36B0C /* DeviceManagementSPI.h */; };
    705708                2DABA7721A817B1700EF0F1A /* WKPageRenderingProgressEventsInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 2DABA7711A817B1700EF0F1A /* WKPageRenderingProgressEventsInternal.h */; };
    706709                2DABA7741A817EE600EF0F1A /* WKPluginLoadPolicy.h in Headers */ = {isa = PBXBuildFile; fileRef = 2DABA7731A817EE600EF0F1A /* WKPluginLoadPolicy.h */; settings = {ATTRIBUTES = (Private, ); }; };
     
    25072510                2D0035221BC7414800DA8716 /* PDFPlugin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PDFPlugin.h; path = PDF/PDFPlugin.h; sourceTree = "<group>"; };
    25082511                2D0035231BC7414800DA8716 /* PDFPlugin.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = PDFPlugin.mm; path = PDF/PDFPlugin.mm; sourceTree = "<group>"; };
     2512                2D0C56FB229F1DEA00BD33E7 /* DeviceManagementSoftLink.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DeviceManagementSoftLink.h; sourceTree = "<group>"; };
     2513                2D0C56FC229F1DEA00BD33E7 /* DeviceManagementSoftLink.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = DeviceManagementSoftLink.mm; sourceTree = "<group>"; };
    25092514                2D0CF64B21F2A80300787566 /* TextCheckingController.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = TextCheckingController.mm; sourceTree = "<group>"; };
    25102515                2D0CF64C21F2A80300787566 /* TextCheckingController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TextCheckingController.h; sourceTree = "<group>"; };
     
    27992804                2DA944B61884EA3500ED86DB /* WebPageIOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = WebPageIOS.mm; path = ios/WebPageIOS.mm; sourceTree = "<group>"; };
    28002805                2DA944BC188511E700ED86DB /* NetworkProcessIOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = NetworkProcessIOS.mm; sourceTree = "<group>"; };
     2806                2DAADA8E2298C21000E36B0C /* DeviceManagementSPI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DeviceManagementSPI.h; sourceTree = "<group>"; };
    28012807                2DABA7711A817B1700EF0F1A /* WKPageRenderingProgressEventsInternal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKPageRenderingProgressEventsInternal.h; sourceTree = "<group>"; };
    28022808                2DABA7731A817EE600EF0F1A /* WKPluginLoadPolicy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKPluginLoadPolicy.h; sourceTree = "<group>"; };
     
    61066112                                A1FB68261F6E51C100C43F9F /* CrashReporterClientSPI.h */,
    61076113                                57DCEDAA214B9B430016B847 /* DeviceIdentitySPI.h */,
     6114                                2DAADA8E2298C21000E36B0C /* DeviceManagementSPI.h */,
    61086115                                3754D5441B3A29FD003A4C7F /* NSInvocationSPI.h */,
    61096116                                37B47E2C1D64DB76005F4EFF /* objcSPI.h */,
     
    71377144                        isa = PBXGroup;
    71387145                        children = (
     7146                                2D0C56FB229F1DEA00BD33E7 /* DeviceManagementSoftLink.h */,
     7147                                2D0C56FC229F1DEA00BD33E7 /* DeviceManagementSoftLink.mm */,
    71397148                                5315876B2076B713004BF9F3 /* NetworkActivityTrackerCocoa.mm */,
    71407149                                5321594F1DBAE6D70054AA3C /* NetworkDataTaskCocoa.h */,
     
    92249233                                57DCEDAB214C60090016B847 /* DeviceIdentitySPI.h in Headers */,
    92259234                                07297F9F1C17BBEA015F0735 /* DeviceIdHashSaltStorage.h in Headers */,
     9235                                2D0C56FD229F1DEA00BD33E7 /* DeviceManagementSoftLink.h in Headers */,
     9236                                2DAADA8F2298C21000E36B0C /* DeviceManagementSPI.h in Headers */,
    92269237                                83891B6C1A68C30B0030F386 /* DiagnosticLoggingClient.h in Headers */,
    92279238                                C18173612058424700DFDA65 /* DisplayLink.h in Headers */,
     
    1098310994                                2D92A77E212B6A7100F493FD /* DataReference.cpp in Sources */,
    1098410995                                2D92A77F212B6A7100F493FD /* Decoder.cpp in Sources */,
     10996                                2D0C56FE229F1DEA00BD33E7 /* DeviceManagementSoftLink.mm in Sources */,
    1098510997                                1AB7D6191288B9D900CFD08C /* DownloadProxyMessageReceiver.cpp in Sources */,
    1098610998                                1A64229912DD029200CAAE2C /* DrawingAreaMessageReceiver.cpp in Sources */,
  • trunk/Source/WebKit/WebProcess/Network/WebLoaderStrategy.cpp

    r245796 r245979  
    336336    loadParameters.isMainFrameNavigation = resourceLoader.frame() && resourceLoader.frame()->isMainFrame() && resourceLoader.options().mode == FetchOptions::Mode::Navigate;
    337337
     338    loadParameters.isMainResourceNavigationForAnyFrame = resourceLoader.frame() && resourceLoader.options().mode == FetchOptions::Mode::Navigate;
     339
    338340    loadParameters.shouldEnableCrossOriginResourcePolicy = RuntimeEnabledFeatures::sharedFeatures().crossOriginResourcePolicyEnabled() && !loadParameters.isMainFrameNavigation;
    339341
  • trunk/Tools/ChangeLog

    r245978 r245979  
     12019-05-31  Tim Horton  <timothy_horton@apple.com>
     2
     3        Optionally respect device management restrictions when loading from the network
     4        https://bugs.webkit.org/show_bug.cgi?id=198318
     5        <rdar://problem/44263806>
     6
     7        Reviewed by Alex Christensen.
     8
     9        * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
     10        * TestWebKitAPI/Tests/WebKitCocoa/DeviceManagementRestrictions.mm: Added.
     11        (TEST):
     12        * TestWebKitAPI/Tests/WebKitCocoa/WKWebsiteDatastore.mm:
     13        (TestWebKitAPI::TEST):
     14        * TestWebKitAPI/Tests/WebKitCocoa/WebsiteDataStoreCustomPaths.mm:
     15        (TEST):
     16        Clone a test that tests non-persistent data stores and ensure
     17        that it works if the data store is created via a configuration as well.
     18
     19        Add a test that ensures that you can't create a data store configuration
     20        with an invalid set of options.
     21
     22        Add a test that device management restrictions (when mocked) correctly
     23        fail the load with a new, appropriate error.
     24
    1252019-05-31  Ryan Haddad  <ryanhaddad@apple.com>
    226
  • trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj

    r245908 r245979  
    9797                2D21FE591F04642900B58E7D /* WKPDFViewStablePresentationUpdateCallback.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2D21FE581F04642800B58E7D /* WKPDFViewStablePresentationUpdateCallback.mm */; };
    9898                2D2BEB2D22324E5F005544CA /* RequestTextInputContext.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2D2BEB2C22324E5F005544CA /* RequestTextInputContext.mm */; };
     99                2D2D13B3229F408B005068AF /* DeviceManagementRestrictions.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2D2D13B2229F408B005068AF /* DeviceManagementRestrictions.mm */; };
    99100                2D3CA3A8221DF4B40088E803 /* PageOverlayPlugin.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2D3CA3A4221DF2390088E803 /* PageOverlayPlugin.mm */; };
    100101                2D4CF8BD1D8360CC0001CE8D /* WKThumbnailView.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2D4CF8BC1D8360CC0001CE8D /* WKThumbnailView.mm */; };
     
    14771478                2D21FE581F04642800B58E7D /* WKPDFViewStablePresentationUpdateCallback.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WKPDFViewStablePresentationUpdateCallback.mm; sourceTree = "<group>"; };
    14781479                2D2BEB2C22324E5F005544CA /* RequestTextInputContext.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = RequestTextInputContext.mm; sourceTree = "<group>"; };
     1480                2D2D13B2229F408B005068AF /* DeviceManagementRestrictions.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = DeviceManagementRestrictions.mm; sourceTree = "<group>"; };
    14791481                2D3CA3A4221DF2390088E803 /* PageOverlayPlugin.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = PageOverlayPlugin.mm; sourceTree = "<group>"; };
    14801482                2D4CF8BC1D8360CC0001CE8D /* WKThumbnailView.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = WKThumbnailView.mm; path = WebKit/WKThumbnailView.mm; sourceTree = "<group>"; };
     
    26002602                                2DC4CF761D2D9DD800ECCC94 /* DataDetection.mm */,
    26012603                                518EE51C20A78D3300E024F3 /* DecidePolicyForNavigationAction.mm */,
     2604                                2D2D13B2229F408B005068AF /* DeviceManagementRestrictions.mm */,
    26022605                                46918EFB2237283500468DFE /* DeviceOrientation.mm */,
    26032606                                CEA7F57B20895F5B0078EF6E /* DidResignInputElementStrongPasswordAppearance.mm */,
     
    41424145                                518EE51D20A78D3600E024F3 /* DecidePolicyForNavigationAction.mm in Sources */,
    41434146                                2D1646E21D1862CD00015A1A /* DeferredViewInWindowStateChange.mm in Sources */,
     4147                                2D2D13B3229F408B005068AF /* DeviceManagementRestrictions.mm in Sources */,
    41444148                                46918EFC2237283C00468DFE /* DeviceOrientation.mm in Sources */,
    41454149                                7CCE7EB91A411A7E00447C4C /* DeviceScaleFactorInDashboardRegions.mm in Sources */,
  • trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WKWebsiteDatastore.mm

    r245978 r245979  
    3434#import <WebKit/WKWebsiteDataStorePrivate.h>
    3535#import <WebKit/WebKit.h>
     36#import <WebKit/_WKWebsiteDataStoreConfiguration.h>
    3637#import <wtf/text/WTFString.h>
    3738
     
    305306}
    306307
    307 }
     308TEST(WebKit, SettingNonPersistentDataStorePathsThrowsException)
     309{
     310    auto configuration = adoptNS([[_WKWebsiteDataStoreConfiguration alloc] initNonPersistentConfiguration]);
     311
     312    auto shouldThrowExceptionWhenUsed = [](Function<void(void)>&& modifier) {
     313        @try {
     314            modifier();
     315            EXPECT_TRUE(false);
     316        } @catch (NSException *exception) {
     317            EXPECT_WK_STREQ(NSInvalidArgumentException, exception.name);
     318        }
     319    };
     320
     321    NSURL *fileURL = [NSURL fileURLWithPath:@"/tmp"];
     322
     323    shouldThrowExceptionWhenUsed([&] {
     324        [configuration _setWebStorageDirectory:fileURL];
     325    });
     326    shouldThrowExceptionWhenUsed([&] {
     327        [configuration _setIndexedDBDatabaseDirectory:fileURL];
     328    });
     329    shouldThrowExceptionWhenUsed([&] {
     330        [configuration _setWebSQLDatabaseDirectory:fileURL];
     331    });
     332    shouldThrowExceptionWhenUsed([&] {
     333        [configuration _setCookieStorageFile:fileURL];
     334    });
     335    shouldThrowExceptionWhenUsed([&] {
     336        [configuration _setResourceLoadStatisticsDirectory:fileURL];
     337    });
     338    shouldThrowExceptionWhenUsed([&] {
     339        [configuration _setCacheStorageDirectory:fileURL];
     340    });
     341    shouldThrowExceptionWhenUsed([&] {
     342        [configuration _setServiceWorkerRegistrationDirectory:fileURL];
     343    });
     344
     345    // These properties shouldn't throw exceptions when set on a non-persistent data store.
     346    [configuration setDeviceManagementRestrictionsEnabled:YES];
     347    [configuration setHTTPProxy:[NSURL URLWithString:@"http://www.apple.com/"]];
     348    [configuration setHTTPSProxy:[NSURL URLWithString:@"https://www.apple.com/"]];
     349    [configuration setSourceApplicationBundleIdentifier:@"com.apple.Safari"];
     350    [configuration setSourceApplicationSecondaryIdentifier:@"com.apple.Safari"];
     351}
     352
     353}
  • trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WebsiteDataStoreCustomPaths.mm

    r243045 r245979  
    428428    EXPECT_TRUE([[NSFileManager defaultManager] fileExistsAtPath:defaultResourceLoadStatisticsPath.path]);
    429429    EXPECT_FALSE([[NSFileManager defaultManager] fileExistsAtPath:defaultResourceLoadStatisticsFilePath.path]);
     430
     431    [[NSFileManager defaultManager] removeItemAtURL:defaultResourceLoadStatisticsPath error:nil];
     432}
     433
     434TEST(WebKit, WebsiteDataStoreEphemeralViaConfiguration)
     435{
     436    RetainPtr<WebsiteDataStoreCustomPathsMessageHandler> handler = adoptNS([[WebsiteDataStoreCustomPathsMessageHandler alloc] init]);
     437    RetainPtr<WKWebViewConfiguration> configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
     438    [[configuration userContentController] addScriptMessageHandler:handler.get() name:@"testHandler"];
     439
     440    NSURL *defaultResourceLoadStatisticsPath = [NSURL fileURLWithPath:[@"~/Library/WebKit/TestWebKitAPI/WebsiteData/ResourceLoadStatistics/" stringByExpandingTildeInPath] isDirectory:YES];
     441
     442    [[NSFileManager defaultManager] removeItemAtURL:defaultResourceLoadStatisticsPath error:nil];
     443
     444    EXPECT_FALSE([[NSFileManager defaultManager] fileExistsAtPath:defaultResourceLoadStatisticsPath.path]);
     445
     446    RetainPtr<_WKWebsiteDataStoreConfiguration> dataStoreConfiguration = adoptNS([[_WKWebsiteDataStoreConfiguration alloc] initNonPersistentConfiguration]);
     447    configuration.get().websiteDataStore = [[[WKWebsiteDataStore alloc] _initWithConfiguration:dataStoreConfiguration.get()] autorelease];
     448    [configuration.get().websiteDataStore _setResourceLoadStatisticsEnabled:YES];
     449
     450    // We expect the directory to be created by starting up the data store machinery, but not the data file.
     451    EXPECT_TRUE([[NSFileManager defaultManager] fileExistsAtPath:defaultResourceLoadStatisticsPath.path]);
     452
     453    NSURL *defaultResourceLoadStatisticsFilePath = [NSURL fileURLWithPath:[@"~/Library/WebKit/TestWebKitAPI/WebsiteData/ResourceLoadStatistics/full_browsing_session_resourceLog.plist" stringByExpandingTildeInPath] isDirectory:NO];
     454    EXPECT_FALSE([[NSFileManager defaultManager] fileExistsAtPath:defaultResourceLoadStatisticsFilePath.path]);
     455
     456    RetainPtr<WKWebView> webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:configuration.get()]);
     457
     458    NSURLRequest *request = [NSURLRequest requestWithURL:[[NSBundle mainBundle] URLForResource:@"WebsiteDataStoreCustomPaths" withExtension:@"html" subdirectory:@"TestWebKitAPI.resources"]];
     459    [webView loadRequest:request];
     460
     461    [[[webView configuration] processPool] _syncNetworkProcessCookies];
     462
     463    // Forcibly shut down everything of WebKit that we can.
     464    auto pid = [webView _webProcessIdentifier];
     465    if (pid)
     466        kill(pid, SIGKILL);
     467
     468    webView = nil;
     469    handler = nil;
     470    configuration = nil;
     471
     472    EXPECT_TRUE([[NSFileManager defaultManager] fileExistsAtPath:defaultResourceLoadStatisticsPath.path]);
     473    EXPECT_FALSE([[NSFileManager defaultManager] fileExistsAtPath:defaultResourceLoadStatisticsFilePath.path]);
     474
     475    [[NSFileManager defaultManager] removeItemAtURL:defaultResourceLoadStatisticsPath error:nil];
    430476}
    431477
Note: See TracChangeset for help on using the changeset viewer.