REGRESSION (r229133): decidePolicyForNavigationAction not called for loading an HTML...
[WebKit-https.git] / Tools / TestWebKitAPI / Tests / WebKitCocoa / DecidePolicyForNavigationAction.mm
1 /*
2  * Copyright (C) 2014-2017 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 #include "config.h"
27
28 #if PLATFORM(MAC)
29
30 #import "PlatformUtilities.h"
31 #import "TestProtocol.h"
32 #import <WebKit/WKNavigationActionPrivate.h>
33 #import <wtf/RetainPtr.h>
34 #import <wtf/mac/AppKitCompatibilityDeclarations.h>
35
36 #if WK_API_ENABLED
37
38 static bool createdWebView;
39 static bool decidedPolicy;
40 static bool finishedNavigation;
41 static RetainPtr<WKNavigationAction> action;
42 static RetainPtr<WKWebView> newWebView;
43
44 static NSString *firstURL = @"data:text/html,First";
45 static NSString *secondURL = @"data:text/html,Second";
46
47 @interface DecidePolicyForNavigationActionController : NSObject <WKNavigationDelegate, WKUIDelegate>
48 @end
49
50 @implementation DecidePolicyForNavigationActionController
51
52 - (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler
53 {
54     decisionHandler(webView == newWebView.get() ? WKNavigationActionPolicyCancel : WKNavigationActionPolicyAllow);
55
56     action = navigationAction;
57     decidedPolicy = true;
58 }
59
60 - (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation
61 {
62     finishedNavigation = true;
63 }
64
65 - (WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures
66 {
67     action = navigationAction;
68     newWebView = adoptNS([[WKWebView alloc] initWithFrame:CGRectMake(0, 0, 800, 600) configuration:configuration]);
69
70     createdWebView = true;
71     return newWebView.get();
72 }
73
74 @end
75
76 TEST(WebKit, DecidePolicyForNavigationActionReload)
77 {
78     auto webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600)]);
79
80     auto window = adoptNS([[NSWindow alloc] initWithContentRect:[webView frame] styleMask:NSWindowStyleMaskBorderless backing:NSBackingStoreBuffered defer:YES]);
81     [[window contentView] addSubview:webView.get()];
82
83     auto controller = adoptNS([[DecidePolicyForNavigationActionController alloc] init]);
84     [webView setNavigationDelegate:controller.get()];
85     [webView setUIDelegate:controller.get()];
86
87     finishedNavigation = false;
88     [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:firstURL]]];
89     TestWebKitAPI::Util::run(&finishedNavigation);
90
91     decidedPolicy = false;
92     [webView reload];
93     TestWebKitAPI::Util::run(&decidedPolicy);
94
95     EXPECT_EQ(WKNavigationTypeReload, [action navigationType]);
96     EXPECT_TRUE([action sourceFrame] != [action targetFrame]);
97     EXPECT_EQ(nil, [action sourceFrame]);
98     EXPECT_WK_STREQ(firstURL, [[[action request] URL] absoluteString]);
99     EXPECT_WK_STREQ(firstURL, [[[[action targetFrame] request] URL] absoluteString]);
100     EXPECT_EQ(webView.get(), [[action targetFrame] webView]);
101
102     newWebView = nullptr;
103     action = nullptr;
104 }
105
106 TEST(WebKit, DecidePolicyForNavigationActionReloadFromOrigin)
107 {
108     auto webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600)]);
109
110     auto window = adoptNS([[NSWindow alloc] initWithContentRect:[webView frame] styleMask:NSWindowStyleMaskBorderless backing:NSBackingStoreBuffered defer:YES]);
111     [[window contentView] addSubview:webView.get()];
112
113     auto controller = adoptNS([[DecidePolicyForNavigationActionController alloc] init]);
114     [webView setNavigationDelegate:controller.get()];
115     [webView setUIDelegate:controller.get()];
116
117     finishedNavigation = false;
118     [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:firstURL]]];
119     TestWebKitAPI::Util::run(&finishedNavigation);
120
121     decidedPolicy = false;
122     [webView reloadFromOrigin];
123     TestWebKitAPI::Util::run(&decidedPolicy);
124
125     EXPECT_EQ(WKNavigationTypeReload, [action navigationType]);
126     EXPECT_TRUE([action sourceFrame] != [action targetFrame]);
127     EXPECT_EQ(nil, [action sourceFrame]);
128     EXPECT_WK_STREQ(firstURL, [[[action request] URL] absoluteString]);
129     EXPECT_WK_STREQ(firstURL, [[[[action targetFrame] request] URL] absoluteString]);
130     EXPECT_EQ(webView.get(), [[action targetFrame] webView]);
131
132     newWebView = nullptr;
133     action = nullptr;
134 }
135
136 TEST(WebKit, DecidePolicyForNavigationActionGoBack)
137 {
138     auto webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600)]);
139
140     auto window = adoptNS([[NSWindow alloc] initWithContentRect:[webView frame] styleMask:NSWindowStyleMaskBorderless backing:NSBackingStoreBuffered defer:YES]);
141     [[window contentView] addSubview:webView.get()];
142
143     auto controller = adoptNS([[DecidePolicyForNavigationActionController alloc] init]);
144     [webView setNavigationDelegate:controller.get()];
145     [webView setUIDelegate:controller.get()];
146
147     finishedNavigation = false;
148     [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:firstURL]]];
149     TestWebKitAPI::Util::run(&finishedNavigation);
150
151     finishedNavigation = false;
152     [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:secondURL]]];
153     TestWebKitAPI::Util::run(&finishedNavigation);
154
155     decidedPolicy = false;
156     [webView goBack];
157     TestWebKitAPI::Util::run(&decidedPolicy);
158
159     EXPECT_EQ(WKNavigationTypeBackForward, [action navigationType]);
160     EXPECT_TRUE([action sourceFrame] != [action targetFrame]);
161     EXPECT_EQ(nil, [action sourceFrame]);
162     EXPECT_WK_STREQ(firstURL, [[[action request] URL] absoluteString]);
163     EXPECT_WK_STREQ(secondURL, [[[[action targetFrame] request] URL] absoluteString]);
164     EXPECT_EQ(webView.get(), [[action targetFrame] webView]);
165
166     newWebView = nullptr;
167     action = nullptr;
168 }
169
170 TEST(WebKit, DecidePolicyForNavigationActionGoForward)
171 {
172     auto webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600)]);
173
174     auto window = adoptNS([[NSWindow alloc] initWithContentRect:[webView frame] styleMask:NSWindowStyleMaskBorderless backing:NSBackingStoreBuffered defer:YES]);
175     [[window contentView] addSubview:webView.get()];
176
177     auto controller = adoptNS([[DecidePolicyForNavigationActionController alloc] init]);
178     [webView setNavigationDelegate:controller.get()];
179     [webView setUIDelegate:controller.get()];
180
181     finishedNavigation = false;
182     [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:firstURL]]];
183     TestWebKitAPI::Util::run(&finishedNavigation);
184
185     finishedNavigation = false;
186     [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:secondURL]]];
187     TestWebKitAPI::Util::run(&finishedNavigation);
188
189     finishedNavigation = false;
190     [webView goBack];
191     TestWebKitAPI::Util::run(&finishedNavigation);
192
193     decidedPolicy = false;
194     [webView goForward];
195     TestWebKitAPI::Util::run(&decidedPolicy);
196
197     EXPECT_EQ(WKNavigationTypeBackForward, [action navigationType]);
198     EXPECT_TRUE([action sourceFrame] != [action targetFrame]);
199     EXPECT_EQ(nil, [action sourceFrame]);
200     EXPECT_WK_STREQ(secondURL, [[[action request] URL] absoluteString]);
201     EXPECT_WK_STREQ(firstURL, [[[[action targetFrame] request] URL] absoluteString]);
202     EXPECT_EQ(webView.get(), [[action targetFrame] webView]);
203
204     newWebView = nullptr;
205     action = nullptr;
206 }
207
208 TEST(WebKit, DecidePolicyForNavigationActionOpenNewWindowAndDeallocSourceWebView)
209 {
210     auto controller = adoptNS([[DecidePolicyForNavigationActionController alloc] init]);
211
212     @autoreleasepool {
213         auto webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600)]);
214
215         auto window = adoptNS([[NSWindow alloc] initWithContentRect:[webView frame] styleMask:NSWindowStyleMaskBorderless backing:NSBackingStoreBuffered defer:YES]);
216         [[window contentView] addSubview:webView.get()];
217
218         [webView setNavigationDelegate:controller.get()];
219         [webView setUIDelegate:controller.get()];
220
221         createdWebView = false;
222         [webView loadHTMLString:@"<script>window.open('http://webkit.org/destination.html')</script>" baseURL:[NSURL URLWithString:@"http://webkit.org"]];
223         TestWebKitAPI::Util::run(&createdWebView);
224     }
225
226     decidedPolicy = false;
227     [newWebView setNavigationDelegate:controller.get()];
228     TestWebKitAPI::Util::run(&decidedPolicy);
229
230     EXPECT_EQ(WKNavigationTypeOther, [action navigationType]);
231     EXPECT_TRUE([action sourceFrame] != [action targetFrame]);
232     EXPECT_EQ(nil, [[action sourceFrame] webView]);
233     EXPECT_EQ(newWebView.get(), [[action targetFrame] webView]);
234
235     newWebView = nullptr;
236     action = nullptr;
237 }
238
239 TEST(WebKit, DecidePolicyForNavigationActionForTargetedHyperlink)
240 {
241     auto webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600)]);
242
243     auto window = adoptNS([[NSWindow alloc] initWithContentRect:[webView frame] styleMask:NSWindowStyleMaskBorderless backing:NSBackingStoreBuffered defer:YES]);
244     [[window contentView] addSubview:webView.get()];
245
246     auto controller = adoptNS([[DecidePolicyForNavigationActionController alloc] init]);
247     [webView setNavigationDelegate:controller.get()];
248     [webView setUIDelegate:controller.get()];
249
250     finishedNavigation = false;
251     [webView loadHTMLString:@"<a style=\"display: block; height: 100%\" href=\"https://webkit.org/destination2.html\" target=\"B\">" baseURL:[NSURL URLWithString:@"http://webkit.org"]];
252     TestWebKitAPI::Util::run(&finishedNavigation);
253
254     createdWebView = false;
255     [webView evaluateJavaScript:@"window.open(\"https://webkit.org/destination1.html\", \"B\")" completionHandler:nil];
256     TestWebKitAPI::Util::run(&createdWebView);
257
258     EXPECT_EQ(WKNavigationTypeOther, [action navigationType]);
259     EXPECT_TRUE([action sourceFrame] != [action targetFrame]);
260     EXPECT_EQ(nil, [action targetFrame]);
261     EXPECT_EQ(webView.get(), [[action sourceFrame] webView]);
262     EXPECT_WK_STREQ("http", [[[action sourceFrame] securityOrigin] protocol]);
263     EXPECT_WK_STREQ("webkit.org", [[[action sourceFrame] securityOrigin] host]);
264
265     // Wait for newWebView to ask to load its initial document.
266     decidedPolicy = false;
267     [newWebView setNavigationDelegate:controller.get()];
268     TestWebKitAPI::Util::run(&decidedPolicy);
269
270     decidedPolicy = false;
271     [newWebView setNavigationDelegate:controller.get()];
272     NSPoint clickPoint = NSMakePoint(100, 100);
273     [[webView hitTest:clickPoint] mouseDown:[NSEvent mouseEventWithType:NSEventTypeLeftMouseDown location:clickPoint modifierFlags:0 timestamp:0 windowNumber:[window windowNumber] context:nil eventNumber:0 clickCount:1 pressure:1]];
274     [[webView hitTest:clickPoint] mouseUp:[NSEvent mouseEventWithType:NSEventTypeLeftMouseUp location:clickPoint modifierFlags:0 timestamp:0 windowNumber:[window windowNumber] context:nil eventNumber:0 clickCount:1 pressure:1]];
275     TestWebKitAPI::Util::run(&decidedPolicy);
276
277     EXPECT_EQ(WKNavigationTypeLinkActivated, [action navigationType]);
278     EXPECT_TRUE([action sourceFrame] != [action targetFrame]);
279     EXPECT_EQ(webView.get(), [[action sourceFrame] webView]);
280     EXPECT_EQ(newWebView.get(), [[action targetFrame] webView]);
281     EXPECT_WK_STREQ("http", [[[action sourceFrame] securityOrigin] protocol]);
282     EXPECT_WK_STREQ("webkit.org", [[[action sourceFrame] securityOrigin] host]);
283
284     newWebView = nullptr;
285     action = nullptr;
286 }
287
288 TEST(WebKit, DecidePolicyForNavigationActionForLoadHTMLString)
289 {
290     auto webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600)]);
291
292     auto window = adoptNS([[NSWindow alloc] initWithContentRect:[webView frame] styleMask:NSWindowStyleMaskBorderless backing:NSBackingStoreBuffered defer:YES]);
293     [[window contentView] addSubview:webView.get()];
294
295     auto controller = adoptNS([[DecidePolicyForNavigationActionController alloc] init]);
296     [webView setNavigationDelegate:controller.get()];
297     [webView setUIDelegate:controller.get()];
298
299     decidedPolicy = false;
300     [webView loadHTMLString:@"TEST" baseURL:[NSURL URLWithString:@"about:blank"]];
301     TestWebKitAPI::Util::run(&decidedPolicy);
302 }
303
304 TEST(WebKit, DecidePolicyForNavigationActionForTargetedWindowOpen)
305 {
306     auto webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600)]);
307
308     auto window = adoptNS([[NSWindow alloc] initWithContentRect:[webView frame] styleMask:NSWindowStyleMaskBorderless backing:NSBackingStoreBuffered defer:YES]);
309     [[window contentView] addSubview:webView.get()];
310
311     auto controller = adoptNS([[DecidePolicyForNavigationActionController alloc] init]);
312     [webView setNavigationDelegate:controller.get()];
313     [webView setUIDelegate:controller.get()];
314
315     finishedNavigation = false;
316     [webView loadHTMLString:@"<a style=\"display: block; height: 100%\" href=\"javascript:window.open('https://webkit.org/destination2.html', 'B')\">" baseURL:[NSURL URLWithString:@"http://webkit.org"]];
317     TestWebKitAPI::Util::run(&finishedNavigation);
318
319     createdWebView = false;
320     [webView evaluateJavaScript:@"window.open(\"https://webkit.org/destination1.html\", \"B\")" completionHandler:nil];
321     TestWebKitAPI::Util::run(&createdWebView);
322
323     EXPECT_EQ(WKNavigationTypeOther, [action navigationType]);
324     EXPECT_TRUE([action sourceFrame] != [action targetFrame]);
325     EXPECT_EQ(nil, [action targetFrame]);
326     EXPECT_EQ(webView.get(), [[action sourceFrame] webView]);
327     EXPECT_WK_STREQ("http", [[[action sourceFrame] securityOrigin] protocol]);
328     EXPECT_WK_STREQ("webkit.org", [[[action sourceFrame] securityOrigin] host]);
329
330     // Wait for newWebView to ask to load its initial document.
331     decidedPolicy = false;
332     [newWebView setNavigationDelegate:controller.get()];
333     TestWebKitAPI::Util::run(&decidedPolicy);
334
335     decidedPolicy = false;
336     [newWebView setNavigationDelegate:controller.get()];
337     NSPoint clickPoint = NSMakePoint(100, 100);
338     [[webView hitTest:clickPoint] mouseDown:[NSEvent mouseEventWithType:NSEventTypeLeftMouseDown location:clickPoint modifierFlags:0 timestamp:0 windowNumber:[window windowNumber] context:nil eventNumber:0 clickCount:1 pressure:1]];
339     [[webView hitTest:clickPoint] mouseUp:[NSEvent mouseEventWithType:NSEventTypeLeftMouseUp location:clickPoint modifierFlags:0 timestamp:0 windowNumber:[window windowNumber] context:nil eventNumber:0 clickCount:1 pressure:1]];
340     TestWebKitAPI::Util::run(&decidedPolicy);
341
342     EXPECT_EQ(WKNavigationTypeOther, [action navigationType]);
343     EXPECT_TRUE([action sourceFrame] != [action targetFrame]);
344     EXPECT_EQ(webView.get(), [[action sourceFrame] webView]);
345     EXPECT_EQ(newWebView.get(), [[action targetFrame] webView]);
346     EXPECT_WK_STREQ("http", [[[action sourceFrame] securityOrigin] protocol]);
347     EXPECT_WK_STREQ("webkit.org", [[[action sourceFrame] securityOrigin] host]);
348
349     newWebView = nullptr;
350     action = nullptr;
351 }
352
353 TEST(WebKit, DecidePolicyForNavigationActionForTargetedFormSubmission)
354 {
355     auto webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600)]);
356
357     auto window = adoptNS([[NSWindow alloc] initWithContentRect:[webView frame] styleMask:NSWindowStyleMaskBorderless backing:NSBackingStoreBuffered defer:YES]);
358     [[window contentView] addSubview:webView.get()];
359
360     auto controller = adoptNS([[DecidePolicyForNavigationActionController alloc] init]);
361     [webView setNavigationDelegate:controller.get()];
362     [webView setUIDelegate:controller.get()];
363
364     finishedNavigation = false;
365     [webView loadHTMLString:@"<form action=\"https://webkit.org/destination1.html\" target=\"B\"><input type=\"submit\" name=\"submit\" value=\"Submit\" style=\"-webkit-appearance: none; height: 100%; width: 100%\"></form>" baseURL:[NSURL URLWithString:@"http://webkit.org"]];
366     TestWebKitAPI::Util::run(&finishedNavigation);
367
368     createdWebView = false;
369     [webView evaluateJavaScript:@"window.open(\"https://webkit.org/destination2.html\", \"B\")" completionHandler:nil];
370     TestWebKitAPI::Util::run(&createdWebView);
371
372     EXPECT_EQ(WKNavigationTypeOther, [action navigationType]);
373     EXPECT_TRUE([action sourceFrame] != [action targetFrame]);
374     EXPECT_EQ(nil, [action targetFrame]);
375     EXPECT_EQ(webView.get(), [[action sourceFrame] webView]);
376     EXPECT_WK_STREQ("http", [[[action sourceFrame] securityOrigin] protocol]);
377     EXPECT_WK_STREQ("webkit.org", [[[action sourceFrame] securityOrigin] host]);
378
379     // Wait for newWebView to ask to load its initial document.
380     decidedPolicy = false;
381     [newWebView setNavigationDelegate:controller.get()];
382     TestWebKitAPI::Util::run(&decidedPolicy);
383
384     decidedPolicy = false;
385     NSPoint clickPoint = NSMakePoint(100, 100);
386     [[webView hitTest:clickPoint] mouseDown:[NSEvent mouseEventWithType:NSEventTypeLeftMouseDown location:clickPoint modifierFlags:0 timestamp:0 windowNumber:[window windowNumber] context:nil eventNumber:0 clickCount:1 pressure:1]];
387     [[webView hitTest:clickPoint] mouseUp:[NSEvent mouseEventWithType:NSEventTypeLeftMouseUp location:clickPoint modifierFlags:0 timestamp:0 windowNumber:[window windowNumber] context:nil eventNumber:0 clickCount:1 pressure:1]];
388     TestWebKitAPI::Util::run(&decidedPolicy);
389
390     EXPECT_EQ(WKNavigationTypeFormSubmitted, [action navigationType]);
391     EXPECT_TRUE([action sourceFrame] != [action targetFrame]);
392     EXPECT_EQ(webView.get(), [[action sourceFrame] webView]);
393     EXPECT_EQ(newWebView.get(), [[action targetFrame] webView]);
394     EXPECT_WK_STREQ("http", [[[action sourceFrame] securityOrigin] protocol]);
395     EXPECT_WK_STREQ("webkit.org", [[[action sourceFrame] securityOrigin] host]);
396
397     newWebView = nullptr;
398     action = nullptr;
399 }
400
401 TEST(WebKit, DecidePolicyForNavigationActionForHyperlinkThatRedirects)
402 {
403     auto webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600)]);
404
405     auto window = adoptNS([[NSWindow alloc] initWithContentRect:[webView frame] styleMask:NSWindowStyleMaskBorderless backing:NSBackingStoreBuffered defer:YES]);
406     [[window contentView] addSubview:webView.get()];
407
408     auto controller = adoptNS([[DecidePolicyForNavigationActionController alloc] init]);
409     [webView setNavigationDelegate:controller.get()];
410     [webView setUIDelegate:controller.get()];
411
412     [TestProtocol registerWithScheme:@"http"];
413     finishedNavigation = false;
414     [webView loadHTMLString:@"<a style=\"display: block; height: 100%\" href=\"http://redirect/?result\">" baseURL:[NSURL URLWithString:@"http://webkit.org"]];
415     TestWebKitAPI::Util::run(&finishedNavigation);
416
417     decidedPolicy = false;
418     [newWebView setNavigationDelegate:controller.get()];
419     NSPoint clickPoint = NSMakePoint(100, 100);
420     [[webView hitTest:clickPoint] mouseDown:[NSEvent mouseEventWithType:NSEventTypeLeftMouseDown location:clickPoint modifierFlags:0 timestamp:0 windowNumber:[window windowNumber] context:nil eventNumber:0 clickCount:1 pressure:1]];
421     [[webView hitTest:clickPoint] mouseUp:[NSEvent mouseEventWithType:NSEventTypeLeftMouseUp location:clickPoint modifierFlags:0 timestamp:0 windowNumber:[window windowNumber] context:nil eventNumber:0 clickCount:1 pressure:1]];
422     TestWebKitAPI::Util::run(&decidedPolicy);
423
424     EXPECT_EQ(WKNavigationTypeLinkActivated, [action navigationType]);
425     EXPECT_TRUE([action sourceFrame] == [action targetFrame]);
426     EXPECT_WK_STREQ("GET", [[action request] HTTPMethod]);
427     EXPECT_WK_STREQ("http://redirect/?result", [[[action request] URL] absoluteString]);
428     EXPECT_EQ(webView.get(), [[action sourceFrame] webView]);
429     EXPECT_WK_STREQ("http", [[[action sourceFrame] securityOrigin] protocol]);
430     EXPECT_WK_STREQ("webkit.org", [[[action sourceFrame] securityOrigin] host]);
431     EXPECT_FALSE([action _isRedirect]);
432
433     // Wait to decide policy for redirect.
434     decidedPolicy = false;
435     TestWebKitAPI::Util::run(&decidedPolicy);
436
437     EXPECT_EQ(WKNavigationTypeLinkActivated, [action navigationType]);
438     EXPECT_TRUE([action sourceFrame] == [action targetFrame]);
439     EXPECT_WK_STREQ("GET", [[action request] HTTPMethod]);
440     EXPECT_WK_STREQ("http://result/", [[[action request] URL] absoluteString]);
441     EXPECT_EQ(webView.get(), [[action sourceFrame] webView]);
442     EXPECT_WK_STREQ("http", [[[action sourceFrame] securityOrigin] protocol]);
443     EXPECT_WK_STREQ("webkit.org", [[[action sourceFrame] securityOrigin] host]);
444     EXPECT_TRUE([action _isRedirect]);
445
446     [TestProtocol unregister];
447     newWebView = nullptr;
448     action = nullptr;
449 }
450
451 TEST(WebKit, DecidePolicyForNavigationActionForPOSTFormSubmissionThatRedirectsToGET)
452 {
453     auto webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600)]);
454
455     auto window = adoptNS([[NSWindow alloc] initWithContentRect:[webView frame] styleMask:NSWindowStyleMaskBorderless backing:NSBackingStoreBuffered defer:YES]);
456     [[window contentView] addSubview:webView.get()];
457
458     auto controller = adoptNS([[DecidePolicyForNavigationActionController alloc] init]);
459     [webView setNavigationDelegate:controller.get()];
460     [webView setUIDelegate:controller.get()];
461
462     finishedNavigation = false;
463     [webView loadHTMLString:@"<form action=\"http://redirect/?result\" method=\"POST\"><input type=\"submit\" name=\"submitButton\" value=\"Submit\"></form>" baseURL:[NSURL URLWithString:@"http://webkit.org"]];
464     TestWebKitAPI::Util::run(&finishedNavigation);
465
466     [TestProtocol registerWithScheme:@"http"];
467     decidedPolicy = false;
468     [webView evaluateJavaScript:@"document.forms[0].submit()" completionHandler:nil];
469     TestWebKitAPI::Util::run(&decidedPolicy);
470
471     EXPECT_EQ(WKNavigationTypeFormSubmitted, [action navigationType]);
472     EXPECT_TRUE([action sourceFrame] == [action targetFrame]);
473     EXPECT_WK_STREQ("POST", [[action request] HTTPMethod]);
474     EXPECT_WK_STREQ("http://redirect/?result", [[[action request] URL] absoluteString]);
475     EXPECT_EQ(webView.get(), [[action sourceFrame] webView]);
476     EXPECT_WK_STREQ("http", [[[action sourceFrame] securityOrigin] protocol]);
477     EXPECT_WK_STREQ("webkit.org", [[[action sourceFrame] securityOrigin] host]);
478     EXPECT_FALSE([action _isRedirect]);
479
480     // Wait to decide policy for redirect.
481     decidedPolicy = false;
482     TestWebKitAPI::Util::run(&decidedPolicy);
483
484     EXPECT_EQ(WKNavigationTypeFormSubmitted, [action navigationType]);
485     EXPECT_TRUE([action sourceFrame] == [action targetFrame]);
486     EXPECT_WK_STREQ("GET", [[action request] HTTPMethod]);
487     EXPECT_WK_STREQ("http://result/", [[[action request] URL] absoluteString]);
488     EXPECT_EQ(webView.get(), [[action sourceFrame] webView]);
489     EXPECT_WK_STREQ("http", [[[action sourceFrame] securityOrigin] protocol]);
490     EXPECT_WK_STREQ("webkit.org", [[[action sourceFrame] securityOrigin] host]);
491     EXPECT_TRUE([action _isRedirect]);
492
493     [TestProtocol unregister];
494     newWebView = nullptr;
495     action = nullptr;
496 }
497
498 TEST(WebKit, DecidePolicyForNavigationActionForPOSTFormSubmissionThatRedirectsToPOST)
499 {
500     auto webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600)]);
501
502     auto window = adoptNS([[NSWindow alloc] initWithContentRect:[webView frame] styleMask:NSWindowStyleMaskBorderless backing:NSBackingStoreBuffered defer:YES]);
503     [[window contentView] addSubview:webView.get()];
504
505     auto controller = adoptNS([[DecidePolicyForNavigationActionController alloc] init]);
506     [webView setNavigationDelegate:controller.get()];
507     [webView setUIDelegate:controller.get()];
508
509     finishedNavigation = false;
510     [webView loadHTMLString:@"<form action=\"http://307-redirect/?result\" method=\"POST\"><input type=\"submit\" name=\"submitButton\" value=\"Submit\"></form>" baseURL:[NSURL URLWithString:@"http://webkit.org"]];
511     TestWebKitAPI::Util::run(&finishedNavigation);
512
513     [TestProtocol registerWithScheme:@"http"];
514     decidedPolicy = false;
515     [webView evaluateJavaScript:@"document.forms[0].submit()" completionHandler:nil];
516     TestWebKitAPI::Util::run(&decidedPolicy);
517
518     EXPECT_EQ(WKNavigationTypeFormSubmitted, [action navigationType]);
519     EXPECT_TRUE([action sourceFrame] == [action targetFrame]);
520     EXPECT_WK_STREQ("POST", [[action request] HTTPMethod]);
521     EXPECT_WK_STREQ("http://307-redirect/?result", [[[action request] URL] absoluteString]);
522     EXPECT_EQ(webView.get(), [[action sourceFrame] webView]);
523     EXPECT_WK_STREQ("http", [[[action sourceFrame] securityOrigin] protocol]);
524     EXPECT_WK_STREQ("webkit.org", [[[action sourceFrame] securityOrigin] host]);
525     EXPECT_FALSE([action _isRedirect]);
526
527     // Wait to decide policy for redirect.
528     decidedPolicy = false;
529     TestWebKitAPI::Util::run(&decidedPolicy);
530
531     EXPECT_EQ(WKNavigationTypeFormSubmitted, [action navigationType]);
532     EXPECT_TRUE([action sourceFrame] == [action targetFrame]);
533     EXPECT_WK_STREQ("POST", [[action request] HTTPMethod]);
534     EXPECT_WK_STREQ("http://result/", [[[action request] URL] absoluteString]);
535     EXPECT_EQ(webView.get(), [[action sourceFrame] webView]);
536     EXPECT_WK_STREQ("http", [[[action sourceFrame] securityOrigin] protocol]);
537     EXPECT_WK_STREQ("webkit.org", [[[action sourceFrame] securityOrigin] host]);
538     EXPECT_TRUE([action _isRedirect]);
539
540     [TestProtocol unregister];
541     newWebView = nullptr;
542     action = nullptr;
543 }
544
545 static size_t calls;
546 static bool done;
547
548 @interface DecidePolicyForNavigationActionFragmentDelegate : NSObject <WKNavigationDelegate>
549 @end
550
551 @implementation DecidePolicyForNavigationActionFragmentDelegate
552
553 - (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler
554 {
555     decisionHandler(WKNavigationActionPolicyAllow);
556     const char* url = navigationAction.request.URL.absoluteString.UTF8String;
557     switch (calls++) {
558     case 0:
559         EXPECT_STREQ(url, "http://webkit.org/");
560         return;
561     case 1:
562         EXPECT_STREQ(url, "http://webkit.org/#fragment");
563         done = true;
564         return;
565     }
566     ASSERT_NOT_REACHED();
567 }
568
569 @end
570
571 TEST(WebKit, DecidePolicyForNavigationActionFragment)
572 {
573     auto webView = adoptNS([[WKWebView alloc] init]);
574     auto delegate = adoptNS([[DecidePolicyForNavigationActionFragmentDelegate alloc] init]);
575     [webView setNavigationDelegate:delegate.get()];
576     [webView loadHTMLString:@"<script>window.location.href='#fragment';</script>" baseURL:[NSURL URLWithString:@"http://webkit.org"]];
577     TestWebKitAPI::Util::run(&done);
578 }
579
580 #endif
581
582 #endif