blob: 17f8136ef1697faaf4acb9e8b68e5732db96d419 [file] [log] [blame]
// Copyright 2016 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
/**
* @fileoverview A bunch of XML HTTP recipes used to do RPC from JavaScript
*/
/**
* The active x identifier used for ie.
* @type String
* @private
*/
var XH_ieProgId_;
// Domain for XMLHttpRequest readyState
var XML_READY_STATE_UNINITIALIZED = 0;
var XML_READY_STATE_LOADING = 1;
var XML_READY_STATE_LOADED = 2;
var XML_READY_STATE_INTERACTIVE = 3;
var XML_READY_STATE_COMPLETED = 4;
/**
* Initialize the private state used by other functions.
* @private
*/
function XH_XmlHttpInit_() {
// The following blog post describes what PROG IDs to use to create the
// XMLHTTP object in Internet Explorer:
// http://blogs.msdn.com/xmlteam/archive/2006/10/23/using-the-right-version-of-msxml-in-internet-explorer.aspx
// However we do not (yet) fully trust that this will be OK for old versions
// of IE on Win9x so we therefore keep the last 2.
// Versions 4 and 5 have been removed because 3.0 is the preferred "fallback"
// per the article above.
// - Version 5 was built for Office applications and is not recommended for
// web applications.
// - Version 4 has been superseded by 6 and is only intended for legacy apps.
// - Version 3 has a wide install base and is serviced regularly with the OS.
/**
* Candidate Active X types.
* @type Array.<String>
* @private
*/
let XH_ACTIVE_X_IDENTS = ['MSXML2.XMLHTTP.6.0', 'MSXML2.XMLHTTP.3.0',
'MSXML2.XMLHTTP', 'Microsoft.XMLHTTP'];
if (typeof XMLHttpRequest == 'undefined' &&
typeof ActiveXObject != 'undefined') {
for (let i = 0; i < XH_ACTIVE_X_IDENTS.length; i++) {
let candidate = XH_ACTIVE_X_IDENTS[i];
try {
new ActiveXObject(candidate);
XH_ieProgId_ = candidate;
break;
} catch (e) {
// do nothing; try next choice
}
}
// couldn't find any matches
if (!XH_ieProgId_) {
throw Error('Could not create ActiveXObject. ActiveX might be disabled,' +
' or MSXML might not be installed.');
}
}
}
XH_XmlHttpInit_();
/**
* Create and return an xml http request object that can be passed to
* {@link #XH_XmlHttpGET} or {@link #XH_XmlHttpPOST}.
*/
function XH_XmlHttpCreate() {
if (XH_ieProgId_) {
return new ActiveXObject(XH_ieProgId_);
} else {
return new XMLHttpRequest();
}
}
/**
* Send a get request.
* @param {XMLHttpRequest} xmlHttp as from {@link XH_XmlHttpCreate}.
* @param {string} url the service to contact
* @param {Function} handler function called when the response is received.
*/
function XH_XmlHttpGET(xmlHttp, url, handler) {
xmlHttp.open('GET', url, true);
xmlHttp.onreadystatechange = handler;
XH_XmlHttpSend(xmlHttp, null);
}
/**
* Send a post request.
* @param {XMLHttpRequest} xmlHttp as from {@link XH_XmlHttpCreate}.
* @param {string} url the service to contact
* @param {string} data the request content.
* @param {Function} handler function called when the response is received.
*/
function XH_XmlHttpPOST(xmlHttp, url, data, handler) {
xmlHttp.open('POST', url, true);
xmlHttp.onreadystatechange = handler;
xmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
XH_XmlHttpSend(xmlHttp, data);
}
/**
* Calls 'send' on the XMLHttpRequest object and calls a function called 'log'
* if any error occured.
*
* @deprecated This dependes on a function called 'log'. You are better off
* handling your errors on application level.
*
* @param {XMLHttpRequest} xmlHttp as from {@link XH_XmlHttpCreate}.
* @param {string|null} data the request content.
*/
function XH_XmlHttpSend(xmlHttp, data) {
try {
xmlHttp.send(data);
} catch (e) {
// You may want to log/debug this error one that you should be aware of is
// e.number == -2146697208, which occurs when the 'Languages...' setting in
// IE is empty.
// This is not entirely true. The same error code is used when the user is
// off line.
console.log('XMLHttpSend failed ' + e.toString() + '<br>' + e.stack);
throw e;
}
}