Changeset 243753 in webkit
- Timestamp:
- Apr 2, 2019, 12:46:30 PM (7 years ago)
- Location:
- trunk
- Files:
-
- 4 edited
-
Source/WebKit/ChangeLog (modified) (1 diff)
-
Source/WebKit/UIProcess/Cocoa/NavigationState.mm (modified) (1 diff)
-
Tools/ChangeLog (modified) (1 diff)
-
Tools/TestWebKitAPI/Tests/WebKitCocoa/WebsitePolicies.mm (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit/ChangeLog
r243733 r243753 1 2019-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 1 25 2019-04-01 Chris Dumez <cdumez@apple.com> 2 26 -
trunk/Source/WebKit/UIProcess/Cocoa/NavigationState.mm
r243726 r243753 553 553 auto checker = CompletionHandlerCallChecker::create(navigationDelegate.get(), delegateHasWebsitePolicies ? @selector(_webView:decidePolicyForNavigationAction:decisionHandler:) : @selector(webView:decidePolicyForNavigationAction:decisionHandler:)); 554 554 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 { 556 556 if (checker->completionHandlerHasBeenCalled()) 557 557 return; 558 558 checker->didCallCompletionHandler(); 559 559 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 561 568 if (apiWebsitePolicies) { 562 569 if (auto* websiteDataStore = apiWebsitePolicies->websiteDataStore()) { -
trunk/Tools/ChangeLog
r243751 r243753 1 2019-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 1 15 2019-04-02 David Kilzer <ddkilzer@apple.com> 2 16 -
trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WebsitePolicies.mm
r242960 r243753 27 27 28 28 #import "PlatformUtilities.h" 29 #import "TestNavigationDelegate.h" 29 30 #import "TestWKWebView.h" 30 31 #import <WebKit/WKNavigationDelegatePrivate.h> … … 37 38 #import <WebKit/WKWebViewPrivate.h> 38 39 #import <WebKit/WKWebsiteDataStorePrivate.h> 40 #import <WebKit/WKWebsitePolicies.h> 39 41 #import <WebKit/_WKUserContentExtensionStorePrivate.h> 40 42 #import <WebKit/_WKWebsiteDataStoreConfiguration.h> … … 240 242 @end 241 243 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 242 260 TEST(WebKit, WebsitePoliciesAutoplayEnabled) 243 261 { … … 513 531 runUntilReceivesAutoplayEvent(kWKAutoplayEventUserDidInterfereWithPlayback); 514 532 ASSERT_TRUE(*receivedAutoplayEventFlags & kWKAutoplayEventFlagsHasAudio); 533 } 534 535 TEST(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 554 TEST(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); 515 573 } 516 574
Note:
See TracChangeset
for help on using the changeset viewer.