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

Changeset 243753 in webkit


Ignore:
Timestamp:
Apr 2, 2019, 12:46:30 PM (7 years ago)
Author:
Wenson Hsieh
Message:

REGRESSION (r243726): Crash at unrecognized selector: -[WKWebpagePreferences webpagePreferences]
https://bugs.webkit.org/show_bug.cgi?id=196496
<rdar://problem/49521634>

Reviewed by Chris Dumez.

Source/WebKit:

r243726 made an incorrect assumption that all callers of -decidePolicyForNavigationAction:decisionHandler: and
-decidePolicyForNavigationAction:userInfo:decisionHandler: must be instances of _WKWebsitePolicies, as opposed
to the new WKWebpagePreferences. However, it's possible for clients (in this case, Safari) to already generate
and pass in an instance of WKWebpagePreferences by bridging the C API opaque ref (WKWebsitePoliciesRef) into the
Objective-C object (which is now WKWebpagePreferences, after my change).

To maintain binary compatibility of trunk WebKit against prior versions of Safari, we need to handle both
WKWebpagePreferences and the soon-to-be-deprecated _WKWebsitePolicies in the navigation action policy decision
handler.

Tests: WebKit.WebsitePoliciesWithBridgingCast

WebKit.WebsitePoliciesWithUnexpectedType

  • UIProcess/Cocoa/NavigationState.mm:

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

Tools:

Add new API tests (see WebKit ChangeLog for more detail).

  • TestWebKitAPI/Tests/WebKitCocoa/WebsitePolicies.mm:

(-[WebsitePoliciesNavigationDelegate _webView:decidePolicyForNavigationAction:userInfo:decisionHandler:]):
(TEST):

Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit/ChangeLog

    r243733 r243753  
     12019-04-02  Wenson Hsieh  <wenson_hsieh@apple.com>
     2
     3        REGRESSION (r243726): Crash at unrecognized selector: -[WKWebpagePreferences webpagePreferences]
     4        https://bugs.webkit.org/show_bug.cgi?id=196496
     5        <rdar://problem/49521634>
     6
     7        Reviewed by Chris Dumez.
     8
     9        r243726 made an incorrect assumption that all callers of -decidePolicyForNavigationAction:decisionHandler: and
     10        -decidePolicyForNavigationAction:userInfo:decisionHandler: must be instances of _WKWebsitePolicies, as opposed
     11        to the new WKWebpagePreferences. However, it's possible for clients (in this case, Safari) to already generate
     12        and pass in an instance of WKWebpagePreferences by bridging the C API opaque ref (WKWebsitePoliciesRef) into the
     13        Objective-C object (which is now WKWebpagePreferences, after my change).
     14
     15        To maintain binary compatibility of trunk WebKit against prior versions of Safari, we need to handle both
     16        WKWebpagePreferences and the soon-to-be-deprecated _WKWebsitePolicies in the navigation action policy decision
     17        handler.
     18
     19        Tests:  WebKit.WebsitePoliciesWithBridgingCast
     20                WebKit.WebsitePoliciesWithUnexpectedType
     21
     22        * UIProcess/Cocoa/NavigationState.mm:
     23        (WebKit::NavigationState::NavigationClient::decidePolicyForNavigationAction):
     24
    1252019-04-01  Chris Dumez  <cdumez@apple.com>
    226
  • trunk/Source/WebKit/UIProcess/Cocoa/NavigationState.mm

    r243726 r243753  
    553553    auto checker = CompletionHandlerCallChecker::create(navigationDelegate.get(), delegateHasWebsitePolicies ? @selector(_webView:decidePolicyForNavigationAction:decisionHandler:) : @selector(webView:decidePolicyForNavigationAction:decisionHandler:));
    554554   
    555     auto decisionHandlerWithPolicies = [localListener = WTFMove(listener), navigationAction = navigationAction.copyRef(), checker = WTFMove(checker), webPageProxy = makeRef(webPageProxy), subframeNavigation](WKNavigationActionPolicy actionPolicy, _WKWebsitePolicies *websitePolicies) mutable {
     555    auto decisionHandlerWithPolicies = [localListener = WTFMove(listener), navigationAction = navigationAction.copyRef(), checker = WTFMove(checker), webPageProxy = makeRef(webPageProxy), subframeNavigation](WKNavigationActionPolicy actionPolicy, id policiesOrPreferences) mutable {
    556556        if (checker->completionHandlerHasBeenCalled())
    557557            return;
    558558        checker->didCallCompletionHandler();
    559559
    560         RefPtr<API::WebsitePolicies> apiWebsitePolicies = [websitePolicies webpagePreferences] ? [websitePolicies webpagePreferences]->_websitePolicies.get() : nullptr;
     560        RefPtr<API::WebsitePolicies> apiWebsitePolicies;
     561        if ([policiesOrPreferences isKindOfClass:WKWebpagePreferences.self])
     562            apiWebsitePolicies = ((WKWebpagePreferences *)policiesOrPreferences)->_websitePolicies.get();
     563        else if ([policiesOrPreferences isKindOfClass:_WKWebsitePolicies.self])
     564            apiWebsitePolicies = [policiesOrPreferences webpagePreferences]->_websitePolicies.get();
     565        else if (policiesOrPreferences)
     566            [NSException raise:NSInvalidArgumentException format:@"Expected policies of class %@, but got %@", NSStringFromClass(_WKWebsitePolicies.self), [policiesOrPreferences class]];
     567
    561568        if (apiWebsitePolicies) {
    562569            if (auto* websiteDataStore = apiWebsitePolicies->websiteDataStore()) {
  • trunk/Tools/ChangeLog

    r243751 r243753  
     12019-04-02  Wenson Hsieh  <wenson_hsieh@apple.com>
     2
     3        REGRESSION (r243726): Crash at unrecognized selector: -[WKWebpagePreferences webpagePreferences]
     4        https://bugs.webkit.org/show_bug.cgi?id=196496
     5        <rdar://problem/49521634>
     6
     7        Reviewed by Chris Dumez.
     8
     9        Add new API tests (see WebKit ChangeLog for more detail).
     10
     11        * TestWebKitAPI/Tests/WebKitCocoa/WebsitePolicies.mm:
     12        (-[WebsitePoliciesNavigationDelegate _webView:decidePolicyForNavigationAction:userInfo:decisionHandler:]):
     13        (TEST):
     14
    1152019-04-02  David Kilzer  <ddkilzer@apple.com>
    216
  • trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WebsitePolicies.mm

    r242960 r243753  
    2727
    2828#import "PlatformUtilities.h"
     29#import "TestNavigationDelegate.h"
    2930#import "TestWKWebView.h"
    3031#import <WebKit/WKNavigationDelegatePrivate.h>
     
    3738#import <WebKit/WKWebViewPrivate.h>
    3839#import <WebKit/WKWebsiteDataStorePrivate.h>
     40#import <WebKit/WKWebsitePolicies.h>
    3941#import <WebKit/_WKUserContentExtensionStorePrivate.h>
    4042#import <WebKit/_WKWebsiteDataStoreConfiguration.h>
     
    240242@end
    241243
     244@interface WebsitePoliciesNavigationDelegate : TestNavigationDelegate <WKNavigationDelegatePrivate>
     245@property (nonatomic, copy) void (^decidePolicyForNavigationActionWithWebsitePolicies)(WKNavigationAction *, id <NSSecureCoding>, void (^)(WKNavigationActionPolicy, _WKWebsitePolicies *));
     246@end
     247
     248@implementation WebsitePoliciesNavigationDelegate
     249
     250- (void)_webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction userInfo:(id <NSSecureCoding>)userInfo decisionHandler:(void (^)(WKNavigationActionPolicy, _WKWebsitePolicies *))decisionHandler
     251{
     252    if (_decidePolicyForNavigationActionWithWebsitePolicies)
     253        _decidePolicyForNavigationActionWithWebsitePolicies(navigationAction, userInfo, decisionHandler);
     254    else
     255        decisionHandler(WKNavigationActionPolicyAllow, nil);
     256}
     257
     258@end
     259
    242260TEST(WebKit, WebsitePoliciesAutoplayEnabled)
    243261{
     
    513531    runUntilReceivesAutoplayEvent(kWKAutoplayEventUserDidInterfereWithPlayback);
    514532    ASSERT_TRUE(*receivedAutoplayEventFlags & kWKAutoplayEventFlagsHasAudio);
     533}
     534
     535TEST(WebKit, WebsitePoliciesWithBridgingCast)
     536{
     537    auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
     538    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 336, 276) configuration:configuration.get()]);
     539    auto delegate = adoptNS([[WebsitePoliciesNavigationDelegate alloc] init]);
     540
     541    __block bool didInvokeDecisionHandler = false;
     542    [delegate setDecidePolicyForNavigationActionWithWebsitePolicies:^(WKNavigationAction *, id <NSSecureCoding>, void (^decisionHandler)(WKNavigationActionPolicy, _WKWebsitePolicies *)) {
     543        auto policies = adoptWK(WKWebsitePoliciesCreate());
     544        decisionHandler(WKNavigationActionPolicyAllow, (__bridge _WKWebsitePolicies *)policies.get());
     545        didInvokeDecisionHandler = true;
     546    }];
     547
     548    [webView setNavigationDelegate:delegate.get()];
     549    [webView loadTestPageNamed:@"simple"];
     550    [delegate waitForDidFinishNavigation];
     551    EXPECT_TRUE(didInvokeDecisionHandler);
     552}
     553
     554TEST(WebKit, WebsitePoliciesWithUnexpectedType)
     555{
     556    auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
     557    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 336, 276) configuration:configuration.get()]);
     558    auto delegate = adoptNS([[WebsitePoliciesNavigationDelegate alloc] init]);
     559
     560    __block bool didCatchException = false;
     561    [delegate setDecidePolicyForNavigationActionWithWebsitePolicies:^(WKNavigationAction *, id <NSSecureCoding>, void (^decisionHandler)(WKNavigationActionPolicy, _WKWebsitePolicies *)) {
     562        @try {
     563            id fakePolicies = @"Hello";
     564            decisionHandler(WKNavigationActionPolicyAllow, (_WKWebsitePolicies *)fakePolicies);
     565        } @catch (NSException *exception) {
     566            didCatchException = true;
     567        }
     568    }];
     569
     570    [webView setNavigationDelegate:delegate.get()];
     571    [webView loadTestPageNamed:@"simple"];
     572    TestWebKitAPI::Util::run(&didCatchException);
    515573}
    516574
Note: See TracChangeset for help on using the changeset viewer.