aboutsummaryrefslogtreecommitdiffstats
path: root/components/script
diff options
context:
space:
mode:
Diffstat (limited to 'components/script')
-rw-r--r--components/script/dom/canvasrenderingcontext2d.rs10
-rw-r--r--components/script/dom/htmlcanvaselement.rs26
-rw-r--r--components/script/dom/htmliframeelement.rs24
-rw-r--r--components/script/script_task.rs75
4 files changed, 110 insertions, 25 deletions
diff --git a/components/script/dom/canvasrenderingcontext2d.rs b/components/script/dom/canvasrenderingcontext2d.rs
index 71a4b639cf2..9ed36217fec 100644
--- a/components/script/dom/canvasrenderingcontext2d.rs
+++ b/components/script/dom/canvasrenderingcontext2d.rs
@@ -44,6 +44,16 @@ impl CanvasRenderingContext2D {
}
}
+pub trait LayoutCanvasRenderingContext2DHelpers {
+ unsafe fn get_renderer(&self) -> Sender<CanvasMsg>;
+}
+
+impl LayoutCanvasRenderingContext2DHelpers for JS<CanvasRenderingContext2D> {
+ unsafe fn get_renderer(&self) -> Sender<CanvasMsg> {
+ (*self.unsafe_get()).renderer.clone()
+ }
+}
+
impl<'a> CanvasRenderingContext2DMethods for JSRef<'a, CanvasRenderingContext2D> {
fn Canvas(self) -> Temporary<HTMLCanvasElement> {
Temporary::new(self.canvas)
diff --git a/components/script/dom/htmlcanvaselement.rs b/components/script/dom/htmlcanvaselement.rs
index eb02b6bc87d..15f25a495a5 100644
--- a/components/script/dom/htmlcanvaselement.rs
+++ b/components/script/dom/htmlcanvaselement.rs
@@ -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 http://mozilla.org/MPL/2.0/. */
+use canvas::canvas_paint_task::CanvasMsg;
use dom::attr::Attr;
use dom::attr::AttrHelpers;
use dom::bindings::codegen::Bindings::HTMLCanvasElementBinding;
@@ -9,8 +10,8 @@ use dom::bindings::codegen::Bindings::HTMLCanvasElementBinding::HTMLCanvasElemen
use dom::bindings::codegen::InheritTypes::HTMLCanvasElementDerived;
use dom::bindings::codegen::InheritTypes::{ElementCast, HTMLElementCast};
use dom::bindings::global::GlobalRef;
-use dom::bindings::js::{MutNullableJS, JSRef, Temporary};
-use dom::canvasrenderingcontext2d::CanvasRenderingContext2D;
+use dom::bindings::js::{MutNullableJS, JS, JSRef, Temporary};
+use dom::canvasrenderingcontext2d::{CanvasRenderingContext2D, LayoutCanvasRenderingContext2DHelpers};
use dom::document::Document;
use dom::element::{Element, AttributeHandlers};
use dom::eventtarget::{EventTarget, EventTargetTypeId};
@@ -60,6 +61,27 @@ impl HTMLCanvasElement {
}
}
+pub trait LayoutHTMLCanvasElementHelpers {
+ unsafe fn get_renderer(&self) -> Option<Sender<CanvasMsg>>;
+ unsafe fn get_canvas_width(&self) -> u32;
+ unsafe fn get_canvas_height(&self) -> u32;
+}
+
+impl LayoutHTMLCanvasElementHelpers for JS<HTMLCanvasElement> {
+ unsafe fn get_renderer(&self) -> Option<Sender<CanvasMsg>> {
+ let context = (*self.unsafe_get()).context.get_inner();
+ context.map(|cx| cx.get_renderer())
+ }
+
+ unsafe fn get_canvas_width(&self) -> u32 {
+ (*self.unsafe_get()).width.get()
+ }
+
+ unsafe fn get_canvas_height(&self) -> u32 {
+ (*self.unsafe_get()).height.get()
+ }
+}
+
impl<'a> HTMLCanvasElementMethods for JSRef<'a, HTMLCanvasElement> {
fn Width(self) -> u32 {
self.width.get()
diff --git a/components/script/dom/htmliframeelement.rs b/components/script/dom/htmliframeelement.rs
index aeb480bdfbf..683c18c678a 100644
--- a/components/script/dom/htmliframeelement.rs
+++ b/components/script/dom/htmliframeelement.rs
@@ -167,7 +167,7 @@ impl<'a> HTMLIFrameElementMethods for JSRef<'a, HTMLIFrameElement> {
fn SetSandbox(self, sandbox: DOMString) {
let element: JSRef<Element> = ElementCast::from_ref(self);
- element.set_string_attribute(&atom!("sandbox"), sandbox);
+ element.set_tokenlist_attribute(&atom!("sandbox"), sandbox);
}
fn GetContentWindow(self) -> Option<Temporary<Window>> {
@@ -217,16 +217,18 @@ impl<'a> VirtualMethods for JSRef<'a, HTMLIFrameElement> {
match attr.local_name() {
&atom!("sandbox") => {
let mut modes = SandboxAllowance::AllowNothing as u8;
- for word in attr.value().as_slice().split(' ') {
- modes |= match word.to_ascii_lower().as_slice() {
- "allow-same-origin" => SandboxAllowance::AllowSameOrigin,
- "allow-forms" => SandboxAllowance::AllowForms,
- "allow-pointer-lock" => SandboxAllowance::AllowPointerLock,
- "allow-popups" => SandboxAllowance::AllowPopups,
- "allow-scripts" => SandboxAllowance::AllowScripts,
- "allow-top-navigation" => SandboxAllowance::AllowTopNavigation,
- _ => SandboxAllowance::AllowNothing
- } as u8;
+ if let Some(ref tokens) = attr.value().tokens() {
+ for token in tokens.iter() {
+ modes |= match token.as_slice().to_ascii_lower().as_slice() {
+ "allow-same-origin" => SandboxAllowance::AllowSameOrigin,
+ "allow-forms" => SandboxAllowance::AllowForms,
+ "allow-pointer-lock" => SandboxAllowance::AllowPointerLock,
+ "allow-popups" => SandboxAllowance::AllowPopups,
+ "allow-scripts" => SandboxAllowance::AllowScripts,
+ "allow-top-navigation" => SandboxAllowance::AllowTopNavigation,
+ _ => SandboxAllowance::AllowNothing
+ } as u8;
+ }
}
self.sandbox.set(Some(modes));
},
diff --git a/components/script/script_task.rs b/components/script/script_task.rs
index 976c2b78011..1c4af120334 100644
--- a/components/script/script_task.rs
+++ b/components/script/script_task.rs
@@ -18,7 +18,7 @@ use dom::bindings::conversions::StringificationBehavior;
use dom::bindings::global::GlobalRef;
use dom::bindings::js::{JS, JSRef, Temporary, OptionalRootable};
use dom::bindings::js::{RootCollection, RootCollectionPtr};
-use dom::bindings::refcounted::LiveDOMReferences;
+use dom::bindings::refcounted::{LiveDOMReferences, Trusted};
use dom::bindings::trace::JSTraceable;
use dom::bindings::utils::{wrap_for_same_compartment, pre_wrap};
use dom::document::{Document, IsHTMLDocument, DocumentHelpers, DocumentSource};
@@ -867,24 +867,23 @@ impl ScriptTask {
}
// https://html.spec.whatwg.org/multipage/#the-end step 4
- let event = Event::new(GlobalRef::Window(window.r()), "DOMContentLoaded".into_string(),
- EventBubbles::DoesNotBubble,
- EventCancelable::NotCancelable).root();
- let doctarget: JSRef<EventTarget> = EventTargetCast::from_ref(document.r());
- let _ = doctarget.DispatchEvent(event.r());
+ let addr: Trusted<Document> = Trusted::new(self.get_cx(), document.r(), self.chan.clone());
+
+ self.chan.send(ScriptMsg::RunnableMsg(box DocumentProgressHandler {
+ addr: addr.clone(),
+ task: DocumentProgressTask::DOMContentLoaded,
+ }));
// We have no concept of a document loader right now, so just dispatch the
// "load" event as soon as we've finished executing all scripts parsed during
// the initial load.
// https://html.spec.whatwg.org/multipage/#the-end step 7
- document.r().set_ready_state(DocumentReadyState::Complete);
+ self.chan.send(ScriptMsg::RunnableMsg(box DocumentProgressHandler {
+ addr: addr,
+ task: DocumentProgressTask::Load,
+ }));
- let event = Event::new(GlobalRef::Window(window.r()), "load".into_string(),
- EventBubbles::DoesNotBubble,
- EventCancelable::NotCancelable).root();
- let wintarget: JSRef<EventTarget> = EventTargetCast::from_ref(window.r());
- let _ = wintarget.dispatch_event_with_target(doctarget, event.r());
*page.fragment_name.borrow_mut() = final_url.fragment.clone();
@@ -1346,3 +1345,55 @@ impl HeaderFormat for LastModified {
fn dom_last_modified(tm: &Tm) -> String {
format!("{}", tm.to_local().strftime("%m/%d/%Y %H:%M:%S").unwrap())
}
+
+enum DocumentProgressTask {
+ DOMContentLoaded,
+ Load,
+}
+
+struct DocumentProgressHandler {
+ addr: Trusted<Document>,
+ task: DocumentProgressTask,
+}
+
+impl DocumentProgressHandler {
+ fn dispatch_dom_content_loaded(&self) {
+ let document = self.addr.to_temporary().root();
+ let window = document.r().window().root();
+ let event = Event::new(GlobalRef::Window(window.r()), "DOMContentLoaded".into_string(),
+ EventBubbles::DoesNotBubble,
+ EventCancelable::NotCancelable).root();
+ let doctarget: JSRef<EventTarget> = EventTargetCast::from_ref(document.r());
+ let _ = doctarget.DispatchEvent(event.r());
+ }
+
+ fn set_ready_state_complete(&self) {
+ let document = self.addr.to_temporary().root();
+ document.r().set_ready_state(DocumentReadyState::Complete);
+ }
+
+ fn dispatch_load(&self) {
+ let document = self.addr.to_temporary().root();
+ let window = document.r().window().root();
+ let event = Event::new(GlobalRef::Window(window.r()), "load".into_string(),
+ EventBubbles::DoesNotBubble,
+ EventCancelable::NotCancelable).root();
+ let wintarget: JSRef<EventTarget> = EventTargetCast::from_ref(window.r());
+ let doctarget: JSRef<EventTarget> = EventTargetCast::from_ref(document.r());
+ let _ = wintarget.dispatch_event_with_target(doctarget, event.r());
+ }
+}
+
+impl Runnable for DocumentProgressHandler {
+ fn handler(&self) {
+ match self.task {
+ DocumentProgressTask::DOMContentLoaded => {
+ self.dispatch_dom_content_loaded();
+ }
+ DocumentProgressTask::Load => {
+ self.set_ready_state_complete();
+ self.dispatch_load();
+ }
+ }
+ }
+}