Process Swap on Navigation causes many webpages to hang due to attempted process...
[WebKit-https.git] / Tools / TestWebKitAPI / Tests / WebKitCocoa / RunOpenPanel.mm
1 /*
2  * Copyright (C) 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 #import "config.h"
27
28 #if WK_API_ENABLED && PLATFORM(MAC)
29
30 #import "PlatformUtilities.h"
31 #import "TestNavigationDelegate.h"
32 #import "Utilities.h"
33 #import <AppKit/AppKit.h>
34 #import <WebKit/WKOpenPanelParametersPrivate.h>
35 #import <WebKit/WebKit.h>
36 #import <wtf/RetainPtr.h>
37
38 static bool fileSelected;
39 static NSString * const expectedFileName = @"这是中文";
40
41 @interface RunOpenPanelUIDelegate : NSObject <WKUIDelegate>
42 @end
43
44 @implementation RunOpenPanelUIDelegate
45
46 - (void)webView:(WKWebView *)webView runOpenPanelWithParameters:(WKOpenPanelParameters *)parameters initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSArray<NSURL *> * _Nullable))completionHandler
47 {
48     EXPECT_FALSE(parameters.allowsMultipleSelection);
49     EXPECT_FALSE(parameters.allowsDirectories);
50     EXPECT_EQ(0ull, parameters._acceptedMIMETypes.count);
51     EXPECT_EQ(0ull, parameters._acceptedFileExtensions.count);
52     completionHandler(@[ [NSURL fileURLWithPath:[NSTemporaryDirectory() stringByAppendingPathComponent:expectedFileName]] ]);
53     fileSelected = true;
54 }
55
56 @end
57
58 namespace TestWebKitAPI {
59
60 TEST(WebKit, RunOpenPanelNonLatin1)
61 {
62     auto webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 100, 100)]);
63     auto uiDelegate = adoptNS([[RunOpenPanelUIDelegate alloc] init]);
64     [webView setUIDelegate:uiDelegate.get()];
65     [webView loadHTMLString:@"<!DOCTYPE html><input style='width: 100vw; height: 100vh;' type='file'>" baseURL:nil];
66     [webView _test_waitForDidFinishNavigation];
67     
68     NSPoint clickPoint = NSMakePoint(50, 50);
69     NSInteger windowNumber = [webView window].windowNumber;
70     [webView mouseDown:[NSEvent mouseEventWithType:NSEventTypeLeftMouseDown location:clickPoint modifierFlags:0 timestamp:0 windowNumber:windowNumber context:nil eventNumber:0 clickCount:1 pressure:1]];
71     [webView mouseUp:[NSEvent mouseEventWithType:NSEventTypeLeftMouseUp location:clickPoint modifierFlags:0 timestamp:0 windowNumber:windowNumber context:nil eventNumber:0 clickCount:1 pressure:1]];
72     Util::run(&fileSelected);
73     
74     __block bool testFinished = false;
75     [webView evaluateJavaScript:@"document.getElementsByTagName('input')[0].files[0].name" completionHandler:^(id _Nullable result, NSError * _Nullable error) {
76         EXPECT_TRUE([result isKindOfClass:[NSString class]]);
77         EXPECT_WK_STREQ(expectedFileName, result);
78         testFinished = true;
79     }];
80     Util::run(&testFinished);
81 }
82     
83 } // namespace TestWebKitAPI
84
85 #endif // WK_API_ENABLED && PLATFORM(MAC)