Skip to content

Commit d61e128

Browse files
committed
tmp
1 parent 43318e9 commit d61e128

File tree

7 files changed

+106
-82
lines changed

7 files changed

+106
-82
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

components/script/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ metrics = {path = "../metrics"}
6565
mitochondria = "1.1.2"
6666
mime = "0.2.1"
6767
mime_guess = "1.8.0"
68+
mozjs_sys = "*"
6869
mozjs = "0.9.0"
6970
msg = {path = "../msg"}
7071
net_traits = {path = "../net_traits"}

components/script/dom/bindings/codegen/CodegenRust.py

Lines changed: 12 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2920,6 +2920,14 @@ def definition_body(self):
29202920
%s;
29212921
assert!(!prototype_proto.is_null());""" % getPrototypeProto)]
29222922

2923+
if self.descriptor.hasNamedPropertiesObject():
2924+
assert self.descriptor.isGlobal()
2925+
assert not self.haveUnscopables
2926+
code.append(CGGeneric("""\
2927+
rooted!(in(cx) let mut prototype_proto_proto = prototype_proto.get());
2928+
dom::types::%s::create_named_properties_object(cx, prototype_proto_proto.handle(), prototype_proto.handle_mut());
2929+
assert!(!prototype_proto.is_null());""" % name))
2930+
29232931
properties = {
29242932
"id": name,
29252933
"unscopables": "unscopable_names" if self.haveUnscopables else "&[]"
@@ -2948,14 +2956,7 @@ def definition_body(self):
29482956
rooted!(in(cx) let mut prototype = ptr::null_mut::<JSObject>());
29492957
"""))
29502958

2951-
if self.descriptor.hasNamedPropertiesObject():
2952-
assert self.descriptor.isGlobal()
2953-
assert not self.haveUnscopables
2954-
code.append(CGGeneric("""
2955-
dom::types::%s::CreateNamedPropertiesObject(cx, prototype.handle_mut());
2956-
""" % name))
2957-
else:
2958-
code.append(CGGeneric("""
2959+
code.append(CGGeneric("""
29592960
create_interface_prototype_object(cx,
29602961
prototype_proto.handle().into(),
29612962
&PrototypeClass,
@@ -5012,9 +5013,7 @@ def getBody(self):
50125013
attrs = "JSPROP_ENUMERATE"
50135014
if self.descriptor.operations['IndexedSetter'] is None:
50145015
attrs += " | JSPROP_READONLY"
5015-
# FIXME(#11868) Should assign to desc.value, desc.get() is a copy.
5016-
fillDescriptor = ("desc.get().value = result_root.get();\n"
5017-
"fill_property_descriptor(MutableHandle::from_raw(desc), proxy.get(), (%s) as u32);\n"
5016+
fillDescriptor = ("fill_property_descriptor(MutableHandle::from_raw(desc), proxy.get(), result_root.get(), (%s) as u32);\n"
50185017
"return true;" % attrs)
50195018
templateValues = {
50205019
'jsvalRef': 'result_root.handle_mut()',
@@ -5037,9 +5036,7 @@ def getBody(self):
50375036
attrs = " | ".join(attrs)
50385037
else:
50395038
attrs = "0"
5040-
# FIXME(#11868) Should assign to desc.value, desc.get() is a copy.
5041-
fillDescriptor = ("desc.get().value = result_root.get();\n"
5042-
"fill_property_descriptor(MutableHandle::from_raw(desc), proxy.get(), (%s) as u32);\n"
5039+
fillDescriptor = ("fill_property_descriptor(MutableHandle::from_raw(desc), proxy.get(), result_root.get(), (%s) as u32);\n"
50435040
"return true;" % attrs)
50445041
templateValues = {
50455042
'jsvalRef': 'result_root.handle_mut()',
@@ -5660,7 +5657,7 @@ def members():
56605657
rettype = "ErrorResult"
56615658
yield name, attribute_arguments(typeNeedsCx(m.type, False), m.type), rettype
56625659

5663-
if descriptor.proxy or descriptor.hasNamedPropertiesObject():
5660+
if descriptor.proxy:
56645661
for name, operation in descriptor.operations.iteritems():
56655662
if not operation or operation.isStringifier():
56665663
continue
@@ -5696,11 +5693,6 @@ def contains_unsafe_arg(arguments):
56965693

56975694
methods = []
56985695

5699-
if descriptor.hasNamedPropertiesObject():
5700-
methods.append(CGGeneric("""
5701-
unsafe fn CreateNamedPropertiesObject(cx: *mut JSContext, proto: MutableHandleObject);
5702-
"""))
5703-
57045696
for name, arguments, rettype in members():
57055697
arguments = list(arguments)
57065698
methods.append(CGGeneric("%sfn %s(&self%s) -> %s;\n" % (

components/script/dom/bindings/proxyhandler.rs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
use dom::bindings::conversions::is_dom_proxy;
1010
use dom::bindings::utils::delete_property_by_id;
11+
use js_sys::jsgc::{IntoHandle, IntoMutableHandle};
1112
use js::glue::{GetProxyHandler, GetProxyHandlerFamily};
1213
use js::glue::{GetProxyPrivate, SetProxyPrivate};
1314
use js::glue::InvokeGetOwnPropertyDescriptor;
@@ -20,9 +21,11 @@ use js::jsapi::HandleId as RawHandleId;
2021
use js::jsapi::HandleObject as RawHandleObject;
2122
use js::jsapi::JS_DefinePropertyById;
2223
use js::jsapi::JS_GetPropertyDescriptorById;
24+
use js::jsapi::JS_HasPropertyById;
2325
use js::jsapi::MutableHandle as RawMutableHandle;
2426
use js::jsapi::MutableHandleObject as RawMutableHandleObject;
2527
use js::jsapi::ObjectOpResult;
28+
use js::jsval::JSVal;
2629
use js::jsval::ObjectValue;
2730
use js::jsval::UndefinedValue;
2831
use js::rust::{Handle, HandleObject, MutableHandle, MutableHandleObject};
@@ -198,10 +201,32 @@ pub unsafe fn ensure_expando_object(
198201
pub fn fill_property_descriptor(
199202
mut desc: MutableHandle<PropertyDescriptor>,
200203
obj: *mut JSObject,
204+
v: JSVal,
201205
attrs: u32,
202206
) {
203207
desc.obj = obj;
208+
desc.value = v;
204209
desc.attrs = attrs;
205210
desc.getter = None;
206211
desc.setter = None;
207212
}
213+
214+
pub unsafe fn has_property_on_prototype(
215+
cx: *mut JSContext,
216+
proxy: HandleObject,
217+
id: RawHandleId,
218+
) -> Result<bool, ()> {
219+
rooted!(in(cx) let mut proto = ptr::null_mut());
220+
if !GetObjectProto(cx, proxy.into_handle(), proto.handle_mut().into_handle_mut()) {
221+
return Err(());
222+
}
223+
if proto.is_null() {
224+
return Ok(false);
225+
}
226+
let mut has = false;
227+
if JS_HasPropertyById(cx, proto.handle().into_handle(), id, &mut has) {
228+
Ok(has)
229+
} else {
230+
Err(())
231+
}
232+
}

components/script/dom/window.rs

Lines changed: 64 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -63,13 +63,12 @@ use ipc_channel::ipc::IpcSender;
6363
use ipc_channel::router::ROUTER;
6464
use js::jsapi::JSAutoCompartment;
6565
use js::jsapi::JSContext;
66-
use js::jsval::JSObject;
66+
use js::jsapi::JSObject;
6767
use js::jsapi::JSPROP_ENUMERATE;
68-
use js::jsapi::JS_GetRuntime;
6968
use js::jsapi::JS_GC;
7069
use js::jsval::JSVal;
7170
use js::jsval::UndefinedValue;
72-
use js::rust::HandleValue;
71+
use js::rust::{HandleValue, HandleObject, MutableHandleObject};
7372
use js::rust::wrappers::JS_DefineProperty;
7473
use layout_image::fetch_image_for_layout;
7574
use libc;
@@ -136,6 +135,7 @@ use task_source::websocket::WebsocketTaskSource;
136135
use time;
137136
use timers::{IsInterval, TimerCallback};
138137
use url::Position;
138+
use window_named_properties;
139139
use webdriver_handlers::jsval_to_webdriver;
140140
use webrender_api::{ExternalScrollId, DeviceIntPoint, DeviceUintSize, DocumentId};
141141
use webvr_traits::WebVRMsg;
@@ -1005,63 +1005,6 @@ impl WindowMethods for Window {
10051005
)
10061006
}
10071007

1008-
// https://heycam.github.io/webidl/#named-properties-object
1009-
// https://html.spec.whatwg.org/multipage/#named-access-on-the-window-object
1010-
#[allow(unsafe_code)]
1011-
unsafe fn CreateNamedPropertiesObject(_cx: *mut JSContext, _proto: MutableHandleObject) {
1012-
unimplemented!("Wow!")
1013-
}
1014-
1015-
// https://html.spec.whatwg.org/multipage/#named-access-on-the-window-object
1016-
fn SupportedPropertyNames(&self) -> Vec<DOMString> {
1017-
// FIXME: unimplemented (https://github.com/servo/servo/issues/7273).
1018-
//
1019-
// See also Document::SupportedPropertyNames.
1020-
vec![]
1021-
}
1022-
1023-
#[allow(unsafe_code)]
1024-
// https://html.spec.whatwg.org/multipage/#named-access-on-the-window-object
1025-
unsafe fn NamedGetter(
1026-
&self,
1027-
cx: *mut JSContext,
1028-
name: DOMString,
1029-
) -> Option<NonNull<JSObject>> {
1030-
// TODO: Return child windows, like iframes and such. When this is
1031-
// fixed, please implement IndexedGetter properly too.
1032-
let document = self.Document();
1033-
if !document.is_html_document() {
1034-
return None;
1035-
}
1036-
1037-
// TODO(emilio): There is a missing fast-path here for when we know
1038-
// there aren't any named items with a given `name`. In that case, we
1039-
// can return `document.get_element_by_id(name)` (unless there are many
1040-
// of those elements), which is much faster.
1041-
let name = Atom::from(name);
1042-
1043-
let filter = WindowNamedGetterFilter { name };
1044-
1045-
let root = document.upcast();
1046-
{
1047-
let mut named_elements = document.upcast::<Node>()
1048-
.traverse_preorder()
1049-
.filter_map(DomRoot::downcast::<Element>)
1050-
.filter(|element| filter.filter(&element, &root));
1051-
1052-
let first_element = named_elements.next()?;
1053-
if named_elements.next().is_none() {
1054-
return Some(NonNull::new_unchecked(
1055-
first_element.reflector().get_jsobject().get()
1056-
));
1057-
}
1058-
}
1059-
1060-
let collection =
1061-
HTMLCollection::create(self, root, Box::new(filter));
1062-
Some(NonNull::new_unchecked(collection.reflector().get_jsobject().get()))
1063-
}
1064-
10651008
// https://drafts.csswg.org/cssom-view/#dom-window-innerheight
10661009
//TODO Include Scrollbar
10671010
fn InnerHeight(&self) -> i32 {
@@ -1270,6 +1213,67 @@ impl WindowMethods for Window {
12701213
}
12711214

12721215
impl Window {
1216+
// https://html.spec.whatwg.org/multipage/#named-access-on-the-window-object
1217+
fn SupportedPropertyNames(&self) -> Vec<DOMString> {
1218+
// FIXME: unimplemented (https://github.com/servo/servo/issues/7273).
1219+
//
1220+
// See also Document::SupportedPropertyNames.
1221+
vec![]
1222+
}
1223+
1224+
#[allow(unsafe_code)]
1225+
// https://html.spec.whatwg.org/multipage/#named-access-on-the-window-object
1226+
pub unsafe fn NamedGetter(
1227+
&self,
1228+
cx: *mut JSContext,
1229+
name: DOMString,
1230+
) -> Option<NonNull<JSObject>> {
1231+
// TODO: Return child windows, like iframes and such. When this is
1232+
// fixed, please implement IndexedGetter properly too.
1233+
let document = self.Document();
1234+
if !document.is_html_document() {
1235+
return None;
1236+
}
1237+
1238+
// TODO(emilio): There is a missing fast-path here for when we know
1239+
// there aren't any named items with a given `name`. In that case, we
1240+
// can return `document.get_element_by_id(name)` (unless there are many
1241+
// of those elements), which is much faster.
1242+
let name = Atom::from(name);
1243+
1244+
let filter = WindowNamedGetterFilter { name };
1245+
1246+
let root = document.upcast();
1247+
{
1248+
let mut named_elements = document.upcast::<Node>()
1249+
.traverse_preorder()
1250+
.filter_map(DomRoot::downcast::<Element>)
1251+
.filter(|element| filter.filter(&element, &root));
1252+
1253+
let first_element = named_elements.next()?;
1254+
if named_elements.next().is_none() {
1255+
return Some(NonNull::new_unchecked(
1256+
first_element.reflector().get_jsobject().get()
1257+
));
1258+
}
1259+
}
1260+
1261+
let collection =
1262+
HTMLCollection::create(self, root, Box::new(filter));
1263+
Some(NonNull::new_unchecked(collection.reflector().get_jsobject().get()))
1264+
}
1265+
1266+
// https://heycam.github.io/webidl/#named-properties-object
1267+
// https://html.spec.whatwg.org/multipage/#named-access-on-the-window-object
1268+
#[allow(unsafe_code)]
1269+
pub unsafe fn create_named_properties_object(
1270+
cx: *mut JSContext,
1271+
proto: HandleObject,
1272+
object: MutableHandleObject
1273+
) {
1274+
window_named_properties::create(cx, proto, object)
1275+
}
1276+
12731277
// https://drafts.css-houdini.org/css-paint-api-1/#paint-worklet
12741278
pub fn paint_worklet(&self) -> DomRoot<Worklet> {
12751279
self.paint_worklet.or_init(|| self.new_paint_worklet())

components/script/dom/windowproxy.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -634,8 +634,7 @@ unsafe extern "C" fn getOwnPropertyDescriptor(
634634
if let Some((window, attrs)) = window {
635635
rooted!(in(cx) let mut val = UndefinedValue());
636636
window.to_jsval(cx, val.handle_mut());
637-
desc.value = val.get();
638-
fill_property_descriptor(MutableHandle::from_raw(desc), proxy.get(), attrs);
637+
fill_property_descriptor(MutableHandle::from_raw(desc), proxy.get(), val.get(), attrs);
639638
return true;
640639
}
641640

components/script/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ extern crate mime;
6868
extern crate mime_guess;
6969
extern crate mitochondria;
7070
extern crate mozangle;
71+
extern crate mozjs_sys as js_sys;
7172
#[macro_use]
7273
extern crate mozjs as js;
7374
extern crate msg;
@@ -139,6 +140,7 @@ pub mod textinput;
139140
mod timers;
140141
mod unpremultiplytable;
141142
mod webdriver_handlers;
143+
mod window_named_properties;
142144

143145
/// A module with everything layout can use from script.
144146
///

0 commit comments

Comments
 (0)