/* Copyright 2013 The Chromium Authors. All rights reserved. * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ /** * @fileoverview * The sandbox isn't allowed to make XHRs, so they have to be proxied to the * main process. The XMLHttpRequestProxy class is API-compatible with the * XMLHttpRequest class, but forwards the requests to the main process where * they can be serviced. The forwarding of XHRs and responses is handled by * the WcsSandboxContent class; this class is just a thin wrapper to hook XHR * creations by JS running in the sandbox. * * Because XMLHttpRequest is implemented natively, and because the intent is * to replace its functionality entirely, prototype linking is not a suitable * approach here, so much of the interface definition is duplicated from the * w3c specification: http://www.w3.org/TR/XMLHttpRequest */ 'use strict'; /** @suppress {duplicate} */ var remoting = remoting || {}; /** * @constructor * @extends {XMLHttpRequest} */ remoting.XMLHttpRequestProxy = function() { /** * @type {{headers: Object}} */ this.sandbox_ipc = { headers: {} }; /** * @type {number} * @private */ this.xhr_id_ = -1; }; remoting.XMLHttpRequestProxy.prototype.open = function( method, url, async, user, password) { if (!async) { console.warn('Synchronous XHRs are not supported.'); } this.sandbox_ipc.method = method; this.sandbox_ipc.url = url.toString(); this.sandbox_ipc.user = user; this.sandbox_ipc.password = password; }; remoting.XMLHttpRequestProxy.prototype.send = function(data) { if (remoting.sandboxContent) { this.sandbox_ipc.data = data; this.xhr_id_ = remoting.sandboxContent.sendXhr(this); } }; remoting.XMLHttpRequestProxy.prototype.setRequestHeader = function( header, value) { this.sandbox_ipc.headers[header] = value; }; remoting.XMLHttpRequestProxy.prototype.abort = function() { if (this.xhr_id_ != -1) { remoting.sandboxContent.abortXhr(this.xhr_id_); } }; remoting.XMLHttpRequestProxy.prototype.getResponseHeader = function(header) { console.error('Sandbox: unproxied getResponseHeader(' + header + ') called.'); }; remoting.XMLHttpRequestProxy.prototype.getAllResponseHeaders = function() { console.error('Sandbox: unproxied getAllResponseHeaders called.'); }; remoting.XMLHttpRequestProxy.prototype.overrideMimeType = function() { console.error('Sandbox: unproxied overrideMimeType called.'); }; remoting.XMLHttpRequestProxy.prototype.UNSENT = 0; remoting.XMLHttpRequestProxy.prototype.OPENED = 1; remoting.XMLHttpRequestProxy.prototype.HEADERS_RECEIVED = 2; remoting.XMLHttpRequestProxy.prototype.LOADING = 3; remoting.XMLHttpRequestProxy.prototype.DONE = 4;