mirror of
https://github.com/servo/servo.git
synced 2025-08-06 06:00:15 +01:00
storage: Isolate sessionStorage per top-level browsing context and copy sessionStorage when creating a new auxiliary browsing context (#37803)
This pull request introduces changes to the storage subsystem to: - Isolate sessionStorage per top-level browsing context (WebViewId), in addition to origin. - Copy sessionStorage when creating a new auxiliary browsing context without noopener, as required by the corresponding spec These changes bring Servo closer to spec compliance, matching expected browser behavior. Testing: This work affects observable behavior. As a result, some previously failing WPT tests now pass. No new tests are added, since the behavior is already covered by existing web-platform-tests. Fixes: #21291 --------- Signed-off-by: Jan Varga <jan.varga@gmail.com>
This commit is contained in:
parent
aaf04883dd
commit
934b3341d7
6 changed files with 234 additions and 122 deletions
|
@ -2,6 +2,7 @@
|
|||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||
|
||||
use base::id::WebViewId;
|
||||
use constellation_traits::ScriptToConstellationMessage;
|
||||
use dom_struct::dom_struct;
|
||||
use ipc_channel::ipc::IpcSender;
|
||||
|
@ -49,6 +50,10 @@ impl Storage {
|
|||
)
|
||||
}
|
||||
|
||||
fn webview_id(&self) -> WebViewId {
|
||||
self.global().as_window().window_proxy().webview_id()
|
||||
}
|
||||
|
||||
fn get_url(&self) -> ServoUrl {
|
||||
self.global().get_url()
|
||||
}
|
||||
|
@ -66,8 +71,9 @@ impl StorageMethods<crate::DomTypeHolder> for Storage {
|
|||
self.get_storage_thread()
|
||||
.send(StorageThreadMsg::Length(
|
||||
sender,
|
||||
self.get_url(),
|
||||
self.storage_type,
|
||||
self.webview_id(),
|
||||
self.get_url(),
|
||||
))
|
||||
.unwrap();
|
||||
receiver.recv().unwrap() as u32
|
||||
|
@ -80,8 +86,9 @@ impl StorageMethods<crate::DomTypeHolder> for Storage {
|
|||
self.get_storage_thread()
|
||||
.send(StorageThreadMsg::Key(
|
||||
sender,
|
||||
self.get_url(),
|
||||
self.storage_type,
|
||||
self.webview_id(),
|
||||
self.get_url(),
|
||||
index,
|
||||
))
|
||||
.unwrap();
|
||||
|
@ -93,7 +100,13 @@ impl StorageMethods<crate::DomTypeHolder> for Storage {
|
|||
let (sender, receiver) = ipc::channel(self.global().time_profiler_chan().clone()).unwrap();
|
||||
let name = String::from(name);
|
||||
|
||||
let msg = StorageThreadMsg::GetItem(sender, self.get_url(), self.storage_type, name);
|
||||
let msg = StorageThreadMsg::GetItem(
|
||||
sender,
|
||||
self.storage_type,
|
||||
self.webview_id(),
|
||||
self.get_url(),
|
||||
name,
|
||||
);
|
||||
self.get_storage_thread().send(msg).unwrap();
|
||||
receiver.recv().unwrap().map(DOMString::from)
|
||||
}
|
||||
|
@ -106,8 +119,9 @@ impl StorageMethods<crate::DomTypeHolder> for Storage {
|
|||
|
||||
let msg = StorageThreadMsg::SetItem(
|
||||
sender,
|
||||
self.get_url(),
|
||||
self.storage_type,
|
||||
self.webview_id(),
|
||||
self.get_url(),
|
||||
name.clone(),
|
||||
value.clone(),
|
||||
);
|
||||
|
@ -128,8 +142,13 @@ impl StorageMethods<crate::DomTypeHolder> for Storage {
|
|||
let (sender, receiver) = ipc::channel(self.global().time_profiler_chan().clone()).unwrap();
|
||||
let name = String::from(name);
|
||||
|
||||
let msg =
|
||||
StorageThreadMsg::RemoveItem(sender, self.get_url(), self.storage_type, name.clone());
|
||||
let msg = StorageThreadMsg::RemoveItem(
|
||||
sender,
|
||||
self.storage_type,
|
||||
self.webview_id(),
|
||||
self.get_url(),
|
||||
name.clone(),
|
||||
);
|
||||
self.get_storage_thread().send(msg).unwrap();
|
||||
if let Some(old_value) = receiver.recv().unwrap() {
|
||||
self.broadcast_change_notification(Some(name), Some(old_value), None);
|
||||
|
@ -143,8 +162,9 @@ impl StorageMethods<crate::DomTypeHolder> for Storage {
|
|||
self.get_storage_thread()
|
||||
.send(StorageThreadMsg::Clear(
|
||||
sender,
|
||||
self.get_url(),
|
||||
self.storage_type,
|
||||
self.webview_id(),
|
||||
self.get_url(),
|
||||
))
|
||||
.unwrap();
|
||||
if receiver.recv().unwrap() {
|
||||
|
@ -159,8 +179,9 @@ impl StorageMethods<crate::DomTypeHolder> for Storage {
|
|||
self.get_storage_thread()
|
||||
.send(StorageThreadMsg::Keys(
|
||||
sender,
|
||||
self.get_url(),
|
||||
self.storage_type,
|
||||
self.webview_id(),
|
||||
self.get_url(),
|
||||
))
|
||||
.unwrap();
|
||||
receiver
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue