diff options
Diffstat (limited to 'components/script')
-rw-r--r-- | components/script/dom/canvasrenderingcontext2d.rs | 10 | ||||
-rw-r--r-- | components/script/dom/htmlcanvaselement.rs | 26 | ||||
-rw-r--r-- | components/script/dom/htmliframeelement.rs | 24 | ||||
-rw-r--r-- | components/script/script_task.rs | 75 |
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(); + } + } + } +} |