diff options
author | bors-servo <metajack+bors@gmail.com> | 2014-10-15 22:06:19 -0600 |
---|---|---|
committer | bors-servo <metajack+bors@gmail.com> | 2014-10-15 22:06:19 -0600 |
commit | a6001329b8186ca655d8c09c29e5167782ad43cb (patch) | |
tree | 8557e38df87fdd16abd153c29d4623e22a8e2594 /components/script/dom | |
parent | f3066c70da80306f68833814025deb589d6eeb2a (diff) | |
parent | 840d949d9795ebf692642644ae1cee4c0d63c102 (diff) | |
download | servo-a6001329b8186ca655d8c09c29e5167782ad43cb.tar.gz servo-a6001329b8186ca655d8c09c29e5167782ad43cb.zip |
auto merge of #3693 : ehsan/servo/3248, r=jdm
This fixes #3248.
r? @jdm. Please review for mistakes mercilessly! Also, I got a host of test failures when running the worker tests, not sure if these tests are expected to pass locally or not.
Diffstat (limited to 'components/script/dom')
-rw-r--r-- | components/script/dom/bindings/error.rs | 3 | ||||
-rw-r--r-- | components/script/dom/dedicatedworkerglobalscope.rs | 16 | ||||
-rw-r--r-- | components/script/dom/domexception.rs | 1 | ||||
-rw-r--r-- | components/script/dom/webidls/DedicatedWorkerGlobalScope.webidl | 1 | ||||
-rw-r--r-- | components/script/dom/webidls/Worker.webidl | 1 | ||||
-rw-r--r-- | components/script/dom/worker.rs | 17 |
6 files changed, 27 insertions, 12 deletions
diff --git a/components/script/dom/bindings/error.rs b/components/script/dom/bindings/error.rs index e2e06d8205a..091a777c430 100644 --- a/components/script/dom/bindings/error.rs +++ b/components/script/dom/bindings/error.rs @@ -34,7 +34,8 @@ pub enum Error { Security, Network, Abort, - Timeout + Timeout, + DataClone } /// The return type for IDL operations that can throw DOM exceptions. diff --git a/components/script/dom/dedicatedworkerglobalscope.rs b/components/script/dom/dedicatedworkerglobalscope.rs index 1f402b73689..902e0e44763 100644 --- a/components/script/dom/dedicatedworkerglobalscope.rs +++ b/components/script/dom/dedicatedworkerglobalscope.rs @@ -7,6 +7,7 @@ use dom::bindings::codegen::Bindings::DedicatedWorkerGlobalScopeBinding::Dedicat use dom::bindings::codegen::Bindings::EventHandlerBinding::EventHandlerNonNull; use dom::bindings::codegen::InheritTypes::DedicatedWorkerGlobalScopeDerived; use dom::bindings::codegen::InheritTypes::{EventTargetCast, WorkerGlobalScopeCast}; +use dom::bindings::error::{ErrorResult, DataClone}; use dom::bindings::global; use dom::bindings::js::{JSRef, Temporary, RootCollection}; use dom::bindings::utils::{Reflectable, Reflector}; @@ -25,7 +26,7 @@ use script_task::StackRootTLS; use servo_net::resource_task::{ResourceTask, load_whole_resource}; use js::glue::JS_STRUCTURED_CLONE_VERSION; -use js::jsapi::{JSContext, JS_ReadStructuredClone, JS_WriteStructuredClone}; +use js::jsapi::{JSContext, JS_ReadStructuredClone, JS_WriteStructuredClone, JS_ClearPendingException}; use js::jsval::{JSVal, UndefinedValue}; use js::rust::Cx; @@ -154,16 +155,21 @@ impl DedicatedWorkerGlobalScope { } impl<'a> DedicatedWorkerGlobalScopeMethods for JSRef<'a, DedicatedWorkerGlobalScope> { - fn PostMessage(self, cx: *mut JSContext, message: JSVal) { + fn PostMessage(self, cx: *mut JSContext, message: JSVal) -> ErrorResult { let mut data = ptr::null_mut(); let mut nbytes = 0; - unsafe { - assert!(JS_WriteStructuredClone(cx, message, &mut data, &mut nbytes, - ptr::null(), ptr::null_mut()) != 0); + let result = unsafe { + JS_WriteStructuredClone(cx, message, &mut data, &mut nbytes, + ptr::null(), ptr::null_mut()) + }; + if result == 0 { + unsafe { JS_ClearPendingException(cx); } + return Err(DataClone); } let ScriptChan(ref sender) = self.parent_sender; sender.send(WorkerPostMessage(self.worker, data, nbytes)); + Ok(()) } fn GetOnmessage(self) -> Option<EventHandlerNonNull> { diff --git a/components/script/dom/domexception.rs b/components/script/dom/domexception.rs index 73dc4c149fe..8dc4e8f89f4 100644 --- a/components/script/dom/domexception.rs +++ b/components/script/dom/domexception.rs @@ -55,6 +55,7 @@ impl DOMErrorName { error::Network => NetworkError, error::Abort => AbortError, error::Timeout => TimeoutError, + error::DataClone => DataCloneError, error::FailureUnknown => fail!(), } } diff --git a/components/script/dom/webidls/DedicatedWorkerGlobalScope.webidl b/components/script/dom/webidls/DedicatedWorkerGlobalScope.webidl index dbf2891f72a..2fd34392dc9 100644 --- a/components/script/dom/webidls/DedicatedWorkerGlobalScope.webidl +++ b/components/script/dom/webidls/DedicatedWorkerGlobalScope.webidl @@ -5,6 +5,7 @@ // http://www.whatwg.org/html/#dedicatedworkerglobalscope [Global/*=Worker,DedicatedWorker*/] /*sealed*/ interface DedicatedWorkerGlobalScope : WorkerGlobalScope { + [Throws] void postMessage(any message/*, optional sequence<Transferable> transfer*/); attribute EventHandler onmessage; }; diff --git a/components/script/dom/webidls/Worker.webidl b/components/script/dom/webidls/Worker.webidl index 2228c203781..aa8a1c1e5d3 100644 --- a/components/script/dom/webidls/Worker.webidl +++ b/components/script/dom/webidls/Worker.webidl @@ -14,6 +14,7 @@ interface AbstractWorker { interface Worker : EventTarget { //void terminate(); + [Throws] void postMessage(any message/*, optional sequence<Transferable> transfer*/); attribute EventHandler onmessage; }; diff --git a/components/script/dom/worker.rs b/components/script/dom/worker.rs index f7feec1929f..0d549ca95f6 100644 --- a/components/script/dom/worker.rs +++ b/components/script/dom/worker.rs @@ -6,7 +6,7 @@ use dom::bindings::codegen::Bindings::WorkerBinding; use dom::bindings::codegen::Bindings::WorkerBinding::WorkerMethods; use dom::bindings::codegen::Bindings::EventHandlerBinding::EventHandlerNonNull; use dom::bindings::codegen::InheritTypes::EventTargetCast; -use dom::bindings::error::{Fallible, Syntax}; +use dom::bindings::error::{Fallible, Syntax, ErrorResult, DataClone}; use dom::bindings::global::{GlobalRef, GlobalField}; use dom::bindings::js::{JS, JSRef, Temporary}; use dom::bindings::trace::JSTraceable; @@ -20,7 +20,7 @@ use servo_util::str::DOMString; use js::glue::JS_STRUCTURED_CLONE_VERSION; use js::jsapi::{JSContext, JS_AddObjectRoot, JS_RemoveObjectRoot, JSTracer}; -use js::jsapi::{JS_ReadStructuredClone, JS_WriteStructuredClone}; +use js::jsapi::{JS_ReadStructuredClone, JS_WriteStructuredClone, JS_ClearPendingException}; use js::jsval::{JSVal, UndefinedValue}; use url::UrlParser; @@ -133,17 +133,22 @@ impl Worker { } impl<'a> WorkerMethods for JSRef<'a, Worker> { - fn PostMessage(self, cx: *mut JSContext, message: JSVal) { + fn PostMessage(self, cx: *mut JSContext, message: JSVal) -> ErrorResult { let mut data = ptr::null_mut(); let mut nbytes = 0; - unsafe { - assert!(JS_WriteStructuredClone(cx, message, &mut data, &mut nbytes, - ptr::null(), ptr::null_mut()) != 0); + let result = unsafe { + JS_WriteStructuredClone(cx, message, &mut data, &mut nbytes, + ptr::null(), ptr::null_mut()) + }; + if result == 0 { + unsafe { JS_ClearPendingException(cx); } + return Err(DataClone); } self.addref(); let ScriptChan(ref sender) = self.sender; sender.send(DOMMessage(data, nbytes)); + Ok(()) } fn GetOnmessage(self) -> Option<EventHandlerNonNull> { |