Changeset 239339 in webkit


Ignore:
Timestamp:
Dec 18, 2018 10:26:33 AM (5 years ago)
Author:
achristensen@apple.com
Message:

WKWebView has old URL while displaying SafeBrowsing interstitial, for link-click navigations
https://bugs.webkit.org/show_bug.cgi?id=192675

Reviewed by Geoffrey Garen.

Source/WebKit:

When a safe browsing warning is being shown, WKWebView.URL should be the unsafe website, not the safe website before it.

  • UIProcess/API/Cocoa/WKWebView.mm:

(-[WKWebView _showSafeBrowsingWarningWithTitle:warning:details:completionHandler:]):
(-[WKWebView _showSafeBrowsingWarningWithURL:title:warning:details:completionHandler:]):

  • UIProcess/API/Cocoa/WKWebViewPrivate.h:
  • UIProcess/Cocoa/SafeBrowsingWarningCocoa.mm:

(WebKit::SafeBrowsingWarning::SafeBrowsingWarning):

  • UIProcess/SafeBrowsingWarning.h:

(WebKit::SafeBrowsingWarning::create):
(WebKit::SafeBrowsingWarning::url const):

  • UIProcess/WebPageProxy.cpp:

(WebKit::WebPageProxy::decidePolicyForNavigationAction):

Tools:

  • TestWebKitAPI/Tests/WebKitCocoa/SafeBrowsing.mm:

(goBack):
(TEST):
(visitUnsafeSite):
(-[SafeBrowsingHelper observeValueForKeyPath:ofObject:change:context:]):
(-[SafeBrowsingHelper webView:runJavaScriptAlertPanelWithMessage:initiatedByFrame:completionHandler:]):

Location:
trunk
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit/ChangeLog

    r239333 r239339  
     12018-12-18  Alex Christensen  <achristensen@webkit.org>
     2
     3        WKWebView has old URL while displaying SafeBrowsing interstitial, for link-click navigations
     4        https://bugs.webkit.org/show_bug.cgi?id=192675
     5
     6        Reviewed by Geoffrey Garen.
     7
     8        When a safe browsing warning is being shown, WKWebView.URL should be the unsafe website, not the safe website before it.
     9
     10        * UIProcess/API/Cocoa/WKWebView.mm:
     11        (-[WKWebView _showSafeBrowsingWarningWithTitle:warning:details:completionHandler:]):
     12        (-[WKWebView _showSafeBrowsingWarningWithURL:title:warning:details:completionHandler:]):
     13        * UIProcess/API/Cocoa/WKWebViewPrivate.h:
     14        * UIProcess/Cocoa/SafeBrowsingWarningCocoa.mm:
     15        (WebKit::SafeBrowsingWarning::SafeBrowsingWarning):
     16        * UIProcess/SafeBrowsingWarning.h:
     17        (WebKit::SafeBrowsingWarning::create):
     18        (WebKit::SafeBrowsingWarning::url const):
     19        * UIProcess/WebPageProxy.cpp:
     20        (WebKit::WebPageProxy::decidePolicyForNavigationAction):
     21
    1222018-12-18  Chris Dumez  <cdumez@apple.com>
    223
  • trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm

    r239314 r239339  
    48014801- (void)_showSafeBrowsingWarningWithTitle:(NSString *)title warning:(NSString *)warning details:(NSAttributedString *)details completionHandler:(void(^)(BOOL))completionHandler
    48024802{
    4803     auto safeBrowsingWarning = WebKit::SafeBrowsingWarning::create(title, warning, details);
     4803    // FIXME: Adopt _showSafeBrowsingWarningWithURL and remove this function.
     4804    [self _showSafeBrowsingWarningWithURL:nil title:title warning:warning details:details completionHandler:completionHandler];
     4805}
     4806
     4807- (void)_showSafeBrowsingWarningWithURL:(NSURL *)url title:(NSString *)title warning:(NSString *)warning details:(NSAttributedString *)details completionHandler:(void(^)(BOOL))completionHandler
     4808{
     4809    auto safeBrowsingWarning = WebKit::SafeBrowsingWarning::create(url, title, warning, details);
    48044810    auto wrapper = [completionHandler = makeBlockPtr(completionHandler)] (Variant<WebKit::ContinueUnsafeLoad, URL>&& variant) {
    48054811        switchOn(variant, [&] (WebKit::ContinueUnsafeLoad continueUnsafeLoad) {
  • trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewPrivate.h

    r238623 r239339  
    195195+ (NSURL *)_visitUnsafeWebsiteSentinel WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
    196196- (void)_showSafeBrowsingWarningWithTitle:(NSString *)title warning:(NSString *)warning details:(NSAttributedString *)details completionHandler:(void(^)(BOOL))completionHandler WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
     197- (void)_showSafeBrowsingWarningWithURL:(NSURL *)url title:(NSString *)title warning:(NSString *)warning details:(NSAttributedString *)details completionHandler:(void(^)(BOOL))completionHandler WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
    197198
    198199- (void)_isJITEnabled:(void(^)(BOOL))completionHandler WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
  • trunk/Source/WebKit/UIProcess/Cocoa/SafeBrowsingWarningCocoa.mm

    r238771 r239339  
    151151
    152152SafeBrowsingWarning::SafeBrowsingWarning(const URL& url, SSBServiceLookupResult *result)
    153     : m_title(safeBrowsingTitleText(result))
     153    : m_url(url)
     154    , m_title(safeBrowsingTitleText(result))
    154155    , m_warning(safeBrowsingWarningText(result))
    155156    , m_details(safeBrowsingDetailsText(url, result))
     
    158159#endif
    159160
    160 SafeBrowsingWarning::SafeBrowsingWarning(String&& title, String&& warning, RetainPtr<NSAttributedString>&& details)
    161     : m_title(WTFMove(title))
     161SafeBrowsingWarning::SafeBrowsingWarning(URL&& url, String&& title, String&& warning, RetainPtr<NSAttributedString>&& details)
     162    : m_url(WTFMove(url))
     163    , m_title(WTFMove(title))
    162164    , m_warning(WTFMove(warning))
    163165    , m_details(WTFMove(details))
  • trunk/Source/WebKit/UIProcess/SafeBrowsingWarning.h

    r238771 r239339  
    4646#endif
    4747#if PLATFORM(COCOA)
    48     static Ref<SafeBrowsingWarning> create(String&& title, String&& warning, RetainPtr<NSAttributedString>&& details)
     48    static Ref<SafeBrowsingWarning> create(URL&& url, String&& title, String&& warning, RetainPtr<NSAttributedString>&& details)
    4949    {
    50         return adoptRef(*new SafeBrowsingWarning(WTFMove(title), WTFMove(warning), WTFMove(details)));
     50        return adoptRef(*new SafeBrowsingWarning(WTFMove(url), WTFMove(title), WTFMove(warning), WTFMove(details)));
    5151    }
    5252#endif
    5353
     54    const URL& url() const { return m_url; }
    5455    const String& title() const { return m_title; }
    5556    const String& warning() const { return m_warning; }
     
    6667#endif
    6768#if PLATFORM(COCOA)
    68     SafeBrowsingWarning(String&&, String&&, RetainPtr<NSAttributedString>&&);
     69    SafeBrowsingWarning(URL&&, String&&, String&&, RetainPtr<NSAttributedString>&&);
    6970#endif
    7071
     72    URL m_url;
    7173    String m_title;
    7274    String m_warning;
  • trunk/Source/WebKit/UIProcess/WebPageProxy.cpp

    r239333 r239339  
    43404340
    43414341        if (safeBrowsingWarning) {
     4342            if (frame->isMainFrame() && safeBrowsingWarning->url().isValid()) {
     4343                auto transaction = m_pageLoadState.transaction();
     4344                m_pageLoadState.setPendingAPIRequestURL(transaction, safeBrowsingWarning->url());
     4345                m_pageLoadState.commitChanges();
     4346            }
     4347
    43424348            m_pageClient->showSafeBrowsingWarning(*safeBrowsingWarning, [protectedThis = WTFMove(protectedThis), completionHandler = WTFMove(completionHandler), policyAction] (auto&& result) mutable {
    43434349                switchOn(result, [&] (const URL& url) {
  • trunk/Tools/ChangeLog

    r239333 r239339  
     12018-12-18  Alex Christensen  <achristensen@webkit.org>
     2
     3        WKWebView has old URL while displaying SafeBrowsing interstitial, for link-click navigations
     4        https://bugs.webkit.org/show_bug.cgi?id=192675
     5
     6        Reviewed by Geoffrey Garen.
     7
     8        * TestWebKitAPI/Tests/WebKitCocoa/SafeBrowsing.mm:
     9        (goBack):
     10        (TEST):
     11        (visitUnsafeSite):
     12        (-[SafeBrowsingHelper observeValueForKeyPath:ofObject:change:context:]):
     13        (-[SafeBrowsingHelper webView:runJavaScriptAlertPanelWithMessage:initiatedByFrame:completionHandler:]):
     14
    1152018-12-18  Chris Dumez  <cdumez@apple.com>
    216
  • trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/SafeBrowsing.mm

    r239134 r239339  
    3636#import <WebKit/WKWebViewPrivate.h>
    3737#import <wtf/RetainPtr.h>
     38#import <wtf/URL.h>
     39#import <wtf/Vector.h>
    3840
    3941static bool committedNavigation;
     
    209211#endif
    210212
    211 TEST(SafeBrowsing, GoBack)
    212 {
    213     auto webView = safeBrowsingView();
    214     auto warning = [webView _safeBrowsingWarning];
    215     auto box = warning.subviews.firstObject;
     213template<typename ViewType> void goBack(ViewType *view)
     214{
     215    WKWebView *webView = (WKWebView *)view.superview;
     216    auto box = view.subviews.firstObject;
    216217    checkTitleAndClick(box.subviews[3], "Go Back");
    217218    EXPECT_EQ([webView _safeBrowsingWarning], nil);
     219}
     220
     221TEST(SafeBrowsing, GoBack)
     222{
     223    auto webView = safeBrowsingView();
     224    goBack([webView _safeBrowsingWarning]);
     225}
     226
     227template<typename ViewType> void visitUnsafeSite(ViewType *view)
     228{
     229    [view performSelector:NSSelectorFromString(@"clickedOnLink:") withObject:[NSURL URLWithString:@"WKVisitUnsafeWebsiteSentinel"]];
    218230}
    219231
     
    229241    EXPECT_EQ(warning.subviews.count, 2ull);
    230242    EXPECT_FALSE(committedNavigation);
    231     [warning performSelector:NSSelectorFromString(@"clickedOnLink:") withObject:[NSURL URLWithString:@"WKVisitUnsafeWebsiteSentinel"]];
     243    visitUnsafeSite(warning);
    232244    TestWebKitAPI::Util::run(&committedNavigation);
    233245}
     
    249261    auto showWarning = ^{
    250262        completionHandlerCalled = false;
    251         [webView _showSafeBrowsingWarningWithTitle:@"test title" warning:@"test warning" details:[[[NSAttributedString alloc] initWithString:@"test details"] autorelease] completionHandler:^(BOOL shouldContinue) {
     263        [webView _showSafeBrowsingWarningWithURL:nil title:@"test title" warning:@"test warning" details:[[[NSAttributedString alloc] initWithString:@"test details"] autorelease] completionHandler:^(BOOL shouldContinue) {
    252264            shouldContinueValue = shouldContinue;
    253265            completionHandlerCalled = true;
     
    269281}
    270282
     283static Vector<URL> urls;
     284static bool done;
     285
     286@interface SafeBrowsingHelper : NSObject<WKNavigationDelegate, WKUIDelegate>
     287@end
     288
     289@implementation SafeBrowsingHelper
     290
     291- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *, id> *)change context:(void *)context
     292{
     293    urls.append((NSURL *)[change objectForKey:NSKeyValueChangeNewKey]);
     294}
     295
     296- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler
     297{
     298    done = true;
     299    completionHandler();
     300}
     301
     302@end
     303
     304TEST(SafeBrowsing, URLObservation)
     305{
     306    ClassMethodSwizzler swizzler(objc_getClass("SSBLookupContext"), @selector(sharedLookupContext), [TestLookupContext methodForSelector:@selector(sharedLookupContext)]);
     307
     308    RetainPtr<NSURL> simpleURL = [[NSBundle mainBundle] URLForResource:@"simple" withExtension:@"html" subdirectory:@"TestWebKitAPI.resources"];
     309    RetainPtr<NSURL> simple2URL = [[NSBundle mainBundle] URLForResource:@"simple2" withExtension:@"html" subdirectory:@"TestWebKitAPI.resources"];
     310    auto helper = adoptNS([SafeBrowsingHelper new]);
     311
     312    auto webViewWithWarning = [&] () -> RetainPtr<WKWebView> {
     313        auto webView = adoptNS([WKWebView new]);
     314        [webView setUIDelegate:helper.get()];
     315        [webView setNavigationDelegate:helper.get()];
     316        [webView addObserver:helper.get() forKeyPath:@"URL" options:NSKeyValueObservingOptionNew context:nil];
     317
     318        [webView loadHTMLString:@"<script>alert('loaded')</script>" baseURL:simpleURL.get()];
     319        while (![webView _safeBrowsingWarning])
     320            TestWebKitAPI::Util::spinRunLoop();
     321        visitUnsafeSite([webView _safeBrowsingWarning]);
     322        TestWebKitAPI::Util::run(&done);
     323        EXPECT_FALSE(!![webView _safeBrowsingWarning]);
     324
     325        done = false;
     326        [webView evaluateJavaScript:[NSString stringWithFormat:@"window.location='%@'", simple2URL.get()] completionHandler:nil];
     327        while (![webView _safeBrowsingWarning])
     328            TestWebKitAPI::Util::spinRunLoop();
     329        return webView;
     330    };
     331   
     332    auto checkURLs = [&] (Vector<RetainPtr<NSURL>>&& expected) {
     333        EXPECT_EQ(urls.size(), expected.size());
     334        if (urls.size() != expected.size())
     335            return;
     336        for (size_t i = 0; i < expected.size(); ++i)
     337            EXPECT_STREQ(urls[i].string().utf8().data(), [expected[i] absoluteString].UTF8String);
     338    };
     339
     340    {
     341        auto webView = webViewWithWarning();
     342        checkURLs({ simpleURL, simple2URL });
     343        goBack([webView _safeBrowsingWarning]);
     344        checkURLs({ simpleURL, simple2URL, simpleURL });
     345        [webView removeObserver:helper.get() forKeyPath:@"URL"];
     346    }
     347   
     348    urls.clear();
     349
     350    {
     351        auto webView = webViewWithWarning();
     352        checkURLs({ simpleURL, simple2URL });
     353        visitUnsafeSite([webView _safeBrowsingWarning]);
     354        TestWebKitAPI::Util::spinRunLoop(5);
     355        checkURLs({ simpleURL, simple2URL });
     356        [webView removeObserver:helper.get() forKeyPath:@"URL"];
     357    }
     358}
     359
    271360@interface NullLookupContext : NSObject
    272361@end
Note: See TracChangeset for help on using the changeset viewer.