1
edit
(removed __callableByContent__ property, since we're not enforcing it anymore) |
m (__exposedProps__ should use colon, not equal sign) |
||
(3 intermediate revisions by one other user not shown) | |||
Line 39: | Line 39: | ||
=== COWing Objects === | === COWing Objects === | ||
By default, Chrome objects passed into content space are completely opaque: no information can be accessed from them, and no properties can be defined on them. | By default, non-function Chrome objects passed into content space are completely opaque: no information can be accessed from them, and no properties can be defined on them. | ||
When a non-writable property is written to, a security exception will be raised. However, when a non-readable property is accessed, its value is <tt>undefined</tt>: a security exception isn't thrown because we don't want to break code that relies on [http://en.wikipedia.org/wiki/Duck_typing duck typing]. | |||
To bypass this default behavior, individual properties can be exposed by defining a <tt>__exposedProps__</tt> property on the object, like so: | |||
<pre class="brush:js;"> | <pre class="brush:js;"> | ||
Line 49: | Line 49: | ||
var MyObj = { | var MyObj = { | ||
__exposedProps__ | __exposedProps__: {foo: "r", bar: "rw"}, | ||
foo: function foo(obj) { | foo: function foo(obj) { | ||
Line 59: | Line 59: | ||
baz: "I am protected information" | baz: "I am protected information" | ||
} | } | ||
</pre> | </pre> | ||
In the above example, <tt>MyObj.foo()</tt> can be accessed but not assigned to | In the above example, <tt>MyObj.foo()</tt> can be accessed but not assigned to, <tt>foo()</tt> itself is callable from content, and <tt>MyObj.bar</tt> is both readable and writable, while <tt>MyObj.baz</tt> can't be accessed at all. | ||
All properties that are exposed to content are enumerable by content as well. | All properties that are exposed to content are enumerable by content as well. | ||
Getters and setters on exposed properties are automatically called as necessary. | |||
If an exposed property is writable by content, it is deletable by content as well. | |||
'''TODO:''' | '''TODO:''' What should the default <tt>toString()</tt> method of a COW'ed object with no metadata yield? | ||
'''TODO:''' Discuss what to do with native objects that get exposed (like the Sidebar object). | '''TODO:''' Discuss what to do with native objects that get exposed (like the Sidebar object). |
edit