duplicate wp7 as wp
Project: http://git-wip-us.apache.org/repos/asf/incubator-cordova-js/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-cordova-js/commit/10d6ebc4 Tree: http://git-wip-us.apache.org/repos/asf/incubator-cordova-js/tree/10d6ebc4 Diff: http://git-wip-us.apache.org/repos/asf/incubator-cordova-js/diff/10d6ebc4 Branch: refs/heads/master Commit: 10d6ebc4e272bef18eb2e197d925aa8ad0158e85 Parents: 0919268 Author: sgrebnov <[email protected]> Authored: Tue Nov 6 01:04:19 2012 +0400 Committer: sgrebnov <[email protected]> Committed: Tue Nov 6 01:04:19 2012 +0400 ---------------------------------------------------------------------- Jakefile | 1 + build/packager.js | 1 + lib/wp/exec.js | 68 ++++++++ lib/wp/platform.js | 77 ++++++++ lib/wp/plugin/wp/CordovaCommandResult.js | 74 ++++++++ lib/wp/plugin/wp/CordovaMediaonStatus.js | 38 ++++ lib/wp/plugin/wp/DOMStorage.js | 195 +++++++++++++++++++++ lib/wp/plugin/wp/FileTransfer.js | 123 +++++++++++++ lib/wp/plugin/wp/FileUploadOptions.js | 47 +++++ lib/wp/plugin/wp/XHRPatch.js | 230 +++++++++++++++++++++++++ lib/wp/plugin/wp/console.js | 45 +++++ 11 files changed, 899 insertions(+), 0 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-cordova-js/blob/10d6ebc4/Jakefile ---------------------------------------------------------------------- diff --git a/Jakefile b/Jakefile index 2d89fa1..c678928 100644 --- a/Jakefile +++ b/Jakefile @@ -90,6 +90,7 @@ task('build', ['clean', 'hint', 'update-version'], function () { packager.generate("blackberry",commitId); packager.generate("ios",commitId); packager.generate("wp7",commitId); + packager.generate("wp",commitId); packager.generate("android",commitId); packager.generate("bada",commitId); packager.generate("tizen",commitId); http://git-wip-us.apache.org/repos/asf/incubator-cordova-js/blob/10d6ebc4/build/packager.js ---------------------------------------------------------------------- diff --git a/build/packager.js b/build/packager.js index d5df739..20d7ed6 100644 --- a/build/packager.js +++ b/build/packager.js @@ -57,6 +57,7 @@ packager.bundle = function(platform, debug, commitId ) { copyProps(modules, collectFiles(path.join('lib', 'blackberry', 'plugin'), 'plugin')); copyProps(modules, collectFiles(path.join('lib', 'tizen', 'plugin', 'tizen'), 'plubin/tizen')); copyProps(modules, collectFiles(path.join('lib', 'wp7', 'plugin', 'wp7'), 'plugin/wp7')); + copyProps(modules, collectFiles(path.join('lib', 'wp', 'plugin', 'wp'), 'plugin/wp')); copyProps(modules, collectFiles(path.join('lib', 'windows8', 'plugin', 'windows8'), 'plugin/windows8')); copyProps(modules, collectFiles(path.join('lib', 'ios', 'plugin', 'ios'), 'plugin/ios/')); copyProps(modules, collectFiles(path.join('lib', 'bada', 'plugin', 'bada'), 'plugin/bada/')); http://git-wip-us.apache.org/repos/asf/incubator-cordova-js/blob/10d6ebc4/lib/wp/exec.js ---------------------------------------------------------------------- diff --git a/lib/wp/exec.js b/lib/wp/exec.js new file mode 100644 index 0000000..96eb306 --- /dev/null +++ b/lib/wp/exec.js @@ -0,0 +1,68 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var cordova = require('cordova'); + +/** + * Execute a cordova command. It is up to the native side whether this action + * is synchronous or asynchronous. The native side can return: + * Synchronous: PluginResult object as a JSON string + * Asynchronous: Empty string "" + * If async, the native side will cordova.callbackSuccess or cordova.callbackError, + * depending upon the result of the action. + * + * @param {Function} success The success callback + * @param {Function} fail The fail callback + * @param {String} service The name of the service to use + * @param {String} action Action to be run in cordova + * @param {String[]} [args] Zero or more arguments to pass to the method + + */ + +module.exports = function(success, fail, service, action, args) { + + var callbackId = service + cordova.callbackId++; + if (typeof success == "function" || typeof fail == "function") { + cordova.callbacks[callbackId] = {success:success, fail:fail}; + } + // generate a new command string, ex. DebugConsole/log/DebugConsole23/["wtf dude?"] + for(var n = 0; n < args.length; n++) + { + if(typeof args[n] !== "string") + { + args[n] = JSON.stringify(args[n]); + } + } + var command = service + "/" + action + "/" + callbackId + "/" + JSON.stringify(args); + // pass it on to Notify + try { + if(window.external) { + window.external.Notify(command); + } + else { + console.log("window.external not available :: command=" + command); + } + } + catch(e) { + console.log("Exception calling native with command :: " + command + " :: exception=" + e); + } +}; + http://git-wip-us.apache.org/repos/asf/incubator-cordova-js/blob/10d6ebc4/lib/wp/platform.js ---------------------------------------------------------------------- diff --git a/lib/wp/platform.js b/lib/wp/platform.js new file mode 100644 index 0000000..5f46ba6 --- /dev/null +++ b/lib/wp/platform.js @@ -0,0 +1,77 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var cordova = require('cordova'), + exec = require('cordova/exec'); + +// specifically require the following patches : + +// localStorage+SessionStorage APIs +require("cordova/plugin/wp/DOMStorage"); + +// Fix XHR calls to local file-system +require("cordova/plugin/wp/XHRPatch"); + + +module.exports = { + id: "wp", + initialize:function() { + window.alert = require("cordova/plugin/notification").alert; + window.FileReader = require("cordova/plugin/FileReader"); + window.File = require("cordova/plugin/File"); + + + // Inject a listener for the backbutton, and tell native to override the flag (true/false) when we have 1 or more, or 0, listeners + var backButtonChannel = cordova.addDocumentEventHandler('backbutton'); + backButtonChannel.onHasSubscribersChange = function() { + exec(null, null, "CoreEvents", "overridebackbutton", [this.numHandlers == 1]); + }; + }, + objects: { + CordovaCommandResult: { + path:"cordova/plugin/wp/CordovaCommandResult" + }, + CordovaMediaonStatus: { + path:"cordova/plugin/wp/CordovaMediaonStatus" + }, + navigator: { + children: { + device: { + children:{ + capture:{ + path:"cordova/plugin/capture" + } + } + }, + console: { + path: "cordova/plugin/wp/console" + + } + } + }, + console:{ + path: "cordova/plugin/wp/console" + }, + FileTransfer: { + path: 'cordova/plugin/wp/FileTransfer' + } + } +}; http://git-wip-us.apache.org/repos/asf/incubator-cordova-js/blob/10d6ebc4/lib/wp/plugin/wp/CordovaCommandResult.js ---------------------------------------------------------------------- diff --git a/lib/wp/plugin/wp/CordovaCommandResult.js b/lib/wp/plugin/wp/CordovaCommandResult.js new file mode 100644 index 0000000..dae5279 --- /dev/null +++ b/lib/wp/plugin/wp/CordovaCommandResult.js @@ -0,0 +1,74 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + + +var cordova = require('cordova'); +var channel = require('cordova/channel'); + +// singular WP callback function attached to window, status is used to determine if it is a success or error +module.exports = function(status,callbackId,args,cast) { + + if(status === "backbutton") { + // do not detach backbutton event, as we need to be able to catch exceptions + cordova.fireDocumentEvent("backbutton", undefined, true); + return "true"; + } + else if(status === "resume") { + cordova.fireDocumentEvent('resume'); + return "true"; + } + else if(status === "pause") { + cordova.fireDocumentEvent('pause'); + return "true"; + } + + var parsedArgs; + try + { + parsedArgs = JSON.parse(args); + + } + catch(ex) + { + console.log("Parse error in CordovaCommandResult :: " + ex); + return; + } + + try + { + // For some commands, the message is a JSON encoded string + // and other times, it is just a string, the try/catch handles the + // case where message was indeed, just a string. + parsedArgs.message = JSON.parse(parsedArgs.message); + } + catch(ex) + { + + } + var safeStatus = parseInt(status, 10); + if(safeStatus === cordova.callbackStatus.NO_RESULT || + safeStatus === cordova.callbackStatus.OK) { + cordova.callbackSuccess(callbackId,parsedArgs,cast); + } + else { + cordova.callbackError(callbackId,parsedArgs,cast); + } +}; http://git-wip-us.apache.org/repos/asf/incubator-cordova-js/blob/10d6ebc4/lib/wp/plugin/wp/CordovaMediaonStatus.js ---------------------------------------------------------------------- diff --git a/lib/wp/plugin/wp/CordovaMediaonStatus.js b/lib/wp/plugin/wp/CordovaMediaonStatus.js new file mode 100644 index 0000000..8cd0879 --- /dev/null +++ b/lib/wp/plugin/wp/CordovaMediaonStatus.js @@ -0,0 +1,38 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + + +var cordova = require('cordova'); +var Media = require('cordova/plugin/Media'); + +module.exports = function(args) { + try { + + var res = JSON.parse(args); + if(res.msg == Media.MEDIA_ERROR) { + res.value = {'code':res.value}; + } + Media.onStatus(res.id, res.msg, res.value); + } + catch(e) { + console.log("Error calling Media.onStatus :: " + e); + } +}; http://git-wip-us.apache.org/repos/asf/incubator-cordova-js/blob/10d6ebc4/lib/wp/plugin/wp/DOMStorage.js ---------------------------------------------------------------------- diff --git a/lib/wp/plugin/wp/DOMStorage.js b/lib/wp/plugin/wp/DOMStorage.js new file mode 100644 index 0000000..b67ad40 --- /dev/null +++ b/lib/wp/plugin/wp/DOMStorage.js @@ -0,0 +1,195 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +(function(win,doc) { + +var docDomain = null; +try { + docDomain = doc.domain; +} catch (err) { + //console.log("caught exception trying to access document.domain"); +} + +// conditionally patch the window.localStorage and window.sessionStorage objects +if (!docDomain || docDomain.length === 0) { + + var DOMStorage = function(type) { + // default type is local + if(type == "sessionStorage") { + this._type = type; + } + Object.defineProperty( this, "length", { + configurable: true, + get: function(){ return this.getLength(); } + }); + }; + + DOMStorage.prototype = { + _type:"localStorage", + _result:null, + keys:null, + + onResult:function(key,valueStr) { + if(!this.keys) { + this.keys = []; + } + this._result = valueStr; + }, + + onKeysChanged:function(jsonKeys) { + this.keys = JSON.parse(jsonKeys); + + var key; + for(var n = 0,len = this.keys.length; n < len; n++) { + key = this.keys[n]; + if(!this.hasOwnProperty(key)) { + Object.defineProperty( this, key, { + configurable: true, + get: function(){ return this.getItem(key); }, + set: function(val){ return this.setItem(key,val); } + }); + } + } + + }, + + initialize:function() { + window.external.Notify("DOMStorage/" + this._type + "/load/keys"); + }, + + /* + The length attribute must return the number of key/value pairs currently present + in the list associated with the object. + */ + getLength:function() { + if(!this.keys) { + this.initialize(); + } + return this.keys.length; + }, + + /* + The key(n) method must return the name of the nth key in the list. + The order of keys is user-agent defined, but must be consistent within an object so long as the number of keys doesn't change. + (Thus, adding or removing a key may change the order of the keys, but merely changing the value of an existing key must not.) + If n is greater than or equal to the number of key/value pairs in the object, then this method must return null. + */ + key:function(n) { + if(!this.keys) { + this.initialize(); + } + + if(n >= this.keys.length) { + return null; + } else { + return this.keys[n]; + } + }, + + /* + The getItem(key) method must return the current value associated with the given key. + If the given key does not exist in the list associated with the object then this method must return null. + */ + getItem:function(key) { + if(!this.keys) { + this.initialize(); + } + + var retVal = null; + if(this.keys.indexOf(key) > -1) { + window.external.Notify("DOMStorage/" + this._type + "/get/" + key); + retVal = window.unescape(decodeURIComponent(this._result)); + this._result = null; + } + return retVal; + }, + /* + The setItem(key, value) method must first check if a key/value pair with the given key already exists + in the list associated with the object. + If it does not, then a new key/value pair must be added to the list, with the given key and with its value set to value. + If the given key does exist in the list, then it must have its value updated to value. + If it couldn't set the new value, the method must raise an QUOTA_EXCEEDED_ERR exception. + (Setting could fail if, e.g., the user has disabled storage for the site, or if the quota has been exceeded.) + */ + setItem:function(key,value) { + if(!this.keys) { + this.initialize(); + } + window.external.Notify("DOMStorage/" + this._type + "/set/" + key + "/" + encodeURIComponent(window.escape(value))); + }, + + /* + The removeItem(key) method must cause the key/value pair with the given key to be removed from the list + associated with the object, if it exists. + If no item with that key exists, the method must do nothing. + */ + removeItem:function(key) { + if(!this.keys) { + this.initialize(); + } + var index = this.keys.indexOf(key); + if(index > -1) { + this.keys.splice(index,1); + // TODO: need sanity check for keys ? like 'clear','setItem', ... + window.external.Notify("DOMStorage/" + this._type + "/remove/" + key); + delete this[key]; + } + }, + + /* + The clear() method must atomically cause the list associated with the object to be emptied of all + key/value pairs, if there are any. + If there are none, then the method must do nothing. + */ + clear:function() { + if(!this.keys) { + this.initialize(); + } + + for(var n=0,len=this.keys.length; n < len;n++) { + // TODO: do we need a sanity check for keys ? like 'clear','setItem', ... + delete this[this.keys[n]]; + } + this.keys = []; + window.external.Notify("DOMStorage/" + this._type + "/clear/"); + } + }; + + // initialize DOMStorage + + Object.defineProperty( window, "localStorage", { + writable: false, + configurable: false, + value:new DOMStorage("localStorage") + }); + window.localStorage.initialize(); + + Object.defineProperty( window, "sessionStorage", { + writable: false, + configurable: false, + value:new DOMStorage("sessionStorage") + }); + window.sessionStorage.initialize(); +} + +})(window, document); + +module.exports = null; http://git-wip-us.apache.org/repos/asf/incubator-cordova-js/blob/10d6ebc4/lib/wp/plugin/wp/FileTransfer.js ---------------------------------------------------------------------- diff --git a/lib/wp/plugin/wp/FileTransfer.js b/lib/wp/plugin/wp/FileTransfer.js new file mode 100644 index 0000000..b2f8686 --- /dev/null +++ b/lib/wp/plugin/wp/FileTransfer.js @@ -0,0 +1,123 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var exec = require('cordova/exec'), + FileTransferError = require('cordova/plugin/FileTransferError'); + +// Note that the only difference between this and the default implementation is the +// object literal passed to exec() in upload - jm + +/** + * FileTransfer uploads a file to a remote server. + * @constructor + */ +var FileTransfer = function() {}; + +/** +* Given an absolute file path, uploads a file on the device to a remote server +* using a multipart HTTP request. +* @param filePath {String} Full path of the file on the device +* @param server {String} URL of the server to receive the file +* @param successCallback (Function} Callback to be invoked when upload has completed +* @param errorCallback {Function} Callback to be invoked upon error +* @param options {FileUploadOptions} Optional parameters such as file name and mimetype +* @param trustAllHosts {Boolean} Optional trust all hosts (e.g. for self-signed certs), defaults to false +*/ + +FileTransfer.prototype.upload = function(filePath, server, successCallback, errorCallback, options, trustAllHosts) { + + // sanity parameter checking + if (!filePath || !server) throw new Error("FileTransfer.upload requires filePath and server URL parameters at the minimum."); + // check for options + var fileKey = null; + var fileName = null; + var mimeType = null; + var params = null; + var chunkedMode = true; + + if (options) { + fileKey = options.fileKey; + fileName = options.fileName; + mimeType = options.mimeType; + if (options.chunkedMode !== null || typeof options.chunkedMode != "undefined") { + chunkedMode = options.chunkedMode; + } + + // if options are specified, and NOT a string already, we will stringify it. + if(options.params && typeof options.params != typeof "") { + var arrParams = []; + for(var v in options.params) { + arrParams.push(v + "=" + options.params[v]); + } + params = encodeURI(arrParams.join("&")); + } + } + + var fail = function(e) { + var error = new FileTransferError(e.code, e.source, e.target, e.http_status); + errorCallback(error); + }; + exec(successCallback, fail, 'FileTransfer', 'upload', [{"filePath":filePath, + "server":server, + "fileKey":fileKey, + "fileName":fileName, + "mimeType":mimeType, + "params":params, + "trustAllHosts":trustAllHosts, + "chunkedMode":chunkedMode}]); +}; + +/** + * Downloads a file form a given URL and saves it to the specified directory. + * @param source {String} URL of the server to receive the file + * @param target {String} Full path of the file on the device + * @param successCallback (Function} Callback to be invoked when upload has completed + * @param errorCallback {Function} Callback to be invoked upon error + */ + +FileTransfer.prototype.download = function(source, target, successCallback, errorCallback) { + // sanity parameter checking + if (!source || !target) throw new Error("FileTransfer.download requires source URI and target URI parameters at the minimum."); + var win = function(result) { + var entry = null; + if (result.isDirectory) { + entry = new (require('cordova/plugin/DirectoryEntry'))(); + } + else if (result.isFile) { + entry = new (require('cordova/plugin/FileEntry'))(); + } + entry.isDirectory = result.isDirectory; + entry.isFile = result.isFile; + entry.name = result.name; + entry.fullPath = result.fullPath; + successCallback(entry); + }; + + var fail = function(e) { + var error = new FileTransferError(e.code, e.source, e.target, e.http_status); + errorCallback(error); + }; + + exec(win, errorCallback, 'FileTransfer', 'download', [source, target]); +}; + + +module.exports = FileTransfer; http://git-wip-us.apache.org/repos/asf/incubator-cordova-js/blob/10d6ebc4/lib/wp/plugin/wp/FileUploadOptions.js ---------------------------------------------------------------------- diff --git a/lib/wp/plugin/wp/FileUploadOptions.js b/lib/wp/plugin/wp/FileUploadOptions.js new file mode 100644 index 0000000..44b0978 --- /dev/null +++ b/lib/wp/plugin/wp/FileUploadOptions.js @@ -0,0 +1,47 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/** + * Options to customize the HTTP request used to upload files. + * @constructor + * @param fileKey {String} Name of file request parameter. + * @param fileName {String} Filename to be used by the server. Defaults to image.jpg. + * @param mimeType {String} Mimetype of the uploaded file. Defaults to image/jpeg. + * @param params {Object} Object with key: value params to send to the server. + */ +var FileUploadOptions = function(fileKey, fileName, mimeType, params) { + this.fileKey = fileKey || null; + this.fileName = fileName || null; + this.mimeType = mimeType || null; + + if(params && typeof params != typeof "") { + var arrParams = []; + for(var v in params) { + arrParams.push(v + "=" + params[v]); + } + this.params = encodeURIComponent(arrParams.join("&")); + } + else { + this.params = params || null; + } +}; + +module.exports = FileUploadOptions; http://git-wip-us.apache.org/repos/asf/incubator-cordova-js/blob/10d6ebc4/lib/wp/plugin/wp/XHRPatch.js ---------------------------------------------------------------------- diff --git a/lib/wp/plugin/wp/XHRPatch.js b/lib/wp/plugin/wp/XHRPatch.js new file mode 100644 index 0000000..9c9d62a --- /dev/null +++ b/lib/wp/plugin/wp/XHRPatch.js @@ -0,0 +1,230 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +// TODO: the build process will implicitly wrap this in a define() call +// with a closure of its own; do you need this extra closure? + +var LocalFileSystem = require('cordova/plugin/LocalFileSystem'); + +(function (win, doc) { + +var docDomain = null; +try { + docDomain = doc.domain; +} catch (err) { + //console.log("caught exception trying to access document.domain"); +} + +if (!docDomain || docDomain.length === 0) { + + var aliasXHR = win.XMLHttpRequest; + + win.XMLHttpRequest = function () { }; + win.XMLHttpRequest.noConflict = aliasXHR; + win.XMLHttpRequest.UNSENT = 0; + win.XMLHttpRequest.OPENED = 1; + win.XMLHttpRequest.HEADERS_RECEIVED = 2; + win.XMLHttpRequest.LOADING = 3; + win.XMLHttpRequest.DONE = 4; + + win.XMLHttpRequest.prototype = { + UNSENT: 0, + OPENED: 1, + HEADERS_RECEIVED: 2, + LOADING: 3, + DONE: 4, + + isAsync: false, + onreadystatechange: null, + readyState: 0, + _url: "", + timeout: 0, + withCredentials: false, + _requestHeaders: null, + open: function (reqType, uri, isAsync, user, password) { + + if (uri && uri.indexOf("http") === 0) { + if (!this.wrappedXHR) { + this.wrappedXHR = new aliasXHR(); + var self = this; + + // timeout + if (this.timeout > 0) { + this.wrappedXHR.timeout = this.timeout; + } + Object.defineProperty(this, "timeout", { + set: function (val) { + this.wrappedXHR.timeout = val; + }, + get: function () { + return this.wrappedXHR.timeout; + } + }); + + + + if (this.withCredentials) { + this.wrappedXHR.withCredentials = this.withCredentials; + } + Object.defineProperty(this, "withCredentials", { + set: function (val) { + this.wrappedXHR.withCredentials = val; + }, + get: function () { + return this.wrappedXHR.withCredentials; + } + }); + + + Object.defineProperty(this, "status", { get: function () { + return this.wrappedXHR.status; + } + }); + Object.defineProperty(this, "responseText", { get: function () { + return this.wrappedXHR.responseText; + } + }); + Object.defineProperty(this, "statusText", { get: function () { + return this.wrappedXHR.statusText; + } + }); + + Object.defineProperty(this, "responseXML", { get: function () { + return this.wrappedXHR.responseXML; + } + }); + + this.getResponseHeader = function (header) { + return this.wrappedXHR.getResponseHeader(header); + }; + this.getAllResponseHeaders = function () { + return this.wrappedXHR.getAllResponseHeaders(); + }; + + this.wrappedXHR.onreadystatechange = function () { + self.changeReadyState(self.wrappedXHR.readyState); + }; + } + return this.wrappedXHR.open(reqType, uri, isAsync, user, password); + } + else { + // x-wmapp1://app/www/page2.html + // need to work some magic on the actual url/filepath + var newUrl = uri; + if (newUrl.indexOf(":/") > -1) { + newUrl = newUrl.split(":/")[1]; + } + // prefix relative urls to our physical root + if(newUrl.indexOf("app/www/") < 0) + { + newUrl = "app/www/" + newUrl; + } + + if (newUrl.lastIndexOf("/") === newUrl.length - 1) { + newUrl += "index.html"; // default page is index.html, when call is to a dir/ ( why not ...? ) + } + this._url = newUrl; + } + }, + statusText: "", + changeReadyState: function (newState) { + this.readyState = newState; + if (this.onreadystatechange) { + this.onreadystatechange(); + } + }, + setRequestHeader: function (header, value) { + if (this.wrappedXHR) { + this.wrappedXHR.setRequestHeader(header, value); + } + }, + getResponseHeader: function (header) { + return this.wrappedXHR ? this.wrappedXHR.getResponseHeader(header) : ""; + }, + getAllResponseHeaders: function () { + return this.wrappedXHR ? this.wrappedXHR.getAllResponseHeaders() : ""; + }, + responseText: "", + responseXML: "", + onResult: function (res) { + this.status = 200; + if(typeof res == "object") + { // callback result handler may have already parsed this from a string-> a JSON object, + // if so, we need to restore its stringyness, as handlers are expecting string data. + // especially if used with jQ -> $.getJSON + res = JSON.stringify(res); + } + this.responseText = res; + this.responseXML = res; + this.changeReadyState(this.DONE); + }, + onError: function (err) { + this.status = 404; + this.changeReadyState(this.DONE); + }, + + abort: function () { + if (this.wrappedXHR) { + return this.wrappedXHR.abort(); + } + }, + + send: function (data) { + if (this.wrappedXHR) { + return this.wrappedXHR.send(data); + } + else { + this.changeReadyState(this.OPENED); + + var alias = this; + + var fail = function fail(evt) { + alias.onError(evt.code); + }; + + var gotFile = function gotFile(file) { + var reader = new FileReader(); + reader.onloadend = function (evt) { + alias.onResult.apply(alias,[evt.target.result]); + }; + reader.readAsText(file); + }; + + var gotEntry = function gotEntry(entry) { + entry.file(gotFile, fail); + }; + + var gotFS = function gotFS(fs) { + fs.root.getFile(alias._url, null, gotEntry, fail); + }; + + window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, gotFS, fail); + + } + }, + status: 404 + }; +} // if doc domain + +// end closure wrap +})(window, document); + +module.exports = null; http://git-wip-us.apache.org/repos/asf/incubator-cordova-js/blob/10d6ebc4/lib/wp/plugin/wp/console.js ---------------------------------------------------------------------- diff --git a/lib/wp/plugin/wp/console.js b/lib/wp/plugin/wp/console.js new file mode 100644 index 0000000..20197d5 --- /dev/null +++ b/lib/wp/plugin/wp/console.js @@ -0,0 +1,45 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + + +var exec = require('cordova/exec'), + channel = require('cordova/channel'); +var cordova = require("cordova"); + +var debugConsole = { + log:function(msg){ + exec(null,null,"DebugConsole","log",msg); + }, + warn:function(msg){ + exec(null,null,"DebugConsole","warn",msg); + }, + error:function(msg){ + exec(null,null,"DebugConsole","error",msg); + } +}; + +var oldOnError = window.onerror; +window.onerror = function(msg,fileName,line) { + oldOnError && oldOnError(msg,fileName,line); + debugConsole.error(msg + " file:" + fileName + " Line:" + line); +}; + +module.exports = debugConsole;
