874
edits
(removed __callableByContent__ property, since we're not enforcing it anymore) |
(revised to reflect the current COW spec) |
||
| 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-readable property is accessed, its value is <tt>undefined</tt>. A security exception is not thrown in this case, as we don't want to break code that relies on [http://en.wikipedia.org/wiki/Duck_typing duck typing]. | |||
However, when a non-writable property is written to, a security exception will be raised. | |||
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 64: | Line 66: | ||
In the above example, <tt>MyObj.foo()</tt> can be accessed but not assigned to—and <tt>foo()</tt> itself is callable from content, since <tt>__callableByContent__</tt> is set—and <tt>MyObj.bar</tt> is both readable and writable, while <tt>MyObj.baz</tt> can't be accessed at all. | In the above example, <tt>MyObj.foo()</tt> can be accessed but not assigned to—and <tt>foo()</tt> itself is callable from content, since <tt>__callableByContent__</tt> is set—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). | ||
edits