diff --git a/Libraries/LibWeb/StorageAPI/StorageKey.cpp b/Libraries/LibWeb/StorageAPI/StorageKey.cpp index 6b66d28a2d8..23788f43270 100644 --- a/Libraries/LibWeb/StorageAPI/StorageKey.cpp +++ b/Libraries/LibWeb/StorageAPI/StorageKey.cpp @@ -16,6 +16,10 @@ Optional obtain_a_storage_key(HTML::Environment const& environment) // 1. Let key be the result of running obtain a storage key for non-storage purposes with environment. auto key = obtain_a_storage_key_for_non_storage_purposes(environment); + // AD-HOC: file:// URLs are opaque, but other browsers support storage on file:// URLs. + if (key.origin.is_opaque_file_origin()) + key.origin = URL::Origin { "file"_string, String {}, {} }; + // 2. If key’s origin is an opaque origin, then return failure. if (key.origin.is_opaque()) return {}; @@ -36,11 +40,14 @@ StorageKey obtain_a_storage_key_for_non_storage_purposes(URL::Origin const& orig StorageKey obtain_a_storage_key_for_non_storage_purposes(HTML::Environment const& environment) { // 1. Let origin be environment’s origin if environment is an environment settings object; otherwise environment’s creation URL’s origin. - if (is(environment)) { - auto const& settings = static_cast(environment); - return { settings.origin() }; - } - return { environment.creation_url.origin() }; + auto origin = [&]() { + if (auto const* settings = as_if(environment)) + return settings->origin(); + return environment.creation_url.origin(); + }(); + + // 2. Return a tuple consisting of origin. + return { move(origin) }; } } diff --git a/Tests/LibWeb/TestConfig.ini b/Tests/LibWeb/TestConfig.ini index d4f75ba3864..a5a9e17c93b 100644 --- a/Tests/LibWeb/TestConfig.ini +++ b/Tests/LibWeb/TestConfig.ini @@ -19,30 +19,11 @@ Text/input/wpt-import/custom-elements/form-associated/form-disabled-callback.htm ; Works in other browsers when loaded from file://. Text/input/wpt-import/html/syntax/parsing/unclosed-svg-script.html -; IndexedDB uses "storage key" concept which is only supported for tuple origins. -; Works in other browsers when loaded from file://. -Text/input/wpt-import/IndexedDB/ - -; Also uses IndexedDB. -Text/input/wpt-import/html/infrastructure/common-dom-interfaces/collections/domstringlist.html - -; localStorage and sessionStorage are also keyed by a storage key, so are not supported for opaque origins. -; Works in other browsers when loaded from file://. -Text/input/wpt-import/webstorage/defineProperty.window.html -Text/input/wpt-import/webstorage/event_constructor.window.html -Text/input/wpt-import/webstorage/event_initstorageevent.window.html +; These tests require cross-origin iframe access to succeed. Text/input/wpt-import/webstorage/event_session_oldvalue.html Text/input/wpt-import/webstorage/event_session_storagearea.html -Text/input/wpt-import/webstorage/set.window.html -Text/input/wpt-import/webstorage/storage_enumerate.window.html -Text/input/wpt-import/webstorage/storage_local_setitem_quotaexceedederr.window.html -Text/input/wpt-import/webstorage/storage_session_setitem_quotaexceedederr.window.html -Text/input/wpt-import/webstorage/symbol-props.window.html -Text/input/localStorage.html -Text/input/iterating-over-storage.html Text/input/navigation/navigation-navigate.html Text/input/navigation/location-reload-fetch.html -Text/input/HTML/local-storage-usage-after-nav.html Text/input/HTML/session-storage-event-fired-to-lazy-window.html ; Navigation has entries and events disabled for opaque origins, so this crash only reproduces over HTTP.