Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Don't fire window or tab events until the browser calls didOpenTab: and didOpenWindow:. #23841

Merged
merged 1 commit into from
Feb 5, 2024

Conversation

xeenon
Copy link
Contributor

@xeenon xeenon commented Feb 5, 2024

1e7cb6d

Don't fire window or tab events until the browser calls didOpenTab: and didOpenWindow:.
https://webkit.org/b/268671
rdar://122143707

Reviewed by Brian Weinstein.

Be more protective of when we fire window and tab events, so we never fire events
if the window or tab hasn't fired the onCreated event. Also add more smart pointer
use, assertions, and error logging to catch misuse.

While fixing this, I discovered the WKWebExtensionAPITabs.QueryWithPrivateAccess
test was not correct and was missing the tests for the incognito windows. Fixed
things up there, and added optional chaining to avoid exceptions when things are
incorrectly undefined / null.

* Source/WebKit/UIProcess/API/Cocoa/_WKWebExtensionContext.mm:
(toAPI):
* Source/WebKit/UIProcess/Extensions/Cocoa/WebExtensionContextCocoa.mm:
(WebKit::WebExtensionContext::postAsyncNotification):
(WebKit::WebExtensionContext::removeGrantedPermissionMatchPatterns):
(WebKit::WebExtensionContext::getOrCreateWindow const):
(WebKit::WebExtensionContext::getWindow const):
(WebKit::WebExtensionContext::forgetWindow const):
(WebKit::WebExtensionContext::getOrCreateTab const):
(WebKit::WebExtensionContext::getTab const):
(WebKit::WebExtensionContext::getCurrentTab const):
(WebKit::WebExtensionContext::forgetTab const):
(WebKit::WebExtensionContext::populateWindowsAndTabs):
(WebKit::WebExtensionContext::isValidWindow):
(WebKit::WebExtensionContext::isValidTab):
(WebKit::WebExtensionContext::openWindows const):
(WebKit::WebExtensionContext::openTabs const):
(WebKit::WebExtensionContext::frontmostWindow const):
(WebKit::WebExtensionContext::didOpenWindow):
(WebKit::WebExtensionContext::didCloseWindow):
(WebKit::WebExtensionContext::didFocusWindow):
(WebKit::WebExtensionContext::didOpenTab):
(WebKit::WebExtensionContext::didCloseTab):
(WebKit::WebExtensionContext::didActivateTab):
(WebKit::WebExtensionContext::didSelectOrDeselectTabs):
(WebKit::WebExtensionContext::didMoveTab):
(WebKit::WebExtensionContext::didReplaceTab):
(WebKit::WebExtensionContext::didChangeTabProperties):
(WebKit::WebExtensionContext::resourceLoadDidSendRequest):
(WebKit::WebExtensionContext::resourceLoadDidPerformHTTPRedirection):
(WebKit::WebExtensionContext::resourceLoadDidReceiveChallenge):
(WebKit::WebExtensionContext::resourceLoadDidReceiveResponse):
(WebKit::WebExtensionContext::resourceLoadDidCompleteWithError):
* Source/WebKit/UIProcess/Extensions/Cocoa/WebExtensionTabCocoa.mm:
(WebKit::WebExtensionTab::parameters const):
(WebKit::WebExtensionTab::index const):
(WebKit::WebExtensionTab::parentTab const):
(WebKit::WebExtensionTab::mainWebView const):
(WebKit::WebExtensionTab::webViews const):
(WebKit::WebExtensionTab::isOpen const):
(WebKit::WebExtensionTab::isActive const):
(WebKit::WebExtensionTab::isPrivate const):
* Source/WebKit/UIProcess/Extensions/Cocoa/WebExtensionWindowCocoa.mm:
(WebKit::WebExtensionWindow::activeTab const):
(WebKit::WebExtensionWindow::isOpen const):
* Source/WebKit/UIProcess/Extensions/WebExtensionContext.h:
(WebKit::WebExtensionContext::openTabs const): Deleted.
* Source/WebKit/UIProcess/Extensions/WebExtensionTab.h:
(WebKit::WebExtensionTab::didOpen):
(WebKit::WebExtensionTab::didClose):
* Source/WebKit/UIProcess/Extensions/WebExtensionWindow.h:
(WebKit::WebExtensionWindow::didOpen):
(WebKit::WebExtensionWindow::didClose):
* Tools/TestWebKitAPI/Tests/WebKitCocoa/WKWebExtensionAPITabs.mm:
(TestWebKitAPI::TEST):

Canonical link: https://commits.webkit.org/274103@main

8669f6f

Misc iOS, tvOS & watchOS macOS Linux Windows
❌ πŸ§ͺ style   πŸ›  ios   πŸ›  mac   πŸ›  wpe   πŸ›  wincairo
❌ πŸ§ͺ bindings   πŸ›  ios-sim   πŸ›  mac-AS-debug   πŸ§ͺ wpe-wk2
  πŸ§ͺ webkitperl   πŸ§ͺ ios-wk2   πŸ§ͺ api-mac   πŸ§ͺ api-wpe
  πŸ§ͺ ios-wk2-wpt   πŸ§ͺ mac-wk1   πŸ›  gtk
  πŸ§ͺ api-ios   πŸ§ͺ mac-wk2   πŸ§ͺ gtk-wk2
  πŸ›  tv   πŸ§ͺ mac-AS-debug-wk2   πŸ§ͺ api-gtk
  πŸ›  tv-sim
  πŸ›  watch
βœ… πŸ›  πŸ§ͺ unsafe-merge   πŸ›  watch-sim

@xeenon xeenon self-assigned this Feb 5, 2024
@xeenon xeenon added the WebKit Extensions Bugs related to extension support. label Feb 5, 2024
@kiaraarose kiaraarose self-requested a review February 5, 2024 17:09
@b-weinstein
Copy link
Contributor

Fire window or tab events until the browser

Should this be Don't fire window or tab events...?

ASSERT(m_windowMap.get(window.identifier()) == &window);
ASSERT(isValidWindow(window));

// The window might already be open, don't log an error.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we have any examples of when this could have been the case? It might be useful to list one here if we know what it is.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We blindly call this in a couple places, to make sure it is open, like the delegate calls to populate on load, when the app might have already told us about the window directly too. These methods are also tied directly to the API, and I figured it was fine to no show too much noise if client app calls it multiple times since we ignore repeats.

ASSERT(m_tabMap.get(tab.identifier()) == &tab);
ASSERT(isValidTab(tab));

// The tab might already be open, don't log an error.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ditto adding an example of when this could happen.

@xeenon xeenon changed the title Fire window or tab events until the browser calls didOpenTab: and didOpenWindow:. Don't fire window or tab events until the browser calls didOpenTab: and didOpenWindow:. Feb 5, 2024
@xeenon xeenon added the unsafe-merge-queue Applied to send a pull request to merge-queue, but skip building and testing label Feb 5, 2024
…nd didOpenWindow:.

https://webkit.org/b/268671
rdar://122143707

Reviewed by Brian Weinstein.

Be more protective of when we fire window and tab events, so we never fire events
if the window or tab hasn't fired the onCreated event. Also add more smart pointer
use, assertions, and error logging to catch misuse.

While fixing this, I discovered the WKWebExtensionAPITabs.QueryWithPrivateAccess
test was not correct and was missing the tests for the incognito windows. Fixed
things up there, and added optional chaining to avoid exceptions when things are
incorrectly undefined / null.

* Source/WebKit/UIProcess/API/Cocoa/_WKWebExtensionContext.mm:
(toAPI):
* Source/WebKit/UIProcess/Extensions/Cocoa/WebExtensionContextCocoa.mm:
(WebKit::WebExtensionContext::postAsyncNotification):
(WebKit::WebExtensionContext::removeGrantedPermissionMatchPatterns):
(WebKit::WebExtensionContext::getOrCreateWindow const):
(WebKit::WebExtensionContext::getWindow const):
(WebKit::WebExtensionContext::forgetWindow const):
(WebKit::WebExtensionContext::getOrCreateTab const):
(WebKit::WebExtensionContext::getTab const):
(WebKit::WebExtensionContext::getCurrentTab const):
(WebKit::WebExtensionContext::forgetTab const):
(WebKit::WebExtensionContext::populateWindowsAndTabs):
(WebKit::WebExtensionContext::isValidWindow):
(WebKit::WebExtensionContext::isValidTab):
(WebKit::WebExtensionContext::openWindows const):
(WebKit::WebExtensionContext::openTabs const):
(WebKit::WebExtensionContext::frontmostWindow const):
(WebKit::WebExtensionContext::didOpenWindow):
(WebKit::WebExtensionContext::didCloseWindow):
(WebKit::WebExtensionContext::didFocusWindow):
(WebKit::WebExtensionContext::didOpenTab):
(WebKit::WebExtensionContext::didCloseTab):
(WebKit::WebExtensionContext::didActivateTab):
(WebKit::WebExtensionContext::didSelectOrDeselectTabs):
(WebKit::WebExtensionContext::didMoveTab):
(WebKit::WebExtensionContext::didReplaceTab):
(WebKit::WebExtensionContext::didChangeTabProperties):
(WebKit::WebExtensionContext::resourceLoadDidSendRequest):
(WebKit::WebExtensionContext::resourceLoadDidPerformHTTPRedirection):
(WebKit::WebExtensionContext::resourceLoadDidReceiveChallenge):
(WebKit::WebExtensionContext::resourceLoadDidReceiveResponse):
(WebKit::WebExtensionContext::resourceLoadDidCompleteWithError):
* Source/WebKit/UIProcess/Extensions/Cocoa/WebExtensionTabCocoa.mm:
(WebKit::WebExtensionTab::parameters const):
(WebKit::WebExtensionTab::index const):
(WebKit::WebExtensionTab::parentTab const):
(WebKit::WebExtensionTab::mainWebView const):
(WebKit::WebExtensionTab::webViews const):
(WebKit::WebExtensionTab::isOpen const):
(WebKit::WebExtensionTab::isActive const):
(WebKit::WebExtensionTab::isPrivate const):
* Source/WebKit/UIProcess/Extensions/Cocoa/WebExtensionWindowCocoa.mm:
(WebKit::WebExtensionWindow::activeTab const):
(WebKit::WebExtensionWindow::isOpen const):
* Source/WebKit/UIProcess/Extensions/WebExtensionContext.h:
(WebKit::WebExtensionContext::openTabs const): Deleted.
* Source/WebKit/UIProcess/Extensions/WebExtensionTab.h:
(WebKit::WebExtensionTab::didOpen):
(WebKit::WebExtensionTab::didClose):
* Source/WebKit/UIProcess/Extensions/WebExtensionWindow.h:
(WebKit::WebExtensionWindow::didOpen):
(WebKit::WebExtensionWindow::didClose):
* Tools/TestWebKitAPI/Tests/WebKitCocoa/WKWebExtensionAPITabs.mm:
(TestWebKitAPI::TEST):

Canonical link: https://commits.webkit.org/274103@main
@webkit-commit-queue
Copy link
Collaborator

Committed 274103@main (1e7cb6d): https://commits.webkit.org/274103@main

Reviewed commits have been landed. Closing PR #23841 and removing active labels.

@webkit-commit-queue webkit-commit-queue merged commit 1e7cb6d into WebKit:main Feb 5, 2024
@webkit-commit-queue webkit-commit-queue removed the unsafe-merge-queue Applied to send a pull request to merge-queue, but skip building and testing label Feb 5, 2024
@xeenon xeenon deleted the bug/268671 branch February 29, 2024 17:43
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
WebKit Extensions Bugs related to extension support.
Projects
None yet
4 participants