Title: [274240] trunk/Tools
Revision
274240
Author
[email protected]
Date
2021-03-10 14:03:14 -0800 (Wed, 10 Mar 2021)

Log Message

Improve AppleLanguagesTest.UpdateAppleLanguages API test
https://bugs.webkit.org/show_bug.cgi?id=223037

Reviewed by Per Arne Vollan.

Made the following improvements to the test:
1. Use 'en-GB' initially instead of 'en-US'. Our bots use 'en-US' by default so this makes
   sure we are indeed able to change the system language.
2. Make it so that the test no longer times out if the languageevent fires but navigator.language
   returns an unexpected language. This was done by using [TestWKWebView performAfterReceivingAnyMessage:]
   instead of [TestWKWebView performAfterMessage:action:].
3. Add an internal timeout handling in the test instead of relying on the test suite's timeout.
   Without this, we would fail to reset the system's language at the end of the test in case
   of a timeout.

* TestWebKitAPI/Tests/WebKit/OverrideAppleLanguagesPreference.mm:
(TEST_F):
* TestWebKitAPI/cocoa/TestWKWebView.h:
* TestWebKitAPI/cocoa/TestWKWebView.mm:
(-[TestMessageHandler setWildcardMessageHandler:]):
(-[TestMessageHandler userContentController:didReceiveScriptMessage:]):
(-[TestWKWebView performAfterReceivingAnyMessage:]):

Modified Paths

Diff

Modified: trunk/Tools/ChangeLog (274239 => 274240)


--- trunk/Tools/ChangeLog	2021-03-10 22:00:22 UTC (rev 274239)
+++ trunk/Tools/ChangeLog	2021-03-10 22:03:14 UTC (rev 274240)
@@ -1,3 +1,28 @@
+2021-03-10  Chris Dumez  <[email protected]>
+
+        Improve AppleLanguagesTest.UpdateAppleLanguages API test
+        https://bugs.webkit.org/show_bug.cgi?id=223037
+
+        Reviewed by Per Arne Vollan.
+
+        Made the following improvements to the test:
+        1. Use 'en-GB' initially instead of 'en-US'. Our bots use 'en-US' by default so this makes
+           sure we are indeed able to change the system language.
+        2. Make it so that the test no longer times out if the languageevent fires but navigator.language
+           returns an unexpected language. This was done by using [TestWKWebView performAfterReceivingAnyMessage:]
+           instead of [TestWKWebView performAfterMessage:action:].
+        3. Add an internal timeout handling in the test instead of relying on the test suite's timeout.
+           Without this, we would fail to reset the system's language at the end of the test in case
+           of a timeout.
+
+        * TestWebKitAPI/Tests/WebKit/OverrideAppleLanguagesPreference.mm:
+        (TEST_F):
+        * TestWebKitAPI/cocoa/TestWKWebView.h:
+        * TestWebKitAPI/cocoa/TestWKWebView.mm:
+        (-[TestMessageHandler setWildcardMessageHandler:]):
+        (-[TestMessageHandler userContentController:didReceiveScriptMessage:]):
+        (-[TestWKWebView performAfterReceivingAnyMessage:]):
+
 2021-03-10  Adrian Perez de Castro  <[email protected]>
 
         [WPE][GTK] Running Tools/gtk/install-dependencies installs too many packages on Debian/Ubuntu

Modified: trunk/Tools/TestWebKitAPI/Tests/WebKit/OverrideAppleLanguagesPreference.mm (274239 => 274240)


--- trunk/Tools/TestWebKitAPI/Tests/WebKit/OverrideAppleLanguagesPreference.mm	2021-03-10 22:00:22 UTC (rev 274239)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKit/OverrideAppleLanguagesPreference.mm	2021-03-10 22:03:14 UTC (rev 274240)
@@ -88,8 +88,8 @@
 
 TEST_F(AppleLanguagesTest, UpdateAppleLanguages)
 {
-    // Tests uses "en-US" language initially.
-    system([NSString stringWithFormat:@"defaults write NSGlobalDomain AppleLanguages '(\"en-US\")'"].UTF8String);
+    // Tests uses "en-GB" language initially.
+    system([NSString stringWithFormat:@"defaults write NSGlobalDomain AppleLanguages '(\"en-GB\")'"].UTF8String);
 
     auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
     auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 300, 300) configuration:configuration.get() addToWindow:YES]);
@@ -101,7 +101,7 @@
     auto preferredLanguage = [&] {
         return [webView stringByEvaluatingJavaScript:@"navigator.language"];
     };
-    EXPECT_WK_STREQ(@"en-us", preferredLanguage());
+    EXPECT_WK_STREQ(@"en-gb", preferredLanguage());
 
     __block bool done = false;
     [webView evaluateJavaScript:@"_onlanguagechange_ = () => { webkit.messageHandlers.testHandler.postMessage(navigator.language); }; true;" completionHandler:^(id value, NSError *error) {
@@ -110,18 +110,25 @@
     }];
     TestWebKitAPI::Util::run(&done);
 
+    done = false;
     __block bool didChangeLanguage = false;
-    [webView performAfterReceivingMessage:@"en-gb" action:^{ didChangeLanguage = true; }];
-    [webView performAfterReceivingMessage:@"en-us" action:^{
-        EXPECT_TRUE(false); // navigator.language was wrong when the languagechange event fired.
+    [webView performAfterReceivingAnyMessage:^(NSString *newLanguage) {
+        EXPECT_WK_STREQ(@"en-us", newLanguage);
         didChangeLanguage = true;
+        done = true;
     }];
 
-    // Switch system language from "en-US" to "en-GB". Make sure that we fire a languagechange event at the Window and that navigator.language
+    // Switch system language from "en-GB" to "en-US". Make sure that we fire a languagechange event at the Window and that navigator.language
     // now reports "en-gb".
-    system([NSString stringWithFormat:@"defaults write NSGlobalDomain AppleLanguages '(\"en-GB\")'"].UTF8String);
+    system([NSString stringWithFormat:@"defaults write NSGlobalDomain AppleLanguages '(\"en-US\")'"].UTF8String);
     CFNotificationCenterPostNotification(CFNotificationCenterGetDistributedCenter(), CFSTR("AppleLanguagePreferencesChangedNotification"), nullptr, nullptr, true);
 
-    TestWebKitAPI::Util::run(&didChangeLanguage);
+    // Implement our own timeout because we would fail to reset the language if we let the test actually time out.
+    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 10 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
+        done = true;
+    });
+
+    TestWebKitAPI::Util::run(&done);
+    EXPECT_TRUE(didChangeLanguage);
 }
 #endif

Modified: trunk/Tools/TestWebKitAPI/cocoa/TestWKWebView.h (274239 => 274240)


--- trunk/Tools/TestWebKitAPI/cocoa/TestWKWebView.h	2021-03-10 22:00:22 UTC (rev 274239)
+++ trunk/Tools/TestWebKitAPI/cocoa/TestWKWebView.h	2021-03-10 22:03:14 UTC (rev 274240)
@@ -80,6 +80,7 @@
 - (void)synchronouslyLoadHTMLStringAndWaitUntilAllImmediateChildFramesPaint:(NSString *)html;
 - (void)clearMessageHandlers:(NSArray *)messageNames;
 - (void)performAfterReceivingMessage:(NSString *)message action:(dispatch_block_t)action;
+- (void)performAfterReceivingAnyMessage:(void (^)(NSString *))action;
 - (void)waitForMessage:(NSString *)message;
 
 // This function waits until a DOM load event is fired.

Modified: trunk/Tools/TestWebKitAPI/cocoa/TestWKWebView.mm (274239 => 274240)


--- trunk/Tools/TestWebKitAPI/cocoa/TestWKWebView.mm	2021-03-10 22:00:22 UTC (rev 274239)
+++ trunk/Tools/TestWebKitAPI/cocoa/TestWKWebView.mm	2021-03-10 22:03:14 UTC (rev 274240)
@@ -37,6 +37,7 @@
 #import <WebKit/_WKActivatedElementInfo.h>
 #import <WebKit/_WKProcessPoolConfiguration.h>
 #import <objc/runtime.h>
+#import <wtf/BlockPtr.h>
 #import <wtf/RetainPtr.h>
 
 #if PLATFORM(MAC)
@@ -255,6 +256,7 @@
 
 @implementation TestMessageHandler {
     NSMutableDictionary<NSString *, dispatch_block_t> *_messageHandlers;
+    BlockPtr<void(NSString *)> _wildcardMessageHandler;
 }
 
 - (void)addMessage:(NSString *)message withHandler:(dispatch_block_t)handler
@@ -265,6 +267,11 @@
     _messageHandlers[message] = [handler copy];
 }
 
+- (void)setWildcardMessageHandler:(void (^)(NSString *))handler
+{
+    _wildcardMessageHandler = handler;
+}
+
 - (void)removeMessage:(NSString *)message
 {
     [_messageHandlers removeObjectForKey:message];
@@ -275,6 +282,9 @@
     dispatch_block_t handler = _messageHandlers[message.body];
     if (handler)
         handler();
+
+    if (_wildcardMessageHandler)
+        _wildcardMessageHandler(message.body);
 }
 
 @end
@@ -511,6 +521,15 @@
     [_testHandler addMessage:message withHandler:action];
 }
 
+- (void)performAfterReceivingAnyMessage:(void (^)(NSString *))action
+{
+    if (!_testHandler) {
+        _testHandler = adoptNS([[TestMessageHandler alloc] init]);
+        [[[self configuration] userContentController] addScriptMessageHandler:_testHandler.get() name:@"testHandler"];
+    }
+    [_testHandler setWildcardMessageHandler:action];
+}
+
 - (void)synchronouslyLoadHTMLStringAndWaitUntilAllImmediateChildFramesPaint:(NSString *)html
 {
     bool didFireDOMLoadEvent = false;
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to