aboutsummaryrefslogtreecommitdiffstats
path: root/components
diff options
context:
space:
mode:
Diffstat (limited to 'components')
-rw-r--r--components/script/document_loader.rs10
-rw-r--r--components/script/dom/htmliframeelement.rs16
-rw-r--r--components/script/dom/htmlimageelement.rs17
-rw-r--r--components/script/dom/htmlmediaelement.rs11
-rw-r--r--components/script/dom/htmlvideoelement.rs10
5 files changed, 34 insertions, 30 deletions
diff --git a/components/script/document_loader.rs b/components/script/document_loader.rs
index dd9d74403ef..5d07cea0930 100644
--- a/components/script/document_loader.rs
+++ b/components/script/document_loader.rs
@@ -11,6 +11,7 @@ use net_traits::request::RequestBuilder;
use net_traits::{fetch_async, BoxedFetchCallback, ResourceThreads};
use servo_url::ServoUrl;
+use crate::dom::bindings::cell::DomRefCell;
use crate::dom::bindings::root::Dom;
use crate::dom::document::Document;
use crate::fetch::FetchCanceller;
@@ -49,11 +50,12 @@ impl LoadBlocker {
}
/// Remove this load from the associated document's list of blocking loads.
- pub fn terminate(blocker: &mut Option<LoadBlocker>, can_gc: CanGc) {
- if let Some(this) = blocker.as_mut() {
- this.doc.finish_load(this.load.take().unwrap(), can_gc);
+ pub fn terminate(blocker: &DomRefCell<Option<LoadBlocker>>, can_gc: CanGc) {
+ if let Some(this) = blocker.borrow().as_ref() {
+ let load_data = this.load.clone().unwrap();
+ this.doc.finish_load(load_data, can_gc);
}
- *blocker = None;
+ *blocker.borrow_mut() = None;
}
}
diff --git a/components/script/dom/htmliframeelement.rs b/components/script/dom/htmliframeelement.rs
index bf0f6de5b0d..d26cf6297f2 100644
--- a/components/script/dom/htmliframeelement.rs
+++ b/components/script/dom/htmliframeelement.rs
@@ -146,10 +146,10 @@ impl HTMLIFrameElement {
let document = document_from_node(self);
{
- let mut load_blocker = self.load_blocker.borrow_mut();
+ let load_blocker = &self.load_blocker;
// Any oustanding load is finished from the point of view of the blocked
// document; the new navigation will continue blocking it.
- LoadBlocker::terminate(&mut load_blocker, can_gc);
+ LoadBlocker::terminate(load_blocker, can_gc);
}
if load_data.url.scheme() == "javascript" {
@@ -422,8 +422,8 @@ impl HTMLIFrameElement {
// Only terminate the load blocker if the pipeline id was updated due to a traversal.
// The load blocker will be terminated for a navigation in iframe_load_event_steps.
if reason == UpdatePipelineIdReason::Traversal {
- let mut blocker = self.load_blocker.borrow_mut();
- LoadBlocker::terminate(&mut blocker, can_gc);
+ let blocker = &self.load_blocker;
+ LoadBlocker::terminate(blocker, can_gc);
}
self.upcast::<Node>().dirty(NodeDamage::OtherNodeDamage);
@@ -507,8 +507,8 @@ impl HTMLIFrameElement {
self.upcast::<EventTarget>()
.fire_event(atom!("load"), can_gc);
- let mut blocker = self.load_blocker.borrow_mut();
- LoadBlocker::terminate(&mut blocker, can_gc);
+ let blocker = &self.load_blocker;
+ LoadBlocker::terminate(blocker, can_gc);
// TODO Step 5 - unset child document `mut iframe load` flag
}
@@ -740,8 +740,8 @@ impl VirtualMethods for HTMLIFrameElement {
fn unbind_from_tree(&self, context: &UnbindContext) {
self.super_type().unwrap().unbind_from_tree(context);
- let mut blocker = self.load_blocker.borrow_mut();
- LoadBlocker::terminate(&mut blocker, CanGc::note());
+ let blocker = &self.load_blocker;
+ LoadBlocker::terminate(blocker, CanGc::note());
// https://html.spec.whatwg.org/multipage/#a-browsing-context-is-discarded
let window = window_from_node(self);
diff --git a/components/script/dom/htmlimageelement.rs b/components/script/dom/htmlimageelement.rs
index f238d777558..d26557985e1 100644
--- a/components/script/dom/htmlimageelement.rs
+++ b/components/script/dom/htmlimageelement.rs
@@ -154,7 +154,7 @@ struct ImageRequest {
#[no_trace]
parsed_url: Option<ServoUrl>,
source_url: Option<USVString>,
- blocker: Option<LoadBlocker>,
+ blocker: DomRefCell<Option<LoadBlocker>>,
#[ignore_malloc_size_of = "Arc"]
#[no_trace]
image: Option<Arc<Image>>,
@@ -431,7 +431,7 @@ impl HTMLImageElement {
self.current_request.borrow_mut().final_url = Some(url);
self.current_request.borrow_mut().image = Some(image);
self.current_request.borrow_mut().state = State::CompletelyAvailable;
- LoadBlocker::terminate(&mut self.current_request.borrow_mut().blocker, can_gc);
+ LoadBlocker::terminate(&self.current_request.borrow().blocker, can_gc);
// Mark the node dirty
self.upcast::<Node>().dirty(NodeDamage::OtherNodeDamage);
self.resolve_image_decode_promises();
@@ -537,7 +537,7 @@ impl HTMLImageElement {
ImageRequestPhase::Current => self.current_request.borrow_mut(),
ImageRequestPhase::Pending => self.pending_request.borrow_mut(),
};
- LoadBlocker::terminate(&mut request.blocker, can_gc);
+ LoadBlocker::terminate(&request.blocker, can_gc);
request.state = state;
request.image = None;
request.metadata = None;
@@ -821,8 +821,9 @@ impl HTMLImageElement {
request.image = None;
request.metadata = None;
let document = document_from_node(self);
- LoadBlocker::terminate(&mut request.blocker, can_gc);
- request.blocker = Some(LoadBlocker::new(&document, LoadType::Image(url.clone())));
+ LoadBlocker::terminate(&request.blocker, can_gc);
+ *request.blocker.borrow_mut() =
+ Some(LoadBlocker::new(&document, LoadType::Image(url.clone())));
}
/// Step 13-17 of html.spec.whatwg.org/multipage/#update-the-image-data
@@ -853,7 +854,7 @@ impl HTMLImageElement {
// Step 15 abort pending request
pending_request.image = None;
pending_request.parsed_url = None;
- LoadBlocker::terminate(&mut pending_request.blocker, can_gc);
+ LoadBlocker::terminate(&pending_request.blocker, can_gc);
// TODO: queue a task to restart animation, if restart-animation is set
return;
}
@@ -1311,7 +1312,7 @@ impl HTMLImageElement {
source_url: None,
image: None,
metadata: None,
- blocker: None,
+ blocker: DomRefCell::new(None),
final_url: None,
current_pixel_density: None,
}),
@@ -1321,7 +1322,7 @@ impl HTMLImageElement {
source_url: None,
image: None,
metadata: None,
- blocker: None,
+ blocker: DomRefCell::new(None),
final_url: None,
current_pixel_density: None,
}),
diff --git a/components/script/dom/htmlmediaelement.rs b/components/script/dom/htmlmediaelement.rs
index 8a9d095dcf7..e76b57e9b8b 100644
--- a/components/script/dom/htmlmediaelement.rs
+++ b/components/script/dom/htmlmediaelement.rs
@@ -511,11 +511,12 @@ impl HTMLMediaElement {
///
/// <https://html.spec.whatwg.org/multipage/#delaying-the-load-event-flag>
pub fn delay_load_event(&self, delay: bool, can_gc: CanGc) {
- let mut blocker = self.delaying_the_load_event_flag.borrow_mut();
- if delay && blocker.is_none() {
- *blocker = Some(LoadBlocker::new(&document_from_node(self), LoadType::Media));
- } else if !delay && blocker.is_some() {
- LoadBlocker::terminate(&mut blocker, can_gc);
+ let blocker = &self.delaying_the_load_event_flag;
+ if delay && blocker.borrow().is_none() {
+ *blocker.borrow_mut() =
+ Some(LoadBlocker::new(&document_from_node(self), LoadType::Media));
+ } else if !delay && blocker.borrow().is_some() {
+ LoadBlocker::terminate(blocker, can_gc);
}
}
diff --git a/components/script/dom/htmlvideoelement.rs b/components/script/dom/htmlvideoelement.rs
index 24614f5b8a0..58981651a0e 100644
--- a/components/script/dom/htmlvideoelement.rs
+++ b/components/script/dom/htmlvideoelement.rs
@@ -225,9 +225,9 @@ impl HTMLVideoElement {
// <video poster="poster.png"></video>
// (which triggers no media load algorithm unless a explicit call to .load() is done)
// will block the document's load event forever.
- let mut blocker = self.load_blocker.borrow_mut();
- LoadBlocker::terminate(&mut blocker, can_gc);
- *blocker = Some(LoadBlocker::new(
+ let blocker = &self.load_blocker;
+ LoadBlocker::terminate(blocker, can_gc);
+ *blocker.borrow_mut() = Some(LoadBlocker::new(
&document_from_node(self),
LoadType::Image(poster_url.clone()),
));
@@ -309,13 +309,13 @@ impl ImageCacheListener for HTMLVideoElement {
ImageResponse::Loaded(image, url) => {
debug!("Loaded poster image for video element: {:?}", url);
self.htmlmediaelement.process_poster_image_loaded(image);
- LoadBlocker::terminate(&mut self.load_blocker.borrow_mut(), can_gc);
+ LoadBlocker::terminate(&self.load_blocker, can_gc);
},
ImageResponse::MetadataLoaded(..) => {},
// The image cache may have loaded a placeholder for an invalid poster url
ImageResponse::PlaceholderLoaded(..) | ImageResponse::None => {
// A failed load should unblock the document load.
- LoadBlocker::terminate(&mut self.load_blocker.borrow_mut(), can_gc);
+ LoadBlocker::terminate(&self.load_blocker, can_gc);
},
}
}