c4d756b627ec3b09110e3a5429acf6b6f7756558
[WebKit.git] / Tools / TestWebKitAPI / Tests / mac / NavigatorLanguage.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 "PlatformUtilities.h"
28 #import <WebKit/WebViewPrivate.h>
29 #import <WebKit/DOM.h>
30 #import <wtf/RetainPtr.h>
31
32 @interface NavigatorLanguageDelegate : NSObject <WebFrameLoadDelegate> {
33 }
34 @end
35
36 static bool didFinishLoad;
37
38 @implementation NavigatorLanguageDelegate
39
40 - (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame
41 {
42     didFinishLoad = true;
43 }
44
45 @end
46
47 namespace TestWebKitAPI {
48
49 void overrideAppleLanguages(NSString *primaryLanguage)
50 {
51     RetainPtr<NSMutableDictionary> argumentDomain = adoptNS([[[NSUserDefaults standardUserDefaults] volatileDomainForName:NSArgumentDomain] mutableCopy]);
52     if (!argumentDomain)
53         argumentDomain = adoptNS([[NSMutableDictionary alloc] init]);
54     
55     [argumentDomain addEntriesFromDictionary:@{
56         @"AppleLanguages": @[primaryLanguage]
57     }];
58     [[NSUserDefaults standardUserDefaults] setVolatileDomain:argumentDomain.get() forName:NSArgumentDomain];
59
60     [[NSDistributedNotificationCenter defaultCenter] postNotificationName:@"AppleLanguagePreferencesChangedNotification" object:nil userInfo:nil options:NSNotificationDeliverImmediately];
61
62     [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];
63 }
64
65 static NSString *languageForSystemLanguage(WebView* webView, NSString *systemLanguage)
66 {
67     overrideAppleLanguages(systemLanguage);
68     return [webView stringByEvaluatingJavaScriptFromString:@"navigator.language"];
69 }
70
71 // These tests document current behavior. Some of the current results may not be right.
72 NSArray *tests = @[
73     @[@"ru", @"ru-ru"], // This does not match other browsers or CFNetwork's Accept-Language, which all use "ru".
74     @[@"en", @"en-us"],
75     @[@"en-GB", @"en-gb"],
76     @[@"en-US", @"en-us"],
77     @[@"ja", @"ja-jp"],
78     @[@"hi", @"hi-in"],
79     @[@"zh-TW", @"zh-tw"], // This should not map to the generic zh-hant, see rdar://problem/21395180.
80     @[@"zh-HK", @"zh-tw"],
81     @[@"es", @"es-es"],
82     @[@"es-MX", @"es-xl"],
83     @[@"es-ES", @"es-es"],
84     @[@"es-419", @"es-xl"],
85     @[@"zh-Hans", @"zh-cn"],
86     @[@"zh-Hant", @"zh-tw"],
87     @[@"pt-BR", @"pt-br"],
88     @[@"pt-PT", @"pt-pt"],
89     @[@"fr", @"fr-fr"],
90     @[@"fr-CA", @"fr-ca"],
91 ];
92
93 TEST(WebKit1, NavigatorLanguage)
94 {
95     RetainPtr<WebView> webView = adoptNS([[WebView alloc] initWithFrame:NSZeroRect frameName:nil groupName:nil]);
96     RetainPtr<NavigatorLanguageDelegate> frameLoadDelegate = adoptNS([NavigatorLanguageDelegate new]);
97
98     webView.get().frameLoadDelegate = frameLoadDelegate.get();
99     [[webView.get() mainFrame] loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"about:blank"]]];
100
101     Util::run(&didFinishLoad);
102     for (NSArray *test in tests)
103         EXPECT_WK_STREQ([test objectAtIndex:1], languageForSystemLanguage(webView.get(), [test objectAtIndex:0]));
104 }
105
106 #if WK_API_ENABLED
107
108 TEST(WKWebView, NavigatorLanguage)
109 {
110     RetainPtr<WKWebView> webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600)]);
111
112     NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"about:blank"]];
113     [webView loadRequest:request];
114     __block bool isDone = false;
115
116     __block void (^runTest)(NSUInteger) = ^(NSUInteger index) {
117         NSArray *test = [tests objectAtIndex:index];
118         overrideAppleLanguages([test objectAtIndex:0]);
119         [webView evaluateJavaScript:@"navigator.language" completionHandler:^(id result, NSError *) {
120             EXPECT_WK_STREQ([test objectAtIndex:1], result);
121             if (index + 1 < [tests count])
122                 runTest(index + 1);
123             else
124                 isDone = true;
125         }];
126     };
127
128     runTest(0);
129
130     TestWebKitAPI::Util::run(&isDone);
131 }
132
133 #endif
134
135 } // namespace TestWebKitAPI