Changeset 281228 in webkit


Ignore:
Timestamp:
Aug 19, 2021 1:46:05 AM (11 months ago)
Author:
commit-queue@webkit.org
Message:

document.hasFocus() returns true for unfocused pages
https://bugs.webkit.org/show_bug.cgi?id=229139

Patch by Carlos Garcia Campos <cgarcia@igalia.com> on 2021-08-19
Reviewed by Adrian Perez de Castro.

Source/WebCore:

We are always claiming to be focused when the document in the active window even if the page is not actually
focused.

  • dom/Document.cpp:

(WebCore::Document::hasFocus const): Check also that page is focused.

Tools:

Add a unit tests to check document.hasFocus() returns false when a web view is in the active window, but not focused.

  • TestWebKitAPI/Tests/WebKitCocoa/_WKWebAuthenticationPanel.mm:

(TestWebKitAPI::TEST): Ensure web view is focused as required by credentials container.

  • TestWebKitAPI/Tests/WebKitGLib/TestWebKitWebView.cpp:

(testWebViewDocumentFocus):
(beforeAll):

  • TestWebKitAPI/cocoa/TestWKWebView.h:
  • TestWebKitAPI/cocoa/TestWKWebView.mm:

(-[TestWKWebView focus]):

Location:
trunk
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r281227 r281228  
     12021-08-19  Carlos Garcia Campos  <cgarcia@igalia.com>
     2
     3        document.hasFocus() returns true for unfocused pages
     4        https://bugs.webkit.org/show_bug.cgi?id=229139
     5
     6        Reviewed by Adrian Perez de Castro.
     7
     8        We are always claiming to be focused when the document in the active window even if the page is not actually
     9        focused.
     10
     11        * dom/Document.cpp:
     12        (WebCore::Document::hasFocus const): Check also that page is focused.
     13
    1142021-08-19  Youenn Fablet  <youenn@apple.com>
    215
  • trunk/Source/WebCore/dom/Document.cpp

    r281147 r281228  
    76207620{
    76217621    Page* page = this->page();
    7622     if (!page || !page->focusController().isActive())
     7622    if (!page || !page->focusController().isActive() || !page->focusController().isFocused())
    76237623        return false;
    76247624    if (Frame* focusedFrame = page->focusController().focusedFrame()) {
  • trunk/Tools/ChangeLog

    r281221 r281228  
     12021-08-19  Carlos Garcia Campos  <cgarcia@igalia.com>
     2
     3        document.hasFocus() returns true for unfocused pages
     4        https://bugs.webkit.org/show_bug.cgi?id=229139
     5
     6        Reviewed by Adrian Perez de Castro.
     7
     8        Add a unit tests to check document.hasFocus() returns false when a web view is in the active window, but not focused.
     9
     10        * TestWebKitAPI/Tests/WebKitCocoa/_WKWebAuthenticationPanel.mm:
     11        (TestWebKitAPI::TEST): Ensure web view is focused as required by credentials container.
     12        * TestWebKitAPI/Tests/WebKitGLib/TestWebKitWebView.cpp:
     13        (testWebViewDocumentFocus):
     14        (beforeAll):
     15        * TestWebKitAPI/cocoa/TestWKWebView.h:
     16        * TestWebKitAPI/cocoa/TestWKWebView.mm:
     17        (-[TestWKWebView focus]):
     18
    1192021-08-18  David Kilzer  <ddkilzer@apple.com>
    220
  • trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/_WKWebAuthenticationPanel.mm

    r279856 r281228  
    433433
    434434    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSZeroRect configuration:configuration]);
     435    [webView focus];
    435436
    436437    [webView loadRequest:[NSURLRequest requestWithURL:testURL.get()]];
     
    447448
    448449    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSZeroRect configuration:configuration]);
     450    [webView focus];
    449451
    450452    [webView loadRequest:[NSURLRequest requestWithURL:testURL.get()]];
     
    464466    auto delegate = adoptNS([[TestWebAuthenticationPanelUIDelegate alloc] init]);
    465467    [webView setUIDelegate:delegate.get()];
     468    [webView focus];
    466469
    467470    [webView loadRequest:[NSURLRequest requestWithURL:testURL.get()]];
     
    486489    auto delegate = adoptNS([[TestWebAuthenticationPanelUIDelegate alloc] init]);
    487490    [webView setUIDelegate:delegate.get()];
     491    [webView focus];
    488492
    489493    [webView loadRequest:[NSURLRequest requestWithURL:testURL.get()]];
     
    514518    [delegate setIsRacy:true];
    515519    [webView setUIDelegate:delegate.get()];
     520    [webView focus];
    516521
    517522    [webView loadRequest:[NSURLRequest requestWithURL:testURL.get()]];
     
    538543    [delegate setIsRacy:true];
    539544    [webView setUIDelegate:delegate.get()];
     545    [webView focus];
    540546
    541547    [webView loadRequest:[NSURLRequest requestWithURL:testURL.get()]];
     
    561567    auto delegate = adoptNS([[TestWebAuthenticationPanelUIDelegate alloc] init]);
    562568    [webView setUIDelegate:delegate.get()];
     569    [webView focus];
    563570
    564571    [webView loadRequest:[NSURLRequest requestWithURL:testURL.get()]];
     
    584591    auto delegate = adoptNS([[TestWebAuthenticationPanelUIDelegate alloc] init]);
    585592    [webView setUIDelegate:delegate.get()];
     593    [webView focus];
    586594
    587595    [webView loadRequest:[NSURLRequest requestWithURL:testURL.get()]];
     
    604612    auto delegate = adoptNS([[TestWebAuthenticationPanelUIDelegate alloc] init]);
    605613    [webView setUIDelegate:delegate.get()];
     614    [webView focus];
    606615
    607616    [webView loadRequest:[NSURLRequest requestWithURL:testURL.get()]];
     
    624633    auto delegate = adoptNS([[TestWebAuthenticationPanelUIDelegate alloc] init]);
    625634    [webView setUIDelegate:delegate.get()];
     635    [webView focus];
    626636
    627637    [webView loadRequest:[NSURLRequest requestWithURL:testURL.get()]];
     
    643653    auto delegate = adoptNS([[TestWebAuthenticationPanelUIDelegate alloc] init]);
    644654    [webView setUIDelegate:delegate.get()];
     655    [webView focus];
    645656
    646657    [webView loadRequest:[NSURLRequest requestWithURL:testURL.get()]];
     
    681692    auto delegate = adoptNS([[TestWebAuthenticationPanelUIDelegate alloc] init]);
    682693    [webView setUIDelegate:delegate.get()];
     694    [webView focus];
    683695
    684696    auto port = static_cast<unsigned>(server.port());
     
    725737    auto delegate = adoptNS([[TestWebAuthenticationPanelUIDelegate alloc] init]);
    726738    [webView setUIDelegate:delegate.get()];
     739    [webView focus];
    727740
    728741    [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:(id)makeString("http://localhost:", server.port())]]];
     
    744757    auto delegate = adoptNS([[TestWebAuthenticationPanelUIDelegate alloc] init]);
    745758    [webView setUIDelegate:delegate.get()];
     759    [webView focus];
    746760
    747761    [webView loadRequest:[NSURLRequest requestWithURL:testURL.get()]];
     
    764778    auto delegate = adoptNS([[TestWebAuthenticationPanelUIDelegate alloc] init]);
    765779    [webView setUIDelegate:delegate.get()];
     780    [webView focus];
    766781
    767782    [webView loadRequest:[NSURLRequest requestWithURL:testURL.get()]];
     
    782797    auto delegate = adoptNS([[TestWebAuthenticationPanelUIDelegate alloc] init]);
    783798    [webView setUIDelegate:delegate.get()];
     799    [webView focus];
    784800
    785801    [webView loadRequest:[NSURLRequest requestWithURL:testURL.get()]];
     
    801817    [delegate setIsFake:true];
    802818    [webView setUIDelegate:delegate.get()];
     819    [webView focus];
    803820
    804821    [webView loadRequest:[NSURLRequest requestWithURL:testURL.get()]];
     
    820837    [delegate setIsFake:true];
    821838    [webView setUIDelegate:delegate.get()];
     839    [webView focus];
    822840
    823841    [webView loadRequest:[NSURLRequest requestWithURL:testURL.get()]];
     
    839857    [delegate setIsNull:true];
    840858    [webView setUIDelegate:delegate.get()];
     859    [webView focus];
    841860
    842861    [webView loadRequest:[NSURLRequest requestWithURL:testURL.get()]];
     
    858877    [delegate setIsNull:true];
    859878    [webView setUIDelegate:delegate.get()];
     879    [webView focus];
    860880
    861881    [webView loadRequest:[NSURLRequest requestWithURL:testURL.get()]];
     
    877897    auto delegate = adoptNS([[TestWebAuthenticationPanelUIDelegate alloc] init]);
    878898    [webView setUIDelegate:delegate.get()];
     899    [webView focus];
    879900
    880901    [webView loadRequest:[NSURLRequest requestWithURL:testURL.get()]];
     
    896917    auto delegate = adoptNS([[TestWebAuthenticationPanelUIDelegate alloc] init]);
    897918    [webView setUIDelegate:delegate.get()];
     919    [webView focus];
    898920
    899921    [webView loadRequest:[NSURLRequest requestWithURL:testURL.get()]];
     
    916938    auto delegate = adoptNS([[TestWebAuthenticationPanelUIDelegate alloc] init]);
    917939    [webView setUIDelegate:delegate.get()];
     940    [webView focus];
    918941    webAuthenticationPanelCancelImmediately = true;
    919942
     
    934957    auto delegate = adoptNS([[TestWebAuthenticationPanelUIDelegate alloc] init]);
    935958    [webView setUIDelegate:delegate.get()];
     959    [webView focus];
    936960    webAuthenticationPanelCancelImmediately = true;
    937961
     
    950974
    951975    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSZeroRect configuration:configuration]);
     976    [webView focus];
    952977    [webView loadRequest:[NSURLRequest requestWithURL:testURL.get()]];
    953978    [webView waitForMessage:@"Unknown internal error. Error code: 2"];
     
    964989
    965990    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSZeroRect configuration:configuration]);
     991    [webView focus];
    966992    [webView loadRequest:[NSURLRequest requestWithURL:testURL.get()]];
    967993    [webView waitForMessage:@"Unknown internal error. Error code: 2"];
     
    9781004
    9791005    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSZeroRect configuration:configuration]);
     1006    [webView focus];
    9801007    [webView loadRequest:[NSURLRequest requestWithURL:testURL.get()]];
    9811008    [webView waitForMessage:@"Pin is null."];
     
    9951022    [delegate setIsNull:true];
    9961023    [webView setUIDelegate:delegate.get()];
     1024    [webView focus];
    9971025
    9981026    [webView loadRequest:[NSURLRequest requestWithURL:testURL.get()]];
     
    10121040    auto delegate = adoptNS([[TestWebAuthenticationPanelUIDelegate alloc] init]);
    10131041    [webView setUIDelegate:delegate.get()];
     1042    [webView focus];
    10141043
    10151044    webAuthenticationPanelPin = "123";
     
    10321061    auto delegate = adoptNS([[TestWebAuthenticationPanelUIDelegate alloc] init]);
    10331062    [webView setUIDelegate:delegate.get()];
     1063    [webView focus];
    10341064
    10351065    webAuthenticationPanelPin = "1234";
     
    10521082    auto delegate = adoptNS([[TestWebAuthenticationPanelUIDelegate alloc] init]);
    10531083    [webView setUIDelegate:delegate.get()];
     1084    [webView focus];
    10541085
    10551086    webAuthenticationPanelPin = "1234";
     
    10721103    auto delegate = adoptNS([[TestWebAuthenticationPanelUIDelegate alloc] init]);
    10731104    [webView setUIDelegate:delegate.get()];
     1105    [webView focus];
    10741106
    10751107    webAuthenticationPanelPin = "1234";
     
    10911123    auto delegate = adoptNS([[TestWebAuthenticationPanelUIDelegate alloc] init]);
    10921124    [webView setUIDelegate:delegate.get()];
     1125    [webView focus];
    10931126
    10941127    webAuthenticationPanelPin = "1234";
     
    11101143    auto delegate = adoptNS([[TestWebAuthenticationPanelUIDelegate alloc] init]);
    11111144    [webView setUIDelegate:delegate.get()];
     1145    [webView focus];
    11121146
    11131147    webAuthenticationPanelPin = "1234";
     
    11281162    auto delegate = adoptNS([[TestWebAuthenticationPanelUIDelegate alloc] init]);
    11291163    [webView setUIDelegate:delegate.get()];
     1164    [webView focus];
    11301165
    11311166    webAuthenticationPanelPin = "1234";
     
    11481183    auto delegate = adoptNS([[TestWebAuthenticationPanelUIDelegate alloc] init]);
    11491184    [webView setUIDelegate:delegate.get()];
     1185    [webView focus];
    11501186
    11511187    webAuthenticationPanelPin = "1234";
     
    11671203    auto delegate = adoptNS([[TestWebAuthenticationPanelUIDelegate alloc] init]);
    11681204    [webView setUIDelegate:delegate.get()];
     1205    [webView focus];
    11691206
    11701207    webAuthenticationPanelPin = "1234";
     
    11851222    auto delegate = adoptNS([[TestWebAuthenticationPanelUIDelegate alloc] init]);
    11861223    [webView setUIDelegate:delegate.get()];
     1224    [webView focus];
    11871225
    11881226    webAuthenticationPanelPin = "1234";
     
    12051243    auto delegate = adoptNS([[TestWebAuthenticationPanelUIDelegate alloc] init]);
    12061244    [webView setUIDelegate:delegate.get()];
     1245    [webView focus];
    12071246
    12081247    webAuthenticationPanelPin = "1234";
     
    12251264    auto delegate = adoptNS([[TestWebAuthenticationPanelUIDelegate alloc] init]);
    12261265    [webView setUIDelegate:delegate.get()];
     1266    [webView focus];
    12271267
    12281268    webAuthenticationPanelPin = "1234";
     
    12451285    [delegate setIsNull:true];
    12461286    [webView setUIDelegate:delegate.get()];
     1287    [webView focus];
    12471288
    12481289    [webView loadRequest:[NSURLRequest requestWithURL:testURL.get()]];
     
    12621303    auto delegate = adoptNS([[TestWebAuthenticationPanelUIDelegate alloc] init]);
    12631304    [webView setUIDelegate:delegate.get()];
     1305    [webView focus];
    12641306
    12651307    [webView loadRequest:[NSURLRequest requestWithURL:testURL.get()]];
     
    12841326    auto delegate = adoptNS([[TestWebAuthenticationPanelUIDelegate alloc] init]);
    12851327    [webView setUIDelegate:delegate.get()];
     1328    [webView focus];
    12861329
    12871330    [webView loadRequest:[NSURLRequest requestWithURL:testURL.get()]];
     
    13011344    auto delegate = adoptNS([[TestWebAuthenticationPanelUIDelegate alloc] init]);
    13021345    [webView setUIDelegate:delegate.get()];
     1346    [webView focus];
    13031347
    13041348    ASSERT_TRUE(addKeyToKeychain(testES256PrivateKeyBase64, "", testUserEntityBundleBase64));
     
    13201364    auto delegate = adoptNS([[TestWebAuthenticationPanelUIDelegate alloc] init]);
    13211365    [webView setUIDelegate:delegate.get()];
     1366    [webView focus];
    13221367
    13231368    [webView loadRequest:[NSURLRequest requestWithURL:testURL.get()]];
     
    13381383    [delegate setIsNull:true];
    13391384    [webView setUIDelegate:delegate.get()];
     1385    [webView focus];
    13401386
    13411387    [webView loadRequest:[NSURLRequest requestWithURL:testURL.get()]];
     
    13551401    auto delegate = adoptNS([[TestWebAuthenticationPanelUIDelegate alloc] init]);
    13561402    [webView setUIDelegate:delegate.get()];
     1403    [webView focus];
    13571404
    13581405    [webView loadRequest:[NSURLRequest requestWithURL:testURL.get()]];
     
    13721419    auto delegate = adoptNS([[TestWebAuthenticationPanelUIDelegate alloc] init]);
    13731420    [webView setUIDelegate:delegate.get()];
     1421    [webView focus];
    13741422
    13751423    localAuthenticatorPolicy = _WKLocalAuthenticatorPolicyAllow;
     
    13921440    auto delegate = adoptNS([[TestWebAuthenticationPanelUIDelegate alloc] init]);
    13931441    [webView setUIDelegate:delegate.get()];
     1442    [webView focus];
    13941443
    13951444    [webView loadRequest:[NSURLRequest requestWithURL:testURL.get()]];
     
    14091458    auto delegate = adoptNS([[TestWebAuthenticationPanelUIDelegate alloc] init]);
    14101459    [webView setUIDelegate:delegate.get()];
     1460    [webView focus];
    14111461
    14121462    localAuthenticatorPolicy = _WKLocalAuthenticatorPolicyAllow;
     
    14421492    auto delegate = adoptNS([[TestWebAuthenticationPanelUIDelegate alloc] init]);
    14431493    [webView setUIDelegate:delegate.get()];
     1494    [webView focus];
    14441495
    14451496    ASSERT_TRUE(addKeyToKeychain(testES256PrivateKeyBase64, "", testUserEntityBundleBase64));
     
    14621513    auto delegate = adoptNS([[TestWebAuthenticationPanelUIDelegate alloc] init]);
    14631514    [webView setUIDelegate:delegate.get()];
     1515    [webView focus];
    14641516
    14651517    [webView loadRequest:[NSURLRequest requestWithURL:testURL.get()]];
     
    14791531    auto delegate = adoptNS([[TestWebAuthenticationPanelUIDelegate alloc] init]);
    14801532    [webView setUIDelegate:delegate.get()];
     1533    [webView focus];
    14811534
    14821535    ASSERT_TRUE(addKeyToKeychain(testES256PrivateKeyBase64, "", testUserEntityBundleBase64));
  • trunk/Tools/TestWebKitAPI/Tests/WebKitGLib/TestWebKitWebView.cpp

    r281079 r281228  
    799799}
    800800
     801static void testWebViewDocumentFocus(WebViewTest* test, gconstpointer)
     802{
     803    if (!g_strcmp0(g_getenv("UNDER_XVFB"), "yes")) {
     804        g_test_skip("This tests doesn't work under Xvfb");
     805        return;
     806    }
     807
     808    test->showInWindow();
     809    test->loadHtml("<html><title></title>"
     810        "<body onload='document.getElementById(\"editable\").focus()'>"
     811        "<input id='editable'></input>"
     812        "<script>"
     813        "document.addEventListener(\"visibilitychange\", onVisibilityChange, false);"
     814        "function onVisibilityChange() {"
     815        "    document.title = document.visibilityState;"
     816        "}"
     817        "</script>"
     818        "</body></html>",
     819        nullptr);
     820    test->waitUntilLoadFinished();
     821
     822    GUniqueOutPtr<GError> error;
     823    WebKitJavascriptResult* javascriptResult = test->runJavaScriptAndWaitUntilFinished("document.hasFocus();", &error.outPtr());
     824    g_assert_nonnull(javascriptResult);
     825    g_assert_no_error(error.get());
     826    g_assert_true(WebViewTest::javascriptResultToBoolean(javascriptResult));
     827
     828    // Hide the view to make it lose the focus, the window is still the active one though.
     829    test->hideView();
     830    test->waitUntilTitleChangedTo("hidden");
     831    javascriptResult = test->runJavaScriptAndWaitUntilFinished("document.hasFocus();", &error.outPtr());
     832    g_assert_nonnull(javascriptResult);
     833    g_assert_no_error(error.get());
     834    g_assert_false(WebViewTest::javascriptResultToBoolean(javascriptResult));
     835}
     836
    801837#if PLATFORM(GTK)
    802838class SnapshotWebViewTest: public WebViewTest {
     
    17101746#endif
    17111747    WebViewTest::add("WebKitWebView", "page-visibility", testWebViewPageVisibility);
     1748    WebViewTest::add("WebKitWebView", "document-focus", testWebViewDocumentFocus);
    17121749#if ENABLE(NOTIFICATIONS)
    17131750    NotificationWebViewTest::add("WebKitWebView", "notification", testWebViewNotification);
  • trunk/Tools/TestWebKitAPI/cocoa/TestWKWebView.h

    r280336 r281228  
    102102- (void)clickOnElementID:(NSString *)elementID;
    103103- (void)waitForPendingMouseEvents;
     104- (void)focus;
    104105@end
    105106
  • trunk/Tools/TestWebKitAPI/cocoa/TestWKWebView.mm

    r280336 r281228  
    655655}
    656656
     657- (void)focus
     658{
     659#if PLATFORM(MAC)
     660    [_hostWindow makeFirstResponder:self];
     661#else
     662    [super becomeFirstResponder];
     663#endif
     664}
     665
    657666#if PLATFORM(IOS_FAMILY)
    658667
Note: See TracChangeset for help on using the changeset viewer.