Move URL from WebCore to WTF
[WebKit-https.git] / Tools / TestWebKitAPI / Tests / WebKitCocoa / LoadAlternateHTMLString.mm
1 /*
2  * Copyright (C) 2015 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #import "config.h"
27 #import <WebKit/WKFoundation.h>
28
29 #if WK_API_ENABLED
30
31 #import "PlatformUtilities.h"
32 #import "Test.h"
33 #import <WebKit/WKWebViewPrivate.h>
34 #import <wtf/RetainPtr.h>
35 #import <wtf/cocoa/NSURLExtras.h>
36
37 static bool isDone;
38 static int provisionalLoadCount;
39
40 @interface LoadAlternateHTMLStringFromProvisionalLoadErrorController : NSObject <WKNavigationDelegate>
41 @end
42
43 @implementation LoadAlternateHTMLStringFromProvisionalLoadErrorController
44
45 - (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation withError:(NSError *)error
46 {
47     if (error.code != NSURLErrorCancelled)
48         [webView _loadAlternateHTMLString:@"error page" baseURL:nil forUnreachableURL:error.userInfo[@"NSErrorFailingURLKey"]];
49 }
50
51 - (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation
52 {
53     isDone = true;
54 }
55
56 - (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(null_unspecified WKNavigation *)navigation
57 {
58     provisionalLoadCount++;
59 }
60
61 @end
62
63 static NSString *unloadableURL = @"data:";
64 static NSString *loadableURL = @"data:text/html,no%20error";
65
66 TEST(WKWebView, LoadAlternateHTMLStringFromProvisionalLoadError)
67 {
68     auto webView = adoptNS([[WKWebView alloc] init]);
69     auto controller = adoptNS([[LoadAlternateHTMLStringFromProvisionalLoadErrorController alloc] init]);
70     [webView setNavigationDelegate:controller.get()];
71
72     [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:unloadableURL]]];
73     TestWebKitAPI::Util::run(&isDone);
74     isDone = false;
75
76     [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:loadableURL]]];
77     TestWebKitAPI::Util::run(&isDone);
78     isDone = false;
79
80     [webView goBack];
81     TestWebKitAPI::Util::run(&isDone);
82     isDone = false;
83
84     WKBackForwardList *list = [webView backForwardList];
85     EXPECT_EQ((NSUInteger)0, list.backList.count);
86     EXPECT_EQ((NSUInteger)1, list.forwardList.count);
87     EXPECT_STREQ([[list.forwardList.firstObject URL] absoluteString].UTF8String, loadableURL.UTF8String);
88     EXPECT_STREQ([[list.currentItem URL] absoluteString].UTF8String, unloadableURL.UTF8String);
89
90     EXPECT_TRUE([webView canGoForward]);
91     if (![webView canGoForward])
92         return;
93
94     [webView goForward];
95     TestWebKitAPI::Util::run(&isDone);
96     isDone = false;
97
98     EXPECT_EQ((NSUInteger)1, list.backList.count);
99     EXPECT_EQ((NSUInteger)0, list.forwardList.count);
100     EXPECT_STREQ([[list.backList.firstObject URL] absoluteString].UTF8String, unloadableURL.UTF8String);
101     EXPECT_STREQ([[list.currentItem URL] absoluteString].UTF8String, loadableURL.UTF8String);
102 }
103
104 TEST(WKWebView, LoadAlternateHTMLStringFromProvisionalLoadErrorBackToBack)
105 {
106     @autoreleasepool {
107         RetainPtr<WKWebView> webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600)]);
108
109         RetainPtr<LoadAlternateHTMLStringFromProvisionalLoadErrorController> delegate = adoptNS([[LoadAlternateHTMLStringFromProvisionalLoadErrorController alloc] init]);
110         [webView setNavigationDelegate:delegate.get()];
111
112         char literal[] = "https://www.example.com<>/";
113         NSURL* targetURL = WTF::URLWithData([NSData dataWithBytes:literal length:strlen(literal)], nil);
114         [webView loadRequest:[NSURLRequest requestWithURL:targetURL]];
115         [webView loadRequest:[NSURLRequest requestWithURL:targetURL]];
116
117         isDone = false;
118         TestWebKitAPI::Util::run(&isDone);
119         // In success, we should only start 2 provisional loads: 1 for the second loadRequest, and 1 for the _loadAlternateHTMLString.
120         // The second loadRequest cancels the first one before its provisional load starts.
121         EXPECT_EQ(2, provisionalLoadCount);
122     }
123 }
124
125 TEST(WKWebView, LoadAlternateHTMLStringNoFileSystemPath)
126 {
127     auto webView = adoptNS([[WKWebView alloc] init]);
128     [webView loadHTMLString:@"<html>hi</html>" baseURL:[NSURL URLWithString:@"file:///.file/id="]];
129 }
130
131 TEST(WKWebView, LoadAlternateHTMLStringFromProvisionalLoadErrorReload)
132 {
133     auto webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600)]);
134     auto controller = adoptNS([[LoadAlternateHTMLStringFromProvisionalLoadErrorController alloc] init]);
135     [webView setNavigationDelegate:controller.get()];
136
137     NSURL *invalidURL = [NSURL URLWithString:@"https://www.example.com%3C%3E/"];
138     [webView loadRequest:[NSURLRequest requestWithURL:invalidURL]];
139     TestWebKitAPI::Util::run(&isDone);
140     isDone = false;
141
142     [webView reload];
143     TestWebKitAPI::Util::run(&isDone);
144     isDone = false;
145
146     [webView reloadFromOrigin];
147     TestWebKitAPI::Util::run(&isDone);
148     isDone = false;
149
150     [webView _reloadExpiredOnly];
151     TestWebKitAPI::Util::run(&isDone);
152     isDone = false;
153
154     WKBackForwardList *list = [webView backForwardList];
155     EXPECT_EQ((NSUInteger)0, list.backList.count);
156 }
157
158 #endif