1/* Copyright 2013 The Chromium Authors. All rights reserved. 2 * Use of this source code is governed by a BSD-style license that can be 3 * found in the LICENSE file. 4 */ 5 6/** 7 * @fileoverview 8 * The sandbox isn't allowed to make XHRs, so they have to be proxied to the 9 * main process. The XMLHttpRequestProxy class is API-compatible with the 10 * XMLHttpRequest class, but forwards the requests to the main process where 11 * they can be serviced. The forwarding of XHRs and responses is handled by 12 * the WcsSandboxContent class; this class is just a thin wrapper to hook XHR 13 * creations by JS running in the sandbox. 14 * 15 * Because XMLHttpRequest is implemented natively, and because the intent is 16 * to replace its functionality entirely, prototype linking is not a suitable 17 * approach here, so much of the interface definition is duplicated from the 18 * w3c specification: http://www.w3.org/TR/XMLHttpRequest 19 */ 20 21'use strict'; 22 23/** @suppress {duplicate} */ 24var remoting = remoting || {}; 25 26/** 27 * @constructor 28 * @extends {XMLHttpRequest} 29 */ 30remoting.XMLHttpRequestProxy = function() { 31 /** 32 * @type {{headers: Object}} 33 */ 34 this.sandbox_ipc = { 35 headers: {} 36 }; 37 /** 38 * @type {number} 39 * @private 40 */ 41 this.xhr_id_ = -1; 42}; 43 44remoting.XMLHttpRequestProxy.prototype.open = function( 45 method, url, async, user, password) { 46 if (!async) { 47 console.warn('Synchronous XHRs are not supported.'); 48 } 49 this.sandbox_ipc.method = method; 50 this.sandbox_ipc.url = url.toString(); 51 this.sandbox_ipc.user = user; 52 this.sandbox_ipc.password = password; 53}; 54 55remoting.XMLHttpRequestProxy.prototype.send = function(data) { 56 if (remoting.sandboxContent) { 57 this.sandbox_ipc.data = data; 58 this.xhr_id_ = remoting.sandboxContent.sendXhr(this); 59 } 60}; 61 62remoting.XMLHttpRequestProxy.prototype.setRequestHeader = function( 63 header, value) { 64 this.sandbox_ipc.headers[header] = value; 65}; 66 67remoting.XMLHttpRequestProxy.prototype.abort = function() { 68 if (this.xhr_id_ != -1) { 69 remoting.sandboxContent.abortXhr(this.xhr_id_); 70 } 71}; 72 73remoting.XMLHttpRequestProxy.prototype.getResponseHeader = function(header) { 74 console.error('Sandbox: unproxied getResponseHeader(' + header + ') called.'); 75}; 76 77remoting.XMLHttpRequestProxy.prototype.getAllResponseHeaders = function() { 78 console.error('Sandbox: unproxied getAllResponseHeaders called.'); 79}; 80 81remoting.XMLHttpRequestProxy.prototype.overrideMimeType = function() { 82 console.error('Sandbox: unproxied overrideMimeType called.'); 83}; 84 85remoting.XMLHttpRequestProxy.prototype.UNSENT = 0; 86remoting.XMLHttpRequestProxy.prototype.OPENED = 1; 87remoting.XMLHttpRequestProxy.prototype.HEADERS_RECEIVED = 2; 88remoting.XMLHttpRequestProxy.prototype.LOADING = 3; 89remoting.XMLHttpRequestProxy.prototype.DONE = 4; 90