mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-08-10 01:59:31 +00:00
LibWeb: Fix CloseWatcher constructor for detached iframes
This fixes the last subtest in /close-watcher/frame-removal.html :)
This commit is contained in:
parent
14b2e5849d
commit
63d9ed9d8c
Notes:
github-actions[bot]
2024-10-15 12:42:46 +00:00
Author: https://github.com/beuss-git 🔰
Commit: 63d9ed9d8c
Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/1814
3 changed files with 34 additions and 2 deletions
|
@ -0,0 +1 @@
|
||||||
|
PASS
|
|
@ -0,0 +1,25 @@
|
||||||
|
<script src="../include.js"></script>
|
||||||
|
<script>
|
||||||
|
promiseTest(async () => {
|
||||||
|
const iframe = document.createElement('iframe');
|
||||||
|
document.body.appendChild(iframe);
|
||||||
|
|
||||||
|
await new Promise(resolve => iframe.onload = resolve);
|
||||||
|
|
||||||
|
const iframeCloseWatcher = iframe.contentWindow.CloseWatcher;
|
||||||
|
const iframeDOMException = iframe.contentWindow.DOMException;
|
||||||
|
|
||||||
|
iframe.remove();
|
||||||
|
|
||||||
|
try {
|
||||||
|
new iframeCloseWatcher();
|
||||||
|
println("FAIL");
|
||||||
|
} catch (error) {
|
||||||
|
if (error instanceof iframeDOMException && error.name === "InvalidStateError") {
|
||||||
|
println("PASS");
|
||||||
|
} else {
|
||||||
|
println(`FAIL: CloseWatcher construction threw unexpected error: ${error.name}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
|
@ -13,6 +13,7 @@
|
||||||
#include <LibWeb/HTML/CloseWatcher.h>
|
#include <LibWeb/HTML/CloseWatcher.h>
|
||||||
#include <LibWeb/HTML/CloseWatcherManager.h>
|
#include <LibWeb/HTML/CloseWatcherManager.h>
|
||||||
#include <LibWeb/HTML/EventHandler.h>
|
#include <LibWeb/HTML/EventHandler.h>
|
||||||
|
#include <LibWeb/HTML/HTMLIFrameElement.h>
|
||||||
#include <LibWeb/HTML/Window.h>
|
#include <LibWeb/HTML/Window.h>
|
||||||
|
|
||||||
namespace Web::HTML {
|
namespace Web::HTML {
|
||||||
|
@ -41,9 +42,14 @@ JS::NonnullGCPtr<CloseWatcher> CloseWatcher::establish(HTML::Window& window)
|
||||||
// https://html.spec.whatwg.org/multipage/interaction.html#dom-closewatcher
|
// https://html.spec.whatwg.org/multipage/interaction.html#dom-closewatcher
|
||||||
WebIDL::ExceptionOr<JS::NonnullGCPtr<CloseWatcher>> CloseWatcher::construct_impl(JS::Realm& realm, CloseWatcherOptions const& options)
|
WebIDL::ExceptionOr<JS::NonnullGCPtr<CloseWatcher>> CloseWatcher::construct_impl(JS::Realm& realm, CloseWatcherOptions const& options)
|
||||||
{
|
{
|
||||||
// 1. If this's relevant global object's associated Document is not fully active, then return an "InvalidStateError" DOMException.
|
|
||||||
// FIXME: Not in spec explicitly, but this should account for detached iframes too. See /close-watcher/frame-removal.html WPT.
|
|
||||||
auto& window = verify_cast<HTML::Window>(realm.global_object());
|
auto& window = verify_cast<HTML::Window>(realm.global_object());
|
||||||
|
|
||||||
|
// NOTE: Not in spec explicitly, but this should account for detached iframes too. See /close-watcher/frame-removal.html WPT.
|
||||||
|
auto navigable = window.navigable();
|
||||||
|
if (navigable && navigable->has_been_destroyed())
|
||||||
|
return WebIDL::InvalidStateError::create(realm, "The iframe has been detached"_string);
|
||||||
|
|
||||||
|
// 1. If this's relevant global object's associated Document is not fully active, then return an "InvalidStateError" DOMException.
|
||||||
if (!window.associated_document().is_fully_active())
|
if (!window.associated_document().is_fully_active())
|
||||||
return WebIDL::InvalidStateError::create(realm, "The document is not fully active."_string);
|
return WebIDL::InvalidStateError::create(realm, "The document is not fully active."_string);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue