mirror of
https://github.com/servo/servo.git
synced 2025-08-04 21:20:23 +01:00
Store source as an enum
This commit is contained in:
parent
f8b61c0315
commit
cf46a9a6dc
1 changed files with 50 additions and 16 deletions
|
@ -6,7 +6,7 @@ use crate::dom::bindings::codegen::Bindings::EventBinding::EventMethods;
|
||||||
use crate::dom::bindings::codegen::Bindings::MessageEventBinding;
|
use crate::dom::bindings::codegen::Bindings::MessageEventBinding;
|
||||||
use crate::dom::bindings::codegen::Bindings::MessageEventBinding::MessageEventMethods;
|
use crate::dom::bindings::codegen::Bindings::MessageEventBinding::MessageEventMethods;
|
||||||
use crate::dom::bindings::codegen::UnionTypes::WindowProxyOrMessagePortOrServiceWorker;
|
use crate::dom::bindings::codegen::UnionTypes::WindowProxyOrMessagePortOrServiceWorker;
|
||||||
use crate::dom::bindings::error::{Error, Fallible};
|
use crate::dom::bindings::error::Fallible;
|
||||||
use crate::dom::bindings::inheritance::Castable;
|
use crate::dom::bindings::inheritance::Castable;
|
||||||
use crate::dom::bindings::reflector::reflect_dom_object;
|
use crate::dom::bindings::reflector::reflect_dom_object;
|
||||||
use crate::dom::bindings::root::{Dom, DomRoot};
|
use crate::dom::bindings::root::{Dom, DomRoot};
|
||||||
|
@ -17,6 +17,7 @@ use crate::dom::event::Event;
|
||||||
use crate::dom::eventtarget::EventTarget;
|
use crate::dom::eventtarget::EventTarget;
|
||||||
use crate::dom::globalscope::GlobalScope;
|
use crate::dom::globalscope::GlobalScope;
|
||||||
use crate::dom::messageport::MessagePort;
|
use crate::dom::messageport::MessagePort;
|
||||||
|
use crate::dom::serviceworker::ServiceWorker;
|
||||||
use crate::dom::windowproxy::WindowProxy;
|
use crate::dom::windowproxy::WindowProxy;
|
||||||
use crate::script_runtime::JSContext;
|
use crate::script_runtime::JSContext;
|
||||||
use dom_struct::dom_struct;
|
use dom_struct::dom_struct;
|
||||||
|
@ -25,13 +26,38 @@ use js::jsval::JSVal;
|
||||||
use js::rust::HandleValue;
|
use js::rust::HandleValue;
|
||||||
use servo_atoms::Atom;
|
use servo_atoms::Atom;
|
||||||
|
|
||||||
|
#[must_root]
|
||||||
|
#[derive(JSTraceable, MallocSizeOf)]
|
||||||
|
enum SrcObject {
|
||||||
|
WindowProxy(Dom<WindowProxy>),
|
||||||
|
MessagePort(Dom<MessagePort>),
|
||||||
|
ServiceWorker(Dom<ServiceWorker>),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<&WindowProxyOrMessagePortOrServiceWorker> for SrcObject {
|
||||||
|
#[allow(unrooted_must_root)]
|
||||||
|
fn from(src_object: &WindowProxyOrMessagePortOrServiceWorker) -> SrcObject {
|
||||||
|
match src_object {
|
||||||
|
WindowProxyOrMessagePortOrServiceWorker::WindowProxy(blob) => {
|
||||||
|
SrcObject::WindowProxy(Dom::from_ref(&*blob))
|
||||||
|
},
|
||||||
|
WindowProxyOrMessagePortOrServiceWorker::MessagePort(stream) => {
|
||||||
|
SrcObject::MessagePort(Dom::from_ref(&*stream))
|
||||||
|
},
|
||||||
|
WindowProxyOrMessagePortOrServiceWorker::ServiceWorker(stream) => {
|
||||||
|
SrcObject::ServiceWorker(Dom::from_ref(&*stream))
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[dom_struct]
|
#[dom_struct]
|
||||||
pub struct MessageEvent {
|
pub struct MessageEvent {
|
||||||
event: Event,
|
event: Event,
|
||||||
#[ignore_malloc_size_of = "mozjs"]
|
#[ignore_malloc_size_of = "mozjs"]
|
||||||
data: Heap<JSVal>,
|
data: Heap<JSVal>,
|
||||||
origin: DOMString,
|
origin: DOMString,
|
||||||
source: Option<Dom<WindowProxy>>,
|
source: Option<SrcObject>,
|
||||||
lastEventId: DOMString,
|
lastEventId: DOMString,
|
||||||
ports: Vec<DomRoot<MessagePort>>,
|
ports: Vec<DomRoot<MessagePort>>,
|
||||||
}
|
}
|
||||||
|
@ -52,14 +78,14 @@ impl MessageEvent {
|
||||||
global: &GlobalScope,
|
global: &GlobalScope,
|
||||||
data: HandleValue,
|
data: HandleValue,
|
||||||
origin: DOMString,
|
origin: DOMString,
|
||||||
source: Option<&WindowProxy>,
|
source: Option<&WindowProxyOrMessagePortOrServiceWorker>,
|
||||||
lastEventId: DOMString,
|
lastEventId: DOMString,
|
||||||
ports: Vec<DomRoot<MessagePort>>,
|
ports: Vec<DomRoot<MessagePort>>,
|
||||||
) -> DomRoot<MessageEvent> {
|
) -> DomRoot<MessageEvent> {
|
||||||
let ev = Box::new(MessageEvent {
|
let ev = Box::new(MessageEvent {
|
||||||
event: Event::new_inherited(),
|
event: Event::new_inherited(),
|
||||||
data: Heap::default(),
|
data: Heap::default(),
|
||||||
source: source.map(Dom::from_ref),
|
source: source.map(|source| source.into()),
|
||||||
origin,
|
origin,
|
||||||
lastEventId,
|
lastEventId,
|
||||||
ports,
|
ports,
|
||||||
|
@ -77,7 +103,7 @@ impl MessageEvent {
|
||||||
cancelable: bool,
|
cancelable: bool,
|
||||||
data: HandleValue,
|
data: HandleValue,
|
||||||
origin: DOMString,
|
origin: DOMString,
|
||||||
source: Option<&WindowProxy>,
|
source: Option<&WindowProxyOrMessagePortOrServiceWorker>,
|
||||||
lastEventId: DOMString,
|
lastEventId: DOMString,
|
||||||
ports: Vec<DomRoot<MessagePort>>,
|
ports: Vec<DomRoot<MessagePort>>,
|
||||||
) -> DomRoot<MessageEvent> {
|
) -> DomRoot<MessageEvent> {
|
||||||
|
@ -94,11 +120,6 @@ impl MessageEvent {
|
||||||
type_: DOMString,
|
type_: DOMString,
|
||||||
init: RootedTraceableBox<MessageEventBinding::MessageEventInit>,
|
init: RootedTraceableBox<MessageEventBinding::MessageEventInit>,
|
||||||
) -> Fallible<DomRoot<MessageEvent>> {
|
) -> Fallible<DomRoot<MessageEvent>> {
|
||||||
let source = match &init.source {
|
|
||||||
Some(WindowProxyOrMessagePortOrServiceWorker::WindowProxy(i)) => Some(i),
|
|
||||||
None => None,
|
|
||||||
_ => return Err(Error::NotSupported)
|
|
||||||
};
|
|
||||||
let ev = MessageEvent::new(
|
let ev = MessageEvent::new(
|
||||||
global,
|
global,
|
||||||
Atom::from(type_),
|
Atom::from(type_),
|
||||||
|
@ -106,7 +127,7 @@ impl MessageEvent {
|
||||||
init.parent.cancelable,
|
init.parent.cancelable,
|
||||||
init.data.handle(),
|
init.data.handle(),
|
||||||
init.origin.clone(),
|
init.origin.clone(),
|
||||||
source.map(|source| &**source),
|
init.source.as_ref(),
|
||||||
init.lastEventId.clone(),
|
init.lastEventId.clone(),
|
||||||
init.ports.clone(),
|
init.ports.clone(),
|
||||||
);
|
);
|
||||||
|
@ -130,7 +151,11 @@ impl MessageEvent {
|
||||||
false,
|
false,
|
||||||
message,
|
message,
|
||||||
DOMString::from(origin.unwrap_or("")),
|
DOMString::from(origin.unwrap_or("")),
|
||||||
source,
|
source
|
||||||
|
.map(|source| {
|
||||||
|
WindowProxyOrMessagePortOrServiceWorker::WindowProxy(DomRoot::from_ref(source))
|
||||||
|
})
|
||||||
|
.as_ref(),
|
||||||
DOMString::new(),
|
DOMString::new(),
|
||||||
ports,
|
ports,
|
||||||
);
|
);
|
||||||
|
@ -146,7 +171,7 @@ impl MessageEvent {
|
||||||
init.parent.cancelable,
|
init.parent.cancelable,
|
||||||
init.data.handle(),
|
init.data.handle(),
|
||||||
init.origin.clone(),
|
init.origin.clone(),
|
||||||
None,
|
init.source.as_ref(),
|
||||||
init.lastEventId.clone(),
|
init.lastEventId.clone(),
|
||||||
init.ports.clone(),
|
init.ports.clone(),
|
||||||
);
|
);
|
||||||
|
@ -167,9 +192,18 @@ impl MessageEventMethods for MessageEvent {
|
||||||
|
|
||||||
// https://html.spec.whatwg.org/multipage/#dom-messageevent-source
|
// https://html.spec.whatwg.org/multipage/#dom-messageevent-source
|
||||||
fn GetSource(&self) -> Option<WindowProxyOrMessagePortOrServiceWorker> {
|
fn GetSource(&self) -> Option<WindowProxyOrMessagePortOrServiceWorker> {
|
||||||
self.source
|
match &self.source {
|
||||||
.as_ref()
|
Some(SrcObject::WindowProxy(i)) => Some(
|
||||||
.and_then(|source| Some(WindowProxyOrMessagePortOrServiceWorker::WindowProxy(DomRoot::from_ref(source))))
|
WindowProxyOrMessagePortOrServiceWorker::WindowProxy(DomRoot::from_ref(&*i)),
|
||||||
|
),
|
||||||
|
Some(SrcObject::MessagePort(i)) => Some(
|
||||||
|
WindowProxyOrMessagePortOrServiceWorker::MessagePort(DomRoot::from_ref(&*i)),
|
||||||
|
),
|
||||||
|
Some(SrcObject::ServiceWorker(i)) => Some(
|
||||||
|
WindowProxyOrMessagePortOrServiceWorker::ServiceWorker(DomRoot::from_ref(&*i)),
|
||||||
|
),
|
||||||
|
None => None,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <https://html.spec.whatwg.org/multipage/#dom-messageevent-lasteventid>
|
/// <https://html.spec.whatwg.org/multipage/#dom-messageevent-lasteventid>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue