From ca82f4b6e74febc2502b90b2726a49b83f376a19 Mon Sep 17 00:00:00 2001 From: Sankha Narayan Guria Date: Tue, 29 Jul 2014 17:22:06 +0200 Subject: [PATCH] servo: Merge #2947 - Implement the delete proxy trap (fixes #2213); r=jdm (from Ms2ger:delete-trap) Source-Repo: https://github.com/servo/servo Source-Revision: 4da88f0ecc92149034f5bba70d5105f995693b1e --- .../dom/bindings/codegen/CodegenRust.py | 4 ++-- .../script/dom/bindings/proxyhandler.rs | 21 ++++++++++++++++++- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/servo/src/components/script/dom/bindings/codegen/CodegenRust.py b/servo/src/components/script/dom/bindings/codegen/CodegenRust.py index 52a689539555..84f978e8f8f5 100644 --- a/servo/src/components/script/dom/bindings/codegen/CodegenRust.py +++ b/servo/src/components/script/dom/bindings/codegen/CodegenRust.py @@ -2061,7 +2061,7 @@ let traps = ProxyTraps { getOwnPropertyDescriptor: Some(getOwnPropertyDescriptor), defineProperty: Some(defineProperty), getOwnPropertyNames: ptr::null(), - delete_: None, + delete_: Some(delete_), enumerate: ptr::null(), has: None, @@ -4541,7 +4541,7 @@ class CGBindingRoot(CGThing): 'dom::bindings::proxyhandler', 'dom::bindings::proxyhandler::{_obj_toString, defineProperty}', 'dom::bindings::proxyhandler::{FillPropertyDescriptor, GetExpandoObject}', - 'dom::bindings::proxyhandler::{getPropertyDescriptor}', + 'dom::bindings::proxyhandler::{delete_, getPropertyDescriptor}', 'dom::bindings::str::ByteString', 'page::JSPageInfo', 'libc', diff --git a/servo/src/components/script/dom/bindings/proxyhandler.rs b/servo/src/components/script/dom/bindings/proxyhandler.rs index 07d750e438e5..1a035a26eb20 100644 --- a/servo/src/components/script/dom/bindings/proxyhandler.rs +++ b/servo/src/components/script/dom/bindings/proxyhandler.rs @@ -10,7 +10,8 @@ use js::jsapi::{JS_GetPropertyDescriptorById, JS_NewUCString, JS_malloc, JS_free use js::jsapi::{JSBool, JS_DefinePropertyById, JS_NewObjectWithGivenProto}; use js::jsapi::{JS_ReportErrorFlagsAndNumber, JS_StrictPropertyStub}; use js::jsapi::{JSREPORT_WARNING, JSREPORT_STRICT, JSREPORT_STRICT_MODE_ERROR}; -use js::jsval::ObjectValue; +use js::jsapi::JS_DeletePropertyById2; +use js::jsval::{UndefinedValue, ObjectValue}; use js::glue::GetProxyExtra; use js::glue::{GetObjectProto, GetObjectParent, SetProxyExtra, GetProxyHandler}; use js::glue::InvokeGetOwnPropertyDescriptor; @@ -78,6 +79,24 @@ pub extern fn defineProperty(cx: *mut JSContext, proxy: *mut JSObject, id: jsid, defineProperty_(cx, proxy, id, desc) } +pub extern fn delete_(cx: *mut JSContext, proxy: *mut JSObject, id: jsid, + bp: *mut bool) -> JSBool { + unsafe { + let expando = EnsureExpandoObject(cx, proxy); + if expando.is_null() { + return 0; + } + + let mut value = UndefinedValue(); + if JS_DeletePropertyById2(cx, expando, id, &mut value) == 0 { + return 0; + } + + *bp = value.to_boolean(); + return 1; + } +} + pub fn _obj_toString(cx: *mut JSContext, className: *libc::c_char) -> *mut JSString { unsafe { let name = str::raw::from_c_str(className);