Here are my meeting notes from all three days of the meeting.
Waldemar
SES meeting Jan 27 2009:
ES3.1 opens up the possibility of exposing protected objects to unprotected
code and have the protected objects stay safe. Maybe not: toSource, watch (to
set watchpoints on properties), Mozilla's two-argument eval, debugging
interfaces, ES3.1 code deliberately causing a stack overflow in a specific
place in secure code, ...?
If foo is a function stored into myProtectedObject, myProtectedObject.foo(args)
can leak myProtectedObject to foo. Fixes:
1. (true && myProtectedObject.foo)(args)
2. Wrap foo when storing it into a property of myProtectedObject
Lots of practical security trouble caused by called methods re-entering the
calling object, doing recursive calls.
ES3.1 Object.getOwnProperties can enumerate all properties, including
non-enumerable ones. This may allow blacklisting runtimes to delete properties
they don't know about, as long as they're deletable.
Allen: Things will stay confusing unless we define the behavior of multiple
global objects and how objects interact between them.
The trouble with proxies: We can write a proxy for some of the things that
JavaScript does, but proxying the proxy itself is problematic. The analogue to
microprocessor instruction set virtualization breaks down because for
microprocessors there is a clear boundary between instructions and software:
emulating all supervisor instructions is sufficient, with libraries running
virtualized. With JavaScript the DOM would not be running virtualized, and
it's problematic to locate all places where property lookups could show through.
Proxying a property with a getter/setter pair -> need to resolve the problem of
someone setting an expando in a derived object (behavior differs for setters) -> need
to resolve the problem of someone calling getOwnProperty, hasProperty, for-in, etc.
-> ...
W3C: Need to work with W3C to make the DOM secure.
All DOM nodes are connected via parents to document root, which then allows
access to the network.
Style sheets are in a single global namespace -- problem for ads, mashups. Can
use iframes, but want some inheritance for backgrounds and such.
Desirables:
- A frame-like thing within a document that comes from the source
- Modifications in the way events bubble
- Looking up elements by id in a subtree (but may also need to exclude
virtualized subtrees to avoid inadvertent or deliberate id collisions)
- Impact of the DOM model on Caja-like isolation
- Feeling of the DOM being too complicated (of course, discussing such generic
feeling won't go anywhere)
Adoption Agency algorithm:
<b><i>foo</b>bar</i> -> <b><i>foo</i></b><i>bar</i>
Problem is that it can clone unique id's:
<b><i id=100>foo</b>bar</i> -> <b><i id=100>foo</i></b><i id=100>bar</i>
Clever history attack that works even on DOMs that masquerade programmatic
queries to visited links as though they were non-visited:
Set the height of visited links to 100; then query the position of some element
after the link to see how high on the page the browser layout put it.
HTML names and id's are reflected as properties of the global object (but won't
shadow existing globals).
Microsoft Web Sandbox: websandbox.livelabs.com: ~300K of JavaScript source
for the sandbox, ~28K compressed minimized, almost all of which is policy rules
and emulators on DOM calls and such. Apache open source.
TC39 meeting Wed Jan 28 2009:
John and Allen want a flag date to issue s press release about a candidate
spec. Change control may be locked down after that?
Waldemar: ECMA should not be the editor. Changes need to be made by a
technically savvy editor.
Waldemar's concern: document has been evolving too quickly, and each time he reviews
the document he needs to re-read the whole thing which takes a long time. Proposed
two levels of change bars after a settle-down date, with changes from ES3 ->
settle-down date tracked with a different color from changes settle-down date ->
head revision.
New schedule:
March 1st: proposed candidate specification
sometome between March and May: Candidate specification
Web testing through July
Wording/typo/etc. fixing through September
Submitted to December GA
Need to remove ToObject from base when making references:
function foo() {return this} (in strict mode)
foo.call(3) -> returns a primitive (i.e. non-wrapped) 3
String.prototype.foo = foo
"bar".foo() -> needs to return a primitive too
Question: what if the function does:
function foo() {this.x = 5}
Answer: in non-strict mode, works as before. In strict mode, throws an
exception due to an attempt to set a property on a primitive.
Use a ::: instead of : grammar to describe use directive syntax in chapter 14.
There are other examples of such usage in chapter 15 that can be used as a
guideline. Also should describe white space using the lexar grammar, not the
syntactic grammar.
[[Class]] == "String", "Date", "RegExp", "Array", "Function", ...
Need [[IsArray]]? Is [[Class]] trustworthy?
Should we enforce constraints on host objects of these classes?
Strawman: Host objects should only be able to do what native objects can do --
doesn't work for host functions that can access data outside the ECMAScript
environment.
Many of the invariants are enforced by native constructors' behavior, not by
constraints on native objects.
Proposal:
+ Change instances of "is an Array object" to "[[Class]] is "Array"", etc.
+ Write specifications on invariants that host objects must ssatisfy in order
to use one of the above [[Class]] values. Who will do it?
Dealing with multiple global objects: Informative annex to 3.1? A Technical
Report would be more appropriate.
Should bind curry over [[Construct]]?
- Agreed to use option 2 from Allen's list: bind will curry over [[Call]] and
[[Construct]]. The bound closure will not have a prototype property --
[[Construct]] will use the prototype of the original function just as it
normally would.
Should bind result in a frozen function?
- Agreed that bind does not result in a frozen function.
When is eval direct? Strict?
- Agreed to keep the current two conditions of a direct call named "eval" and
the function actually evaluating to the built-in eval function.
- Agreed to disallow the use of "eval" as the name of a local variable,
function parameter, etc. in strict mode.
- Agreed that indirect eval is strict if and only if the eval'd string starts
with a use strict directive. Direct eval is strict if the calling context is
strict or ir the eval'd string starts with a use strict directive.
- Agreed that indirect eval calls will use their own little private scope for
newly introduced bindings in strict mode (as determined by whether the eval'd
string starts with a use directive), even if they're called at the global level.
Should apply be specified like an array generic?
- Agreed that it should be generic. This will also make it explicit what
happens if there are holes in an array.
Should numerically named properties of strings be enumerable?
- Yes.
Parse time error reporting ("strict")
- "detection does not require program execution" is too vague. Agreed to retain the
"must" as long as individual cases are listed instead of "detection does not require program
execution".
Regexp lookahead
- Rejected the ticket. Rejecting quantifiers syntactically would be a breaking
change and make grammar syntax more complicated. There is a use for
quantifiers after lookaheads -- executing a quantifier zero times is different
from executing it once, and the differences can be observed via capturing
parentheses.
Name properties of getter/setter functions defined in object literals.
- Property values for function <name> are "get <name>", "set <name>", "bind
<name>". They do not show up on the scope chain.
Multiline comments:
break/*
*/foo;
See http://bugs.ecmascript.org/ticket/414
- Agreed to retain the specified ECMAScript behavior: a multiline comment
counts as if it were a line terminator.
11.1.4: Replace [[Put]] of length with DefineOwnProperty. Generic array
algorithms will continue to be done using [[Get]] and [[Put]] (this is
important for folks who define length properties as getter-setter pairs).
JSON throws a SyntaxError when it detects a problem with the input. This is
the first instance of throwing a SyntaxError based on what's typically user
input data. Suggestions were made for using a FormatError or JSONError.
Reluctantly we decided to keep SyntaxError, mainly due to compatibility with
existing JSON libraries. This means that users who catch SyntaxErrors hoping
to catch JSON errors will catch things that are not user data errors as well
if, for example, the ECMAScript program constructs faulty regular expressions
or eval's code with syntax errors.
What causes the arguments object to get un-joined with local argument variables?
- Allen's current approach (changing enumerability or configurability doesn't
matter, changing value breaks joining) seems like the right approach.
- Agreed that in strict mode there is no joining of arguments objects to local
variables.
- Agreed that arguments objects are *not* frozen in strict mode. There are
important use cases for mutating them, such as stripping off initial arguments
using shift and passing the rest to another function.
TC39 meeting Thu Jan 29 2009:
Trying to make a liaison with W3C. Lawyers complaining about intellectual
property requirements mismatch -- royalty-free (W3C) vs. rand (ECMA). The
intersection of these is royalty-free. There is precedent for doing this in
ECMA -- Microsoft made a rand-z (zero royalty) commitment for their C# work in
ECMA.
W3C interested in colocating an ECMA TC39 meeting with their large meeting in
Santa Clara in early November.
Sam Ruby is the co-chair of the HTML Working Group.
There is a W3C group working on an ECMAScript binding for the DOM (WebAPI
Working Group).
We scheduled the rest of the 2009 meeting dates:
Mar 24-26 Yahoo, Sunnyvale CA
May 27-29 Mozilla, Mountain View CA
Jul 28-30 Microsoft, Redmond WA
Sep 15-17 bay area
Nov 3-5 Santa Clara CA, colocated with W3C
Pratap demoed a modified IE8 implementation of a number of ES3.1 features:
bind, attribute reflection, and a preliminary strict mode. He also has about
200 tests; the intent is to make these available. There was much rejoicing
among the natives.
Ihab and Kris's module system strawman presentation (see documents Ihab sent
out). Interesting proposal. Provoked much debate:
- HATE is all we need?
- Module identifier issues: If these are executable, they can cause trouble.
On the other hand, don't want to limit their expressivity.
- The claim that the loader can be left unspecified is unsafe. This can enable
cookie-stealing and other nefarious activities.
- Hermetic eval slide issues: If you don't verify the syntax of the eval'd
code, it can jump out of the boilerplate opening parentheses and then return
something that closes over its own state. Two invocations of the resulting
function could then talk to each other.
- Primordial environment issue: If hermetic eval provides its own definitions
of Array, etc., how does instanceof behave when communicating with hermetic
eval'd code? Having differing notions of arrayness causes all kinds of trouble
in practice.
- Cannot intern modules if there is no equality defined on module names. Would
be easy if they were constrained to be strings, but Kris doesn't want to
constrain them to such. The other possible test is the object identity test,
but that's impractical to use and leads to exploitable loaders.
- Don't want to have sugar for module names as identifiers because that would
encourage short module names which would collide.
- Why have different mechanisms for getting definitions from the environment
and from imported modules? Why not make everything into a module? Part of the
argument for separating them is that modules are compute-only and cannot do
i/o, but we may also have prepopulated modules that do have i/o capabilities.
The argument against separating them is that it makes versioning of things in
the environment hard; implementations may wish to use external modules to
replace environment functionality on older browsers that don't have the
functionality built-in to the environment. Currently this is done via
monkey-patching, which is not possible here.
- The usual disapproval of "with" in the export salt.
- Recursive dependencies between modules? The beget approach was proposed, but
it allows partially set up modules to leak through by examining the prototype.
If module A imports B which then imports A, then B will unknowingly see a
partial A and, if it's malicious, can modify some of its exports (via
prototypes) since they aren't frozen yet.
- Good to see catch-all imports gone from the proposal.
- Stage separation issues (macro or type system example). See PLT Scheme for
Mark's favorite solution to such issues.
- Related to that: prefetching modules -- fetching a module over the net
asynchronously, without waiting for the import function to complete before
continuing with other things.
- How many hermetic eval variants do we need? They all need to verity that the
value is in fact a function, not, say, an expression that closes over a
function. We also may need options to provide either the existing primordial
environment (to load modules into an existing one), a completely fresh
primordial set (with only built-in global objects), or a fresh set of frozen
primordials (same as before but can be safely shared between different modules).
- Need IPR release from Kris to consider his work in any ECMA committee.
ES3.1 10.4.1.1 currently states that "this" at the top level in strict mode is undefined,
not the global object. This prevents people from portably referring to the global object, other
than through a DOM binding. Agreed to revert it so that "this" refers to the global
object at the top level.
Decimal in Harmony: Wrappers or no wrappers? Remain in agreement that
wrappers are needed for consistency with ES3.1, as long as Number continues to
have wrappers.
Mark wants general operator overloading instead of adding Decimal as a one-off.
Brendan: decimal semantics are needed anyway, as per one of the most-reported
Mozilla bugs. Some kind of exact symbolic arithmetic mode is likely
impractical. Also, Mark's proposal does not allow overriding ===, but Decimal
needs nonstandard semantics for ===.
Operator overloading use case: Package A defines complex. Package B defines
rational. Package C wants to use both A and B, but neither one knows how to do
== with respect to the other.
Now suppose A wants to upgrade his complex library to define the heterogeneous
comples == rational operator, but does not want to pull in package B unless the
ultimate client C uses it. Without pulling in package B, package A cannot do
an instanceof test to detect rational numbers.
To solve the above, we'd want time-reversed weak references. Traditional weak
references point to an object for a while but might turn empty if the object is
garbage-collected. Time-reversed weak references are born empty but might
become an object (such as the Rational type) if it is ever interned (brought
into the system).
Unusual Decimal proposal: have numeric constants evaluate to Decimal instead of Number
(where "Number" means the existing binary floating point). Arithmetic
contagion of Numer and Decimal is towards Number [sic]. Conversion of strings to numbers
produces Decimal. Transcendental functions, π, etc. produce Numbers. Might be
problematic for those who use 1e400 to represent infinity.
Adjourned.
_______________________________________________
Es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss