/* * Copyright (C) 2019 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. */ #import "config.h" #if PLATFORM(MAC) #import "PlatformUtilities.h" #import "Test.h" #import "TestNavigationDelegate.h" #import "TestURLSchemeHandler.h" #import "TestWKWebView.h" #import #import #import #import #import #import #import #import #import #import #import #import #import static RetainPtr createdWebView; static RetainPtr navDelegate; @interface JavascriptURLNavigationDelegate : NSObject @end @implementation JavascriptURLNavigationDelegate - (void)_webViewRunModal:(WKWebView *)webView { EXPECT_EQ(webView, createdWebView.get()); } - (nullable WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures { createdWebView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:configuration]); [createdWebView setUIDelegate:self]; navDelegate = adoptNS([[TestNavigationDelegate alloc] init]); [navDelegate setDecidePolicyForNavigationAction:[&] (WKNavigationAction *action, void (^decisionHandler)(WKNavigationActionPolicy)) { decisionHandler(WKNavigationActionPolicyAllow); }]; [createdWebView setNavigationDelegate:navDelegate.get()]; return createdWebView.get(); } - (void)_webViewClose:(WKWebView *)webView { EXPECT_EQ(webView, createdWebView.get()); [webView _close]; } @end static const char* mainResource = R"JSURLRESOURCE( The initial frame should have "Hello there" in it.
The second frame should not.
)JSURLRESOURCE"; TEST(WKWebView, JavascriptURLNavigation) { static bool done; auto delegate = adoptNS([[JavascriptURLNavigationDelegate alloc] init]); auto handler = adoptNS([[TestURLSchemeHandler alloc] init]); auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]); [configuration setURLSchemeHandler:handler.get() forURLScheme:@"jsurl"]; auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:CGRectMake(0, 0, 800, 600) configuration:configuration.get()]); [webView setUIDelegate:delegate.get()]; [webView performAfterReceivingMessage:@"Passed" action:^() { done = true; }]; [webView performAfterReceivingMessage:@"Failed" action:^() { done = true; FAIL(); }]; [handler setStartURLSchemeTaskHandler:^(WKWebView *, id task) { if (![task.request.URL.absoluteString isEqualToString:@"jsurl://host1/main.html"]) { // We only expect the URL above. FAIL(); } auto response = adoptNS([[NSURLResponse alloc] initWithURL:task.request.URL MIMEType:@"text/html" expectedContentLength:0 textEncodingName:nil]); [task didReceiveResponse:response.get()]; [task didReceiveData:[NSData dataWithBytes:mainResource length:strlen(mainResource)]]; [task didFinish]; }]; [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"jsurl://host1/main.html"]]]; TestWebKitAPI::Util::run(&done); } #endif // PLATFORM(MAC)