Update JS snapshot to version 3.9.0-dev (via coho)
diff --git a/template/www/cordova.js b/template/www/cordova.js
index e92a31b..bb0d061 100644
--- a/template/www/cordova.js
+++ b/template/www/cordova.js
@@ -1,5 +1,5 @@
-// Platform: windowsphone

-// 91157c2e1bf3eb098c7e2ab31404e895ccb0df2a

+// Platform: wp8

+// b4af1c5ec477dd98cd651932ea6df6d46705d7f9

 /*

  Licensed to the Apache Software Foundation (ASF) under one

  or more contributor license agreements.  See the NOTICE file

@@ -19,7 +19,7 @@
  under the License.

 */

 ;(function() {

-var PLATFORM_VERSION_BUILD_LABEL = '3.8.0-dev';

+var PLATFORM_VERSION_BUILD_LABEL = '3.9.0-dev';

 // file: src/scripts/require.js

 

 /*jshint -W079 */

@@ -101,6 +101,8 @@
 // file: src/cordova.js

 define("cordova", function(require, exports, module) {

 

+if ("cordova" in window) { throw new Error("cordova already defined"); };

+

 

 var channel = require('cordova/channel');

 var platform = require('cordova/platform');

@@ -284,10 +286,16 @@
             if (callback) {

                 if (isSuccess && status == cordova.callbackStatus.OK) {

                     callback.success && callback.success.apply(null, args);

-                } else {

+                } else if (!isSuccess) {

                     callback.fail && callback.fail.apply(null, args);

                 }

-

+                /*

+                else

+                    Note, this case is intentionally not caught.

+                    this can happen if isSuccess is true, but callbackStatus is NO_RESULT

+                    which is used to remove a callback from the list without calling the callbacks

+                    typically keepCallback is false in this case

+                */

                 // Clear callback if not expecting any more results

                 if (!keepCallback) {

                     delete cordova.callbacks[callbackId];

@@ -464,9 +472,14 @@
 

 function clobber(obj, key, value) {

     exports.replaceHookForTesting(obj, key);

-    obj[key] = value;

+    var needsProperty = false;

+    try {

+        obj[key] = value;

+    } catch (e) {

+        needsProperty = true;

+    }

     // Getters can only be overridden by getters.

-    if (obj[key] !== value) {

+    if (needsProperty || obj[key] !== value) {

         utils.defineGetter(obj, key, function() {

             return value;

         });

@@ -581,7 +594,6 @@
  * onDeviceReady*              User event fired to indicate that Cordova is ready

  * onResume                    User event fired to indicate a start/resume lifecycle event

  * onPause                     User event fired to indicate a pause lifecycle event

- * onDestroy*                  Internal event fired when app is being destroyed (User should use window.onunload event, not this one).

  *

  * The events marked with an * are sticky. Once they have fired, they will stay in the fired state.

  * All listeners that subscribe after the event is fired will be executed right away.

@@ -793,9 +805,6 @@
 // Event to indicate a pause lifecycle event

 channel.create('onPause');

 

-// Event to indicate a destroy lifecycle event

-channel.createSticky('onDestroy');

-

 // Channels that must fire before "deviceready" is fired.

 channel.waitForInitialization('onCordovaReady');

 channel.waitForInitialization('onDOMContentLoaded');

@@ -804,7 +813,7 @@
 

 });

 

-// file: src/windowsphone/exec.js

+// file: src/wp8/exec.js

 define("cordova/exec", function(require, exports, module) {

 

 var cordova = require('cordova'),

@@ -935,7 +944,7 @@
         for (var key in origNavigator) {

             if (typeof origNavigator[key] == 'function') {

                 newNavigator[key] = origNavigator[key].bind(origNavigator);

-            } 

+            }

             else {

                 (function(k) {

                     utils.defineGetterSetter(newNavigator,key,function() {

@@ -1063,7 +1072,7 @@
         for (var key in origNavigator) {

             if (typeof origNavigator[key] == 'function') {

                 newNavigator[key] = origNavigator[key].bind(origNavigator);

-            } 

+            }

             else {

                 (function(k) {

                     utils.defineGetterSetter(newNavigator,key,function() {

@@ -1118,7 +1127,7 @@
  * Create all cordova objects once native side is ready.

  */

 channel.join(function() {

-    

+

     platform.initialize && platform.initialize();

 

     // Fire event to notify that all objects are created

@@ -1236,7 +1245,7 @@
 

 });

 

-// file: src/windowsphone/platform.js

+// file: src/wp8/platform.js

 define("cordova/platform", function(require, exports, module) {

 

 module.exports = {