mirror of
https://github.com/Mibew/tray.git
synced 2025-01-22 18:10:34 +03:00
Added JavaScript version of the Mibew API and tests for it
This commit is contained in:
parent
fcba6ec6f4
commit
58d015c247
20
src/messenger/tests/client_side/qunit/index.html
Normal file
20
src/messenger/tests/client_side/qunit/index.html
Normal file
@ -0,0 +1,20 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Mibew. Unit tests for JavaScript</title>
|
||||
<link rel="stylesheet" href="qunit.css" type="text/css" />
|
||||
<script type="text/javascript" src="qunit.js"></script>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
</head>
|
||||
<body>
|
||||
<div id="qunit"></div>
|
||||
<div id="qunit-fixture"></div>
|
||||
|
||||
<!-- Start of the mibew_api.js tests -->
|
||||
<script type="text/javascript" src="/webim/js/164/json2.js"></script>
|
||||
<script type="text/javascript" src="/webim/js/164/mibewapi.js"></script>
|
||||
<script type="text/javascript" src="test_cases/mibewapi_tests.js"></script>
|
||||
<!-- End of the mibew_api.js tests -->
|
||||
|
||||
</body>
|
||||
</html>
|
231
src/messenger/tests/client_side/qunit/qunit.css
Normal file
231
src/messenger/tests/client_side/qunit/qunit.css
Normal file
@ -0,0 +1,231 @@
|
||||
/**
|
||||
* QUnit v1.9.0 - A JavaScript Unit Testing Framework
|
||||
*
|
||||
* http://docs.jquery.com/QUnit
|
||||
*
|
||||
* Copyright (c) 2012 John Resig, Jörn Zaefferer
|
||||
* Dual licensed under the MIT (MIT-LICENSE.txt)
|
||||
* or GPL (GPL-LICENSE.txt) licenses.
|
||||
*/
|
||||
|
||||
/** Font Family and Sizes */
|
||||
|
||||
#qunit-tests, #qunit-header, #qunit-banner, #qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult {
|
||||
font-family: "Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial, sans-serif;
|
||||
}
|
||||
|
||||
#qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult, #qunit-tests li { font-size: small; }
|
||||
#qunit-tests { font-size: smaller; }
|
||||
|
||||
|
||||
/** Resets */
|
||||
|
||||
#qunit-tests, #qunit-tests ol, #qunit-header, #qunit-banner, #qunit-userAgent, #qunit-testresult {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
|
||||
/** Header */
|
||||
|
||||
#qunit-header {
|
||||
padding: 0.5em 0 0.5em 1em;
|
||||
|
||||
color: #8699a4;
|
||||
background-color: #0d3349;
|
||||
|
||||
font-size: 1.5em;
|
||||
line-height: 1em;
|
||||
font-weight: normal;
|
||||
|
||||
border-radius: 5px 5px 0 0;
|
||||
-moz-border-radius: 5px 5px 0 0;
|
||||
-webkit-border-top-right-radius: 5px;
|
||||
-webkit-border-top-left-radius: 5px;
|
||||
}
|
||||
|
||||
#qunit-header a {
|
||||
text-decoration: none;
|
||||
color: #c2ccd1;
|
||||
}
|
||||
|
||||
#qunit-header a:hover,
|
||||
#qunit-header a:focus {
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
#qunit-testrunner-toolbar label {
|
||||
display: inline-block;
|
||||
padding: 0 .5em 0 .1em;
|
||||
}
|
||||
|
||||
#qunit-banner {
|
||||
height: 5px;
|
||||
}
|
||||
|
||||
#qunit-testrunner-toolbar {
|
||||
padding: 0.5em 0 0.5em 2em;
|
||||
color: #5E740B;
|
||||
background-color: #eee;
|
||||
}
|
||||
|
||||
#qunit-userAgent {
|
||||
padding: 0.5em 0 0.5em 2.5em;
|
||||
background-color: #2b81af;
|
||||
color: #fff;
|
||||
text-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px;
|
||||
}
|
||||
|
||||
|
||||
/** Tests: Pass/Fail */
|
||||
|
||||
#qunit-tests {
|
||||
list-style-position: inside;
|
||||
}
|
||||
|
||||
#qunit-tests li {
|
||||
padding: 0.4em 0.5em 0.4em 2.5em;
|
||||
border-bottom: 1px solid #fff;
|
||||
list-style-position: inside;
|
||||
}
|
||||
|
||||
#qunit-tests.hidepass li.pass, #qunit-tests.hidepass li.running {
|
||||
display: none;
|
||||
}
|
||||
|
||||
#qunit-tests li strong {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
#qunit-tests li a {
|
||||
padding: 0.5em;
|
||||
color: #c2ccd1;
|
||||
text-decoration: none;
|
||||
}
|
||||
#qunit-tests li a:hover,
|
||||
#qunit-tests li a:focus {
|
||||
color: #000;
|
||||
}
|
||||
|
||||
#qunit-tests ol {
|
||||
margin-top: 0.5em;
|
||||
padding: 0.5em;
|
||||
|
||||
background-color: #fff;
|
||||
|
||||
border-radius: 5px;
|
||||
-moz-border-radius: 5px;
|
||||
-webkit-border-radius: 5px;
|
||||
}
|
||||
|
||||
#qunit-tests table {
|
||||
border-collapse: collapse;
|
||||
margin-top: .2em;
|
||||
}
|
||||
|
||||
#qunit-tests th {
|
||||
text-align: right;
|
||||
vertical-align: top;
|
||||
padding: 0 .5em 0 0;
|
||||
}
|
||||
|
||||
#qunit-tests td {
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
#qunit-tests pre {
|
||||
margin: 0;
|
||||
white-space: pre-wrap;
|
||||
word-wrap: break-word;
|
||||
}
|
||||
|
||||
#qunit-tests del {
|
||||
background-color: #e0f2be;
|
||||
color: #374e0c;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
#qunit-tests ins {
|
||||
background-color: #ffcaca;
|
||||
color: #500;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
/*** Test Counts */
|
||||
|
||||
#qunit-tests b.counts { color: black; }
|
||||
#qunit-tests b.passed { color: #5E740B; }
|
||||
#qunit-tests b.failed { color: #710909; }
|
||||
|
||||
#qunit-tests li li {
|
||||
padding: 5px;
|
||||
background-color: #fff;
|
||||
border-bottom: none;
|
||||
list-style-position: inside;
|
||||
}
|
||||
|
||||
/*** Passing Styles */
|
||||
|
||||
#qunit-tests li li.pass {
|
||||
color: #3c510c;
|
||||
background-color: #fff;
|
||||
border-left: 10px solid #C6E746;
|
||||
}
|
||||
|
||||
#qunit-tests .pass { color: #528CE0; background-color: #D2E0E6; }
|
||||
#qunit-tests .pass .test-name { color: #366097; }
|
||||
|
||||
#qunit-tests .pass .test-actual,
|
||||
#qunit-tests .pass .test-expected { color: #999999; }
|
||||
|
||||
#qunit-banner.qunit-pass { background-color: #C6E746; }
|
||||
|
||||
/*** Failing Styles */
|
||||
|
||||
#qunit-tests li li.fail {
|
||||
color: #710909;
|
||||
background-color: #fff;
|
||||
border-left: 10px solid #EE5757;
|
||||
white-space: pre;
|
||||
}
|
||||
|
||||
#qunit-tests > li:last-child {
|
||||
border-radius: 0 0 5px 5px;
|
||||
-moz-border-radius: 0 0 5px 5px;
|
||||
-webkit-border-bottom-right-radius: 5px;
|
||||
-webkit-border-bottom-left-radius: 5px;
|
||||
}
|
||||
|
||||
#qunit-tests .fail { color: #000000; background-color: #EE5757; }
|
||||
#qunit-tests .fail .test-name,
|
||||
#qunit-tests .fail .module-name { color: #000000; }
|
||||
|
||||
#qunit-tests .fail .test-actual { color: #EE5757; }
|
||||
#qunit-tests .fail .test-expected { color: green; }
|
||||
|
||||
#qunit-banner.qunit-fail { background-color: #EE5757; }
|
||||
|
||||
|
||||
/** Result */
|
||||
|
||||
#qunit-testresult {
|
||||
padding: 0.5em 0.5em 0.5em 2.5em;
|
||||
|
||||
color: #2b81af;
|
||||
background-color: #D2E0E6;
|
||||
|
||||
border-bottom: 1px solid white;
|
||||
}
|
||||
#qunit-testresult .module-name {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
/** Fixture */
|
||||
|
||||
#qunit-fixture {
|
||||
position: absolute;
|
||||
top: -10000px;
|
||||
left: -10000px;
|
||||
width: 1000px;
|
||||
height: 1000px;
|
||||
}
|
1932
src/messenger/tests/client_side/qunit/qunit.js
Normal file
1932
src/messenger/tests/client_side/qunit/qunit.js
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,713 @@
|
||||
// Testing MibewAPI class
|
||||
module("MibewAPI");
|
||||
|
||||
/**
|
||||
* Represents test interaction type
|
||||
*
|
||||
* @constructor
|
||||
*/
|
||||
function MibewAPITestInteraction() {
|
||||
this.reservedFunctionNames = [
|
||||
'result'
|
||||
];
|
||||
|
||||
this.obligatoryArguments = [
|
||||
'return',
|
||||
'references'
|
||||
];
|
||||
|
||||
this.getDefaultObligatoryArguments = function(){
|
||||
return {
|
||||
"return" : {},
|
||||
"references" : {}
|
||||
}
|
||||
}
|
||||
}
|
||||
MibewAPITestInteraction.prototype = new MibewAPIInteraction();
|
||||
|
||||
// Tests for the class constructor
|
||||
test("constructor", function(){
|
||||
// Incorrect initialization
|
||||
try {
|
||||
new MibewAPI({});
|
||||
} catch (e) {
|
||||
equal(
|
||||
e.message,
|
||||
"Wrong interaction type",
|
||||
"Test with wrong constructor argument"
|
||||
);
|
||||
}
|
||||
|
||||
// Correct Initialization
|
||||
new MibewAPI(new MibewAPITestInteraction());
|
||||
ok(true, "Correct initialization");
|
||||
});
|
||||
|
||||
// Tests for the checkFunction method
|
||||
test("checkFunction", function(){
|
||||
var mibewAPI = new MibewAPI(new MibewAPITestInteraction());
|
||||
|
||||
// Try to check empty function object
|
||||
try {
|
||||
mibewAPI.checkFunction({});
|
||||
} catch (e) {
|
||||
equal(
|
||||
e.message,
|
||||
"Cannot call for function with no name",
|
||||
"Test with empty function object"
|
||||
);
|
||||
}
|
||||
|
||||
// Try to check function with no name
|
||||
try {
|
||||
mibewAPI.checkFunction({"function": ""});
|
||||
} catch (e) {
|
||||
equal(
|
||||
e.message,
|
||||
"Cannot call for function with no name",
|
||||
"Test with a function with no name"
|
||||
);
|
||||
}
|
||||
|
||||
// Try to check function with reserved name and filterReservedFunctions
|
||||
// argument equals to true
|
||||
try {
|
||||
mibewAPI.checkFunction({"function" : "result"}, true);
|
||||
} catch (e) {
|
||||
equal(
|
||||
e.message,
|
||||
"'result' is reserved function name",
|
||||
"Test with reserved function's name and filterReservedFunctions " +
|
||||
"arguments set to true"
|
||||
);
|
||||
}
|
||||
|
||||
// Try to check function with reserved name and filterReservedFunctions
|
||||
// argument equals to false. Arguments list is undefined
|
||||
try {
|
||||
mibewAPI.checkFunction({"function": "result"}, false);
|
||||
} catch (e) {
|
||||
equal(
|
||||
e.message,
|
||||
"There are no arguments in 'result' function",
|
||||
"Test with reserved function's name and filterReservedFunctions " +
|
||||
"arguments set to false. Arguments list is undefined"
|
||||
);
|
||||
}
|
||||
|
||||
// Try to check function with not all obligatory arguments
|
||||
try {
|
||||
mibewAPI.checkFunction({
|
||||
"function" : "test",
|
||||
"arguments" : {"return" : []}
|
||||
});
|
||||
} catch (e) {
|
||||
equal(
|
||||
e.message,
|
||||
"Not all obligatory arguments are set in 'test' function",
|
||||
"Test with not all obligatory arguments"
|
||||
);
|
||||
}
|
||||
|
||||
// Try to check correct function
|
||||
mibewAPI.checkFunction({
|
||||
"function" : "test",
|
||||
"arguments" : {
|
||||
"return" : [],
|
||||
"references" : [],
|
||||
"testArgument" : "testValue"
|
||||
}
|
||||
});
|
||||
ok(true, "Test correct function");
|
||||
});
|
||||
|
||||
// Test for the checkRequest method
|
||||
test("checkRequest", function() {
|
||||
var mibewAPI = new MibewAPI(new MibewAPITestInteraction());
|
||||
var correctFunction = {
|
||||
"function" : "test",
|
||||
"arguments" : {
|
||||
"return" : [],
|
||||
"references" : [],
|
||||
"testArgument" : "testValue"
|
||||
}
|
||||
}
|
||||
|
||||
// Try to check request without token
|
||||
try {
|
||||
mibewAPI.checkRequest({});
|
||||
} catch (e) {
|
||||
equal(
|
||||
e.message,
|
||||
"Empty token",
|
||||
"Test with empty token"
|
||||
);
|
||||
}
|
||||
|
||||
// Try to check request with wrong token type
|
||||
try {
|
||||
mibewAPI.checkRequest({"token" : false});
|
||||
} catch (e) {
|
||||
equal(
|
||||
e.message,
|
||||
"Wrong token type",
|
||||
"Test with wrong token type"
|
||||
);
|
||||
}
|
||||
|
||||
// Try to check request with empty token string
|
||||
try {
|
||||
mibewAPI.checkRequest({"token" : ""});
|
||||
} catch (e) {
|
||||
equal(
|
||||
e.message,
|
||||
"Empty token",
|
||||
"Test with empty token string"
|
||||
);
|
||||
}
|
||||
|
||||
// Try to check request with no functions list
|
||||
try {
|
||||
mibewAPI.checkRequest({"token" : "123"});
|
||||
} catch (e) {
|
||||
equal(
|
||||
e.message,
|
||||
"Empty functions set",
|
||||
"Test with no functions list"
|
||||
);
|
||||
}
|
||||
|
||||
// Try to check request with functions list of the wrong type
|
||||
try {
|
||||
mibewAPI.checkRequest({"token" : "123", "functions" : {}});
|
||||
} catch (e) {
|
||||
equal(
|
||||
e.message,
|
||||
"Empty functions set",
|
||||
"Test with wrong type of the functions list"
|
||||
);
|
||||
}
|
||||
|
||||
// Try to check request with empty functions list
|
||||
try {
|
||||
mibewAPI.checkRequest({"token" : "123", "functions" : []});
|
||||
} catch (e) {
|
||||
equal(
|
||||
e.message,
|
||||
"Empty functions set",
|
||||
"Test with empty functions list"
|
||||
);
|
||||
}
|
||||
|
||||
// Try to check correct request
|
||||
mibewAPI.checkRequest({
|
||||
"token" : "123",
|
||||
"functions" : [
|
||||
correctFunction,
|
||||
correctFunction
|
||||
]
|
||||
});
|
||||
ok(true, "Test with correct request");
|
||||
});
|
||||
|
||||
// Test for the checkPackage method
|
||||
test("checkPackage", function() {
|
||||
var mibewAPI = new MibewAPI(new MibewAPITestInteraction());
|
||||
var correctRequest = {
|
||||
"token" : "123",
|
||||
"functions" : [
|
||||
{
|
||||
"function" : "test",
|
||||
"arguments" : {
|
||||
"return" : [],
|
||||
"references" : []
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
// Try to check package with no signature
|
||||
try {
|
||||
mibewAPI.checkPackage({});
|
||||
} catch (e) {
|
||||
equal(
|
||||
e.message,
|
||||
"Missed package signature",
|
||||
"Test package with no signature"
|
||||
);
|
||||
}
|
||||
|
||||
// Try to check package with no protocol version
|
||||
try {
|
||||
mibewAPI.checkPackage({"signature" : "test_signature"});
|
||||
} catch (e) {
|
||||
equal(
|
||||
e.message,
|
||||
"Missed protocol version",
|
||||
"Test package with no protocol"
|
||||
);
|
||||
}
|
||||
|
||||
// Try to check package with wrong protocol version
|
||||
try {
|
||||
mibewAPI.checkPackage({
|
||||
"signature" : "test_signature",
|
||||
"proto" : -12
|
||||
});
|
||||
} catch (e) {
|
||||
equal(
|
||||
e.message,
|
||||
"Wrong protocol version",
|
||||
"Test pacakge with wrong protocol version"
|
||||
);
|
||||
}
|
||||
|
||||
// Try to check package with no 'async' flag value
|
||||
try {
|
||||
mibewAPI.checkPackage({
|
||||
"signature" : "test_signature",
|
||||
"proto" : mibewAPI.protocolVersion
|
||||
});
|
||||
} catch (e) {
|
||||
equal(
|
||||
e.message,
|
||||
"'async' flag is missed",
|
||||
"Test with no 'async' flag"
|
||||
);
|
||||
}
|
||||
|
||||
// Try to check package with wrong 'async' flag value
|
||||
try {
|
||||
mibewAPI.checkPackage({
|
||||
"signature" : "test_signature",
|
||||
"proto" : mibewAPI.protocolVersion,
|
||||
"async" : "wrong_async_flag"
|
||||
});
|
||||
} catch (e) {
|
||||
equal(
|
||||
e.message,
|
||||
"Wrong 'async' flag value",
|
||||
"Test with wrong 'async' flag value"
|
||||
);
|
||||
}
|
||||
|
||||
// Try to check package with no requests list
|
||||
try {
|
||||
mibewAPI.checkPackage({
|
||||
"signature" : "test_signature",
|
||||
"proto" : mibewAPI.protocolVersion,
|
||||
"async" : true
|
||||
});
|
||||
} catch (e) {
|
||||
equal(
|
||||
e.message,
|
||||
"Empty requests set",
|
||||
"Test with no requests list"
|
||||
);
|
||||
}
|
||||
|
||||
// Try to check package with wrong requests list type
|
||||
try {
|
||||
mibewAPI.checkPackage({
|
||||
"signature" : "test_signature",
|
||||
"proto" : mibewAPI.protocolVersion,
|
||||
"async" : true,
|
||||
"requests" : {}
|
||||
});
|
||||
} catch (e) {
|
||||
equal(
|
||||
e.message,
|
||||
"Empty requests set",
|
||||
"Test with wrong requests list type"
|
||||
);
|
||||
}
|
||||
|
||||
// Try to check package with empty requests list
|
||||
try {
|
||||
mibewAPI.checkPackage({
|
||||
"signature" : "test_signature",
|
||||
"proto" : mibewAPI.protocolVersion,
|
||||
"async" : true,
|
||||
"requests" : []
|
||||
});
|
||||
} catch (e) {
|
||||
equal(
|
||||
e.message,
|
||||
"Empty requests set",
|
||||
"Test with empty requests list"
|
||||
);
|
||||
}
|
||||
|
||||
// Try to check correct package
|
||||
mibewAPI.checkPackage({
|
||||
"signature" : "test_signature",
|
||||
"proto" : mibewAPI.protocolVersion,
|
||||
"async" : true,
|
||||
'requests' : [
|
||||
correctRequest,
|
||||
correctRequest
|
||||
]
|
||||
});
|
||||
ok(true, "Test with correct package");
|
||||
});
|
||||
|
||||
// Test for the getResultFunction method
|
||||
test("getResult", function() {
|
||||
var mibewAPI = new MibewAPI(new MibewAPITestInteraction);
|
||||
var resultFunction = {
|
||||
"function" : "result",
|
||||
"test_field" : "test_value"
|
||||
}
|
||||
|
||||
// Try to get result function from function list, but it contains more than
|
||||
// one 'result' function
|
||||
try {
|
||||
mibewAPI.getResultFunction([
|
||||
{"function" : "result"},
|
||||
{"function" : "result"},
|
||||
]);
|
||||
} catch (e) {
|
||||
equal(
|
||||
e.message,
|
||||
"Function 'result' already exists in functions list",
|
||||
"Test more than one 'result' functions in functions list"
|
||||
)
|
||||
}
|
||||
|
||||
// Try to get 'result' function from functions list that have no 'result'
|
||||
// function. 'existance' argument set to true
|
||||
try {
|
||||
mibewAPI.getResultFunction({}, true);
|
||||
} catch (e) {
|
||||
equal(
|
||||
e.message,
|
||||
"There is no 'result' function in functions list",
|
||||
"Test with no 'result' function in functions list"
|
||||
);
|
||||
}
|
||||
|
||||
// Try to get 'result' function from functions list that have no 'result'
|
||||
// function. 'existance' argument set to false
|
||||
equal(
|
||||
mibewAPI.getResultFunction({}, false),
|
||||
null,
|
||||
"Test with no 'result' function in functions list, 'existance' " +
|
||||
"argument equals to false and null as the result functionon returned"
|
||||
);
|
||||
|
||||
// Try to get 'result' function from functions list that have no 'result'
|
||||
// function. 'existance' argument set to null
|
||||
equal(
|
||||
mibewAPI.getResultFunction({}, null),
|
||||
null,
|
||||
"Test with no 'result' function in functions list, 'existance' " +
|
||||
"argument equals to null and null as the result functionon returned"
|
||||
);
|
||||
|
||||
// Try to get 'result' function from functions list that have 'result'
|
||||
// function. 'existance' argument set to false
|
||||
try {
|
||||
mibewAPI.getResultFunction([
|
||||
{"function" : "result"}
|
||||
], false);
|
||||
} catch (e) {
|
||||
equal(
|
||||
e.message,
|
||||
"There is 'result' function in functions list",
|
||||
"Test with 'result' function in functions list"
|
||||
);
|
||||
}
|
||||
|
||||
// Try to get result function
|
||||
deepEqual(
|
||||
mibewAPI.getResultFunction([resultFunction]),
|
||||
resultFunction,
|
||||
"Test of get 'result' function"
|
||||
);
|
||||
});
|
||||
|
||||
// Test for the builResult method
|
||||
test("buildResult", function() {
|
||||
var mibewAPIInteraction = new MibewAPITestInteraction;
|
||||
var mibewAPI = new MibewAPI(mibewAPIInteraction);
|
||||
var testArguments = {
|
||||
"first" : "test_value",
|
||||
"second" : "test_value"
|
||||
}
|
||||
var token = "some token";
|
||||
var testPackage = {
|
||||
"token" : token,
|
||||
"functions" : [
|
||||
{
|
||||
"function" : "result",
|
||||
"arguments" : {
|
||||
"first" : "test_value",
|
||||
"second" : "test_value",
|
||||
"return" : {},
|
||||
"references" : {}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
// Compare result package
|
||||
deepEqual(
|
||||
mibewAPI.buildResult(testArguments, token),
|
||||
testPackage,
|
||||
"Test returned package"
|
||||
);
|
||||
});
|
||||
|
||||
// Test for the encodePackage Method
|
||||
test("encodePackage", function() {
|
||||
var mibewAPI = new MibewAPI(new MibewAPITestInteraction);
|
||||
var testRequest = mibewAPI.buildResult({}, "some_token");
|
||||
var testPackage = {
|
||||
"signature" : "",
|
||||
"proto" : mibewAPI.protocolVersion,
|
||||
"async" : true,
|
||||
"requests" : [testRequest]
|
||||
}
|
||||
|
||||
// Compare encoded packages
|
||||
equal(
|
||||
mibewAPI.encodePackage([testRequest]),
|
||||
encodeURIComponent(JSON.stringify(testPackage)),
|
||||
"Test encoded package"
|
||||
);
|
||||
});
|
||||
|
||||
// Test for the decodePackage method
|
||||
test("decodePackage", function() {
|
||||
var mibewAPI = new MibewAPI(new MibewAPITestInteraction);
|
||||
var testRequest = mibewAPI.buildResult({}, "some_token");
|
||||
var testPackage = {
|
||||
"signature" : "",
|
||||
"proto" : mibewAPI.protocolVersion,
|
||||
"async" : true,
|
||||
"requests" : [testRequest]
|
||||
}
|
||||
var encodedPackage = mibewAPI.encodePackage([testRequest]);
|
||||
|
||||
// Try to decode broken package
|
||||
try {
|
||||
mibewAPI.decodePackage(encodedPackage.substr(
|
||||
Math.floor(encodedPackage.length / 2)
|
||||
));
|
||||
} catch(e) {
|
||||
ok(e.name = "SyntaxError","Test broken package");
|
||||
}
|
||||
|
||||
// Compare decoded packages
|
||||
deepEqual(
|
||||
mibewAPI.decodePackage(encodedPackage),
|
||||
testPackage,
|
||||
"Test decoded package"
|
||||
)
|
||||
});
|
||||
|
||||
// Testing MibewAPIExecutionContext class
|
||||
module("MibewAPIExecutionContext");
|
||||
|
||||
// Test for the storeFunctionResults method
|
||||
test("storeFunctionResults", function() {
|
||||
var context = new MibewAPIExecutionContext();
|
||||
|
||||
// Try to store result for function with inconsistent 'return' argument and
|
||||
// function's result
|
||||
try {
|
||||
context.storeFunctionResults(
|
||||
{
|
||||
"function" : "test",
|
||||
"arguments" : {
|
||||
"return" : {"test_field" : "alias_for_test_field"}
|
||||
}
|
||||
},
|
||||
{"another_test_field" : "another_test_value"}
|
||||
);
|
||||
} catch (e) {
|
||||
equal(
|
||||
e.message,
|
||||
"Variable with name 'test_field' is undefined in " +
|
||||
"the results of the 'test' function",
|
||||
"Test with inconsistent 'return' argument and function results"
|
||||
);
|
||||
}
|
||||
|
||||
// Try to store correct results
|
||||
context.storeFunctionResults(
|
||||
{
|
||||
"function" : "test",
|
||||
"arguments" : {
|
||||
"return" : {
|
||||
"test_field" : "alias_for_test_field",
|
||||
"another_test_field" : "another_alias"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"test_field" : "test_value",
|
||||
"another_test_field" : "another_test_value"
|
||||
}
|
||||
);
|
||||
deepEqual(
|
||||
context.returnValues,
|
||||
{
|
||||
"alias_for_test_field" : "test_value",
|
||||
"another_alias" : "another_test_value"
|
||||
},
|
||||
"Test returnValues after storing correct results"
|
||||
);
|
||||
deepEqual(
|
||||
context.functionsResults,
|
||||
[{
|
||||
"test_field" : "test_value",
|
||||
"another_test_field" : "another_test_value"
|
||||
}],
|
||||
"Test functionsResults after storing correct results"
|
||||
);
|
||||
});
|
||||
|
||||
// Test for the getArgumentsList method
|
||||
test("getArgumentsList", function(){
|
||||
var context = new MibewAPIExecutionContext();
|
||||
|
||||
// Try to reference to undefined function number in execution context
|
||||
try {
|
||||
context.getArgumentsList({
|
||||
"function" : "test",
|
||||
"arguments" : {
|
||||
"return" : {},
|
||||
"references" : {"test" : 1},
|
||||
"test" : "test_value"
|
||||
}
|
||||
});
|
||||
} catch (e) {
|
||||
equal(
|
||||
e.message,
|
||||
"Wrong reference in 'test' function. Function #1 does not call yet.",
|
||||
"Test with reference to function that does not called function"
|
||||
);
|
||||
}
|
||||
|
||||
// Store some test results in context
|
||||
context.storeFunctionResults(
|
||||
{
|
||||
"function" : "test",
|
||||
"arguments" : {
|
||||
"return" : {
|
||||
"test_field" : "alias_for_test_field",
|
||||
"another_test_field" : "another_alias"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"test_field" : "test_value",
|
||||
"another_test_field" : "another_test_value"
|
||||
}
|
||||
);
|
||||
|
||||
// Check undefined target name
|
||||
try {
|
||||
context.getArgumentsList({
|
||||
"function" : "test",
|
||||
"arguments" : {
|
||||
"return" : {},
|
||||
"references" : {"test" : 1}
|
||||
}
|
||||
});
|
||||
} catch (e) {
|
||||
equal(
|
||||
e.message,
|
||||
"Wrong reference in 'test' function. Empty 'test' argument.",
|
||||
"Test with undefined reference argument"
|
||||
);
|
||||
}
|
||||
|
||||
// Check empty target name
|
||||
try {
|
||||
context.getArgumentsList({
|
||||
"function" : "test",
|
||||
"arguments" : {
|
||||
"return" : {},
|
||||
"references" : {"test" : 1},
|
||||
"test" : ""
|
||||
}
|
||||
});
|
||||
} catch (e) {
|
||||
equal(
|
||||
e.message,
|
||||
"Wrong reference in 'test' function. Empty 'test' argument.",
|
||||
"Test with empty reference argument"
|
||||
);
|
||||
}
|
||||
|
||||
// Check undefined target value
|
||||
try {
|
||||
context.getArgumentsList({
|
||||
"function" : "test",
|
||||
"arguments" : {
|
||||
"return" : {},
|
||||
"references" : {"test" : 1},
|
||||
"test" : "undefined_target_value"
|
||||
}
|
||||
});
|
||||
} catch (e) {
|
||||
equal(
|
||||
e.message,
|
||||
"Wrong reference in 'test' function. There is no " +
|
||||
"'undefined_target_value' argument in #1 function results",
|
||||
"Test with undefined target value"
|
||||
);
|
||||
}
|
||||
|
||||
// Check correct references
|
||||
deepEqual(
|
||||
context.getArgumentsList({
|
||||
"function" : "test",
|
||||
"arguments" : {
|
||||
"return" : {},
|
||||
"references" : {"test" : 1},
|
||||
"test" : "test_field"
|
||||
}
|
||||
}),
|
||||
{
|
||||
"return" : {},
|
||||
"references" : {"test" : 1},
|
||||
"test" : "test_value"
|
||||
},
|
||||
"Test returned arguments list"
|
||||
);
|
||||
});
|
||||
|
||||
// Test for the getResults method
|
||||
test("getResults", function() {
|
||||
var context = new MibewAPIExecutionContext();
|
||||
|
||||
// Store some test results in context
|
||||
context.storeFunctionResults(
|
||||
{
|
||||
"function" : "test",
|
||||
"arguments" : {
|
||||
"return" : {
|
||||
"test_field" : "alias_for_test_field",
|
||||
"another_test_field" : "another_alias"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"test_field" : "test_value",
|
||||
"another_test_field" : "another_test_value"
|
||||
}
|
||||
);
|
||||
|
||||
// Check returned values
|
||||
deepEqual(
|
||||
context.getResults(),
|
||||
{
|
||||
"alias_for_test_field" : "test_value",
|
||||
"another_alias" : "another_test_value"
|
||||
},
|
||||
"Test returned values"
|
||||
);
|
||||
});
|
13
src/messenger/webim/js/164/json2.js
Normal file
13
src/messenger/webim/js/164/json2.js
Normal file
@ -0,0 +1,13 @@
|
||||
/*
|
||||
json2.js
|
||||
2011-10-19
|
||||
Public Domain.
|
||||
See http://www.JSON.org/js.html
|
||||
*/
|
||||
var JSON;JSON||(JSON={});
|
||||
(function(){function k(a){return 10>a?"0"+a:a}function o(a){p.lastIndex=0;return p.test(a)?'"'+a.replace(p,function(a){var c=r[a];return"string"===typeof c?c:"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+a+'"'}function m(a,j){var c,d,h,n,g=e,f,b=j[a];b&&("object"===typeof b&&"function"===typeof b.toJSON)&&(b=b.toJSON(a));"function"===typeof i&&(b=i.call(j,a,b));switch(typeof b){case "string":return o(b);case "number":return isFinite(b)?String(b):"null";case "boolean":case "null":return String(b);case "object":if(!b)return"null";
|
||||
e+=l;f=[];if("[object Array]"===Object.prototype.toString.apply(b)){n=b.length;for(c=0;c<n;c+=1)f[c]=m(c,b)||"null";h=0===f.length?"[]":e?"[\n"+e+f.join(",\n"+e)+"\n"+g+"]":"["+f.join(",")+"]";e=g;return h}if(i&&"object"===typeof i){n=i.length;for(c=0;c<n;c+=1)"string"===typeof i[c]&&(d=i[c],(h=m(d,b))&&f.push(o(d)+(e?": ":":")+h))}else for(d in b)Object.prototype.hasOwnProperty.call(b,d)&&(h=m(d,b))&&f.push(o(d)+(e?": ":":")+h);h=0===f.length?"{}":e?"{\n"+e+f.join(",\n"+e)+"\n"+g+"}":"{"+f.join(",")+
|
||||
"}";e=g;return h}}"function"!==typeof Date.prototype.toJSON&&(Date.prototype.toJSON=function(){return isFinite(this.valueOf())?this.getUTCFullYear()+"-"+k(this.getUTCMonth()+1)+"-"+k(this.getUTCDate())+"T"+k(this.getUTCHours())+":"+k(this.getUTCMinutes())+":"+k(this.getUTCSeconds())+"Z":null},String.prototype.toJSON=Number.prototype.toJSON=Boolean.prototype.toJSON=function(){return this.valueOf()});var q=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
|
||||
p=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,e,l,r={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},i;"function"!==typeof JSON.stringify&&(JSON.stringify=function(a,j,c){var d;l=e="";if(typeof c==="number")for(d=0;d<c;d=d+1)l=l+" ";else typeof c==="string"&&(l=c);if((i=j)&&typeof j!=="function"&&(typeof j!=="object"||typeof j.length!=="number"))throw Error("JSON.stringify");return m("",{"":a})});
|
||||
"function"!==typeof JSON.parse&&(JSON.parse=function(a,e){function c(a,d){var g,f,b=a[d];if(b&&typeof b==="object")for(g in b)if(Object.prototype.hasOwnProperty.call(b,g)){f=c(b,g);f!==void 0?b[g]=f:delete b[g]}return e.call(a,d,b)}var d,a=String(a);q.lastIndex=0;q.test(a)&&(a=a.replace(q,function(a){return"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)}));if(/^[\],:{}\s]*$/.test(a.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
|
||||
"]").replace(/(?:^|:|,)(?:\s*\[)+/g,""))){d=eval("("+a+")");return typeof e==="function"?c({"":d},""):d}throw new SyntaxError("JSON.parse");})})();
|
19
src/messenger/webim/js/164/mibewapi.js
Normal file
19
src/messenger/webim/js/164/mibewapi.js
Normal file
@ -0,0 +1,19 @@
|
||||
/*
|
||||
This file is part of Mibew Messenger project.
|
||||
http://mibew.org
|
||||
|
||||
Copyright (c) 2005-2011 Mibew Messenger Community
|
||||
License: http://mibew.org/license.php
|
||||
*/
|
||||
function MibewAPI(a){this.protocolVersion="1.0";if("object"!=typeof a||!(a instanceof MibewAPIInteraction))throw Error("Wrong interaction type");this.interaction=a}
|
||||
MibewAPI.prototype.checkFunction=function(a,b){if("undefined"==typeof a["function"]||""==a["function"])throw Error("Cannot call for function with no name");if(b)for(var c=0;c<this.interaction.reservedFunctionNames.length;c++)if(a["function"]==this.interaction.reservedFunctionNames[c])throw Error("'"+a["function"]+"' is reserved function name");if("object"!=typeof a.arguments)throw Error("There are no arguments in '"+a["function"]+"' function");var d=0,e;a:for(e in a.arguments)for(c=0;c<this.interaction.obligatoryArguments.length;c++)if(e==
|
||||
this.interaction.obligatoryArguments[c]){d++;continue a}if(d!=this.interaction.obligatoryArguments.length)throw Error("Not all obligatory arguments are set in '"+a["function"]+"' function");};
|
||||
MibewAPI.prototype.checkRequest=function(a){if("string"!=typeof a.token){if("undefined"==typeof a.token)throw Error("Empty token");throw Error("Wrong token type");}if(""==a.token)throw Error("Empty token");if("object"!=typeof a.functions||!(a.functions instanceof Array)||0==a.functions.length)throw Error("Empty functions set");for(var b=0;b<a.functions.length;b++)this.checkFunction(a.functions[b])};
|
||||
MibewAPI.prototype.checkPackage=function(a){if("undefined"==typeof a.signature)throw Error("Missed package signature");if("undefined"==typeof a.proto)throw Error("Missed protocol version");if(a.proto!=this.protocolVersion)throw Error("Wrong protocol version");if("undefined"==typeof a.async)throw Error("'async' flag is missed");if("boolean"!=typeof a.async)throw Error("Wrong 'async' flag value");if("object"!=typeof a.requests||!(a.requests instanceof Array)||0==a.requests.length)throw Error("Empty requests set");
|
||||
for(var b=0;b<a.requests.length;b++)this.checkRequest(a.requests[b])};MibewAPI.prototype.getResultFunction=function(a,b){"undefined"==typeof b&&(b=null);var c=null,d;for(d in a)if(a.hasOwnProperty(d)&&"result"==a[d]["function"]){if(null!==c)throw Error("Function 'result' already exists in functions list");c=a[d]}if(!0===b&&null===c)throw Error("There is no 'result' function in functions list");if(!1===b&&null!==c)throw Error("There is 'result' function in functions list");return c};
|
||||
MibewAPI.prototype.buildResult=function(a,b){var c=this.interaction.getDefaultObligatoryArguments(),d;for(d in c)c.hasOwnProperty(d)&&(a[d]=c[d]);return{token:b,functions:[{"function":"result",arguments:a}]}};MibewAPI.prototype.encodePackage=function(a){var b={signature:""};b.proto=this.protocolVersion;b.async=!0;b.requests=a;return encodeURIComponent(JSON.stringify(b)).replace(/\%20/gi,"+")};
|
||||
MibewAPI.prototype.decodePackage=function(a){a=JSON.parse(decodeURIComponent(a.replace(/\+/gi," ")));this.checkPackage(a);return a};function MibewAPIInteraction(){this.reservedFunctionNames=[];this.obligatoryArguments=[];this.getDefaultObligatoryArguments=function(){return{}}}function MibewAPIWindowToCoreInteraction(){this.reservedFunctionNames=["result"];this.obligatoryArguments=["return","references"];this.getDefaultObligatoryArguments=function(){return{"return":{},references:{}}}}
|
||||
MibewAPIWindowToCoreInteraction.prototype=new MibewAPIInteraction;function MibewAPIExecutionContext(){this.returnValues={};this.functionsResults=[]}
|
||||
MibewAPIExecutionContext.prototype.getArgumentsList=function(a){var b=a.arguments,c=a.arguments.references,d,e,f;for(f in c)if(c.hasOwnProperty(f)){e=c[f];if("undefined"==typeof this.functionsResults[e-1])throw Error("Wrong reference in '"+a["function"]+"' function. Function #"+e+" does not call yet.");if("undefined"==typeof b[f]||""==b[f])throw Error("Wrong reference in '"+a["function"]+"' function. Empty '"+f+"' argument.");d=b[f];if("undefined"==typeof this.functionsResults[e-1][d])throw Error("Wrong reference in '"+
|
||||
a["function"]+"' function. There is no '"+d+"' argument in #"+e+" function results");b[f]=this.functionsResults[e-1][d]}return b};MibewAPIExecutionContext.prototype.getResults=function(){return this.returnValues};
|
||||
MibewAPIExecutionContext.prototype.storeFunctionResults=function(a,b){var c,d;for(d in a.arguments["return"])if(a.arguments["return"].hasOwnProperty(d)){c=a.arguments["return"][d];if("undefined"==typeof b[d])throw Error("Variable with name '"+d+"' is undefined in the results of the '"+a["function"]+"' function");this.returnValues[c]=b[d]}this.functionsResults.push(b)};
|
@ -36,6 +36,14 @@
|
||||
<arg value="invite_op:1:common"/>
|
||||
<arg value="--js"/>
|
||||
<arg value="invite_op.js"/>
|
||||
<arg value="--module"/>
|
||||
<arg value="json2:1:common"/>
|
||||
<arg value="--js"/>
|
||||
<arg value="json2.js"/>
|
||||
<arg value="--module"/>
|
||||
<arg value="mibew_api:1:common"/>
|
||||
<arg value="--js"/>
|
||||
<arg value="mibew_api.js"/>
|
||||
</java>
|
||||
|
||||
<java jar="${closure.c}" fork="true">
|
||||
|
486
src/messenger/webim/js/source/json2.js
Normal file
486
src/messenger/webim/js/source/json2.js
Normal file
@ -0,0 +1,486 @@
|
||||
/**
|
||||
* @preserve json2.js
|
||||
* 2011-10-19
|
||||
* Public Domain.
|
||||
* See http://www.JSON.org/js.html
|
||||
*/
|
||||
|
||||
/*
|
||||
NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
|
||||
|
||||
This code should be minified before deployment.
|
||||
See http://javascript.crockford.com/jsmin.html
|
||||
|
||||
USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
|
||||
NOT CONTROL.
|
||||
|
||||
|
||||
This file creates a global JSON object containing two methods: stringify
|
||||
and parse.
|
||||
|
||||
JSON.stringify(value, replacer, space)
|
||||
value any JavaScript value, usually an object or array.
|
||||
|
||||
replacer an optional parameter that determines how object
|
||||
values are stringified for objects. It can be a
|
||||
function or an array of strings.
|
||||
|
||||
space an optional parameter that specifies the indentation
|
||||
of nested structures. If it is omitted, the text will
|
||||
be packed without extra whitespace. If it is a number,
|
||||
it will specify the number of spaces to indent at each
|
||||
level. If it is a string (such as '\t' or ' '),
|
||||
it contains the characters used to indent at each level.
|
||||
|
||||
This method produces a JSON text from a JavaScript value.
|
||||
|
||||
When an object value is found, if the object contains a toJSON
|
||||
method, its toJSON method will be called and the result will be
|
||||
stringified. A toJSON method does not serialize: it returns the
|
||||
value represented by the name/value pair that should be serialized,
|
||||
or undefined if nothing should be serialized. The toJSON method
|
||||
will be passed the key associated with the value, and this will be
|
||||
bound to the value
|
||||
|
||||
For example, this would serialize Dates as ISO strings.
|
||||
|
||||
Date.prototype.toJSON = function (key) {
|
||||
function f(n) {
|
||||
// Format integers to have at least two digits.
|
||||
return n < 10 ? '0' + n : n;
|
||||
}
|
||||
|
||||
return this.getUTCFullYear() + '-' +
|
||||
f(this.getUTCMonth() + 1) + '-' +
|
||||
f(this.getUTCDate()) + 'T' +
|
||||
f(this.getUTCHours()) + ':' +
|
||||
f(this.getUTCMinutes()) + ':' +
|
||||
f(this.getUTCSeconds()) + 'Z';
|
||||
};
|
||||
|
||||
You can provide an optional replacer method. It will be passed the
|
||||
key and value of each member, with this bound to the containing
|
||||
object. The value that is returned from your method will be
|
||||
serialized. If your method returns undefined, then the member will
|
||||
be excluded from the serialization.
|
||||
|
||||
If the replacer parameter is an array of strings, then it will be
|
||||
used to select the members to be serialized. It filters the results
|
||||
such that only members with keys listed in the replacer array are
|
||||
stringified.
|
||||
|
||||
Values that do not have JSON representations, such as undefined or
|
||||
functions, will not be serialized. Such values in objects will be
|
||||
dropped; in arrays they will be replaced with null. You can use
|
||||
a replacer function to replace those with JSON values.
|
||||
JSON.stringify(undefined) returns undefined.
|
||||
|
||||
The optional space parameter produces a stringification of the
|
||||
value that is filled with line breaks and indentation to make it
|
||||
easier to read.
|
||||
|
||||
If the space parameter is a non-empty string, then that string will
|
||||
be used for indentation. If the space parameter is a number, then
|
||||
the indentation will be that many spaces.
|
||||
|
||||
Example:
|
||||
|
||||
text = JSON.stringify(['e', {pluribus: 'unum'}]);
|
||||
// text is '["e",{"pluribus":"unum"}]'
|
||||
|
||||
|
||||
text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t');
|
||||
// text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'
|
||||
|
||||
text = JSON.stringify([new Date()], function (key, value) {
|
||||
return this[key] instanceof Date ?
|
||||
'Date(' + this[key] + ')' : value;
|
||||
});
|
||||
// text is '["Date(---current time---)"]'
|
||||
|
||||
|
||||
JSON.parse(text, reviver)
|
||||
This method parses a JSON text to produce an object or array.
|
||||
It can throw a SyntaxError exception.
|
||||
|
||||
The optional reviver parameter is a function that can filter and
|
||||
transform the results. It receives each of the keys and values,
|
||||
and its return value is used instead of the original value.
|
||||
If it returns what it received, then the structure is not modified.
|
||||
If it returns undefined then the member is deleted.
|
||||
|
||||
Example:
|
||||
|
||||
// Parse the text. Values that look like ISO date strings will
|
||||
// be converted to Date objects.
|
||||
|
||||
myData = JSON.parse(text, function (key, value) {
|
||||
var a;
|
||||
if (typeof value === 'string') {
|
||||
a =
|
||||
/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
|
||||
if (a) {
|
||||
return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
|
||||
+a[5], +a[6]));
|
||||
}
|
||||
}
|
||||
return value;
|
||||
});
|
||||
|
||||
myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) {
|
||||
var d;
|
||||
if (typeof value === 'string' &&
|
||||
value.slice(0, 5) === 'Date(' &&
|
||||
value.slice(-1) === ')') {
|
||||
d = new Date(value.slice(5, -1));
|
||||
if (d) {
|
||||
return d;
|
||||
}
|
||||
}
|
||||
return value;
|
||||
});
|
||||
|
||||
|
||||
This is a reference implementation. You are free to copy, modify, or
|
||||
redistribute.
|
||||
*/
|
||||
|
||||
/*jslint evil: true, regexp: true */
|
||||
|
||||
/*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply,
|
||||
call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
|
||||
getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
|
||||
lastIndex, length, parse, prototype, push, replace, slice, stringify,
|
||||
test, toJSON, toString, valueOf
|
||||
*/
|
||||
|
||||
|
||||
// Create a JSON object only if one does not already exist. We create the
|
||||
// methods in a closure to avoid creating global variables.
|
||||
|
||||
var JSON;
|
||||
if (!JSON) {
|
||||
JSON = {};
|
||||
}
|
||||
|
||||
(function () {
|
||||
'use strict';
|
||||
|
||||
function f(n) {
|
||||
// Format integers to have at least two digits.
|
||||
return n < 10 ? '0' + n : n;
|
||||
}
|
||||
|
||||
if (typeof Date.prototype.toJSON !== 'function') {
|
||||
|
||||
Date.prototype.toJSON = function (key) {
|
||||
|
||||
return isFinite(this.valueOf())
|
||||
? this.getUTCFullYear() + '-' +
|
||||
f(this.getUTCMonth() + 1) + '-' +
|
||||
f(this.getUTCDate()) + 'T' +
|
||||
f(this.getUTCHours()) + ':' +
|
||||
f(this.getUTCMinutes()) + ':' +
|
||||
f(this.getUTCSeconds()) + 'Z'
|
||||
: null;
|
||||
};
|
||||
|
||||
String.prototype.toJSON =
|
||||
Number.prototype.toJSON =
|
||||
Boolean.prototype.toJSON = function (key) {
|
||||
return this.valueOf();
|
||||
};
|
||||
}
|
||||
|
||||
var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
|
||||
escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
|
||||
gap,
|
||||
indent,
|
||||
meta = { // table of character substitutions
|
||||
'\b': '\\b',
|
||||
'\t': '\\t',
|
||||
'\n': '\\n',
|
||||
'\f': '\\f',
|
||||
'\r': '\\r',
|
||||
'"' : '\\"',
|
||||
'\\': '\\\\'
|
||||
},
|
||||
rep;
|
||||
|
||||
|
||||
function quote(string) {
|
||||
|
||||
// If the string contains no control characters, no quote characters, and no
|
||||
// backslash characters, then we can safely slap some quotes around it.
|
||||
// Otherwise we must also replace the offending characters with safe escape
|
||||
// sequences.
|
||||
|
||||
escapable.lastIndex = 0;
|
||||
return escapable.test(string) ? '"' + string.replace(escapable, function (a) {
|
||||
var c = meta[a];
|
||||
return typeof c === 'string'
|
||||
? c
|
||||
: '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
|
||||
}) + '"' : '"' + string + '"';
|
||||
}
|
||||
|
||||
|
||||
function str(key, holder) {
|
||||
|
||||
// Produce a string from holder[key].
|
||||
|
||||
var i, // The loop counter.
|
||||
k, // The member key.
|
||||
v, // The member value.
|
||||
length,
|
||||
mind = gap,
|
||||
partial,
|
||||
value = holder[key];
|
||||
|
||||
// If the value has a toJSON method, call it to obtain a replacement value.
|
||||
|
||||
if (value && typeof value === 'object' &&
|
||||
typeof value.toJSON === 'function') {
|
||||
value = value.toJSON(key);
|
||||
}
|
||||
|
||||
// If we were called with a replacer function, then call the replacer to
|
||||
// obtain a replacement value.
|
||||
|
||||
if (typeof rep === 'function') {
|
||||
value = rep.call(holder, key, value);
|
||||
}
|
||||
|
||||
// What happens next depends on the value's type.
|
||||
|
||||
switch (typeof value) {
|
||||
case 'string':
|
||||
return quote(value);
|
||||
|
||||
case 'number':
|
||||
|
||||
// JSON numbers must be finite. Encode non-finite numbers as null.
|
||||
|
||||
return isFinite(value) ? String(value) : 'null';
|
||||
|
||||
case 'boolean':
|
||||
case 'null':
|
||||
|
||||
// If the value is a boolean or null, convert it to a string. Note:
|
||||
// typeof null does not produce 'null'. The case is included here in
|
||||
// the remote chance that this gets fixed someday.
|
||||
|
||||
return String(value);
|
||||
|
||||
// If the type is 'object', we might be dealing with an object or an array or
|
||||
// null.
|
||||
|
||||
case 'object':
|
||||
|
||||
// Due to a specification blunder in ECMAScript, typeof null is 'object',
|
||||
// so watch out for that case.
|
||||
|
||||
if (!value) {
|
||||
return 'null';
|
||||
}
|
||||
|
||||
// Make an array to hold the partial results of stringifying this object value.
|
||||
|
||||
gap += indent;
|
||||
partial = [];
|
||||
|
||||
// Is the value an array?
|
||||
|
||||
if (Object.prototype.toString.apply(value) === '[object Array]') {
|
||||
|
||||
// The value is an array. Stringify every element. Use null as a placeholder
|
||||
// for non-JSON values.
|
||||
|
||||
length = value.length;
|
||||
for (i = 0; i < length; i += 1) {
|
||||
partial[i] = str(i, value) || 'null';
|
||||
}
|
||||
|
||||
// Join all of the elements together, separated with commas, and wrap them in
|
||||
// brackets.
|
||||
|
||||
v = partial.length === 0
|
||||
? '[]'
|
||||
: gap
|
||||
? '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']'
|
||||
: '[' + partial.join(',') + ']';
|
||||
gap = mind;
|
||||
return v;
|
||||
}
|
||||
|
||||
// If the replacer is an array, use it to select the members to be stringified.
|
||||
|
||||
if (rep && typeof rep === 'object') {
|
||||
length = rep.length;
|
||||
for (i = 0; i < length; i += 1) {
|
||||
if (typeof rep[i] === 'string') {
|
||||
k = rep[i];
|
||||
v = str(k, value);
|
||||
if (v) {
|
||||
partial.push(quote(k) + (gap ? ': ' : ':') + v);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
||||
// Otherwise, iterate through all of the keys in the object.
|
||||
|
||||
for (k in value) {
|
||||
if (Object.prototype.hasOwnProperty.call(value, k)) {
|
||||
v = str(k, value);
|
||||
if (v) {
|
||||
partial.push(quote(k) + (gap ? ': ' : ':') + v);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Join all of the member texts together, separated with commas,
|
||||
// and wrap them in braces.
|
||||
|
||||
v = partial.length === 0
|
||||
? '{}'
|
||||
: gap
|
||||
? '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}'
|
||||
: '{' + partial.join(',') + '}';
|
||||
gap = mind;
|
||||
return v;
|
||||
}
|
||||
}
|
||||
|
||||
// If the JSON object does not yet have a stringify method, give it one.
|
||||
|
||||
if (typeof JSON.stringify !== 'function') {
|
||||
JSON.stringify = function (value, replacer, space) {
|
||||
|
||||
// The stringify method takes a value and an optional replacer, and an optional
|
||||
// space parameter, and returns a JSON text. The replacer can be a function
|
||||
// that can replace values, or an array of strings that will select the keys.
|
||||
// A default replacer method can be provided. Use of the space parameter can
|
||||
// produce text that is more easily readable.
|
||||
|
||||
var i;
|
||||
gap = '';
|
||||
indent = '';
|
||||
|
||||
// If the space parameter is a number, make an indent string containing that
|
||||
// many spaces.
|
||||
|
||||
if (typeof space === 'number') {
|
||||
for (i = 0; i < space; i += 1) {
|
||||
indent += ' ';
|
||||
}
|
||||
|
||||
// If the space parameter is a string, it will be used as the indent string.
|
||||
|
||||
} else if (typeof space === 'string') {
|
||||
indent = space;
|
||||
}
|
||||
|
||||
// If there is a replacer, it must be a function or an array.
|
||||
// Otherwise, throw an error.
|
||||
|
||||
rep = replacer;
|
||||
if (replacer && typeof replacer !== 'function' &&
|
||||
(typeof replacer !== 'object' ||
|
||||
typeof replacer.length !== 'number')) {
|
||||
throw new Error('JSON.stringify');
|
||||
}
|
||||
|
||||
// Make a fake root object containing our value under the key of ''.
|
||||
// Return the result of stringifying the value.
|
||||
|
||||
return str('', {'': value});
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
// If the JSON object does not yet have a parse method, give it one.
|
||||
|
||||
if (typeof JSON.parse !== 'function') {
|
||||
JSON.parse = function (text, reviver) {
|
||||
|
||||
// The parse method takes a text and an optional reviver function, and returns
|
||||
// a JavaScript value if the text is a valid JSON text.
|
||||
|
||||
var j;
|
||||
|
||||
function walk(holder, key) {
|
||||
|
||||
// The walk method is used to recursively walk the resulting structure so
|
||||
// that modifications can be made.
|
||||
|
||||
var k, v, value = holder[key];
|
||||
if (value && typeof value === 'object') {
|
||||
for (k in value) {
|
||||
if (Object.prototype.hasOwnProperty.call(value, k)) {
|
||||
v = walk(value, k);
|
||||
if (v !== undefined) {
|
||||
value[k] = v;
|
||||
} else {
|
||||
delete value[k];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return reviver.call(holder, key, value);
|
||||
}
|
||||
|
||||
|
||||
// Parsing happens in four stages. In the first stage, we replace certain
|
||||
// Unicode characters with escape sequences. JavaScript handles many characters
|
||||
// incorrectly, either silently deleting them, or treating them as line endings.
|
||||
|
||||
text = String(text);
|
||||
cx.lastIndex = 0;
|
||||
if (cx.test(text)) {
|
||||
text = text.replace(cx, function (a) {
|
||||
return '\\u' +
|
||||
('0000' + a.charCodeAt(0).toString(16)).slice(-4);
|
||||
});
|
||||
}
|
||||
|
||||
// In the second stage, we run the text against regular expressions that look
|
||||
// for non-JSON patterns. We are especially concerned with '()' and 'new'
|
||||
// because they can cause invocation, and '=' because it can cause mutation.
|
||||
// But just to be safe, we want to reject all unexpected forms.
|
||||
|
||||
// We split the second stage into 4 regexp operations in order to work around
|
||||
// crippling inefficiencies in IE's and Safari's regexp engines. First we
|
||||
// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we
|
||||
// replace all simple value tokens with ']' characters. Third, we delete all
|
||||
// open brackets that follow a colon or comma or that begin the text. Finally,
|
||||
// we look to see that the remaining characters are only whitespace or ']' or
|
||||
// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.
|
||||
|
||||
if (/^[\],:{}\s]*$/
|
||||
.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@')
|
||||
.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']')
|
||||
.replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
|
||||
|
||||
// In the third stage we use the eval function to compile the text into a
|
||||
// JavaScript structure. The '{' operator is subject to a syntactic ambiguity
|
||||
// in JavaScript: it can begin a block or an object literal. We wrap the text
|
||||
// in parens to eliminate the ambiguity.
|
||||
|
||||
j = eval('(' + text + ')');
|
||||
|
||||
// In the optional fourth stage, we recursively walk the new structure, passing
|
||||
// each name/value pair to a reviver function for possible transformation.
|
||||
|
||||
return typeof reviver === 'function'
|
||||
? walk({'': j}, '')
|
||||
: j;
|
||||
}
|
||||
|
||||
// If the text is not JSON parseable, then a SyntaxError is thrown.
|
||||
|
||||
throw new SyntaxError('JSON.parse');
|
||||
};
|
||||
}
|
||||
}());
|
440
src/messenger/webim/js/source/mibewapi.js
Normal file
440
src/messenger/webim/js/source/mibewapi.js
Normal file
@ -0,0 +1,440 @@
|
||||
/**
|
||||
* @preserve This file is part of Mibew Messenger project.
|
||||
* http://mibew.org
|
||||
*
|
||||
* Copyright (c) 2005-2011 Mibew Messenger Community
|
||||
* License: http://mibew.org/license.php
|
||||
*/
|
||||
|
||||
/**
|
||||
* Mibew API class constructor
|
||||
*
|
||||
* @constructor
|
||||
* @param {MibewAPIInteraction} interaction An object that represents
|
||||
* interaction type
|
||||
* @todo Think about error code
|
||||
*/
|
||||
function MibewAPI(interaction) {
|
||||
|
||||
/**
|
||||
* Version of the MIBEW API protocol implemented by the object
|
||||
*/
|
||||
this.protocolVersion = "1.0";
|
||||
|
||||
// Check interaction type
|
||||
if (typeof interaction != "object" ||
|
||||
!(interaction instanceof MibewAPIInteraction)) {
|
||||
throw new Error("Wrong interaction type");
|
||||
}
|
||||
|
||||
/**
|
||||
* An object that encapsulates type of the interaction
|
||||
* @private
|
||||
* @type MibewAPIInteraction
|
||||
*/
|
||||
this.interaction = interaction;
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate function
|
||||
*
|
||||
* Throws an Error object if function is not valid.
|
||||
*
|
||||
* @param {Object} functionObject The function. See Mibew API for details.
|
||||
* @param {Boolean} [filterReservedFunctions=false]. Determine if function
|
||||
* name must not be in reserved list
|
||||
* @thows Error
|
||||
*/
|
||||
MibewAPI.prototype.checkFunction = function(functionObject, filterReservedFunctions) {
|
||||
filterReservedFunctions = filterReservedFunctions || false;
|
||||
|
||||
// Check function name
|
||||
if (typeof functionObject["function"] == "undefined" ||
|
||||
functionObject["function"] == "") {
|
||||
throw new Error("Cannot call for function with no name");
|
||||
}
|
||||
if (filterReservedFunctions) {
|
||||
for (var i = 0; i < this.interaction.reservedFunctionNames.length; i++) {
|
||||
if (functionObject["function"] ==
|
||||
this.interaction.reservedFunctionNames[i]) {
|
||||
throw new Error(
|
||||
"'" + functionObject["function"] +
|
||||
"' is reserved function name"
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Check function's arguments
|
||||
if (typeof functionObject.arguments != "object") {
|
||||
throw new Error(
|
||||
"There are no arguments in '" + functionObject["function"] +
|
||||
"' function"
|
||||
);
|
||||
}
|
||||
var obligatoryArgumentsCount = 0;
|
||||
argumentsLoop:
|
||||
for (var argName in functionObject.arguments){
|
||||
for (var i = 0; i < this.interaction.obligatoryArguments.length; i++) {
|
||||
if (argName == this.interaction.obligatoryArguments[i]) {
|
||||
obligatoryArgumentsCount++;
|
||||
continue argumentsLoop;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (obligatoryArgumentsCount !=
|
||||
this.interaction.obligatoryArguments.length) {
|
||||
throw new Error(
|
||||
"Not all obligatory arguments are set in '" +
|
||||
functionObject["function"] + "' function"
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate request
|
||||
*
|
||||
* Throws an Error object if request is not valid.
|
||||
*
|
||||
* @param {Object} requestObject The Request. See Mibew API for details.
|
||||
* @thows Error
|
||||
*/
|
||||
MibewAPI.prototype.checkRequest = function(requestObject) {
|
||||
// Check token
|
||||
if (typeof requestObject.token != "string") {
|
||||
if (typeof requestObject.token == "undefined") {
|
||||
throw new Error("Empty token");
|
||||
} else {
|
||||
throw new Error("Wrong token type");
|
||||
}
|
||||
}
|
||||
if (requestObject.token == "") {
|
||||
throw new Error("Empty token");
|
||||
}
|
||||
|
||||
// Request must have at least one function
|
||||
if (typeof requestObject.functions != "object" ||
|
||||
!(requestObject.functions instanceof Array) ||
|
||||
requestObject.functions.length == 0) {
|
||||
throw new Error("Empty functions set");
|
||||
}
|
||||
|
||||
// Check function
|
||||
for (var i = 0; i < requestObject.functions.length; i++) {
|
||||
this.checkFunction(requestObject.functions[i]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate package.
|
||||
*
|
||||
* Throws an Error object if package is not valid.
|
||||
*
|
||||
* @param {Object} packageObject The package. See Mibew API for details.
|
||||
* @thows Error
|
||||
*/
|
||||
MibewAPI.prototype.checkPackage = function (packageObject) {
|
||||
// Check signature
|
||||
if (typeof packageObject.signature == "undefined") {
|
||||
throw new Error("Missed package signature");
|
||||
}
|
||||
|
||||
// Check protocol
|
||||
if (typeof packageObject.proto == "undefined") {
|
||||
throw new Error("Missed protocol version");
|
||||
}
|
||||
if (packageObject.proto != this.protocolVersion) {
|
||||
throw new Error("Wrong protocol version");
|
||||
}
|
||||
|
||||
// Check async flag
|
||||
if (typeof packageObject.async == "undefined") {
|
||||
throw new Error("'async' flag is missed");
|
||||
}
|
||||
if (typeof packageObject.async != "boolean") {
|
||||
throw new Error("Wrong 'async' flag value");
|
||||
}
|
||||
|
||||
// Package must have at least one request
|
||||
if (typeof packageObject.requests != "object" ||
|
||||
!(packageObject.requests instanceof Array) ||
|
||||
packageObject.requests.length == 0) {
|
||||
throw new Error("Empty requests set");
|
||||
}
|
||||
|
||||
// Check requests in package
|
||||
for (var i = 0; i < packageObject.requests.length; i++) {
|
||||
this.checkRequest(packageObject.requests[i]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Search 'result' function in functionsList. If request contains more than
|
||||
* one result functions throws an Error
|
||||
*
|
||||
* @param {Object[]} functionsList Array of functions. See MibewAPI for
|
||||
* function structure details
|
||||
* @param {Boolean|null} [existance="null"] (optional) Control existance of
|
||||
* the 'result' function in request. Use boolean true if 'result' function
|
||||
* must exists in request, boolean false if must not and null if it doesn't
|
||||
* matter.
|
||||
* @returns {Object|null} Function object if 'result' function found and
|
||||
* null otherwise
|
||||
* @throws Error
|
||||
*/
|
||||
MibewAPI.prototype.getResultFunction = function(functionsList, existance){
|
||||
if (typeof existance == "undefined") {
|
||||
existance = null;
|
||||
}
|
||||
var resultFunction = null;
|
||||
// Try to find result function
|
||||
for (var i in functionsList) {
|
||||
if (! functionsList.hasOwnProperty(i)) {
|
||||
continue;
|
||||
}
|
||||
if (functionsList[i]["function"] == 'result') {
|
||||
if (resultFunction !== null) {
|
||||
// Another result function found
|
||||
throw new Error(
|
||||
"Function 'result' already exists in functions list"
|
||||
);
|
||||
}
|
||||
// First 'result' function found
|
||||
resultFunction = functionsList[i];
|
||||
}
|
||||
}
|
||||
if (existance === true && resultFunction === null) {
|
||||
// 'result' function must present in request
|
||||
throw new Error("There is no 'result' function in functions list");
|
||||
}
|
||||
if (existance === false && resultFunction !== null) {
|
||||
throw new Error("There is 'result' function in functions list");
|
||||
}
|
||||
return resultFunction;
|
||||
}
|
||||
|
||||
/**
|
||||
* Builds result package
|
||||
*
|
||||
* @param {Object} resultArguments Arguments of the result function
|
||||
* @param {String} token Token of the result package
|
||||
* @returns {Object} Result package
|
||||
*/
|
||||
MibewAPI.prototype.buildResult = function(resultArguments, token) {
|
||||
var mergedArguments = resultArguments;
|
||||
var defaultArguments = this.interaction.getDefaultObligatoryArguments();
|
||||
for (var argName in defaultArguments) {
|
||||
if (! defaultArguments.hasOwnProperty(argName)) {
|
||||
continue;
|
||||
}
|
||||
mergedArguments[argName] = defaultArguments[argName];
|
||||
}
|
||||
return {
|
||||
'token': token,
|
||||
'functions': [
|
||||
{
|
||||
'function' : 'result',
|
||||
'arguments' : mergedArguments
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Encodes package
|
||||
*
|
||||
* @param {Object[]} requests Array of the Requests. See Mibew API for
|
||||
* details.
|
||||
* @returns {String} Ready for transfer encoded package
|
||||
*/
|
||||
MibewAPI.prototype.encodePackage = function(requests) {
|
||||
var packageObject = {};
|
||||
packageObject.signature = "";
|
||||
packageObject.proto = this.protocolVersion;
|
||||
packageObject.async = true;
|
||||
packageObject.requests = requests;
|
||||
return encodeURIComponent(JSON.stringify(packageObject)).replace(/\%20/gi, '+');
|
||||
}
|
||||
|
||||
/**
|
||||
* Decodes package and validate package structure
|
||||
*
|
||||
* Throws an Error object if package cannot be decoded or is not valid
|
||||
*
|
||||
* @param {String} encodedPackage Encoded package
|
||||
* @returns {Object} The Decoded package. See Mibew API for details.
|
||||
* @throws Error
|
||||
*/
|
||||
MibewAPI.prototype.decodePackage = function(encodedPackage){
|
||||
var decodedPackage = JSON.parse(decodeURIComponent(encodedPackage.replace(/\+/gi, ' ')));
|
||||
this.checkPackage(decodedPackage);
|
||||
return decodedPackage;
|
||||
}
|
||||
/**
|
||||
* End of MibewAPI Class
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* Represents interaction type
|
||||
*
|
||||
* @constructor
|
||||
*/
|
||||
function MibewAPIInteraction(){
|
||||
/**
|
||||
* Abligatory arguments in called functions
|
||||
*/
|
||||
this.reservedFunctionNames = [];
|
||||
/**
|
||||
* Reserved function names
|
||||
*/
|
||||
this.obligatoryArguments = [];
|
||||
/**
|
||||
* Returns default values of obligatory arguments
|
||||
*
|
||||
* @returns {Object} An object fields names are obligatory arguments and
|
||||
* values are default values of them
|
||||
*/
|
||||
this.getDefaultObligatoryArguments = function(){
|
||||
return {}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Represents Window to core interaction type
|
||||
*
|
||||
* @constructor
|
||||
* @todo Think about real values!
|
||||
*/
|
||||
function MibewAPIWindowToCoreInteraction() {
|
||||
this.reservedFunctionNames = [
|
||||
'result'
|
||||
];
|
||||
|
||||
this.obligatoryArguments = [
|
||||
'return',
|
||||
'references'
|
||||
];
|
||||
|
||||
this.getDefaultObligatoryArguments = function(){
|
||||
return {
|
||||
"return" : {},
|
||||
"references" : {}
|
||||
}
|
||||
}
|
||||
}
|
||||
MibewAPIWindowToCoreInteraction.prototype = new MibewAPIInteraction();
|
||||
|
||||
/**
|
||||
* Implements functions execution context
|
||||
*
|
||||
* @constructor
|
||||
*/
|
||||
function MibewAPIExecutionContext() {
|
||||
/**
|
||||
* Values which returns after execution of all functions in request
|
||||
* @private
|
||||
*/
|
||||
this.returnValues = {};
|
||||
|
||||
/**
|
||||
* Results of execution of all function in request
|
||||
* @private
|
||||
*/
|
||||
this.functionsResults = [];
|
||||
}
|
||||
|
||||
/**
|
||||
* Build arguments list by replace all references by values of execution
|
||||
* context
|
||||
*
|
||||
* @param {Object} functionObject The Function. See MibewAPI for details.
|
||||
* @returns {Array} Arguments list
|
||||
* @throws Error
|
||||
*/
|
||||
MibewAPIExecutionContext.prototype.getArgumentsList = function(functionObject) {
|
||||
var argumentsList = functionObject.arguments;
|
||||
var references = functionObject.arguments.references;
|
||||
var referenceTo, funcNum;
|
||||
for (var variableName in references) {
|
||||
if (! references.hasOwnProperty(variableName)) {
|
||||
continue;
|
||||
}
|
||||
referenceTo = null;
|
||||
funcNum = references[variableName];
|
||||
// Check target function in context
|
||||
if (typeof this.functionsResults[funcNum - 1] == "undefined") {
|
||||
// Wrong function number
|
||||
throw new Error("Wrong reference in '" +
|
||||
functionObject['function'] + "' function. Function #" +
|
||||
funcNum + " does not call yet."
|
||||
);
|
||||
}
|
||||
|
||||
// Check reference
|
||||
if (typeof argumentsList[variableName] == "undefined" ||
|
||||
argumentsList[variableName] == "") {
|
||||
// Empty argument that should contains reference
|
||||
throw new Error("Wrong reference in '" +
|
||||
functionObject['function'] + "' function. " +
|
||||
"Empty '" + variableName + "' argument."
|
||||
);
|
||||
}
|
||||
referenceTo = argumentsList[variableName];
|
||||
|
||||
// Check target value
|
||||
if (typeof this.functionsResults[funcNum - 1][referenceTo] ==
|
||||
"undefined") {
|
||||
throw new Error(
|
||||
"Wrong reference in '" + functionObject['function'] +
|
||||
"' function. There is no '" + referenceTo +
|
||||
"' argument in #" + funcNum + " function results"
|
||||
);
|
||||
}
|
||||
|
||||
// Replace reference by target value
|
||||
argumentsList[variableName] = this.functionsResults[funcNum - 1][referenceTo];
|
||||
}
|
||||
return argumentsList;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns requets results
|
||||
*
|
||||
* @returns {Object}
|
||||
*/
|
||||
MibewAPIExecutionContext.prototype.getResults = function(){
|
||||
return this.returnValues;
|
||||
}
|
||||
|
||||
/**
|
||||
* Stores functions results in execution context and add values to request
|
||||
* result
|
||||
*
|
||||
* @param {Object} functionObject The Function. See MibewAPI for details.
|
||||
* @param {Object} results Object of the function results.
|
||||
* @throws Error
|
||||
*/
|
||||
MibewAPIExecutionContext.prototype.storeFunctionResults = function(functionObject, results) {
|
||||
var alias;
|
||||
// Add value to request results
|
||||
for (var argName in functionObject.arguments["return"]) {
|
||||
if (! functionObject.arguments["return"].hasOwnProperty(argName)) {
|
||||
continue;
|
||||
}
|
||||
alias = functionObject.arguments["return"][argName];
|
||||
if (typeof results[argName] == "undefined") {
|
||||
throw new Error(
|
||||
"Variable with name '" + argName + "' is undefined in " +
|
||||
"the results of the '" + functionObject['function'] +
|
||||
"' function"
|
||||
);
|
||||
}
|
||||
this.returnValues[alias] = results[argName];
|
||||
}
|
||||
// Store function results in execution context
|
||||
this.functionsResults.push(results);
|
||||
}
|
||||
/**
|
||||
* End of MibewAPIExecutionContext class
|
||||
*/
|
Loading…
Reference in New Issue
Block a user