blob: 83bcfa97201a030eb5756065f9b5efae3348b64b [file] [log] [blame]
/*
* Copyright (C) 2016 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"
#import "PlatformUtilities.h"
#import "Test.h"
#import "TestNavigationDelegate.h"
#import <WebKit/WKBackForwardListPrivate.h>
#import <WebKit/WKNavigationPrivate.h>
#import <WebKit/WKWebViewPrivate.h>
#import <WebKit/_WKSessionState.h>
#import <wtf/RetainPtr.h>
static NSString *loadableURL1 = @"data:text/html,no%20error%20A";
static NSString *loadableURL2 = @"data:text/html,no%20error%20B";
static NSString *loadableURL3 = @"data:text/html,no%20error%20C";
TEST(WKBackForwardList, RemoveCurrentItem)
{
auto webView = adoptNS([[WKWebView alloc] init]);
[webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:loadableURL1]]];
[webView _test_waitForDidFinishNavigation];
[webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:loadableURL2]]];
[webView _test_waitForDidFinishNavigation];
[webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:loadableURL3]]];
[webView _test_waitForDidFinishNavigation];
WKBackForwardList *list = [webView backForwardList];
EXPECT_EQ((NSUInteger)2, list.backList.count);
EXPECT_EQ((NSUInteger)0, list.forwardList.count);
EXPECT_STREQ([[list.currentItem URL] absoluteString].UTF8String, loadableURL3.UTF8String);
_WKSessionState *sessionState = [webView _sessionStateWithFilter:^BOOL(WKBackForwardListItem *item)
{
return [item.URL isEqual:[NSURL URLWithString:loadableURL2]];
}];
[webView _restoreSessionState:sessionState andNavigate:NO];
WKBackForwardList *newList = [webView backForwardList];
EXPECT_EQ((NSUInteger)0, newList.backList.count);
EXPECT_EQ((NSUInteger)0, newList.forwardList.count);
EXPECT_STREQ([[newList.currentItem URL] absoluteString].UTF8String, loadableURL2.UTF8String);
}
TEST(WKBackForwardList, CanNotGoBackAfterRestoringEmptySessionState)
{
auto webView = adoptNS([[WKWebView alloc] init]);
[webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:loadableURL1]]];
[webView _test_waitForDidFinishNavigation];
[webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:loadableURL2]]];
[webView _test_waitForDidFinishNavigation];
WKBackForwardList *list = [webView backForwardList];
EXPECT_EQ(YES, [webView canGoBack]);
EXPECT_EQ(NO, [webView canGoForward]);
EXPECT_EQ((NSUInteger)1, list.backList.count);
EXPECT_EQ((NSUInteger)0, list.forwardList.count);
auto singlePageWebView = adoptNS([[WKWebView alloc] init]);
[singlePageWebView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:loadableURL1]]];
[singlePageWebView _test_waitForDidFinishNavigation];
[webView _restoreSessionState:[singlePageWebView _sessionState] andNavigate:NO];
WKBackForwardList *newList = [webView backForwardList];
EXPECT_EQ(NO, [webView canGoBack]);
EXPECT_EQ(NO, [webView canGoForward]);
EXPECT_EQ((NSUInteger)0, newList.backList.count);
EXPECT_EQ((NSUInteger)0, newList.forwardList.count);
}
TEST(WKBackForwardList, RestoringNilSessionState)
{
auto webView = adoptNS([[WKWebView alloc] init]);
[webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:loadableURL1]]];
[webView _test_waitForDidFinishNavigation];
[webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:loadableURL2]]];
[webView _test_waitForDidFinishNavigation];
WKBackForwardList *list = [webView backForwardList];
EXPECT_EQ(YES, [webView canGoBack]);
EXPECT_EQ(NO, [webView canGoForward]);
EXPECT_EQ((NSUInteger)1, list.backList.count);
EXPECT_EQ((NSUInteger)0, list.forwardList.count);
auto singlePageWebView = adoptNS([[WKWebView alloc] init]);
[singlePageWebView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:loadableURL1]]];
[singlePageWebView _test_waitForDidFinishNavigation];
[webView _restoreSessionState:nil andNavigate:NO];
WKBackForwardList *newList = [webView backForwardList];
EXPECT_EQ(YES, [webView canGoBack]);
EXPECT_EQ(NO, [webView canGoForward]);
EXPECT_EQ((NSUInteger)1, newList.backList.count);
EXPECT_EQ((NSUInteger)0, newList.forwardList.count);
}
static bool done;
static size_t navigations;
@interface AsyncPolicyDecisionDelegate : NSObject <WKNavigationDelegate, WKUIDelegate>
@end
@implementation AsyncPolicyDecisionDelegate
- (void)webView:(WKWebView *)webView didFinishNavigation:(null_unspecified WKNavigation *)navigation
{
if (navigations++)
done = true;
}
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler
{
dispatch_async(dispatch_get_main_queue(), ^{
decisionHandler(WKNavigationActionPolicyAllow);
});
}
@end
TEST(WKBackForwardList, WindowLocationAsyncPolicyDecision)
{
NSURL *simple = [[NSBundle mainBundle] URLForResource:@"simple" withExtension:@"html" subdirectory:@"TestWebKitAPI.resources"];
NSURL *simple2 = [[NSBundle mainBundle] URLForResource:@"simple2" withExtension:@"html" subdirectory:@"TestWebKitAPI.resources"];
auto webView = adoptNS([[WKWebView alloc] init]);
auto delegate = adoptNS([[AsyncPolicyDecisionDelegate alloc] init]);
[webView setNavigationDelegate:delegate.get()];
[webView loadHTMLString:@"<script>window.location='simple.html'</script>" baseURL:simple2];
TestWebKitAPI::Util::run(&done);
EXPECT_STREQ(webView.get().backForwardList.currentItem.URL.absoluteString.UTF8String, simple.absoluteString.UTF8String);
}