diff options
-rw-r--r-- | components/script/dom/htmliframeelement.rs | 8 | ||||
-rw-r--r-- | components/script/dom/window.rs | 4 | ||||
-rw-r--r-- | components/script/script_thread.rs | 8 |
3 files changed, 19 insertions, 1 deletions
diff --git a/components/script/dom/htmliframeelement.rs b/components/script/dom/htmliframeelement.rs index 65cfd32fa17..fd8788480a6 100644 --- a/components/script/dom/htmliframeelement.rs +++ b/components/script/dom/htmliframeelement.rs @@ -23,9 +23,10 @@ use dom::htmlelement::HTMLElement; use dom::node::{Node, UnbindContext, window_from_node}; use dom::urlhelper::UrlHelper; use dom::virtualmethods::VirtualMethods; -use dom::window::Window; +use dom::window::{ReflowReason, Window}; use js::jsapi::{JSAutoCompartment, JSAutoRequest, RootedValue, JSContext, MutableHandleValue}; use js::jsval::{UndefinedValue, NullValue}; +use layout_interface::ReflowQueryType; use msg::constellation_msg::{ConstellationChan}; use msg::constellation_msg::{NavigationDirection, PipelineId, SubpageId}; use page::IterablePage; @@ -34,6 +35,7 @@ use script_traits::{IFrameLoadInfo, MozBrowserEvent, ScriptMsg as ConstellationM use std::ascii::AsciiExt; use std::cell::Cell; use string_cache::Atom; +use style::context::ReflowGoal; use url::Url; use util::prefs; use util::str::{DOMString, LengthOrPercentageOrAuto}; @@ -211,6 +213,10 @@ impl HTMLIFrameElement { let window = window_from_node(self); self.upcast::<EventTarget>().fire_simple_event("load", GlobalRef::Window(window.r())); // TODO Step 5 - unset child document `mut iframe load` flag + + window.reflow(ReflowGoal::ForDisplay, + ReflowQueryType::NoQuery, + ReflowReason::IFrameLoadEvent); } } diff --git a/components/script/dom/window.rs b/components/script/dom/window.rs index 4c26c15e6f5..2ca2090e547 100644 --- a/components/script/dom/window.rs +++ b/components/script/dom/window.rs @@ -108,6 +108,8 @@ pub enum ReflowReason { RequestAnimationFrame, WebFontLoaded, FramedContentChanged, + IFrameLoadEvent, + MissingExplicitReflow, } pub type ScrollPoint = Point2D<Au>; @@ -1427,6 +1429,8 @@ fn debug_reflow_events(goal: &ReflowGoal, query_type: &ReflowQueryType, reason: ReflowReason::RequestAnimationFrame => "\tRequestAnimationFrame", ReflowReason::WebFontLoaded => "\tWebFontLoaded", ReflowReason::FramedContentChanged => "\tFramedContentChanged", + ReflowReason::IFrameLoadEvent => "\tIFrameLoadEvent", + ReflowReason::MissingExplicitReflow => "\tMissingExplicitReflow", }); println!("{}", debug_msg); diff --git a/components/script/script_thread.rs b/components/script/script_thread.rs index ef55e608be8..4cae85da9ba 100644 --- a/components/script/script_thread.rs +++ b/components/script/script_thread.rs @@ -1028,6 +1028,14 @@ impl ScriptThread { window.reflow(ReflowGoal::ForDisplay, ReflowQueryType::NoQuery, ReflowReason::ImageLoaded); + } else { + // Reflow currently happens when explicitly invoked by code that + // knows the document could have been modified. This should really + // be driven by the compositor on an as-needed basis instead, to + // minimize unnecessary work. + window.reflow(ReflowGoal::ForDisplay, + ReflowQueryType::NoQuery, + ReflowReason::MissingExplicitReflow); } } } |