mirror of
https://github.com/servo/servo.git
synced 2025-08-05 13:40:08 +01:00
Auto merge of #9255 - ckimes89:remove-globalfield, r=nox
Remove global fields from DOM objects Fixes #9227 <!-- Reviewable:start --> [<img src="https://reviewable.io/review_button.png" height=40 alt="Review on Reviewable"/>](https://reviewable.io/reviews/servo/servo/9255) <!-- Reviewable:end -->
This commit is contained in:
commit
53c4a782a0
19 changed files with 104 additions and 151 deletions
|
@ -44,17 +44,6 @@ pub enum GlobalRoot {
|
||||||
Worker(Root<WorkerGlobalScope>),
|
Worker(Root<WorkerGlobalScope>),
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A traced reference to a global object, for use in fields of traced Rust
|
|
||||||
/// structures.
|
|
||||||
#[derive(JSTraceable, HeapSizeOf)]
|
|
||||||
#[must_root]
|
|
||||||
pub enum GlobalField {
|
|
||||||
/// A field for a `Window` object.
|
|
||||||
Window(JS<window::Window>),
|
|
||||||
/// A field for a `WorkerGlobalScope` object.
|
|
||||||
Worker(JS<WorkerGlobalScope>),
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'a> GlobalRef<'a> {
|
impl<'a> GlobalRef<'a> {
|
||||||
/// Get the `JSContext` for the `JSRuntime` associated with the thread
|
/// Get the `JSContext` for the `JSRuntime` associated with the thread
|
||||||
/// this global object is on.
|
/// this global object is on.
|
||||||
|
@ -273,25 +262,6 @@ impl GlobalRoot {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl GlobalField {
|
|
||||||
/// Create a new `GlobalField` from a rooted reference.
|
|
||||||
#[allow(unrooted_must_root)]
|
|
||||||
pub fn from_rooted(global: &GlobalRef) -> GlobalField {
|
|
||||||
match *global {
|
|
||||||
GlobalRef::Window(window) => GlobalField::Window(JS::from_ref(window)),
|
|
||||||
GlobalRef::Worker(worker) => GlobalField::Worker(JS::from_ref(worker)),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Create a stack-bounded root for this reference.
|
|
||||||
pub fn root(&self) -> GlobalRoot {
|
|
||||||
match *self {
|
|
||||||
GlobalField::Window(ref window) => GlobalRoot::Window(Root::from_ref(window)),
|
|
||||||
GlobalField::Worker(ref worker) => GlobalRoot::Worker(Root::from_ref(worker)),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Returns the global object of the realm that the given DOM object's reflector was created in.
|
/// Returns the global object of the realm that the given DOM object's reflector was created in.
|
||||||
pub fn global_root_from_reflector<T: Reflectable>(reflector: &T) -> GlobalRoot {
|
pub fn global_root_from_reflector<T: Reflectable>(reflector: &T) -> GlobalRoot {
|
||||||
global_root_from_object(*reflector.reflector().get_jsobject())
|
global_root_from_object(*reflector.reflector().get_jsobject())
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
//! The `Reflector` struct.
|
//! The `Reflector` struct.
|
||||||
|
|
||||||
use dom::bindings::global::GlobalRef;
|
use dom::bindings::global::{GlobalRef, GlobalRoot, global_root_from_reflector};
|
||||||
use dom::bindings::js::Root;
|
use dom::bindings::js::Root;
|
||||||
use js::jsapi::{HandleObject, JSContext, JSObject};
|
use js::jsapi::{HandleObject, JSContext, JSObject};
|
||||||
use std::cell::UnsafeCell;
|
use std::cell::UnsafeCell;
|
||||||
|
@ -75,4 +75,9 @@ pub trait Reflectable {
|
||||||
fn reflector(&self) -> &Reflector;
|
fn reflector(&self) -> &Reflector;
|
||||||
/// Initializes the Reflector
|
/// Initializes the Reflector
|
||||||
fn init_reflector(&mut self, obj: *mut JSObject);
|
fn init_reflector(&mut self, obj: *mut JSObject);
|
||||||
|
|
||||||
|
/// Returns the global object of the realm that the Reflectable was created in.
|
||||||
|
fn global(&self) -> GlobalRoot where Self: Sized {
|
||||||
|
global_root_from_reflector(self)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,9 +5,9 @@
|
||||||
use dom::bindings::codegen::Bindings::BlobBinding;
|
use dom::bindings::codegen::Bindings::BlobBinding;
|
||||||
use dom::bindings::codegen::Bindings::BlobBinding::BlobMethods;
|
use dom::bindings::codegen::Bindings::BlobBinding::BlobMethods;
|
||||||
use dom::bindings::error::Fallible;
|
use dom::bindings::error::Fallible;
|
||||||
use dom::bindings::global::{GlobalField, GlobalRef};
|
use dom::bindings::global::GlobalRef;
|
||||||
use dom::bindings::js::Root;
|
use dom::bindings::js::Root;
|
||||||
use dom::bindings::reflector::{Reflector, reflect_dom_object};
|
use dom::bindings::reflector::{Reflectable, Reflector, reflect_dom_object};
|
||||||
use dom::bindings::trace::JSTraceable;
|
use dom::bindings::trace::JSTraceable;
|
||||||
use num::ToPrimitive;
|
use num::ToPrimitive;
|
||||||
use std::ascii::AsciiExt;
|
use std::ascii::AsciiExt;
|
||||||
|
@ -76,7 +76,6 @@ pub struct Blob {
|
||||||
#[ignore_heap_size_of = "No clear owner"]
|
#[ignore_heap_size_of = "No clear owner"]
|
||||||
data: DataSlice,
|
data: DataSlice,
|
||||||
typeString: String,
|
typeString: String,
|
||||||
global: GlobalField,
|
|
||||||
isClosed_: Cell<bool>,
|
isClosed_: Cell<bool>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -87,8 +86,7 @@ fn is_ascii_printable(string: &str) -> bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Blob {
|
impl Blob {
|
||||||
pub fn new_inherited(global: GlobalRef,
|
pub fn new_inherited(bytes: Arc<Vec<u8>>,
|
||||||
bytes: Arc<Vec<u8>>,
|
|
||||||
bytes_start: Option<i64>,
|
bytes_start: Option<i64>,
|
||||||
bytes_end: Option<i64>,
|
bytes_end: Option<i64>,
|
||||||
typeString: &str) -> Blob {
|
typeString: &str) -> Blob {
|
||||||
|
@ -96,13 +94,12 @@ impl Blob {
|
||||||
reflector_: Reflector::new(),
|
reflector_: Reflector::new(),
|
||||||
data: DataSlice::new(bytes, bytes_start, bytes_end),
|
data: DataSlice::new(bytes, bytes_start, bytes_end),
|
||||||
typeString: typeString.to_owned(),
|
typeString: typeString.to_owned(),
|
||||||
global: GlobalField::from_rooted(&global),
|
|
||||||
isClosed_: Cell::new(false),
|
isClosed_: Cell::new(false),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn new(global: GlobalRef, bytes: Vec<u8>, typeString: &str) -> Root<Blob> {
|
pub fn new(global: GlobalRef, bytes: Vec<u8>, typeString: &str) -> Root<Blob> {
|
||||||
let boxed_blob = box Blob::new_inherited(global, Arc::new(bytes), None, None, typeString);
|
let boxed_blob = box Blob::new_inherited(Arc::new(bytes), None, None, typeString);
|
||||||
reflect_dom_object(boxed_blob, global, BlobBinding::Wrap)
|
reflect_dom_object(boxed_blob, global, BlobBinding::Wrap)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -112,7 +109,7 @@ impl Blob {
|
||||||
bytes_end: Option<i64>,
|
bytes_end: Option<i64>,
|
||||||
typeString: &str) -> Root<Blob> {
|
typeString: &str) -> Root<Blob> {
|
||||||
|
|
||||||
let boxed_blob = box Blob::new_inherited(global, bytes, bytes_start, bytes_end, typeString);
|
let boxed_blob = box Blob::new_inherited(bytes, bytes_start, bytes_end, typeString);
|
||||||
reflect_dom_object(boxed_blob, global, BlobBinding::Wrap)
|
reflect_dom_object(boxed_blob, global, BlobBinding::Wrap)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -171,7 +168,7 @@ impl BlobMethods for Blob {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
let global = self.global.root();
|
let global = self.global();
|
||||||
let bytes = self.data.bytes.clone();
|
let bytes = self.data.bytes.clone();
|
||||||
Blob::new_sliced(global.r(), bytes, start, end, &relativeContentType)
|
Blob::new_sliced(global.r(), bytes, start, end, &relativeContentType)
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,11 +18,11 @@ use dom::bindings::codegen::Bindings::WindowBinding::WindowMethods;
|
||||||
use dom::bindings::codegen::UnionTypes::HTMLImageElementOrHTMLCanvasElementOrCanvasRenderingContext2D;
|
use dom::bindings::codegen::UnionTypes::HTMLImageElementOrHTMLCanvasElementOrCanvasRenderingContext2D;
|
||||||
use dom::bindings::codegen::UnionTypes::StringOrCanvasGradientOrCanvasPattern;
|
use dom::bindings::codegen::UnionTypes::StringOrCanvasGradientOrCanvasPattern;
|
||||||
use dom::bindings::error::{Error, Fallible};
|
use dom::bindings::error::{Error, Fallible};
|
||||||
use dom::bindings::global::{GlobalField, GlobalRef};
|
use dom::bindings::global::GlobalRef;
|
||||||
use dom::bindings::inheritance::Castable;
|
use dom::bindings::inheritance::Castable;
|
||||||
use dom::bindings::js::{JS, LayoutJS, Root};
|
use dom::bindings::js::{JS, LayoutJS, Root};
|
||||||
use dom::bindings::num::Finite;
|
use dom::bindings::num::Finite;
|
||||||
use dom::bindings::reflector::{Reflector, reflect_dom_object};
|
use dom::bindings::reflector::{Reflectable, Reflector, reflect_dom_object};
|
||||||
use dom::canvasgradient::{CanvasGradient, CanvasGradientStyle, ToFillOrStrokeStyle};
|
use dom::canvasgradient::{CanvasGradient, CanvasGradientStyle, ToFillOrStrokeStyle};
|
||||||
use dom::canvaspattern::CanvasPattern;
|
use dom::canvaspattern::CanvasPattern;
|
||||||
use dom::htmlcanvaselement::HTMLCanvasElement;
|
use dom::htmlcanvaselement::HTMLCanvasElement;
|
||||||
|
@ -61,7 +61,6 @@ enum CanvasFillOrStrokeStyle {
|
||||||
#[dom_struct]
|
#[dom_struct]
|
||||||
pub struct CanvasRenderingContext2D {
|
pub struct CanvasRenderingContext2D {
|
||||||
reflector_: Reflector,
|
reflector_: Reflector,
|
||||||
global: GlobalField,
|
|
||||||
renderer_id: usize,
|
renderer_id: usize,
|
||||||
#[ignore_heap_size_of = "Defined in ipc-channel"]
|
#[ignore_heap_size_of = "Defined in ipc-channel"]
|
||||||
ipc_renderer: IpcSender<CanvasMsg>,
|
ipc_renderer: IpcSender<CanvasMsg>,
|
||||||
|
@ -128,7 +127,6 @@ impl CanvasRenderingContext2D {
|
||||||
let (ipc_renderer, renderer_id) = receiver.recv().unwrap();
|
let (ipc_renderer, renderer_id) = receiver.recv().unwrap();
|
||||||
CanvasRenderingContext2D {
|
CanvasRenderingContext2D {
|
||||||
reflector_: Reflector::new(),
|
reflector_: Reflector::new(),
|
||||||
global: GlobalField::from_rooted(&global),
|
|
||||||
renderer_id: renderer_id,
|
renderer_id: renderer_id,
|
||||||
ipc_renderer: ipc_renderer,
|
ipc_renderer: ipc_renderer,
|
||||||
canvas: JS::from_ref(canvas),
|
canvas: JS::from_ref(canvas),
|
||||||
|
@ -1016,12 +1014,12 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D {
|
||||||
|
|
||||||
let sw = cmp::max(1, sw.abs().to_u32().unwrap());
|
let sw = cmp::max(1, sw.abs().to_u32().unwrap());
|
||||||
let sh = cmp::max(1, sh.abs().to_u32().unwrap());
|
let sh = cmp::max(1, sh.abs().to_u32().unwrap());
|
||||||
Ok(ImageData::new(self.global.root().r(), sw, sh, None))
|
Ok(ImageData::new(self.global().r(), sw, sh, None))
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://html.spec.whatwg.org/multipage/#dom-context-2d-createimagedata
|
// https://html.spec.whatwg.org/multipage/#dom-context-2d-createimagedata
|
||||||
fn CreateImageData_(&self, imagedata: &ImageData) -> Fallible<Root<ImageData>> {
|
fn CreateImageData_(&self, imagedata: &ImageData) -> Fallible<Root<ImageData>> {
|
||||||
Ok(ImageData::new(self.global.root().r(),
|
Ok(ImageData::new(self.global().r(),
|
||||||
imagedata.Width(),
|
imagedata.Width(),
|
||||||
imagedata.Height(),
|
imagedata.Height(),
|
||||||
None))
|
None))
|
||||||
|
@ -1078,7 +1076,7 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D {
|
||||||
chunk[2] = UNPREMULTIPLY_TABLE[256 * alpha + chunk[2] as usize];
|
chunk[2] = UNPREMULTIPLY_TABLE[256 * alpha + chunk[2] as usize];
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(ImageData::new(self.global.root().r(), sw, sh, Some(data)))
|
Ok(ImageData::new(self.global().r(), sw, sh, Some(data)))
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://html.spec.whatwg.org/multipage/#dom-context-2d-putimagedata
|
// https://html.spec.whatwg.org/multipage/#dom-context-2d-putimagedata
|
||||||
|
@ -1101,7 +1099,7 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D {
|
||||||
dirtyY: Finite<f64>,
|
dirtyY: Finite<f64>,
|
||||||
dirtyWidth: Finite<f64>,
|
dirtyWidth: Finite<f64>,
|
||||||
dirtyHeight: Finite<f64>) {
|
dirtyHeight: Finite<f64>) {
|
||||||
let data = imagedata.get_data_array(&self.global.root().r());
|
let data = imagedata.get_data_array(&self.global().r());
|
||||||
let offset = Point2D::new(*dx, *dy);
|
let offset = Point2D::new(*dx, *dy);
|
||||||
let image_data_size = Size2D::new(imagedata.Width() as f64, imagedata.Height() as f64);
|
let image_data_size = Size2D::new(imagedata.Width() as f64, imagedata.Height() as f64);
|
||||||
|
|
||||||
|
@ -1122,7 +1120,7 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D {
|
||||||
x1: Finite<f64>,
|
x1: Finite<f64>,
|
||||||
y1: Finite<f64>)
|
y1: Finite<f64>)
|
||||||
-> Root<CanvasGradient> {
|
-> Root<CanvasGradient> {
|
||||||
CanvasGradient::new(self.global.root().r(),
|
CanvasGradient::new(self.global().r(),
|
||||||
CanvasGradientStyle::Linear(LinearGradientStyle::new(*x0,
|
CanvasGradientStyle::Linear(LinearGradientStyle::new(*x0,
|
||||||
*y0,
|
*y0,
|
||||||
*x1,
|
*x1,
|
||||||
|
@ -1143,7 +1141,7 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D {
|
||||||
return Err(Error::IndexSize);
|
return Err(Error::IndexSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(CanvasGradient::new(self.global.root().r(),
|
Ok(CanvasGradient::new(self.global().r(),
|
||||||
CanvasGradientStyle::Radial(RadialGradientStyle::new(*x0,
|
CanvasGradientStyle::Radial(RadialGradientStyle::new(*x0,
|
||||||
*y0,
|
*y0,
|
||||||
*r0,
|
*r0,
|
||||||
|
@ -1183,7 +1181,7 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D {
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Ok(rep) = RepetitionStyle::from_str(&repetition) {
|
if let Ok(rep) = RepetitionStyle::from_str(&repetition) {
|
||||||
Ok(CanvasPattern::new(self.global.root().r(),
|
Ok(CanvasPattern::new(self.global().r(),
|
||||||
image_data,
|
image_data,
|
||||||
image_size,
|
image_size,
|
||||||
rep,
|
rep,
|
||||||
|
|
|
@ -5,9 +5,9 @@
|
||||||
use devtools_traits::{ConsoleMessage, LogLevel, ScriptToDevtoolsControlMsg};
|
use devtools_traits::{ConsoleMessage, LogLevel, ScriptToDevtoolsControlMsg};
|
||||||
use dom::bindings::codegen::Bindings::ConsoleBinding;
|
use dom::bindings::codegen::Bindings::ConsoleBinding;
|
||||||
use dom::bindings::codegen::Bindings::ConsoleBinding::ConsoleMethods;
|
use dom::bindings::codegen::Bindings::ConsoleBinding::ConsoleMethods;
|
||||||
use dom::bindings::global::{GlobalRef, global_root_from_reflector};
|
use dom::bindings::global::GlobalRef;
|
||||||
use dom::bindings::js::Root;
|
use dom::bindings::js::Root;
|
||||||
use dom::bindings::reflector::{Reflector, reflect_dom_object};
|
use dom::bindings::reflector::{Reflectable, Reflector, reflect_dom_object};
|
||||||
use util::str::DOMString;
|
use util::str::DOMString;
|
||||||
|
|
||||||
// https://developer.mozilla.org/en-US/docs/Web/API/Console
|
// https://developer.mozilla.org/en-US/docs/Web/API/Console
|
||||||
|
@ -30,7 +30,7 @@ impl Console {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn send_to_devtools(&self, level: LogLevel, message: DOMString) {
|
fn send_to_devtools(&self, level: LogLevel, message: DOMString) {
|
||||||
let global = global_root_from_reflector(self);
|
let global = self.global();
|
||||||
let global = global.r();
|
let global = global.r();
|
||||||
if let Some(chan) = global.devtools_chan() {
|
if let Some(chan) = global.devtools_chan() {
|
||||||
let console_message = prepare_message(level, message);
|
let console_message = prepare_message(level, message);
|
||||||
|
|
|
@ -8,9 +8,9 @@ use dom::bindings::codegen::Bindings::DOMQuadBinding::{DOMQuadInit, DOMQuadMetho
|
||||||
use dom::bindings::codegen::Bindings::DOMRectBinding::DOMRectMethods;
|
use dom::bindings::codegen::Bindings::DOMRectBinding::DOMRectMethods;
|
||||||
use dom::bindings::codegen::Bindings::DOMRectReadOnlyBinding::{DOMRectInit, DOMRectReadOnlyMethods};
|
use dom::bindings::codegen::Bindings::DOMRectReadOnlyBinding::{DOMRectInit, DOMRectReadOnlyMethods};
|
||||||
use dom::bindings::error::Fallible;
|
use dom::bindings::error::Fallible;
|
||||||
use dom::bindings::global::{GlobalRef, global_root_from_reflector};
|
use dom::bindings::global::GlobalRef;
|
||||||
use dom::bindings::js::{Root, JS};
|
use dom::bindings::js::{Root, JS};
|
||||||
use dom::bindings::reflector::{Reflector, reflect_dom_object};
|
use dom::bindings::reflector::{Reflectable, Reflector, reflect_dom_object};
|
||||||
use dom::dompoint::DOMPoint;
|
use dom::dompoint::DOMPoint;
|
||||||
use dom::domrect::DOMRect;
|
use dom::domrect::DOMRect;
|
||||||
|
|
||||||
|
@ -110,7 +110,7 @@ impl DOMQuadMethods for DOMQuad {
|
||||||
let right = self.p1.X().max(self.p2.X()).max(self.p3.X()).max(self.p4.X());
|
let right = self.p1.X().max(self.p2.X()).max(self.p3.X()).max(self.p4.X());
|
||||||
let bottom = self.p1.Y().max(self.p2.Y()).max(self.p3.Y()).max(self.p4.Y());
|
let bottom = self.p1.Y().max(self.p2.Y()).max(self.p3.Y()).max(self.p4.Y());
|
||||||
|
|
||||||
DOMRect::new(global_root_from_reflector(self).r(),
|
DOMRect::new(self.global().r(),
|
||||||
left,
|
left,
|
||||||
top,
|
top,
|
||||||
right - left,
|
right - left,
|
||||||
|
|
|
@ -5,9 +5,10 @@
|
||||||
use devtools_traits::{StartedTimelineMarker, TimelineMarker, TimelineMarkerType};
|
use devtools_traits::{StartedTimelineMarker, TimelineMarker, TimelineMarkerType};
|
||||||
use dom::bindings::callback::ExceptionHandling::Report;
|
use dom::bindings::callback::ExceptionHandling::Report;
|
||||||
use dom::bindings::codegen::Bindings::EventBinding::EventMethods;
|
use dom::bindings::codegen::Bindings::EventBinding::EventMethods;
|
||||||
use dom::bindings::global::{GlobalRoot, global_root_from_reflector};
|
use dom::bindings::global::GlobalRoot;
|
||||||
use dom::bindings::inheritance::Castable;
|
use dom::bindings::inheritance::Castable;
|
||||||
use dom::bindings::js::{JS, Root, RootedReference};
|
use dom::bindings::js::{JS, Root, RootedReference};
|
||||||
|
use dom::bindings::reflector::Reflectable;
|
||||||
use dom::bindings::trace::RootedVec;
|
use dom::bindings::trace::RootedVec;
|
||||||
use dom::event::{Event, EventPhase};
|
use dom::event::{Event, EventPhase};
|
||||||
use dom::eventtarget::{EventListenerType, EventTarget, ListenerPhase};
|
use dom::eventtarget::{EventListenerType, EventTarget, ListenerPhase};
|
||||||
|
@ -49,7 +50,7 @@ fn dispatch_to_listeners(event: &Event, target: &EventTarget, chain: &[&EventTar
|
||||||
assert!(!event.stop_propagation());
|
assert!(!event.stop_propagation());
|
||||||
assert!(!event.stop_immediate());
|
assert!(!event.stop_immediate());
|
||||||
|
|
||||||
let window = match global_root_from_reflector(target) {
|
let window = match target.global() {
|
||||||
GlobalRoot::Window(window) => {
|
GlobalRoot::Window(window) => {
|
||||||
if window.need_emit_timeline_marker(TimelineMarkerType::DOMEvent) {
|
if window.need_emit_timeline_marker(TimelineMarkerType::DOMEvent) {
|
||||||
Some(window)
|
Some(window)
|
||||||
|
|
|
@ -11,7 +11,7 @@ use dom::bindings::codegen::Bindings::EventListenerBinding::EventListener;
|
||||||
use dom::bindings::codegen::Bindings::EventTargetBinding::EventTargetMethods;
|
use dom::bindings::codegen::Bindings::EventTargetBinding::EventTargetMethods;
|
||||||
use dom::bindings::codegen::UnionTypes::EventOrString;
|
use dom::bindings::codegen::UnionTypes::EventOrString;
|
||||||
use dom::bindings::error::{Error, Fallible, report_pending_exception};
|
use dom::bindings::error::{Error, Fallible, report_pending_exception};
|
||||||
use dom::bindings::global::{GlobalRef, global_root_from_reflector};
|
use dom::bindings::global::GlobalRef;
|
||||||
use dom::bindings::inheritance::{Castable, EventTargetTypeId};
|
use dom::bindings::inheritance::{Castable, EventTargetTypeId};
|
||||||
use dom::bindings::js::Root;
|
use dom::bindings::js::Root;
|
||||||
use dom::bindings::reflector::{Reflectable, Reflector};
|
use dom::bindings::reflector::{Reflectable, Reflector};
|
||||||
|
@ -123,7 +123,7 @@ impl EventListenerType {
|
||||||
match *handler {
|
match *handler {
|
||||||
CommonEventHandler::ErrorEventHandler(ref handler) => {
|
CommonEventHandler::ErrorEventHandler(ref handler) => {
|
||||||
if let Some(event) = event.downcast::<ErrorEvent>() {
|
if let Some(event) = event.downcast::<ErrorEvent>() {
|
||||||
let global = global_root_from_reflector(object);
|
let global = object.global();
|
||||||
let cx = global.r().get_cx();
|
let cx = global.r().get_cx();
|
||||||
let error = RootedValue::new(cx, event.Error(cx));
|
let error = RootedValue::new(cx, event.Error(cx));
|
||||||
let _ = handler.Call_(object,
|
let _ = handler.Call_(object,
|
||||||
|
|
|
@ -18,11 +18,10 @@ pub struct File {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl File {
|
impl File {
|
||||||
fn new_inherited(global: GlobalRef,
|
fn new_inherited(_file_bits: &Blob, name: DOMString) -> File {
|
||||||
_file_bits: &Blob, name: DOMString) -> File {
|
|
||||||
File {
|
File {
|
||||||
//TODO: get type from the underlying filesystem instead of "".to_string()
|
//TODO: get type from the underlying filesystem instead of "".to_string()
|
||||||
blob: Blob::new_inherited(global, Arc::new(Vec::new()), None, None, ""),
|
blob: Blob::new_inherited(Arc::new(Vec::new()), None, None, ""),
|
||||||
name: name,
|
name: name,
|
||||||
}
|
}
|
||||||
// XXXManishearth Once Blob is able to store data
|
// XXXManishearth Once Blob is able to store data
|
||||||
|
@ -30,7 +29,7 @@ impl File {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn new(global: GlobalRef, file_bits: &Blob, name: DOMString) -> Root<File> {
|
pub fn new(global: GlobalRef, file_bits: &Blob, name: DOMString) -> Root<File> {
|
||||||
reflect_dom_object(box File::new_inherited(global, file_bits, name),
|
reflect_dom_object(box File::new_inherited(file_bits, name),
|
||||||
global,
|
global,
|
||||||
FileBinding::Wrap)
|
FileBinding::Wrap)
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,7 +7,7 @@ use dom::bindings::codegen::Bindings::BlobBinding::BlobMethods;
|
||||||
use dom::bindings::codegen::Bindings::EventHandlerBinding::EventHandlerNonNull;
|
use dom::bindings::codegen::Bindings::EventHandlerBinding::EventHandlerNonNull;
|
||||||
use dom::bindings::codegen::Bindings::FileReaderBinding::{self, FileReaderConstants, FileReaderMethods};
|
use dom::bindings::codegen::Bindings::FileReaderBinding::{self, FileReaderConstants, FileReaderMethods};
|
||||||
use dom::bindings::error::{Error, ErrorResult, Fallible};
|
use dom::bindings::error::{Error, ErrorResult, Fallible};
|
||||||
use dom::bindings::global::{GlobalField, GlobalRef};
|
use dom::bindings::global::GlobalRef;
|
||||||
use dom::bindings::inheritance::Castable;
|
use dom::bindings::inheritance::Castable;
|
||||||
use dom::bindings::js::{JS, MutNullableHeap, Root};
|
use dom::bindings::js::{JS, MutNullableHeap, Root};
|
||||||
use dom::bindings::refcounted::Trusted;
|
use dom::bindings::refcounted::Trusted;
|
||||||
|
@ -69,7 +69,6 @@ pub enum FileReaderReadyState {
|
||||||
#[dom_struct]
|
#[dom_struct]
|
||||||
pub struct FileReader {
|
pub struct FileReader {
|
||||||
eventtarget: EventTarget,
|
eventtarget: EventTarget,
|
||||||
global: GlobalField,
|
|
||||||
ready_state: Cell<FileReaderReadyState>,
|
ready_state: Cell<FileReaderReadyState>,
|
||||||
error: MutNullableHeap<JS<DOMException>>,
|
error: MutNullableHeap<JS<DOMException>>,
|
||||||
result: DOMRefCell<Option<DOMString>>,
|
result: DOMRefCell<Option<DOMString>>,
|
||||||
|
@ -77,10 +76,9 @@ pub struct FileReader {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl FileReader {
|
impl FileReader {
|
||||||
pub fn new_inherited(global: GlobalRef) -> FileReader {
|
pub fn new_inherited() -> FileReader {
|
||||||
FileReader {
|
FileReader {
|
||||||
eventtarget: EventTarget::new_inherited(),//?
|
eventtarget: EventTarget::new_inherited(),//?
|
||||||
global: GlobalField::from_rooted(&global),
|
|
||||||
ready_state: Cell::new(FileReaderReadyState::Empty),
|
ready_state: Cell::new(FileReaderReadyState::Empty),
|
||||||
error: MutNullableHeap::new(None),
|
error: MutNullableHeap::new(None),
|
||||||
result: DOMRefCell::new(None),
|
result: DOMRefCell::new(None),
|
||||||
|
@ -89,7 +87,7 @@ impl FileReader {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn new(global: GlobalRef) -> Root<FileReader> {
|
pub fn new(global: GlobalRef) -> Root<FileReader> {
|
||||||
reflect_dom_object(box FileReader::new_inherited(global),
|
reflect_dom_object(box FileReader::new_inherited(),
|
||||||
global, FileReaderBinding::Wrap)
|
global, FileReaderBinding::Wrap)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -114,7 +112,7 @@ impl FileReader {
|
||||||
fr.change_ready_state(FileReaderReadyState::Done);
|
fr.change_ready_state(FileReaderReadyState::Done);
|
||||||
*fr.result.borrow_mut() = None;
|
*fr.result.borrow_mut() = None;
|
||||||
|
|
||||||
let global = fr.global.root();
|
let global = fr.r().global();
|
||||||
let exception = DOMException::new(global.r(), error);
|
let exception = DOMException::new(global.r(), error);
|
||||||
fr.error.set(Some(&exception));
|
fr.error.set(Some(&exception));
|
||||||
|
|
||||||
|
@ -291,7 +289,7 @@ impl FileReaderMethods for FileReader {
|
||||||
// Steps 1 & 3
|
// Steps 1 & 3
|
||||||
*self.result.borrow_mut() = None;
|
*self.result.borrow_mut() = None;
|
||||||
|
|
||||||
let global = self.global.root();
|
let global = self.global();
|
||||||
let exception = DOMException::new(global.r(), DOMErrorName::AbortError);
|
let exception = DOMException::new(global.r(), DOMErrorName::AbortError);
|
||||||
self.error.set(Some(&exception));
|
self.error.set(Some(&exception));
|
||||||
|
|
||||||
|
@ -321,7 +319,7 @@ impl FileReaderMethods for FileReader {
|
||||||
impl FileReader {
|
impl FileReader {
|
||||||
fn dispatch_progress_event(&self, type_: Atom, loaded: u64, total: Option<u64>) {
|
fn dispatch_progress_event(&self, type_: Atom, loaded: u64, total: Option<u64>) {
|
||||||
|
|
||||||
let global = self.global.root();
|
let global = self.global();
|
||||||
let progressevent = ProgressEvent::new(global.r(),
|
let progressevent = ProgressEvent::new(global.r(),
|
||||||
type_, EventBubbles::DoesNotBubble, EventCancelable::NotCancelable,
|
type_, EventBubbles::DoesNotBubble, EventCancelable::NotCancelable,
|
||||||
total.is_some(), loaded, total.unwrap_or(0));
|
total.is_some(), loaded, total.unwrap_or(0));
|
||||||
|
@ -334,7 +332,7 @@ impl FileReader {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn read(&self, function: FileReaderFunction, blob: &Blob, label: Option<DOMString>) -> ErrorResult {
|
fn read(&self, function: FileReaderFunction, blob: &Blob, label: Option<DOMString>) -> ErrorResult {
|
||||||
let root = self.global.root();
|
let root = self.global();
|
||||||
let global = root.r();
|
let global = root.r();
|
||||||
// Step 1
|
// Step 1
|
||||||
if self.ready_state.get() == FileReaderReadyState::Loading {
|
if self.ready_state.get() == FileReaderReadyState::Loading {
|
||||||
|
@ -342,7 +340,7 @@ impl FileReader {
|
||||||
}
|
}
|
||||||
// Step 2
|
// Step 2
|
||||||
if blob.IsClosed() {
|
if blob.IsClosed() {
|
||||||
let global = self.global.root();
|
let global = self.global();
|
||||||
let exception = DOMException::new(global.r(), DOMErrorName::InvalidStateError);
|
let exception = DOMException::new(global.r(), DOMErrorName::InvalidStateError);
|
||||||
self.error.set(Some(&exception));
|
self.error.set(Some(&exception));
|
||||||
|
|
||||||
|
|
|
@ -7,10 +7,10 @@ use dom::bindings::codegen::Bindings::FormDataBinding;
|
||||||
use dom::bindings::codegen::Bindings::FormDataBinding::FormDataMethods;
|
use dom::bindings::codegen::Bindings::FormDataBinding::FormDataMethods;
|
||||||
use dom::bindings::codegen::UnionTypes::BlobOrUSVString::{self, eBlob, eUSVString};
|
use dom::bindings::codegen::UnionTypes::BlobOrUSVString::{self, eBlob, eUSVString};
|
||||||
use dom::bindings::error::{Fallible};
|
use dom::bindings::error::{Fallible};
|
||||||
use dom::bindings::global::{GlobalField, GlobalRef};
|
use dom::bindings::global::GlobalRef;
|
||||||
use dom::bindings::inheritance::Castable;
|
use dom::bindings::inheritance::Castable;
|
||||||
use dom::bindings::js::{JS, Root};
|
use dom::bindings::js::{JS, Root};
|
||||||
use dom::bindings::reflector::{Reflector, reflect_dom_object};
|
use dom::bindings::reflector::{Reflectable, Reflector, reflect_dom_object};
|
||||||
use dom::bindings::str::USVString;
|
use dom::bindings::str::USVString;
|
||||||
use dom::blob::Blob;
|
use dom::blob::Blob;
|
||||||
use dom::file::File;
|
use dom::file::File;
|
||||||
|
@ -32,22 +32,20 @@ pub enum FormDatum {
|
||||||
pub struct FormData {
|
pub struct FormData {
|
||||||
reflector_: Reflector,
|
reflector_: Reflector,
|
||||||
data: DOMRefCell<HashMap<Atom, Vec<FormDatum>>>,
|
data: DOMRefCell<HashMap<Atom, Vec<FormDatum>>>,
|
||||||
global: GlobalField,
|
|
||||||
form: Option<JS<HTMLFormElement>>
|
form: Option<JS<HTMLFormElement>>
|
||||||
}
|
}
|
||||||
|
|
||||||
impl FormData {
|
impl FormData {
|
||||||
fn new_inherited(form: Option<&HTMLFormElement>, global: GlobalRef) -> FormData {
|
fn new_inherited(form: Option<&HTMLFormElement>) -> FormData {
|
||||||
FormData {
|
FormData {
|
||||||
reflector_: Reflector::new(),
|
reflector_: Reflector::new(),
|
||||||
data: DOMRefCell::new(HashMap::new()),
|
data: DOMRefCell::new(HashMap::new()),
|
||||||
global: GlobalField::from_rooted(&global),
|
|
||||||
form: form.map(|f| JS::from_ref(f)),
|
form: form.map(|f| JS::from_ref(f)),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn new(form: Option<&HTMLFormElement>, global: GlobalRef) -> Root<FormData> {
|
pub fn new(form: Option<&HTMLFormElement>, global: GlobalRef) -> Root<FormData> {
|
||||||
reflect_dom_object(box FormData::new_inherited(form, global),
|
reflect_dom_object(box FormData::new_inherited(form),
|
||||||
global, FormDataBinding::Wrap)
|
global, FormDataBinding::Wrap)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -128,7 +126,7 @@ impl FormData {
|
||||||
fn get_file_or_blob(&self, value: &Blob, filename: Option<USVString>) -> Root<Blob> {
|
fn get_file_or_blob(&self, value: &Blob, filename: Option<USVString>) -> Root<Blob> {
|
||||||
match filename {
|
match filename {
|
||||||
Some(fname) => {
|
Some(fname) => {
|
||||||
let global = self.global.root();
|
let global = self.global();
|
||||||
let name = DOMString::from(fname.0);
|
let name = DOMString::from(fname.0);
|
||||||
Root::upcast(File::new(global.r(), value, name))
|
Root::upcast(File::new(global.r(), value, name))
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,11 +5,11 @@
|
||||||
use dom::bindings::codegen::Bindings::StorageBinding;
|
use dom::bindings::codegen::Bindings::StorageBinding;
|
||||||
use dom::bindings::codegen::Bindings::StorageBinding::StorageMethods;
|
use dom::bindings::codegen::Bindings::StorageBinding::StorageMethods;
|
||||||
use dom::bindings::error::{Error, ErrorResult};
|
use dom::bindings::error::{Error, ErrorResult};
|
||||||
use dom::bindings::global::{GlobalField, GlobalRef};
|
use dom::bindings::global::GlobalRef;
|
||||||
use dom::bindings::inheritance::Castable;
|
use dom::bindings::inheritance::Castable;
|
||||||
use dom::bindings::js::{Root, RootedReference};
|
use dom::bindings::js::{Root, RootedReference};
|
||||||
use dom::bindings::refcounted::Trusted;
|
use dom::bindings::refcounted::Trusted;
|
||||||
use dom::bindings::reflector::{Reflector, reflect_dom_object};
|
use dom::bindings::reflector::{Reflectable, Reflector, reflect_dom_object};
|
||||||
use dom::event::{Event, EventBubbles, EventCancelable};
|
use dom::event::{Event, EventBubbles, EventCancelable};
|
||||||
use dom::storageevent::StorageEvent;
|
use dom::storageevent::StorageEvent;
|
||||||
use dom::urlhelper::UrlHelper;
|
use dom::urlhelper::UrlHelper;
|
||||||
|
@ -24,31 +24,29 @@ use util::str::DOMString;
|
||||||
#[dom_struct]
|
#[dom_struct]
|
||||||
pub struct Storage {
|
pub struct Storage {
|
||||||
reflector_: Reflector,
|
reflector_: Reflector,
|
||||||
global: GlobalField,
|
|
||||||
storage_type: StorageType
|
storage_type: StorageType
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Storage {
|
impl Storage {
|
||||||
fn new_inherited(global: &GlobalRef, storage_type: StorageType) -> Storage {
|
fn new_inherited(storage_type: StorageType) -> Storage {
|
||||||
Storage {
|
Storage {
|
||||||
reflector_: Reflector::new(),
|
reflector_: Reflector::new(),
|
||||||
global: GlobalField::from_rooted(global),
|
|
||||||
storage_type: storage_type
|
storage_type: storage_type
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn new(global: &GlobalRef, storage_type: StorageType) -> Root<Storage> {
|
pub fn new(global: &GlobalRef, storage_type: StorageType) -> Root<Storage> {
|
||||||
reflect_dom_object(box Storage::new_inherited(global, storage_type), *global, StorageBinding::Wrap)
|
reflect_dom_object(box Storage::new_inherited(storage_type), *global, StorageBinding::Wrap)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_url(&self) -> Url {
|
fn get_url(&self) -> Url {
|
||||||
let global_root = self.global.root();
|
let global_root = self.global();
|
||||||
let global_ref = global_root.r();
|
let global_ref = global_root.r();
|
||||||
global_ref.get_url()
|
global_ref.get_url()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_storage_thread(&self) -> StorageThread {
|
fn get_storage_thread(&self) -> StorageThread {
|
||||||
let global_root = self.global.root();
|
let global_root = self.global();
|
||||||
let global_ref = global_root.r();
|
let global_ref = global_root.r();
|
||||||
global_ref.as_window().storage_thread()
|
global_ref.as_window().storage_thread()
|
||||||
}
|
}
|
||||||
|
@ -154,7 +152,7 @@ impl Storage {
|
||||||
/// https://html.spec.whatwg.org/multipage/#send-a-storage-notification
|
/// https://html.spec.whatwg.org/multipage/#send-a-storage-notification
|
||||||
fn broadcast_change_notification(&self, key: Option<String>, old_value: Option<String>,
|
fn broadcast_change_notification(&self, key: Option<String>, old_value: Option<String>,
|
||||||
new_value: Option<String>) {
|
new_value: Option<String>) {
|
||||||
let global_root = self.global.root();
|
let global_root = self.global();
|
||||||
let global_ref = global_root.r();
|
let global_ref = global_root.r();
|
||||||
let main_script_chan = global_ref.as_window().main_thread_script_chan();
|
let main_script_chan = global_ref.as_window().main_thread_script_chan();
|
||||||
let script_chan = global_ref.dom_manipulation_thread_source();
|
let script_chan = global_ref.dom_manipulation_thread_source();
|
||||||
|
@ -183,7 +181,7 @@ impl MainThreadRunnable for StorageEventRunnable {
|
||||||
let this = *self;
|
let this = *self;
|
||||||
let storage_root = this.element.root();
|
let storage_root = this.element.root();
|
||||||
let storage = storage_root.r();
|
let storage = storage_root.r();
|
||||||
let global_root = storage.global.root();
|
let global_root = storage.global();
|
||||||
let global_ref = global_root.r();
|
let global_ref = global_root.r();
|
||||||
let ev_window = global_ref.as_window();
|
let ev_window = global_ref.as_window();
|
||||||
let ev_url = storage.get_url();
|
let ev_url = storage.get_url();
|
||||||
|
|
|
@ -10,10 +10,10 @@ use dom::bindings::codegen::Bindings::TestBindingBinding::{self, TestBindingMeth
|
||||||
use dom::bindings::codegen::UnionTypes::{BlobOrString, EventOrString};
|
use dom::bindings::codegen::UnionTypes::{BlobOrString, EventOrString};
|
||||||
use dom::bindings::codegen::UnionTypes::{EventOrUSVString, HTMLElementOrLong};
|
use dom::bindings::codegen::UnionTypes::{EventOrUSVString, HTMLElementOrLong};
|
||||||
use dom::bindings::error::Fallible;
|
use dom::bindings::error::Fallible;
|
||||||
use dom::bindings::global::{GlobalRef, global_root_from_reflector};
|
use dom::bindings::global::GlobalRef;
|
||||||
use dom::bindings::js::Root;
|
use dom::bindings::js::Root;
|
||||||
use dom::bindings::num::Finite;
|
use dom::bindings::num::Finite;
|
||||||
use dom::bindings::reflector::{Reflector, reflect_dom_object};
|
use dom::bindings::reflector::{Reflectable, Reflector, reflect_dom_object};
|
||||||
use dom::bindings::str::{ByteString, USVString};
|
use dom::bindings::str::{ByteString, USVString};
|
||||||
use dom::bindings::weakref::MutableWeakRef;
|
use dom::bindings::weakref::MutableWeakRef;
|
||||||
use dom::blob::Blob;
|
use dom::blob::Blob;
|
||||||
|
@ -85,7 +85,7 @@ impl TestBindingMethods for TestBinding {
|
||||||
fn EnumAttribute(&self) -> TestEnum { TestEnum::_empty }
|
fn EnumAttribute(&self) -> TestEnum { TestEnum::_empty }
|
||||||
fn SetEnumAttribute(&self, _: TestEnum) {}
|
fn SetEnumAttribute(&self, _: TestEnum) {}
|
||||||
fn InterfaceAttribute(&self) -> Root<Blob> {
|
fn InterfaceAttribute(&self) -> Root<Blob> {
|
||||||
Blob::new(global_root_from_reflector(self).r(), Vec::new(), "")
|
Blob::new(self.global().r(), Vec::new(), "")
|
||||||
}
|
}
|
||||||
fn SetInterfaceAttribute(&self, _: &Blob) {}
|
fn SetInterfaceAttribute(&self, _: &Blob) {}
|
||||||
fn UnionAttribute(&self) -> HTMLElementOrLong { HTMLElementOrLong::eLong(0) }
|
fn UnionAttribute(&self) -> HTMLElementOrLong { HTMLElementOrLong::eLong(0) }
|
||||||
|
@ -143,7 +143,7 @@ impl TestBindingMethods for TestBinding {
|
||||||
fn SetAttr_to_automatically_rename(&self, _: DOMString) {}
|
fn SetAttr_to_automatically_rename(&self, _: DOMString) {}
|
||||||
fn GetEnumAttributeNullable(&self) -> Option<TestEnum> { Some(TestEnum::_empty) }
|
fn GetEnumAttributeNullable(&self) -> Option<TestEnum> { Some(TestEnum::_empty) }
|
||||||
fn GetInterfaceAttributeNullable(&self) -> Option<Root<Blob>> {
|
fn GetInterfaceAttributeNullable(&self) -> Option<Root<Blob>> {
|
||||||
Some(Blob::new(global_root_from_reflector(self).r(), Vec::new(), ""))
|
Some(Blob::new(self.global().r(), Vec::new(), ""))
|
||||||
}
|
}
|
||||||
fn SetInterfaceAttributeNullable(&self, _: Option<&Blob>) {}
|
fn SetInterfaceAttributeNullable(&self, _: Option<&Blob>) {}
|
||||||
fn GetInterfaceAttributeWeak(&self) -> Option<Root<URL>> {
|
fn GetInterfaceAttributeWeak(&self) -> Option<Root<URL>> {
|
||||||
|
@ -182,7 +182,7 @@ impl TestBindingMethods for TestBinding {
|
||||||
fn ReceiveByteString(&self) -> ByteString { ByteString::new(vec!()) }
|
fn ReceiveByteString(&self) -> ByteString { ByteString::new(vec!()) }
|
||||||
fn ReceiveEnum(&self) -> TestEnum { TestEnum::_empty }
|
fn ReceiveEnum(&self) -> TestEnum { TestEnum::_empty }
|
||||||
fn ReceiveInterface(&self) -> Root<Blob> {
|
fn ReceiveInterface(&self) -> Root<Blob> {
|
||||||
Blob::new(global_root_from_reflector(self).r(), Vec::new(), "")
|
Blob::new(self.global().r(), Vec::new(), "")
|
||||||
}
|
}
|
||||||
fn ReceiveAny(&self, _: *mut JSContext) -> JSVal { NullValue() }
|
fn ReceiveAny(&self, _: *mut JSContext) -> JSVal { NullValue() }
|
||||||
fn ReceiveObject(&self, _: *mut JSContext) -> *mut JSObject { panic!() }
|
fn ReceiveObject(&self, _: *mut JSContext) -> *mut JSObject { panic!() }
|
||||||
|
@ -207,7 +207,7 @@ impl TestBindingMethods for TestBinding {
|
||||||
fn ReceiveNullableByteString(&self) -> Option<ByteString> { Some(ByteString::new(vec!())) }
|
fn ReceiveNullableByteString(&self) -> Option<ByteString> { Some(ByteString::new(vec!())) }
|
||||||
fn ReceiveNullableEnum(&self) -> Option<TestEnum> { Some(TestEnum::_empty) }
|
fn ReceiveNullableEnum(&self) -> Option<TestEnum> { Some(TestEnum::_empty) }
|
||||||
fn ReceiveNullableInterface(&self) -> Option<Root<Blob>> {
|
fn ReceiveNullableInterface(&self) -> Option<Root<Blob>> {
|
||||||
Some(Blob::new(global_root_from_reflector(self).r(), Vec::new(), ""))
|
Some(Blob::new(self.global().r(), Vec::new(), ""))
|
||||||
}
|
}
|
||||||
fn ReceiveNullableObject(&self, _: *mut JSContext) -> *mut JSObject { ptr::null_mut() }
|
fn ReceiveNullableObject(&self, _: *mut JSContext) -> *mut JSObject { ptr::null_mut() }
|
||||||
fn ReceiveNullableUnion(&self) -> Option<HTMLElementOrLong> {
|
fn ReceiveNullableUnion(&self) -> Option<HTMLElementOrLong> {
|
||||||
|
|
|
@ -10,10 +10,10 @@ use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::{WebGLRender
|
||||||
use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::{self, WebGLContextAttributes};
|
use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::{self, WebGLContextAttributes};
|
||||||
use dom::bindings::codegen::UnionTypes::ImageDataOrHTMLImageElementOrHTMLCanvasElementOrHTMLVideoElement;
|
use dom::bindings::codegen::UnionTypes::ImageDataOrHTMLImageElementOrHTMLCanvasElementOrHTMLVideoElement;
|
||||||
use dom::bindings::conversions::{ToJSValConvertible, array_buffer_view_to_vec_checked, array_buffer_view_to_vec};
|
use dom::bindings::conversions::{ToJSValConvertible, array_buffer_view_to_vec_checked, array_buffer_view_to_vec};
|
||||||
use dom::bindings::global::{GlobalField, GlobalRef};
|
use dom::bindings::global::GlobalRef;
|
||||||
use dom::bindings::inheritance::Castable;
|
use dom::bindings::inheritance::Castable;
|
||||||
use dom::bindings::js::{JS, LayoutJS, MutNullableHeap, Root};
|
use dom::bindings::js::{JS, LayoutJS, MutNullableHeap, Root};
|
||||||
use dom::bindings::reflector::{Reflector, reflect_dom_object};
|
use dom::bindings::reflector::{Reflectable, Reflector, reflect_dom_object};
|
||||||
use dom::event::{Event, EventBubbles, EventCancelable};
|
use dom::event::{Event, EventBubbles, EventCancelable};
|
||||||
use dom::htmlcanvaselement::HTMLCanvasElement;
|
use dom::htmlcanvaselement::HTMLCanvasElement;
|
||||||
use dom::htmlcanvaselement::utils as canvas_utils;
|
use dom::htmlcanvaselement::utils as canvas_utils;
|
||||||
|
@ -69,7 +69,6 @@ bitflags! {
|
||||||
#[dom_struct]
|
#[dom_struct]
|
||||||
pub struct WebGLRenderingContext {
|
pub struct WebGLRenderingContext {
|
||||||
reflector_: Reflector,
|
reflector_: Reflector,
|
||||||
global: GlobalField,
|
|
||||||
renderer_id: usize,
|
renderer_id: usize,
|
||||||
#[ignore_heap_size_of = "Defined in ipc-channel"]
|
#[ignore_heap_size_of = "Defined in ipc-channel"]
|
||||||
ipc_renderer: IpcSender<CanvasMsg>,
|
ipc_renderer: IpcSender<CanvasMsg>,
|
||||||
|
@ -98,7 +97,6 @@ impl WebGLRenderingContext {
|
||||||
result.map(|(ipc_renderer, renderer_id)| {
|
result.map(|(ipc_renderer, renderer_id)| {
|
||||||
WebGLRenderingContext {
|
WebGLRenderingContext {
|
||||||
reflector_: Reflector::new(),
|
reflector_: Reflector::new(),
|
||||||
global: GlobalField::from_rooted(&global),
|
|
||||||
renderer_id: renderer_id,
|
renderer_id: renderer_id,
|
||||||
ipc_renderer: ipc_renderer,
|
ipc_renderer: ipc_renderer,
|
||||||
canvas: JS::from_ref(canvas),
|
canvas: JS::from_ref(canvas),
|
||||||
|
@ -617,34 +615,34 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
|
||||||
// generated objects, either here or in the webgl thread
|
// generated objects, either here or in the webgl thread
|
||||||
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.5
|
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.5
|
||||||
fn CreateBuffer(&self) -> Option<Root<WebGLBuffer>> {
|
fn CreateBuffer(&self) -> Option<Root<WebGLBuffer>> {
|
||||||
WebGLBuffer::maybe_new(self.global.root().r(), self.ipc_renderer.clone())
|
WebGLBuffer::maybe_new(self.global().r(), self.ipc_renderer.clone())
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.6
|
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.6
|
||||||
fn CreateFramebuffer(&self) -> Option<Root<WebGLFramebuffer>> {
|
fn CreateFramebuffer(&self) -> Option<Root<WebGLFramebuffer>> {
|
||||||
WebGLFramebuffer::maybe_new(self.global.root().r(), self.ipc_renderer.clone())
|
WebGLFramebuffer::maybe_new(self.global().r(), self.ipc_renderer.clone())
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.7
|
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.7
|
||||||
fn CreateRenderbuffer(&self) -> Option<Root<WebGLRenderbuffer>> {
|
fn CreateRenderbuffer(&self) -> Option<Root<WebGLRenderbuffer>> {
|
||||||
WebGLRenderbuffer::maybe_new(self.global.root().r(), self.ipc_renderer.clone())
|
WebGLRenderbuffer::maybe_new(self.global().r(), self.ipc_renderer.clone())
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.8
|
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.8
|
||||||
fn CreateTexture(&self) -> Option<Root<WebGLTexture>> {
|
fn CreateTexture(&self) -> Option<Root<WebGLTexture>> {
|
||||||
WebGLTexture::maybe_new(self.global.root().r(), self.ipc_renderer.clone())
|
WebGLTexture::maybe_new(self.global().r(), self.ipc_renderer.clone())
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9
|
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9
|
||||||
fn CreateProgram(&self) -> Option<Root<WebGLProgram>> {
|
fn CreateProgram(&self) -> Option<Root<WebGLProgram>> {
|
||||||
WebGLProgram::maybe_new(self.global.root().r(), self.ipc_renderer.clone())
|
WebGLProgram::maybe_new(self.global().r(), self.ipc_renderer.clone())
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO(ecoal95): Check if constants are cross-platform or if we must make a translation
|
// TODO(ecoal95): Check if constants are cross-platform or if we must make a translation
|
||||||
// between WebGL constants and native ones.
|
// between WebGL constants and native ones.
|
||||||
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9
|
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9
|
||||||
fn CreateShader(&self, shader_type: u32) -> Option<Root<WebGLShader>> {
|
fn CreateShader(&self, shader_type: u32) -> Option<Root<WebGLShader>> {
|
||||||
WebGLShader::maybe_new(self.global.root().r(), self.ipc_renderer.clone(), shader_type)
|
WebGLShader::maybe_new(self.global().r(), self.ipc_renderer.clone(), shader_type)
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.5
|
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.5
|
||||||
|
@ -806,7 +804,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
|
||||||
name: DOMString) -> Option<Root<WebGLUniformLocation>> {
|
name: DOMString) -> Option<Root<WebGLUniformLocation>> {
|
||||||
if let Some(program) = program {
|
if let Some(program) = program {
|
||||||
handle_potential_webgl_error!(self, program.get_uniform_location(name), None)
|
handle_potential_webgl_error!(self, program.get_uniform_location(name), None)
|
||||||
.map(|location| WebGLUniformLocation::new(self.global.root().r(), location))
|
.map(|location| WebGLUniformLocation::new(self.global().r(), location))
|
||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
@ -1083,7 +1081,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
|
||||||
|
|
||||||
let (pixels, size) = match source {
|
let (pixels, size) = match source {
|
||||||
ImageDataOrHTMLImageElementOrHTMLCanvasElementOrHTMLVideoElement::eImageData(image_data) => {
|
ImageDataOrHTMLImageElementOrHTMLCanvasElementOrHTMLVideoElement::eImageData(image_data) => {
|
||||||
let global = self.global.root();
|
let global = self.global();
|
||||||
(image_data.get_data_array(&global.r()), image_data.get_size())
|
(image_data.get_data_array(&global.r()), image_data.get_size())
|
||||||
},
|
},
|
||||||
ImageDataOrHTMLImageElementOrHTMLCanvasElementOrHTMLVideoElement::eHTMLImageElement(image) => {
|
ImageDataOrHTMLImageElementOrHTMLCanvasElementOrHTMLVideoElement::eHTMLImageElement(image) => {
|
||||||
|
|
|
@ -9,7 +9,7 @@ use dom::bindings::codegen::Bindings::WebSocketBinding;
|
||||||
use dom::bindings::codegen::Bindings::WebSocketBinding::{BinaryType, WebSocketMethods};
|
use dom::bindings::codegen::Bindings::WebSocketBinding::{BinaryType, WebSocketMethods};
|
||||||
use dom::bindings::conversions::{ToJSValConvertible};
|
use dom::bindings::conversions::{ToJSValConvertible};
|
||||||
use dom::bindings::error::{Error, Fallible};
|
use dom::bindings::error::{Error, Fallible};
|
||||||
use dom::bindings::global::{GlobalField, GlobalRef};
|
use dom::bindings::global::GlobalRef;
|
||||||
use dom::bindings::inheritance::Castable;
|
use dom::bindings::inheritance::Castable;
|
||||||
use dom::bindings::js::Root;
|
use dom::bindings::js::Root;
|
||||||
use dom::bindings::refcounted::Trusted;
|
use dom::bindings::refcounted::Trusted;
|
||||||
|
@ -136,7 +136,6 @@ mod close_code {
|
||||||
pub struct WebSocket {
|
pub struct WebSocket {
|
||||||
eventtarget: EventTarget,
|
eventtarget: EventTarget,
|
||||||
url: Url,
|
url: Url,
|
||||||
global: GlobalField,
|
|
||||||
ready_state: Cell<WebSocketRequestState>,
|
ready_state: Cell<WebSocketRequestState>,
|
||||||
buffered_amount: Cell<u64>,
|
buffered_amount: Cell<u64>,
|
||||||
clearing_buffer: Cell<bool>, //Flag to tell if there is a running thread to clear buffered_amount
|
clearing_buffer: Cell<bool>, //Flag to tell if there is a running thread to clear buffered_amount
|
||||||
|
@ -152,11 +151,10 @@ pub struct WebSocket {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl WebSocket {
|
impl WebSocket {
|
||||||
fn new_inherited(global: GlobalRef, url: Url) -> WebSocket {
|
fn new_inherited(url: Url) -> WebSocket {
|
||||||
WebSocket {
|
WebSocket {
|
||||||
eventtarget: EventTarget::new_inherited(),
|
eventtarget: EventTarget::new_inherited(),
|
||||||
url: url,
|
url: url,
|
||||||
global: GlobalField::from_rooted(&global),
|
|
||||||
ready_state: Cell::new(WebSocketRequestState::Connecting),
|
ready_state: Cell::new(WebSocketRequestState::Connecting),
|
||||||
buffered_amount: Cell::new(0),
|
buffered_amount: Cell::new(0),
|
||||||
clearing_buffer: Cell::new(false),
|
clearing_buffer: Cell::new(false),
|
||||||
|
@ -169,11 +167,10 @@ impl WebSocket {
|
||||||
binary_type: Cell::new(BinaryType::Blob),
|
binary_type: Cell::new(BinaryType::Blob),
|
||||||
protocol: DOMRefCell::new("".to_owned()),
|
protocol: DOMRefCell::new("".to_owned()),
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn new(global: GlobalRef, url: Url) -> Root<WebSocket> {
|
fn new(global: GlobalRef, url: Url) -> Root<WebSocket> {
|
||||||
reflect_dom_object(box WebSocket::new_inherited(global, url),
|
reflect_dom_object(box WebSocket::new_inherited(url),
|
||||||
global, WebSocketBinding::Wrap)
|
global, WebSocketBinding::Wrap)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -295,7 +292,7 @@ impl WebSocket {
|
||||||
WebSocketRequestState::Closing | WebSocketRequestState::Closed => true,
|
WebSocketRequestState::Closing | WebSocketRequestState::Closed => true,
|
||||||
};
|
};
|
||||||
|
|
||||||
let global = self.global.root();
|
let global = self.global();
|
||||||
let chan = global.r().networking_thread_source();
|
let chan = global.r().networking_thread_source();
|
||||||
let address = Trusted::new(self, chan.clone());
|
let address = Trusted::new(self, chan.clone());
|
||||||
|
|
||||||
|
@ -463,7 +460,7 @@ struct ConnectionEstablishedTask {
|
||||||
impl Runnable for ConnectionEstablishedTask {
|
impl Runnable for ConnectionEstablishedTask {
|
||||||
fn handler(self: Box<Self>) {
|
fn handler(self: Box<Self>) {
|
||||||
let ws = self.addr.root();
|
let ws = self.addr.root();
|
||||||
let global = ws.global.root();
|
let global = ws.r().global();
|
||||||
|
|
||||||
// Step 1: Protocols.
|
// Step 1: Protocols.
|
||||||
if !self.protocols.is_empty() && self.headers.get::<WebSocketProtocol>().is_none() {
|
if !self.protocols.is_empty() && self.headers.get::<WebSocketProtocol>().is_none() {
|
||||||
|
@ -522,7 +519,7 @@ impl Runnable for CloseTask {
|
||||||
fn handler(self: Box<Self>) {
|
fn handler(self: Box<Self>) {
|
||||||
let ws = self.addr.root();
|
let ws = self.addr.root();
|
||||||
let ws = ws.r();
|
let ws = ws.r();
|
||||||
let global = ws.global.root();
|
let global = ws.global();
|
||||||
ws.ready_state.set(WebSocketRequestState::Closed);
|
ws.ready_state.set(WebSocketRequestState::Closed);
|
||||||
//If failed or full, fire error event
|
//If failed or full, fire error event
|
||||||
if ws.failed.get() || ws.full.get() {
|
if ws.failed.get() || ws.full.get() {
|
||||||
|
@ -568,7 +565,7 @@ impl Runnable for MessageReceivedTask {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Step 2-5.
|
// Step 2-5.
|
||||||
let global = ws.global.root();
|
let global = ws.r().global();
|
||||||
// global.get_cx() returns a valid `JSContext` pointer, so this is safe.
|
// global.get_cx() returns a valid `JSContext` pointer, so this is safe.
|
||||||
unsafe {
|
unsafe {
|
||||||
let cx = global.r().get_cx();
|
let cx = global.r().get_cx();
|
||||||
|
|
|
@ -12,7 +12,7 @@ use dom::bindings::codegen::Bindings::FunctionBinding::Function;
|
||||||
use dom::bindings::codegen::Bindings::WindowBinding::{ScrollBehavior, ScrollToOptions};
|
use dom::bindings::codegen::Bindings::WindowBinding::{ScrollBehavior, ScrollToOptions};
|
||||||
use dom::bindings::codegen::Bindings::WindowBinding::{self, FrameRequestCallback, WindowMethods};
|
use dom::bindings::codegen::Bindings::WindowBinding::{self, FrameRequestCallback, WindowMethods};
|
||||||
use dom::bindings::error::{Error, Fallible, report_pending_exception};
|
use dom::bindings::error::{Error, Fallible, report_pending_exception};
|
||||||
use dom::bindings::global::{GlobalRef, global_root_from_reflector};
|
use dom::bindings::global::GlobalRef;
|
||||||
use dom::bindings::inheritance::Castable;
|
use dom::bindings::inheritance::Castable;
|
||||||
use dom::bindings::js::RootedReference;
|
use dom::bindings::js::RootedReference;
|
||||||
use dom::bindings::js::{JS, MutNullableHeap, Root};
|
use dom::bindings::js::{JS, MutNullableHeap, Root};
|
||||||
|
@ -804,7 +804,7 @@ impl<'a, T: Reflectable> ScriptHelpers for &'a T {
|
||||||
#[allow(unsafe_code)]
|
#[allow(unsafe_code)]
|
||||||
fn evaluate_script_on_global_with_result(self, code: &str, filename: &str,
|
fn evaluate_script_on_global_with_result(self, code: &str, filename: &str,
|
||||||
rval: MutableHandleValue) {
|
rval: MutableHandleValue) {
|
||||||
let global = global_root_from_reflector(self);
|
let global = self.global();
|
||||||
let cx = global.r().get_cx();
|
let cx = global.r().get_cx();
|
||||||
let _ar = JSAutoRequest::new(cx);
|
let _ar = JSAutoRequest::new(cx);
|
||||||
let globalhandle = global.r().reflector().get_jsobject();
|
let globalhandle = global.r().reflector().get_jsobject();
|
||||||
|
|
|
@ -7,7 +7,7 @@ use dom::bindings::codegen::Bindings::EventHandlerBinding::EventHandlerNonNull;
|
||||||
use dom::bindings::codegen::Bindings::WorkerBinding;
|
use dom::bindings::codegen::Bindings::WorkerBinding;
|
||||||
use dom::bindings::codegen::Bindings::WorkerBinding::WorkerMethods;
|
use dom::bindings::codegen::Bindings::WorkerBinding::WorkerMethods;
|
||||||
use dom::bindings::error::{Error, ErrorResult, Fallible};
|
use dom::bindings::error::{Error, ErrorResult, Fallible};
|
||||||
use dom::bindings::global::{GlobalField, GlobalRef};
|
use dom::bindings::global::GlobalRef;
|
||||||
use dom::bindings::inheritance::Castable;
|
use dom::bindings::inheritance::Castable;
|
||||||
use dom::bindings::js::Root;
|
use dom::bindings::js::Root;
|
||||||
use dom::bindings::refcounted::Trusted;
|
use dom::bindings::refcounted::Trusted;
|
||||||
|
@ -34,7 +34,6 @@ pub type TrustedWorkerAddress = Trusted<Worker>;
|
||||||
#[dom_struct]
|
#[dom_struct]
|
||||||
pub struct Worker {
|
pub struct Worker {
|
||||||
eventtarget: EventTarget,
|
eventtarget: EventTarget,
|
||||||
global: GlobalField,
|
|
||||||
#[ignore_heap_size_of = "Defined in std"]
|
#[ignore_heap_size_of = "Defined in std"]
|
||||||
/// Sender to the Receiver associated with the DedicatedWorkerGlobalScope
|
/// Sender to the Receiver associated with the DedicatedWorkerGlobalScope
|
||||||
/// this Worker created.
|
/// this Worker created.
|
||||||
|
@ -42,12 +41,10 @@ pub struct Worker {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Worker {
|
impl Worker {
|
||||||
fn new_inherited(global: GlobalRef,
|
fn new_inherited(sender: Sender<(TrustedWorkerAddress, WorkerScriptMsg)>)
|
||||||
sender: Sender<(TrustedWorkerAddress, WorkerScriptMsg)>)
|
|
||||||
-> Worker {
|
-> Worker {
|
||||||
Worker {
|
Worker {
|
||||||
eventtarget: EventTarget::new_inherited(),
|
eventtarget: EventTarget::new_inherited(),
|
||||||
global: GlobalField::from_rooted(&global),
|
|
||||||
sender: sender,
|
sender: sender,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -55,7 +52,7 @@ impl Worker {
|
||||||
pub fn new(global: GlobalRef,
|
pub fn new(global: GlobalRef,
|
||||||
sender: Sender<(TrustedWorkerAddress, WorkerScriptMsg)>)
|
sender: Sender<(TrustedWorkerAddress, WorkerScriptMsg)>)
|
||||||
-> Root<Worker> {
|
-> Root<Worker> {
|
||||||
reflect_dom_object(box Worker::new_inherited(global, sender),
|
reflect_dom_object(box Worker::new_inherited(sender),
|
||||||
global,
|
global,
|
||||||
WorkerBinding::Wrap)
|
WorkerBinding::Wrap)
|
||||||
}
|
}
|
||||||
|
@ -114,7 +111,7 @@ impl Worker {
|
||||||
data: StructuredCloneData) {
|
data: StructuredCloneData) {
|
||||||
let worker = address.root();
|
let worker = address.root();
|
||||||
|
|
||||||
let global = worker.r().global.root();
|
let global = worker.r().global();
|
||||||
let target = worker.upcast();
|
let target = worker.upcast();
|
||||||
let _ar = JSAutoRequest::new(global.r().get_cx());
|
let _ar = JSAutoRequest::new(global.r().get_cx());
|
||||||
let _ac = JSAutoCompartment::new(global.r().get_cx(), target.reflector().get_jsobject().get());
|
let _ac = JSAutoCompartment::new(global.r().get_cx(), target.reflector().get_jsobject().get());
|
||||||
|
@ -125,14 +122,14 @@ impl Worker {
|
||||||
|
|
||||||
pub fn dispatch_simple_error(address: TrustedWorkerAddress) {
|
pub fn dispatch_simple_error(address: TrustedWorkerAddress) {
|
||||||
let worker = address.root();
|
let worker = address.root();
|
||||||
let global = worker.r().global.root();
|
let global = worker.r().global();
|
||||||
worker.upcast().fire_simple_event("error", global.r());
|
worker.upcast().fire_simple_event("error", global.r());
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn handle_error_message(address: TrustedWorkerAddress, message: DOMString,
|
pub fn handle_error_message(address: TrustedWorkerAddress, message: DOMString,
|
||||||
filename: DOMString, lineno: u32, colno: u32) {
|
filename: DOMString, lineno: u32, colno: u32) {
|
||||||
let worker = address.root();
|
let worker = address.root();
|
||||||
let global = worker.r().global.root();
|
let global = worker.r().global();
|
||||||
let error = RootedValue::new(global.r().get_cx(), UndefinedValue());
|
let error = RootedValue::new(global.r().get_cx(), UndefinedValue());
|
||||||
let errorevent = ErrorEvent::new(global.r(), atom!("error"),
|
let errorevent = ErrorEvent::new(global.r(), atom!("error"),
|
||||||
EventBubbles::Bubbles, EventCancelable::Cancelable,
|
EventBubbles::Bubbles, EventCancelable::Cancelable,
|
||||||
|
@ -145,7 +142,7 @@ impl WorkerMethods for Worker {
|
||||||
// https://html.spec.whatwg.org/multipage/#dom-dedicatedworkerglobalscope-postmessage
|
// https://html.spec.whatwg.org/multipage/#dom-dedicatedworkerglobalscope-postmessage
|
||||||
fn PostMessage(&self, cx: *mut JSContext, message: HandleValue) -> ErrorResult {
|
fn PostMessage(&self, cx: *mut JSContext, message: HandleValue) -> ErrorResult {
|
||||||
let data = try!(StructuredCloneData::write(cx, message));
|
let data = try!(StructuredCloneData::write(cx, message));
|
||||||
let address = Trusted::new(self, self.global.root().r().dom_manipulation_thread_source());
|
let address = Trusted::new(self, self.global().r().dom_manipulation_thread_source());
|
||||||
self.sender.send((address, WorkerScriptMsg::DOMMessage(data))).unwrap();
|
self.sender.send((address, WorkerScriptMsg::DOMMessage(data))).unwrap();
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,7 +16,7 @@ use dom::bindings::codegen::UnionTypes::StringOrURLSearchParams;
|
||||||
use dom::bindings::codegen::UnionTypes::StringOrURLSearchParams::{eString, eURLSearchParams};
|
use dom::bindings::codegen::UnionTypes::StringOrURLSearchParams::{eString, eURLSearchParams};
|
||||||
use dom::bindings::conversions::{ToJSValConvertible};
|
use dom::bindings::conversions::{ToJSValConvertible};
|
||||||
use dom::bindings::error::{Error, ErrorResult, Fallible};
|
use dom::bindings::error::{Error, ErrorResult, Fallible};
|
||||||
use dom::bindings::global::{GlobalField, GlobalRef, GlobalRoot};
|
use dom::bindings::global::{GlobalRef, GlobalRoot};
|
||||||
use dom::bindings::inheritance::Castable;
|
use dom::bindings::inheritance::Castable;
|
||||||
use dom::bindings::js::{JS, MutNullableHeap};
|
use dom::bindings::js::{JS, MutNullableHeap};
|
||||||
use dom::bindings::js::{Root, RootedReference};
|
use dom::bindings::js::{Root, RootedReference};
|
||||||
|
@ -141,7 +141,6 @@ pub struct XMLHttpRequest {
|
||||||
upload_events: Cell<bool>,
|
upload_events: Cell<bool>,
|
||||||
send_flag: Cell<bool>,
|
send_flag: Cell<bool>,
|
||||||
|
|
||||||
global: GlobalField,
|
|
||||||
timeout_cancel: DOMRefCell<Option<TimerHandle>>,
|
timeout_cancel: DOMRefCell<Option<TimerHandle>>,
|
||||||
fetch_time: Cell<i64>,
|
fetch_time: Cell<i64>,
|
||||||
generation_id: Cell<GenerationId>,
|
generation_id: Cell<GenerationId>,
|
||||||
|
@ -175,7 +174,6 @@ impl XMLHttpRequest {
|
||||||
upload_events: Cell::new(false),
|
upload_events: Cell::new(false),
|
||||||
send_flag: Cell::new(false),
|
send_flag: Cell::new(false),
|
||||||
|
|
||||||
global: GlobalField::from_rooted(&global),
|
|
||||||
timeout_cancel: DOMRefCell::new(None),
|
timeout_cancel: DOMRefCell::new(None),
|
||||||
fetch_time: Cell::new(0),
|
fetch_time: Cell::new(0),
|
||||||
generation_id: Cell::new(GenerationId(0)),
|
generation_id: Cell::new(GenerationId(0)),
|
||||||
|
@ -325,7 +323,7 @@ impl XMLHttpRequestMethods for XMLHttpRequest {
|
||||||
*self.request_method.borrow_mut() = parsed_method;
|
*self.request_method.borrow_mut() = parsed_method;
|
||||||
|
|
||||||
// Step 6
|
// Step 6
|
||||||
let base = self.global.root().r().get_url();
|
let base = self.global().r().get_url();
|
||||||
let parsed_url = match base.join(&url) {
|
let parsed_url = match base.join(&url) {
|
||||||
Ok(parsed) => parsed,
|
Ok(parsed) => parsed,
|
||||||
Err(_) => return Err(Error::Syntax) // Step 7
|
Err(_) => return Err(Error::Syntax) // Step 7
|
||||||
|
@ -457,7 +455,7 @@ impl XMLHttpRequestMethods for XMLHttpRequest {
|
||||||
XMLHttpRequestState::Loading |
|
XMLHttpRequestState::Loading |
|
||||||
XMLHttpRequestState::Done => Err(Error::InvalidState),
|
XMLHttpRequestState::Done => Err(Error::InvalidState),
|
||||||
_ if self.send_flag.get() => Err(Error::InvalidState),
|
_ if self.send_flag.get() => Err(Error::InvalidState),
|
||||||
_ => match self.global.root() {
|
_ => match self.global() {
|
||||||
GlobalRoot::Window(_) if self.sync.get() => Err(Error::InvalidAccess),
|
GlobalRoot::Window(_) if self.sync.get() => Err(Error::InvalidAccess),
|
||||||
_ => {
|
_ => {
|
||||||
self.with_credentials.set(with_credentials);
|
self.with_credentials.set(with_credentials);
|
||||||
|
@ -519,7 +517,7 @@ impl XMLHttpRequestMethods for XMLHttpRequest {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let global = self.global.root();
|
let global = self.global();
|
||||||
let pipeline_id = global.r().pipeline();
|
let pipeline_id = global.r().pipeline();
|
||||||
let mut load_data =
|
let mut load_data =
|
||||||
LoadData::new(LoadContext::Browsing,
|
LoadData::new(LoadContext::Browsing,
|
||||||
|
@ -562,8 +560,8 @@ impl XMLHttpRequestMethods for XMLHttpRequest {
|
||||||
load_data.method = (*self.request_method.borrow()).clone();
|
load_data.method = (*self.request_method.borrow()).clone();
|
||||||
|
|
||||||
// CORS stuff
|
// CORS stuff
|
||||||
let global = self.global.root();
|
let global = self.global();
|
||||||
let referer_url = self.global.root().r().get_url();
|
let referer_url = self.global().r().get_url();
|
||||||
let mode = if self.upload_events.get() {
|
let mode = if self.upload_events.get() {
|
||||||
RequestMode::ForcedPreflight
|
RequestMode::ForcedPreflight
|
||||||
} else {
|
} else {
|
||||||
|
@ -686,7 +684,7 @@ impl XMLHttpRequestMethods for XMLHttpRequest {
|
||||||
|
|
||||||
// https://xhr.spec.whatwg.org/#the-responsetype-attribute
|
// https://xhr.spec.whatwg.org/#the-responsetype-attribute
|
||||||
fn SetResponseType(&self, response_type: XMLHttpRequestResponseType) -> ErrorResult {
|
fn SetResponseType(&self, response_type: XMLHttpRequestResponseType) -> ErrorResult {
|
||||||
match self.global.root() {
|
match self.global() {
|
||||||
GlobalRoot::Worker(_) if response_type == XMLHttpRequestResponseType::Document
|
GlobalRoot::Worker(_) if response_type == XMLHttpRequestResponseType::Document
|
||||||
=> return Ok(()),
|
=> return Ok(()),
|
||||||
_ => {}
|
_ => {}
|
||||||
|
@ -789,7 +787,7 @@ impl XMLHttpRequest {
|
||||||
fn change_ready_state(&self, rs: XMLHttpRequestState) {
|
fn change_ready_state(&self, rs: XMLHttpRequestState) {
|
||||||
assert!(self.ready_state.get() != rs);
|
assert!(self.ready_state.get() != rs);
|
||||||
self.ready_state.set(rs);
|
self.ready_state.set(rs);
|
||||||
let global = self.global.root();
|
let global = self.global();
|
||||||
let event = Event::new(global.r(),
|
let event = Event::new(global.r(),
|
||||||
atom!("readystatechange"),
|
atom!("readystatechange"),
|
||||||
EventBubbles::DoesNotBubble,
|
EventBubbles::DoesNotBubble,
|
||||||
|
@ -970,7 +968,7 @@ impl XMLHttpRequest {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn dispatch_progress_event(&self, upload: bool, type_: Atom, loaded: u64, total: Option<u64>) {
|
fn dispatch_progress_event(&self, upload: bool, type_: Atom, loaded: u64, total: Option<u64>) {
|
||||||
let global = self.global.root();
|
let global = self.global();
|
||||||
let progressevent = ProgressEvent::new(global.r(),
|
let progressevent = ProgressEvent::new(global.r(),
|
||||||
type_,
|
type_,
|
||||||
EventBubbles::DoesNotBubble,
|
EventBubbles::DoesNotBubble,
|
||||||
|
@ -1024,7 +1022,7 @@ impl XMLHttpRequest {
|
||||||
|
|
||||||
// Sets up the object to timeout in a given number of milliseconds
|
// Sets up the object to timeout in a given number of milliseconds
|
||||||
// This will cancel all previous timeouts
|
// This will cancel all previous timeouts
|
||||||
let global = self.global.root();
|
let global = self.global();
|
||||||
let callback = ScheduledXHRTimeout {
|
let callback = ScheduledXHRTimeout {
|
||||||
xhr: Trusted::new(self, global.r().networking_thread_source()),
|
xhr: Trusted::new(self, global.r().networking_thread_source()),
|
||||||
generation_id: self.generation_id.get(),
|
generation_id: self.generation_id.get(),
|
||||||
|
@ -1035,7 +1033,7 @@ impl XMLHttpRequest {
|
||||||
|
|
||||||
fn cancel_timeout(&self) {
|
fn cancel_timeout(&self) {
|
||||||
if let Some(handle) = self.timeout_cancel.borrow_mut().take() {
|
if let Some(handle) = self.timeout_cancel.borrow_mut().take() {
|
||||||
let global = self.global.root();
|
let global = self.global();
|
||||||
global.r().unschedule_callback(handle);
|
global.r().unschedule_callback(handle);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1084,7 +1082,7 @@ impl XMLHttpRequest {
|
||||||
|
|
||||||
fn document_text_html(&self) -> Root<Document>{
|
fn document_text_html(&self) -> Root<Document>{
|
||||||
let charset = self.final_charset().unwrap_or(UTF_8);
|
let charset = self.final_charset().unwrap_or(UTF_8);
|
||||||
let wr = self.global.root();
|
let wr = self.global();
|
||||||
let wr = wr.r();
|
let wr = wr.r();
|
||||||
let decoded = charset.decode(&self.response.borrow(), DecoderTrap::Replace).unwrap().to_owned();
|
let decoded = charset.decode(&self.response.borrow(), DecoderTrap::Replace).unwrap().to_owned();
|
||||||
let document = self.new_doc(IsHTMLDocument::HTMLDocument);
|
let document = self.new_doc(IsHTMLDocument::HTMLDocument);
|
||||||
|
@ -1095,7 +1093,7 @@ impl XMLHttpRequest {
|
||||||
|
|
||||||
fn handle_xml(&self) -> Root<Document> {
|
fn handle_xml(&self) -> Root<Document> {
|
||||||
let charset = self.final_charset().unwrap_or(UTF_8);
|
let charset = self.final_charset().unwrap_or(UTF_8);
|
||||||
let wr = self.global.root();
|
let wr = self.global();
|
||||||
let wr = wr.r();
|
let wr = wr.r();
|
||||||
let decoded = charset.decode(&self.response.borrow(), DecoderTrap::Replace).unwrap().to_owned();
|
let decoded = charset.decode(&self.response.borrow(), DecoderTrap::Replace).unwrap().to_owned();
|
||||||
let document = self.new_doc(IsHTMLDocument::NonHTMLDocument);
|
let document = self.new_doc(IsHTMLDocument::NonHTMLDocument);
|
||||||
|
@ -1105,13 +1103,13 @@ impl XMLHttpRequest {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn new_doc(&self, is_html_document: IsHTMLDocument) -> Root<Document> {
|
fn new_doc(&self, is_html_document: IsHTMLDocument) -> Root<Document> {
|
||||||
let wr = self.global.root();
|
let wr = self.global();
|
||||||
let wr = wr.r();
|
let wr = wr.r();
|
||||||
let win = wr.as_window();
|
let win = wr.as_window();
|
||||||
let doc = win.Document();
|
let doc = win.Document();
|
||||||
let doc = doc.r();
|
let doc = doc.r();
|
||||||
let docloader = DocumentLoader::new(&*doc.loader());
|
let docloader = DocumentLoader::new(&*doc.loader());
|
||||||
let base = self.global.root().r().get_url();
|
let base = self.global().r().get_url();
|
||||||
let parsed_url = match base.join(&self.ResponseURL()) {
|
let parsed_url = match base.join(&self.ResponseURL()) {
|
||||||
Ok(parsed) => Some(parsed),
|
Ok(parsed) => Some(parsed),
|
||||||
Err(_) => None // Step 7
|
Err(_) => None // Step 7
|
||||||
|
|
|
@ -5,7 +5,6 @@
|
||||||
use dom::bindings::callback::ExceptionHandling::Report;
|
use dom::bindings::callback::ExceptionHandling::Report;
|
||||||
use dom::bindings::cell::DOMRefCell;
|
use dom::bindings::cell::DOMRefCell;
|
||||||
use dom::bindings::codegen::Bindings::FunctionBinding::Function;
|
use dom::bindings::codegen::Bindings::FunctionBinding::Function;
|
||||||
use dom::bindings::global::global_root_from_reflector;
|
|
||||||
use dom::bindings::reflector::Reflectable;
|
use dom::bindings::reflector::Reflectable;
|
||||||
use dom::bindings::trace::JSTraceable;
|
use dom::bindings::trace::JSTraceable;
|
||||||
use dom::window::ScriptHelpers;
|
use dom::window::ScriptHelpers;
|
||||||
|
@ -289,7 +288,7 @@ impl ActiveTimers {
|
||||||
// step 14
|
// step 14
|
||||||
match callback {
|
match callback {
|
||||||
InternalTimerCallback::StringTimerCallback(code_str) => {
|
InternalTimerCallback::StringTimerCallback(code_str) => {
|
||||||
let cx = global_root_from_reflector(this).r().get_cx();
|
let cx = this.global().r().get_cx();
|
||||||
let mut rval = RootedValue::new(cx, UndefinedValue());
|
let mut rval = RootedValue::new(cx, UndefinedValue());
|
||||||
|
|
||||||
this.evaluate_js_on_global_with_result(&code_str, rval.handle_mut());
|
this.evaluate_js_on_global_with_result(&code_str, rval.handle_mut());
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue