aboutsummaryrefslogtreecommitdiffstats
path: root/components/script
diff options
context:
space:
mode:
Diffstat (limited to 'components/script')
-rw-r--r--components/script/dom/htmliframeelement.rs8
-rw-r--r--components/script/dom/window.rs6
-rw-r--r--components/script/script_thread.rs26
3 files changed, 39 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 46cda6c4aa4..2ca2090e547 100644
--- a/components/script/dom/window.rs
+++ b/components/script/dom/window.rs
@@ -107,6 +107,9 @@ pub enum ReflowReason {
ImageLoaded,
RequestAnimationFrame,
WebFontLoaded,
+ FramedContentChanged,
+ IFrameLoadEvent,
+ MissingExplicitReflow,
}
pub type ScrollPoint = Point2D<Au>;
@@ -1425,6 +1428,9 @@ fn debug_reflow_events(goal: &ReflowGoal, query_type: &ReflowQueryType, reason:
ReflowReason::ImageLoaded => "\tImageLoaded",
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 663d87f46ee..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);
}
}
}
@@ -1131,6 +1139,8 @@ impl ScriptThread {
ConstellationControlMsg::DispatchFrameLoadEvent {
target: pipeline_id, parent: containing_id } =>
self.handle_frame_load_event(containing_id, pipeline_id),
+ ConstellationControlMsg::FramedContentChanged(containing_pipeline_id, subpage_id) =>
+ self.handle_framed_content_changed(containing_pipeline_id, subpage_id),
ConstellationControlMsg::ReportCSSError(pipeline_id, filename, line, column, msg) =>
self.handle_css_error_reporting(pipeline_id, filename, line, column, msg),
}
@@ -1487,6 +1497,22 @@ impl ScriptThread {
}
}
+ fn handle_framed_content_changed(&self,
+ parent_pipeline_id: PipelineId,
+ subpage_id: SubpageId) {
+ let borrowed_page = self.root_page();
+ let page = borrowed_page.find(parent_pipeline_id).unwrap();
+ let doc = page.document();
+ let frame_element = doc.find_iframe(subpage_id);
+ if let Some(ref frame_element) = frame_element {
+ frame_element.upcast::<Node>().dirty(NodeDamage::OtherNodeDamage);
+ let window = page.window();
+ window.reflow(ReflowGoal::ForDisplay,
+ ReflowQueryType::NoQuery,
+ ReflowReason::FramedContentChanged);
+ }
+ }
+
/// Handles a mozbrowser event, for example see:
/// https://developer.mozilla.org/en-US/docs/Web/Events/mozbrowserloadstart
fn handle_mozbrowser_event_msg(&self,