--- html5/webdatabase/Overview.html 2009/09/14 07:38:33 1.31 +++ html5/webdatabase/Overview.html 2010/08/09 23:13:10 1.91 @@ -1,4 +1,4 @@ -
Copyright - © 2009 W3C® (MIT, ERCIM, Keio), All Rights Reserved. W3C @@ -194,8 +204,10 @@ trademark and document use rules apply.
+ +This specification defines an API for storing data in databases - that can be queried using a variant of SQL.
This section describes the status of this document at the
+ that can be queried using a variant of SQL. This section describes the status of this document at the
time of its publication. Other documents may supersede this
document. A list of current W3C publications and the most recently
formally published revision of this technical report can be found in
@@ -210,7 +222,7 @@
archives),
- or submit them using our
+ or submit them using our
public bug database.
All feedback is welcome. Implementors should be aware that this specification is not
@@ -219,7 +231,16 @@
under them in incompatible ways. Vendors interested in
implementing this specification before it eventually reaches the
Candidate Recommendation stage should join the aforementioned
- mailing lists and take part in the discussions. The latest stable version of the editor's draft of this
+ mailing lists and take part in the discussions. This specification has reached an impasse: all
+ interested implementors have used the same SQL backend (Sqlite), but
+ we need multiple independent implementations to proceed along a
+ standardisation path. Until another implementor is interested in
+ implementing this spec, the description of the SQL dialect has been
+ left as simply a reference to Sqlite, which isn't acceptable for a
+ standard. Should you be an implementor interested in implementing an
+ independent SQL backend, please contact the editor so that he can
+ write a specification for the dialect, thus allowing this
+ specification to move forward. The latest stable version of the editor's draft of this
specification is always available on the W3C CVS
server. Change tracking for this document is available at the
following location: The W3C Web Apps
+ The W3C Web Applications
Working Group is the W3C working group responsible for this
specification's progress along the W3C Recommendation track.
- This specification is the 10 September 2009 First Public Working Draft.
-
+ This specification is the 9 August 2010 Editor's Draft.
This document was produced by a group operating under the 5
February 2004 W3C Patent Policy. W3C maintains a public list of
any patent disclosures made in connection with the deliverables
@@ -244,7 +264,7 @@
patent. An individual who has actual knowledge of a patent which the
individual believes contains Essential
Claim(s) must disclose the information in accordance with section
- 6 of the W3C Patent Policy. User agents may impose implementation-specific limits on
otherwise unconstrained inputs, e.g. to prevent denial of service
attacks, to guard against running out of memory, or to work around
- platform-specific limitations. This specification relies on several other underlying
- specifications. When support for a feature is disabled (e.g. as an emergency
+ measure to mitigate a security problem, or to aid in development, or
+ for performance reasons), user agents must act as if they had no
+ support for the feature whatsoever, and as if the feature was not
+ mentioned in this specification. For example, if a particular
+ feature is accessed via an attribute in a Web IDL interface, the
+ attribute itself would be omitted from the objects that implement
+ that interface — leaving the attribute on the object but
+ making it return null or throw an exception is insufficient. This specification relies on several other underlying
+ specifications. Many fundamental concepts from HTML5 are used by this
- specification. [HTML5] Many fundamental concepts from HTML are used by this
+ specification. [HTML] A DOM attribute is said to be getting when its value is
+ specifications. [DOMCORE] An IDL attribute is said to be getting when its value is
being retrieved (e.g. by author script), and is said to be
setting when a new value is assigned to it. The term "JavaScript" is used to refer to ECMA262, rather than
the official term ECMAScript, since the term JavaScript is more
@@ -445,6 +473,10 @@ interface Dat
If origin is not a scheme/host/port
+ tuple, then throw a If the database version provided is not the empty string,
and there is already a database with the given name from the origin
origin, but the database has a different
@@ -517,22 +549,22 @@ interface Dat
instead of the user agent prompting the user for permission to
increase the quota every five megabytes. When the user agent is to preprocess a SQL statement sqlStatement with an array of arguments arguments, it must run the following steps: Parse sqlStatement as a SQL statement,
- with the exception that U+003F QUESTION MARK (?) characters can be
+ with the exception that U+003F QUESTION MARK characters (?) can be
used in place of SQL literals in the statement. [SQL] Replace each Substitutions for Bind each Binding the The result is the statement. A future version of this specification will probably
define the exact SQL subset required in more detail. Otherwise: commit the transaction and run the postflight
- operation. If an error occurred in the committing of the
- transaction, jump to the last step. Otherwise: commit the transaction. If an error occurred in the
+ committing of the transaction, jump to the last step. The task source for these tasks is the database access task
+ The task source for these tasks is the database access task
source. A When the If the The Implementors are encouraged to implement
- For the asynchronous API, implementors are
+ encouraged to prefetch all the data for
+ Fetching the Need to define the SQL dialect. User agents should limit the total amount of space allowed for
+ User agents must implement the SQL dialect supported by Sqlite 3.6.19. When converting bound arguments to SQL data types, the JavaScript
+ ToPrimitive abstract operation must be applied to obtain the raw
+ value to be processed. [ECMA262]. User agents should limit the total amount of space allowed for
databases.
User agents should guard against sites storing data under the
@@ -1088,7 +1125,8 @@ interface S
future. A third-party advertiser (or any entity capable of getting
content distributed to multiple sites) could use a unique identifier
stored in its
- client-side database
+ client-side databases
+
to track a user across multiple sessions, building a profile of the
user's interests to allow for highly targeted advertising. In
@@ -1103,6 +1141,7 @@ interface S
User agents may restrict access to
the database objects
+
to scripts originating at the domain of the top-level document of
the browsing context, for instance denying access to
the API for pages from other domains running in
@@ -1113,8 +1152,8 @@ interface S
User agents may automatically delete stored data after a period
- of time. User agents may, if so configured by the user, automatically
+ delete stored data after a period of time. This can restrict the ability of a site to track a user, as the
@@ -1122,10 +1161,11 @@ interface S
sessions when he authenticates with the site itself (e.g. by
making a purchase or logging in to a service). However, this also puts the user's data at risk. However, this also reduces the usefulness of the API as a
+ long-term storage mechanism. It can also put the user's data at
+ risk, if the user does not fully understand the implications of
+ data expiration. If users attempt to protect their privacy by clearing cookies
without also clearing data stored in the
-
- database
+ relevant databases,
-
- feature, sites can defeat those attempts by using the two features
- as redundant backup for each other. User agents should present the
+ sites can defeat those attempts by using the two features as
+ redundant backup for each other. User agents should present the
interfaces for clearing these in a way that helps users to
understand this possibility and enables them to delete data in all
persistent storage features simultaneously. [COOKIES] User agents may require the user to authorize access to
databases before a site can use the feature. To this end, user agents should ensure that when deleting data,
- it is promptly deleted from the underlying storage. Because of the potential for DNS spoofing attacks, one cannot
+ it is promptly deleted from the underlying storage. Because of the potential for DNS spoofing attacks, one cannot
guarantee that a host claiming to be in a certain domain really is
- from that domain. To mitigate this, pages can use SSL. Pages using
- SSL can be sure that only pages using SSL that have certificates
+ from that domain. To mitigate this, pages can use TLS. Pages using
+ TLS can be sure that only pages using TLS that have certificates
identifying them as being from the same domain can access their
databases.
@@ -1242,43 +1282,37 @@ interface S
there is little reason to allow Web authors to control the character
encoding used in the disk representation of the data, as all data in
JavaScript is implicitly UTF-16. Authors are strongly recommended to make use of the All references are normative unless marked "Non-normative". All references are normative unless marked "Non-normative".Status of This document
Table of contents
+ 6 of the W3C Patent Policy.Table of Contents
2.1 Dependencies
2.1 Dependencies
Document
object or of any other
Node
objects as defined in the DOM Core
- specifications. [DOMCORE]SECURITY_ERR
exception and abort
+ these steps.4.2 Parsing and processing SQL statements
?
placeholder with the value
- of the argument in the arguments array with
- the same position. (So the first ?
- placeholder gets replaced by the first value in the arguments array, and generally the nth ?
placeholder gets
- replaced by the nth value in the arguments array.)?
- placeholders are done at the literal level, not as string
- concatenations, so this provides a way to dynamically insert
- parameters into a statement without risk of a SQL injection
- attack.?
placeholder with the value of
+ the argument in the arguments array with the
+ same position. (So the first ?
placeholder
+ gets bound to the first value in the arguments
+ array, and generally the nth ?
placeholder gets bound to the nth value in the arguments
+ array.)?
placeholders
+ is done at the literal level, not as string concatenations, so
+ this provides a way to dynamically insert parameters into a
+ statement without risk of a SQL injection attack.4.3 Asynchronous database API
interface Database {
- void transaction(in SQLTransactionCallback callback, optional in SQLTransactionErrorCallback errorCallback, optional in SQLVoidCallback successCallback);
- void readTransaction(in SQLTransactionCallback callback, optional in SQLTransactionErrorCallback errorCallback, optional in SQLVoidCallback successCallback);
+ void transaction(in SQLTransactionCallback callback, in optional SQLTransactionErrorCallback errorCallback, in optional SQLVoidCallback successCallback);
+ void readTransaction(in SQLTransactionCallback callback, in optional SQLTransactionErrorCallback errorCallback, in optional SQLVoidCallback successCallback);
readonly attribute DOMString version;
void changeVersion(in DOMString oldVersion, in DOMString newVersion, in optional SQLTransactionCallback callback, in optional SQLTransactionErrorCallback errorCallback, in optional SQLVoidCallback successCallback);
@@ -649,7 +681,7 @@ interface typedef sequence<any> ObjectArray;
interface SQLTransaction {
- void executeSql(in DOMString sqlStatement, optional in ObjectArray arguments, optional in SQLStatementCallback callback, optional in SQLStatementErrorCallback errorCallback);
+ void executeSql(in DOMString sqlStatement, in optional ObjectArray arguments, in optional SQLStatementCallback callback, in optional SQLStatementErrorCallback errorCallback);
};
[Callback=FunctionOnly, NoInterfaceObject]
@@ -775,14 +807,13 @@ interface changeVersion()
+ the transaction and, if that succeeds, run the postflight
+ operation. If the commit fails, then instead jump to the last
+ step. (This is basically a hook for the
changeVersion()
method.)4.4 Synchronous database API
interface DatabaseSync {
void transaction(in SQLTransactionSyncCallback callback);
void readTransaction(in SQLTransactionSyncCallback callback);
readonly attribute DOMString version;
- void changeVersion(in DOMString oldVersion, in DOMString newVersion, optional in SQLTransactionSyncCallback callback);
+ void changeVersion(in DOMString oldVersion, in DOMString newVersion, in optional SQLTransactionSyncCallback callback);
};
[Callback=FunctionOnly, NoInterfaceObject]
@@ -906,7 +937,7 @@ interface SQLTransactionSync objects.
// typedef sequence<any> ObjectArray;
interface SQLTransactionSync {
- SQLResultSet executeSql(in DOMString sqlStatement, optional in ObjectArray arguments);
+ SQLResultSet executeSql(in DOMString sqlStatement, in optional ObjectArray arguments);
};
SQLTransactionSync
object is initially fresh, but it will be marked as stale
once it has been committed or rolled back.executeSql(sqlStatement, arguments)
method is invoked, the user
agent must run the following algorithm:SQLTransactionSync
object is stale, then throw an INVALID_STATE_ERR
@@ -957,14 +988,18 @@ interface S
zero (querying the database doesn't affect any rows).rows
attribute must return a SQLResultSetRowList
representing the rows returned, in the order returned by the
- database. If no rows were returned, then the object will be empty
- (its length
will
- be zero).interface SQLResultSetRowList {
+ database. The same object must be returned each time. If no rows
+ were returned, then the object will be empty (its
length
will be
+ zero).interface SQLResultSetRowList {
readonly attribute unsigned long length;
getter any item(in unsigned long index);
-};
SQLResultSetRowList
objects lazily, or at least
- asynchronously, for better performance.SQLResultSetRowList
objects have a length
+};SQLResultSetRowList
objects when the object is
+ constructed (before the result set callback is invoked), rather than
+ on-demand, for better responsiveness. For the synchronous API, an
+ on-demand lazy evaluation implementation strategy is encouraged
+ instead, for better performance.SQLResultSetRowList
objects have a length
attribute that must return the number of rows it represents (the
number of rows returned by the database). This is the length.length
might be
expensive, and authors are thus encouraged to avoid using it (or
@@ -1072,7 +1107,9 @@ interface S
A lock for the transaction could not be obtained in a
reasonable time.
- 5 Web SQL
6 Disk space
5 Web SQL
6 Disk space
7 Privacy
7.1 User tracking
8 Security
8.1 DNS spoofing attacks
8 Security
8.1 DNS spoofing attacks
8.5 SQL injection
?
placeholder feature of the executeSql()
method,
- and to never construct SQL statements on the fly.References
References