You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@couchdb.apache.org by Robert Newson <ro...@gmail.com> on 2010/08/07 14:36:29 UTC

Futon test suite on Chrome

All,

I spent a few hours this morning trying to get the full test suite
running on Chrome. I failed for interesting reasons that I think are
worth sharing.

Exactly two tests fail, attachments.js and replication.js

attachments.js fails because of an unidentified Chrome parsing bug. If
you remove this part of the test (right at the end), the test passes
on Chrome;

  bin_doc6._attachments["foo.txt"] = { stub: true, revpos: 10};
  try {
      T(db.save(bin_doc6).ok == true);
      T(false && "Shouldn't get here!");
  } catch (e) {
      T(e.error == "missing_stub")
  }

It is *not* sufficient to merely comment it out, the test still hangs.
Interestingly, the presence of this stanza prevents even the first
line of the test from executing. I confirmed this by building another
test class and copying attachments.js over incrementally. The oddness
of this bug was confirmed by doppler on #couchdb.

replication.js fails because Chrome has another bug around the common
defaulting idiom we use. In couch.js we default options and
options.headers to empty objects if either are undefined, which should
make the reference to options.headers['Content-Type'] completely safe.
Not so in Chrome. I added if (!options.headers) alert('oops'); after
both defaulting lines and it fires on Chrome.  The following patch
fixes it but I don't think we should apply it;

diff --git a/share/www/script/couch.js b/share/www/script/couch.js
index b7e0e51..7d18939 100644
--- a/share/www/script/couch.js
+++ b/share/www/script/couch.js
@@ -397,8 +397,8 @@ CouchDB.newXhr = function() {
 }

 CouchDB.request = function(method, uri, options) {
-  options = options || {};
-  options.headers = options.headers || {};
+  options = typeof(options) == 'object' ? options : {};
+  options.headers = typeof(options.headers) == 'object' ? options.headers : {};
   options.headers["Content-Type"] = options.headers["Content-Type"]
|| options.he
   options.headers["Accept"] = options.headers["Accept"] ||
options.headers["accep
   var req = CouchDB.newXhr();

B.

Re: Futon test suite on Chrome

Posted by Jan Lehnardt <ja...@apache.org>.
Hi Robert,

I committed that as part of r986710 as it also fixes 
support for Safari 5. Thanks for the digging :)

Cheers
Jan
-- 

On 7 Aug 2010, at 14:36, Robert Newson wrote:

> All,
> 
> I spent a few hours this morning trying to get the full test suite
> running on Chrome. I failed for interesting reasons that I think are
> worth sharing.
> 
> Exactly two tests fail, attachments.js and replication.js
> 
> attachments.js fails because of an unidentified Chrome parsing bug. If
> you remove this part of the test (right at the end), the test passes
> on Chrome;
> 
>  bin_doc6._attachments["foo.txt"] = { stub: true, revpos: 10};
>  try {
>      T(db.save(bin_doc6).ok == true);
>      T(false && "Shouldn't get here!");
>  } catch (e) {
>      T(e.error == "missing_stub")
>  }
> 
> It is *not* sufficient to merely comment it out, the test still hangs.
> Interestingly, the presence of this stanza prevents even the first
> line of the test from executing. I confirmed this by building another
> test class and copying attachments.js over incrementally. The oddness
> of this bug was confirmed by doppler on #couchdb.
> 
> replication.js fails because Chrome has another bug around the common
> defaulting idiom we use. In couch.js we default options and
> options.headers to empty objects if either are undefined, which should
> make the reference to options.headers['Content-Type'] completely safe.
> Not so in Chrome. I added if (!options.headers) alert('oops'); after
> both defaulting lines and it fires on Chrome.  The following patch
> fixes it but I don't think we should apply it;
> 
> diff --git a/share/www/script/couch.js b/share/www/script/couch.js
> index b7e0e51..7d18939 100644
> --- a/share/www/script/couch.js
> +++ b/share/www/script/couch.js
> @@ -397,8 +397,8 @@ CouchDB.newXhr = function() {
> }
> 
> CouchDB.request = function(method, uri, options) {
> -  options = options || {};
> -  options.headers = options.headers || {};
> +  options = typeof(options) == 'object' ? options : {};
> +  options.headers = typeof(options.headers) == 'object' ? options.headers : {};
>   options.headers["Content-Type"] = options.headers["Content-Type"]
> || options.he
>   options.headers["Accept"] = options.headers["Accept"] ||
> options.headers["accep
>   var req = CouchDB.newXhr();
> 
> B.