Refactor base Javascript and CSS utilities and support server-side aggregation of HTML and Javascript.
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@1517415 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
1976d3e16f
commit
2e5abd5858
15 changed files with 1724 additions and 1651 deletions
3
sca-cpp/trunk/.gitignore
vendored
3
sca-cpp/trunk/.gitignore
vendored
|
|
@ -57,11 +57,14 @@ config.guess
|
|||
config.sub
|
||||
config.status
|
||||
all.js
|
||||
base.js
|
||||
cache-manifest.cmf
|
||||
*-min.html
|
||||
*-ssi.html
|
||||
*-min.js
|
||||
*-min.css
|
||||
*.b64
|
||||
*.off
|
||||
intro*.png
|
||||
depcomp
|
||||
install-sh
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@ INCLUDES = -I${HTTPD_INCLUDE}
|
|||
incl_HEADERS = *.hpp
|
||||
incldir = $(prefix)/include/modules/http
|
||||
|
||||
dist_mod_SCRIPTS = httpd-conf httpd-addr httpd-start httpd-stop httpd-restart ssl-ca-conf ssl-cert-conf ssl-cert-find httpd-ssl-conf base64-encode basic-auth-conf cert-auth-conf form-auth-conf open-auth-conf passwd-auth-conf group-auth-conf cache-conf cache-ssl-conf cache-manifest proxy-conf proxy-base-conf proxy-ssl-conf proxy-balancer-conf proxy-member-conf proxy-ssl-member-conf proxy-ssl-nossl-member-conf alt-host-conf mass-host-conf mass-host-ssl-conf httpd-tunnel-ssl-conf tunnel-ssl-conf httpd-worker-conf httpd-event-conf httpd-loglevel-conf minify-html minify-js minify-css
|
||||
dist_mod_SCRIPTS = httpd-conf httpd-addr httpd-start httpd-stop httpd-restart ssl-ca-conf ssl-cert-conf ssl-cert-find httpd-ssl-conf base64-encode basic-auth-conf cert-auth-conf form-auth-conf open-auth-conf passwd-auth-conf group-auth-conf cache-conf cache-ssl-conf cache-manifest proxy-conf proxy-base-conf proxy-ssl-conf proxy-balancer-conf proxy-member-conf proxy-ssl-member-conf proxy-ssl-nossl-member-conf alt-host-conf mass-host-conf mass-host-ssl-conf httpd-tunnel-ssl-conf tunnel-ssl-conf httpd-worker-conf httpd-event-conf httpd-loglevel-conf minify-html minify-js minify-css ssinclude-html
|
||||
moddir = $(prefix)/modules/http
|
||||
|
||||
curl_test_SOURCES = curl-test.cpp
|
||||
|
|
|
|||
28
sca-cpp/trunk/modules/http/ssinclude-html
Executable file
28
sca-cpp/trunk/modules/http/ssinclude-html
Executable file
|
|
@ -0,0 +1,28 @@
|
|||
#!/bin/sh
|
||||
|
||||
# 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.
|
||||
|
||||
# Process server-side includes in an HTML file
|
||||
here=`echo "import os; print os.path.realpath('$0')" | python`; here=`dirname $here`
|
||||
|
||||
html=`echo "import os; print os.path.realpath('$1')" | python`
|
||||
ssihtml=`echo "import os; print os.path.realpath('$2')" | python`
|
||||
|
||||
cd `dirname ${html}`
|
||||
cat ${html} | awk '{ print; } /<!--#include file="[^"]+"/ { match($0, "file=\"[^\"]+\""); system("cat " substr($0, RSTART + 6, RLENGTH - 7)); }' > ${ssihtml}
|
||||
|
||||
|
|
@ -18,11 +18,14 @@
|
|||
|
||||
jsfiles = htdocs/util.js htdocs/elemutil.js htdocs/xmlutil.js htdocs/atomutil.js htdocs/jsonutil.js htdocs/scdl.js htdocs/ui.js htdocs/component.js
|
||||
|
||||
BUILT_SOURCES = htdocs/all.js
|
||||
BUILT_SOURCES = htdocs/base.js htdocs/all.js
|
||||
htdocs/base.js: htdocs/util.js htdocs/ui.js
|
||||
cat $^ >htdocs/base.js
|
||||
|
||||
htdocs/all.js: ${jsfiles}
|
||||
cat $^ >htdocs/all.js
|
||||
|
||||
minified = htdocs/all-min.js htdocs/ui-min.css
|
||||
minified = htdocs/all-min.js htdocs/base-min.js htdocs/ui-min.css
|
||||
|
||||
SUFFIXES = -min.html -min.js -min.css
|
||||
.html-min.html:
|
||||
|
|
@ -34,9 +37,9 @@ SUFFIXES = -min.html -min.js -min.css
|
|||
.css-min.css:
|
||||
../../modules/http/minify-css $< $@
|
||||
|
||||
CLEANFILES = htdocs/all.js ${minified}
|
||||
CLEANFILES = htdocs/base.js htdocs/all.js ${minified}
|
||||
|
||||
dist_mod_SCRIPTS = js-conf
|
||||
dist_mod_SCRIPTS = js-conf js-extract
|
||||
moddir = $(prefix)/modules/js
|
||||
nobase_dist_mod_DATA = ${minified}
|
||||
EXTRA_DIST = ${jsfiles} htdocs/ui.css
|
||||
|
|
|
|||
|
|
@ -15,16 +15,6 @@
|
|||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*
|
||||
* The JSON-RPC client code is based on Jan-Klaas' JavaScript
|
||||
* o lait library (jsolait).
|
||||
*
|
||||
* $Id: jsonrpc.js,v 1.36.2.3 2006/03/08 15:09:37 mclark Exp $
|
||||
*
|
||||
* Copyright (c) 2003-2004 Jan-Klaas Kollhof
|
||||
* Copyright (c) 2005 Michael Clark, Metaparadigm Pte Ltd
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License").
|
||||
*/
|
||||
|
||||
/**
|
||||
|
|
@ -33,72 +23,6 @@
|
|||
|
||||
var JSONClient = {};
|
||||
|
||||
/**
|
||||
* Escape a character.
|
||||
*/
|
||||
JSONClient.escapeJSONChar = function(c) {
|
||||
if(c == "\"" || c == "\\") return "\\" + c;
|
||||
if(c == "\b") return "\\b";
|
||||
if(c == "\f") return "\\f";
|
||||
if(c == "\n") return "\\n";
|
||||
if(c == "\r") return "\\r";
|
||||
if(c == "\t") return "\\t";
|
||||
var hex = c.charCodeAt(0).toString(16);
|
||||
if(hex.length == 1) return "\\u000" + hex;
|
||||
if(hex.length == 2) return "\\u00" + hex;
|
||||
if(hex.length == 3) return "\\u0" + hex;
|
||||
return "\\u" + hex;
|
||||
};
|
||||
|
||||
/**
|
||||
* Encode a string into JSON format.
|
||||
*/
|
||||
JSONClient.escapeJSONString = function(s) {
|
||||
// The following should suffice but Safari's regex is broken (doesn't support callback substitutions)
|
||||
// return "\"" + s.replace(/([^\u0020-\u007f]|[\\\"])/g, JSONClient.escapeJSONChar) + "\"";
|
||||
|
||||
// Rather inefficient way to do it
|
||||
var parts = s.split("");
|
||||
for(var i = 0; i < parts.length; i++) {
|
||||
var c = parts[i];
|
||||
if(c == '"' || c == '\\' || c.charCodeAt(0) < 32 || c.charCodeAt(0) >= 128)
|
||||
parts[i] = JSONClient.escapeJSONChar(parts[i]);
|
||||
}
|
||||
return "\"" + parts.join("") + "\"";
|
||||
};
|
||||
|
||||
/**
|
||||
* Marshall objects to JSON format.
|
||||
*/
|
||||
JSONClient.toJSON = function(o) {
|
||||
if(o == null)
|
||||
return "null";
|
||||
if(o.constructor == String)
|
||||
return JSONClient.escapeJSONString(o);
|
||||
if(o.constructor == Number)
|
||||
return o.toString();
|
||||
if(o.constructor == Boolean)
|
||||
return o.toString();
|
||||
if(o.constructor == Date)
|
||||
return '{javaClass: "java.util.Date", time: ' + o.valueOf() +'}';
|
||||
if(o.constructor == Array) {
|
||||
var v = [];
|
||||
for(var i = 0; i < o.length; i++)
|
||||
v.push(JSONClient.toJSON(o[i]));
|
||||
return "[" + v.join(", ") + "]";
|
||||
}
|
||||
var v = [];
|
||||
for(attr in o) {
|
||||
if(o[attr] == null)
|
||||
v.push("\"" + attr + "\": null");
|
||||
else if(typeof o[attr] == "function")
|
||||
; // Skip
|
||||
else
|
||||
v.push(JSONClient.escapeJSONString(attr) + ": " + JSONClient.toJSON(o[attr]));
|
||||
}
|
||||
return "{" + v.join(", ") + "}";
|
||||
};
|
||||
|
||||
/**
|
||||
* Construct an HTTPBindingClient.
|
||||
*/
|
||||
|
|
@ -113,6 +37,17 @@ function HTTPBindingClient(name, uri, domain) {
|
|||
* HTTPBindingClient implementation
|
||||
*/
|
||||
|
||||
/**
|
||||
* Run a function asynchronously.
|
||||
*/
|
||||
HTTPBindingClient.delaying = false;
|
||||
HTTPBindingClient.delay = function(f) {
|
||||
if (HTTPBindingClient.delaying)
|
||||
return window.setTimeout(f, 0);
|
||||
else
|
||||
return f();
|
||||
};
|
||||
|
||||
/**
|
||||
* Generate client proxy apply method.
|
||||
*/
|
||||
|
|
@ -121,10 +56,10 @@ HTTPBindingClient.prototype.createApplyMethod = function() {
|
|||
var methodName = arguments[0];
|
||||
var args = [];
|
||||
for(var i = 1; i < arguments.length; i++)
|
||||
args.push(arguments[i]);
|
||||
args[args.length] = arguments[i];
|
||||
|
||||
var cb = null;
|
||||
if(typeof args[args.length - 1] == "function")
|
||||
var cb;
|
||||
if(typeof args[args.length - 1] == 'function')
|
||||
cb = args.pop();
|
||||
|
||||
var req = HTTPBindingClient.makeJSONRequest(methodName, args, cb);
|
||||
|
|
@ -151,7 +86,7 @@ HTTPBindingClient.makeJSONRequest = function(methodName, args, cb) {
|
|||
obj.id = req.id;
|
||||
obj.method = methodName;
|
||||
obj.params = args;
|
||||
req.data = JSONClient.toJSON(obj);
|
||||
req.data = JSON.stringify(obj);
|
||||
return req;
|
||||
};
|
||||
|
||||
|
|
@ -159,62 +94,39 @@ HTTPBindingClient.makeJSONRequest = function(methodName, args, cb) {
|
|||
* Return the JSON result from an XMLHttpRequest.
|
||||
*/
|
||||
HTTPBindingClient.jsonResult = function(http) {
|
||||
// Get the charset
|
||||
function httpCharset(http) {
|
||||
try {
|
||||
var contentType = http.getResponseHeader("Content-Type");
|
||||
var parts = contentType.split(/\s*;\s*/);
|
||||
for(var i = 0; i < parts.length; i++) {
|
||||
if(parts[i].substring(0, 8) == "charset=")
|
||||
return parts[i].substring(8, parts[i].length);
|
||||
}
|
||||
} catch (e) {}
|
||||
return "UTF-8";
|
||||
}
|
||||
if(!HTTPBindingClient.charset)
|
||||
HTTPBindingClient.charset = httpCharset(http);
|
||||
|
||||
// Unmarshall the JSON response
|
||||
var obj;
|
||||
eval("obj = " + http.responseText);
|
||||
if(obj.error)
|
||||
throw new HTTPBindingClient.Exception(obj.error.code, obj.error.msg);
|
||||
var res = obj.result;
|
||||
return res;
|
||||
var obj = JSON.parse(http.responseText);
|
||||
return obj.result;
|
||||
};
|
||||
|
||||
/**
|
||||
* Schedule async requests, limiting the number of concurrent running requests.
|
||||
*/
|
||||
HTTPBindingClient.queuedRequests = new Array();
|
||||
HTTPBindingClient.runningRequests = new Array();
|
||||
HTTPBindingClient.concurrentRequests = 2;
|
||||
HTTPBindingClient.queuedRequests = [];
|
||||
HTTPBindingClient.runningRequests = [];
|
||||
HTTPBindingClient.concurrentRequests = 4;
|
||||
|
||||
HTTPBindingClient.scheduleAsyncRequest = function(f, cancelable) {
|
||||
//debug('schedule async request, running ' + HTTPBindingClient.runningRequests.length + ' queued ' + HTTPBindingClient.queuedRequests.length);
|
||||
debug('component schedule async request', 'running', HTTPBindingClient.runningRequests.length, 'queued', HTTPBindingClient.queuedRequests.length);
|
||||
|
||||
// Queue the request function
|
||||
var req = new Object();
|
||||
req.f = f;
|
||||
req.cancelable = cancelable;
|
||||
req.canceled = false;
|
||||
HTTPBindingClient.queuedRequests.push(req);
|
||||
HTTPBindingClient.queuedRequests[HTTPBindingClient.queuedRequests.length] = req;
|
||||
|
||||
// Execute any requests in the queue
|
||||
setTimeout(function() {
|
||||
HTTPBindingClient.runAsyncRequests(true);
|
||||
}, 0);
|
||||
return true;
|
||||
return HTTPBindingClient.runAsyncRequests();
|
||||
};
|
||||
|
||||
HTTPBindingClient.forgetRequest = function(req) {
|
||||
req.http = null;
|
||||
req.http = undefined;
|
||||
|
||||
// Remove a request from the list of running requests
|
||||
for (i in HTTPBindingClient.runningRequests) {
|
||||
for (var i in HTTPBindingClient.runningRequests) {
|
||||
if (HTTPBindingClient.runningRequests[i] == req) {
|
||||
HTTPBindingClient.runningRequests.splice(i, 1);
|
||||
//debug('forget async request, running ' + HTTPBindingClient.runningRequests.length + ' queued ' + HTTPBindingClient.queuedRequests.length);
|
||||
debug('forget async request', 'running', HTTPBindingClient.runningRequests.length, 'queued', HTTPBindingClient.queuedRequests.length);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
@ -222,33 +134,32 @@ HTTPBindingClient.forgetRequest = function(req) {
|
|||
};
|
||||
|
||||
HTTPBindingClient.cancelRequests = function() {
|
||||
//debug('cancel async requests, running ' + HTTPBindingClient.runningRequests.length + ' queued ' + HTTPBindingClient.queuedRequests.length);
|
||||
debug('component cancel async requests', 'running', HTTPBindingClient.runningRequests.length, 'queued', HTTPBindingClient.queuedRequests.length);
|
||||
|
||||
// Cancel any cancelable in flight HTTP requests
|
||||
for (i in HTTPBindingClient.queuedRequests) {
|
||||
for (var i in HTTPBindingClient.queuedRequests) {
|
||||
var req = HTTPBindingClient.queuedRequests[i];
|
||||
if (req.cancelable)
|
||||
req.canceled = true;
|
||||
}
|
||||
for (i in HTTPBindingClient.runningRequests) {
|
||||
for (var i in HTTPBindingClient.runningRequests) {
|
||||
var req = HTTPBindingClient.runningRequests[i];
|
||||
if (req.cancelable) {
|
||||
req.canceled = true;
|
||||
if (req.http) {
|
||||
req.http.aborted = true;
|
||||
req.http.abort();
|
||||
req.http = null;
|
||||
//debug('abort async request, running ' + HTTPBindingClient.runningRequests.length + ' queued ' + HTTPBindingClient.queuedRequests.length);
|
||||
req.http = undefined;
|
||||
debug('component abort async request', 'running', HTTPBindingClient.runningRequests.length, 'queued', HTTPBindingClient.queuedRequests.length);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Flush the queue
|
||||
setTimeout(function() {
|
||||
HTTPBindingClient.runAsyncRequests(true);
|
||||
}, 0);
|
||||
return HTTPBindingClient.runAsyncRequests();
|
||||
}
|
||||
|
||||
HTTPBindingClient.runAsyncRequests = function(fromui) {
|
||||
HTTPBindingClient.runAsyncRequests = function() {
|
||||
// Stop now if we already have enough requests running or there's no request in the queue
|
||||
if(HTTPBindingClient.runningRequests.length >= HTTPBindingClient.concurrentRequests || HTTPBindingClient.queuedRequests.length == 0)
|
||||
return true;
|
||||
|
|
@ -256,41 +167,38 @@ HTTPBindingClient.runAsyncRequests = function(fromui) {
|
|||
// Run the first request in the queue
|
||||
var req = HTTPBindingClient.queuedRequests.shift();
|
||||
if (!req.canceled) {
|
||||
HTTPBindingClient.runningRequests.push(req);
|
||||
//debug('run async request, running ' + HTTPBindingClient.runningRequests.length + ' queued ' + HTTPBindingClient.queuedRequests.length);
|
||||
var runAsyncRequest = function() {
|
||||
if (req.canceled) {
|
||||
HTTPBindingClient.forgetRequest(req);
|
||||
//debug('canceled timed async request, running ' + HTTPBindingClient.runningRequests.length + ' queued ' + HTTPBindingClient.queuedRequests.length);
|
||||
return false;
|
||||
}
|
||||
HTTPBindingClient.runningRequests[HTTPBindingClient.runningRequests.length] = req;
|
||||
debug('component run async request', 'running', HTTPBindingClient.runningRequests.length, 'queued', HTTPBindingClient.queuedRequests.length);
|
||||
if (req.canceled) {
|
||||
HTTPBindingClient.forgetRequest(req);
|
||||
debug('component canceled timed async request', 'running', HTTPBindingClient.runningRequests.length, 'queued', HTTPBindingClient.queuedRequests.length);
|
||||
return false;
|
||||
}
|
||||
HTTPBindingClient.delay(function asyncRequest() {
|
||||
try {
|
||||
req.http = new XMLHttpRequest();
|
||||
req.http.aborted = false;
|
||||
return req.f(req.http, function asyncRequestDone() {
|
||||
// Execute any requests left in the queue
|
||||
HTTPBindingClient.forgetRequest(req);
|
||||
//debug('done async request, running ' + HTTPBindingClient.runningRequests.length + ' queued ' + HTTPBindingClient.queuedRequests.length);
|
||||
HTTPBindingClient.runAsyncRequests(false);
|
||||
debug('component done async request', 'running', HTTPBindingClient.runningRequests.length, 'queued', HTTPBindingClient.queuedRequests.length);
|
||||
HTTPBindingClient.runAsyncRequests();
|
||||
return true;
|
||||
});
|
||||
} catch(e) {
|
||||
// Execute any requests left in the queue
|
||||
HTTPBindingClient.forgetRequest(req);
|
||||
//debug('err async request, running ' + HTTPBindingClient.runningRequests.length + ' queued ' + HTTPBindingClient.queuedRequests.length);
|
||||
HTTPBindingClient.runAsyncRequests(false);
|
||||
debug('component async request error', 'running', HTTPBindingClient.runningRequests.length, 'queued', HTTPBindingClient.queuedRequests.length, 'error', e);
|
||||
HTTPBindingClient.runAsyncRequests();
|
||||
}
|
||||
return false;
|
||||
};
|
||||
if (false)
|
||||
setTimeout(runAsyncRequest, 0);
|
||||
else
|
||||
runAsyncRequest();
|
||||
});
|
||||
} else {
|
||||
//debug('canceled queued async request, running ' + HTTPBindingClient.runningRequests.length + ' queued ' + HTTPBindingClient.queuedRequests.length);
|
||||
debug('component canceled queued async request', 'running', HTTPBindingClient.runningRequests.length, 'queued', HTTPBindingClient.queuedRequests.length);
|
||||
}
|
||||
|
||||
// Execute any requests left in the queue
|
||||
HTTPBindingClient.runAsyncRequests(fromui);
|
||||
HTTPBindingClient.runAsyncRequests();
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -298,24 +206,24 @@ HTTPBindingClient.runAsyncRequests = function(fromui) {
|
|||
*/
|
||||
HTTPBindingClient.getCacheItem = function(k) {
|
||||
var ls = lstorage || localStorage;
|
||||
return ls.getItem('cache.d.' + k);
|
||||
return ls.getItem('dc.d.' + k);
|
||||
};
|
||||
|
||||
/**
|
||||
* Set a cache item in local storage.
|
||||
*/
|
||||
HTTPBindingClient.setCacheItem = function(k, v) {
|
||||
if (v && v.length > 65535)
|
||||
return HTTPBindingClient.removeCacheItem(k);
|
||||
HTTPBindingClient.collectCacheItems();
|
||||
var ls = lstorage || localStorage;
|
||||
try {
|
||||
var s = ls.getItem('cache.size');
|
||||
var size = parseInt(s);
|
||||
var ov = ls.getItem('cache.d.' + k);
|
||||
var nsize = size - (ov != null? ov.length : 0) + (v != null? v.length : 0);
|
||||
if (nsize != size)
|
||||
ls.setItem('cache.size', nsize.toString());
|
||||
} catch(e) {}
|
||||
return ls.setItem('cache.d.' + k, v);
|
||||
var s = ls.getItem('dc.size');
|
||||
var size = s? parseInt(s) : 0;
|
||||
var ov = ls.getItem('dc.d.' + k);
|
||||
var nsize = size - (ov? ov.length : 0) + (v? v.length : 0);
|
||||
if (nsize != size)
|
||||
ls.setItem('dc.size', nsize.toString());
|
||||
return ls.setItem('dc.d.' + k, v);
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -323,16 +231,14 @@ HTTPBindingClient.setCacheItem = function(k, v) {
|
|||
*/
|
||||
HTTPBindingClient.removeCacheItem = function(k) {
|
||||
var ls = lstorage || localStorage;
|
||||
try {
|
||||
var s = ls.getItem('cache.size');
|
||||
var size = parseInt(s);
|
||||
var ov = ls.getItem('cache.d' + k);
|
||||
if (ov != null) {
|
||||
var nsize = size - ov.length;
|
||||
ls.setItem('cache.size', nsize.toString());
|
||||
}
|
||||
} catch(e) {}
|
||||
return ls.removeItem('cache.d.' + k);
|
||||
var s = ls.getItem('dc.size');
|
||||
var size = s? parseInt(s) : 0;
|
||||
var ov = ls.getItem('dc.d.' + k);
|
||||
if (ov) {
|
||||
var nsize = size - ov.length;
|
||||
ls.setItem('dc.size', nsize.toString());
|
||||
}
|
||||
return ls.removeItem('dc.d.' + k);
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -343,61 +249,59 @@ HTTPBindingClient.collectCacheSize = /* 10000; */ 1048576;
|
|||
HTTPBindingClient.collectCacheItems = function() {
|
||||
var ls = window.lstorage || localStorage;
|
||||
var nkeys = window.lstorage? function() { return ls.length(); } : function() { return ls.length; };
|
||||
try {
|
||||
// Get the current cache size
|
||||
var size = 0;
|
||||
var s = ls.getItem('cache.size');
|
||||
if(s == null) {
|
||||
// Calculate and store initial cache size
|
||||
//debug('calculating cache size');
|
||||
var n = nkeys();
|
||||
for(var i = 0; i < n; i++) {
|
||||
var k = ls.key(i);
|
||||
if(k == null || k.substr(0, 8) != 'cache.d.')
|
||||
continue;
|
||||
var v = ls.getItem(k);
|
||||
if(v == null)
|
||||
continue;
|
||||
size += v.length;
|
||||
}
|
||||
ls.setItem('cache.size', size.toString());
|
||||
} else
|
||||
size = parseInt(s);
|
||||
|
||||
// Nothing to do if it's below the max size
|
||||
//debug('cache.size', size);
|
||||
if (size <= HTTPBindingClient.maxCacheSize)
|
||||
return false;
|
||||
|
||||
// Collect random cache entries until we reach our min size
|
||||
//debug('collecting cache items');
|
||||
var keys = new Array();
|
||||
// Get the current cache size
|
||||
var size = 0;
|
||||
var s = ls.getItem('dc.size');
|
||||
if(!s) {
|
||||
// Calculate and store initial cache size
|
||||
debug('component calculating cache size');
|
||||
var n = nkeys();
|
||||
for(var i = 0; i < n; i++) {
|
||||
var k = ls.key(i);
|
||||
if(k == null || k.substr(0, 8) != 'cache.d.')
|
||||
if(!k || k.substr(0, 5) != 'dc.d.')
|
||||
continue;
|
||||
keys.push(k);
|
||||
}
|
||||
while (keys.length != 0 && size >= HTTPBindingClient.collectCacheSize) {
|
||||
var r = Math.floor(keys.length * Math.random());
|
||||
if (r == keys.length)
|
||||
continue;
|
||||
var k = keys[r];
|
||||
var v = ls.getItem(k);
|
||||
//debug('collect cache item', k);
|
||||
ls.removeItem(k);
|
||||
keys.splice(r, 1);
|
||||
if (v != null)
|
||||
size = size - v.length;
|
||||
if(!v)
|
||||
continue;
|
||||
size += v.length;
|
||||
}
|
||||
ls.setItem('dc.size', size.toString());
|
||||
} else
|
||||
size = parseInt(s);
|
||||
|
||||
// Store the new cache size
|
||||
//debug('updated cache.size', size);
|
||||
ls.setItem('cache.size', size.toString());
|
||||
return true;
|
||||
} catch(e) {}
|
||||
return false;
|
||||
// Nothing to do if it's below the max size
|
||||
debug('component cache size', size);
|
||||
if (size <= HTTPBindingClient.maxCacheSize)
|
||||
return false;
|
||||
|
||||
// Collect random cache entries until we reach our min size
|
||||
debug('component collecting cache items');
|
||||
var keys = [];
|
||||
var n = nkeys();
|
||||
for(var i = 0; i < n; i++) {
|
||||
var k = ls.key(i);
|
||||
if(!k || k.substr(0, 5) != 'dc.d.')
|
||||
continue;
|
||||
keys[keys.length] = k;
|
||||
}
|
||||
while (keys.length != 0 && size >= HTTPBindingClient.collectCacheSize) {
|
||||
var r = Math.floor(keys.length * Math.random());
|
||||
if (r == keys.length)
|
||||
continue;
|
||||
var k = keys[r];
|
||||
var v = ls.getItem(k);
|
||||
debug('component collect cache item', k);
|
||||
ls.removeItem(k);
|
||||
keys.splice(r, 1);
|
||||
if (v)
|
||||
size = size - v.length;
|
||||
}
|
||||
|
||||
// Store the new cache size
|
||||
debug('component updated cache size', size);
|
||||
ls.setItem('dc.size', size.toString());
|
||||
return true;
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -410,28 +314,19 @@ HTTPBindingClient.prototype.jsonApply = function(req) {
|
|||
if(hascb) {
|
||||
var u = this.uri;
|
||||
return HTTPBindingClient.scheduleAsyncRequest(function jsonApplyRequest(http, done) {
|
||||
http.open("POST", u, true);
|
||||
http.setRequestHeader("Accept", "*/*");
|
||||
http.setRequestHeader("Content-Type", "application/json-rpc");
|
||||
http.open('POST', u, true);
|
||||
http.setRequestHeader('Accept', '*/*');
|
||||
http.setRequestHeader('Content-Type', 'application/json-rpc');
|
||||
http.setRequestHeader('X-Cache-Control', 'no-cache');
|
||||
http.onreadystatechange = function() {
|
||||
if(http.readyState == 4) {
|
||||
// Pass the result or exception
|
||||
if(http.status == 200) {
|
||||
var res = null;
|
||||
try {
|
||||
res = HTTPBindingClient.jsonResult(http);
|
||||
try {
|
||||
req.cb(res);
|
||||
} catch(cbe) {}
|
||||
} catch(e) {
|
||||
try {
|
||||
req.cb(null, e);
|
||||
} catch(cbe) {}
|
||||
}
|
||||
} else {
|
||||
try {
|
||||
req.cb(null, HTTPBindingClient.Exception(http.status, http.statusText));
|
||||
} catch(cbe) {}
|
||||
var res = HTTPBindingClient.jsonResult(http);
|
||||
req.cb(res);
|
||||
} if(!http.aborted) {
|
||||
error('jsonApply error', 'status', http.status, http.statusText);
|
||||
req.cb(undefined, new Error('' + http.status + ' ' + http.statusText));
|
||||
}
|
||||
return done();
|
||||
}
|
||||
|
|
@ -445,13 +340,15 @@ HTTPBindingClient.prototype.jsonApply = function(req) {
|
|||
|
||||
// Call synchronously and return the result or exception
|
||||
var http = new XMLHttpRequest();
|
||||
http.open("POST", this.uri, false);
|
||||
http.setRequestHeader("Accept", "*/*");
|
||||
http.setRequestHeader("Content-Type", "application/json-rpc");
|
||||
http.open('POST', this.uri, false);
|
||||
http.setRequestHeader('Accept', '*/*');
|
||||
http.setRequestHeader('Content-Type', 'application/json-rpc');
|
||||
http.setRequestHeader('X-Cache-Control', 'no-cache');
|
||||
http.send(req.data);
|
||||
if(http.status == 200)
|
||||
return HTTPBindingClient.jsonResult(http);
|
||||
throw new HTTPBindingClient.Exception(http.status, http.statusText);
|
||||
error('jsonApply error', 'status', http.status, http.statusText);
|
||||
throw new Error('' + http.status + ' ' + http.statusText);
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -463,69 +360,64 @@ HTTPBindingClient.prototype.get = function(id, cb, mode) {
|
|||
var hascb = cb? true : false;
|
||||
|
||||
// Get from local storage first
|
||||
var item = null;
|
||||
var item;
|
||||
if(mode != 'remote') {
|
||||
item = HTTPBindingClient.getCacheItem(u);
|
||||
if(item != null && item != '') {
|
||||
if(item && item != '') {
|
||||
if(!hascb)
|
||||
return item;
|
||||
|
||||
// Pass local result to callback
|
||||
setTimeout(function() {
|
||||
cb(item);
|
||||
}, 0);
|
||||
cb(item);
|
||||
}
|
||||
}
|
||||
|
||||
// Call asynchronously with a callback
|
||||
if(hascb) {
|
||||
return HTTPBindingClient.scheduleAsyncRequest(function getRequest(http, done) {
|
||||
http.open("GET", u, true);
|
||||
http.setRequestHeader("Accept", "*/*");
|
||||
http.open('GET', u, true);
|
||||
http.setRequestHeader('Accept', '*/*');
|
||||
http.setRequestHeader('X-Cache-Control', 'no-cache');
|
||||
http.onreadystatechange = function() {
|
||||
//debug('readystate', http.readyState, 'status', http.status, 'headers', http.getAllResponseHeaders());
|
||||
if(http.readyState == 4) {
|
||||
|
||||
// Pass result if different from local result
|
||||
//debug('readystate', http.readyState, 'status', http.status, 'headers', http.getAllResponseHeaders());
|
||||
if(http.status == 200) {
|
||||
var xl = http.getResponseHeader("X-Login");
|
||||
var ct = http.getResponseHeader("Content-Type");
|
||||
if(xl != null && xl != '' && ct != null && ct.indexOf('text/html') == 0) {
|
||||
// Detect redirect to a login page
|
||||
try {
|
||||
var le = new HTTPBindingClient.Exception(403, 'X-Login');
|
||||
if(window.onloginredirect)
|
||||
window.onloginredirect(le);
|
||||
cb(null, le);
|
||||
return done();
|
||||
} catch(cbe) {}
|
||||
var ct = http.getResponseHeader('Content-Type');
|
||||
if(http.responseText == '' || !ct || ct == '') {
|
||||
|
||||
}
|
||||
if(http.responseText == '' || ct == null || ct == '') {
|
||||
// Report empty response
|
||||
try {
|
||||
cb(null, new HTTPBindingClient.Exception(403, 'No-Content'));
|
||||
return done();
|
||||
} catch(cbe) {}
|
||||
error('get received empty response', 'url', u);
|
||||
cb(undefined, new Error('500 No-Content'));
|
||||
return done();
|
||||
|
||||
} else {
|
||||
if(item == null || http.responseText != item) {
|
||||
// Store retrieved entry in local storage
|
||||
if(http.responseText != null)
|
||||
HTTPBindingClient.setCacheItem(u, http.responseText);
|
||||
try {
|
||||
cb(http.responseText);
|
||||
return done();
|
||||
} catch(cbe) {}
|
||||
}
|
||||
} else if(!item || http.responseText != item) {
|
||||
|
||||
// Store retrieved entry in local storage
|
||||
//debug('received response', 'url', u, 'response', http.responseText);
|
||||
if(http.responseText != null)
|
||||
HTTPBindingClient.setCacheItem(u, http.responseText);
|
||||
cb(http.responseText);
|
||||
return done();
|
||||
}
|
||||
}
|
||||
else {
|
||||
} else if (http.status == 403) {
|
||||
|
||||
// Redirect to login page
|
||||
error('get received 403 response', 'url', u);
|
||||
var le = new Error('' + http.status + ' ' + http.statusText);
|
||||
if(window.onloginredirect)
|
||||
window.onloginredirect(le);
|
||||
cb(undefined, le);
|
||||
return done();
|
||||
|
||||
} else if(!http.aborted) {
|
||||
|
||||
// Pass exception if we didn't have a local result
|
||||
if(item == null) {
|
||||
try {
|
||||
cb(null, new HTTPBindingClient.Exception(http.status, http.statusText));
|
||||
return done();
|
||||
} catch(cbe) {}
|
||||
error('get received error', 'url', u, 'status', http.status, http.statusText);
|
||||
if(!item) {
|
||||
cb(undefined, new Error('' + http.status + ' ' + http.statusText));
|
||||
return done();
|
||||
}
|
||||
}
|
||||
return done();
|
||||
|
|
@ -540,28 +432,29 @@ HTTPBindingClient.prototype.get = function(id, cb, mode) {
|
|||
|
||||
// Call synchronously and return the result or exception
|
||||
var http = new XMLHttpRequest();
|
||||
http.open("GET", u, false);
|
||||
http.setRequestHeader("Accept", "*/*");
|
||||
http.open('GET', u, false);
|
||||
http.setRequestHeader('Accept', '*/*');
|
||||
http.setRequestHeader('X-Cache-Control', 'no-cache');
|
||||
http.send(null);
|
||||
if(http.status == 200) {
|
||||
var xl = http.getResponseHeader("X-Login");
|
||||
var ct = http.getResponseHeader("Content-Type");
|
||||
if(xl != null && xl != '' && ct != null && ct.indexOf('text/html') == 0) {
|
||||
// Detect redirect to a login page
|
||||
var le = new HTTPBindingClient.Exception(403, 'X-Login');
|
||||
if(window.onloginredirect)
|
||||
window.onloginredirect(le);
|
||||
throw le;
|
||||
|
||||
}
|
||||
var ct = http.getResponseHeader("Content-Type");
|
||||
if(http.responseText == '' || ct == null || ct == '') {
|
||||
var ct = http.getResponseHeader('Content-Type');
|
||||
if(http.responseText == '' || !ct || ct == '') {
|
||||
// Report empty response
|
||||
throw new HTTPBindingClient.Exception(403, 'No-Content');
|
||||
error('get received empty response', 'url', u);
|
||||
throw new Error('500 No Content');
|
||||
}
|
||||
return http.responseText;
|
||||
}
|
||||
throw new HTTPBindingClient.Exception(http.status, http.statusText);
|
||||
if(http.status == 403) {
|
||||
// Redirect to login page
|
||||
error('get received 403 response', 'url', u);
|
||||
var le = new Error('' + http.status + ' ' + http.statusText);
|
||||
if(window.onloginredirect)
|
||||
window.onloginredirect(le);
|
||||
throw le;
|
||||
}
|
||||
error('get received error', 'url', u, 'status', http.status, http.statusText);
|
||||
throw new Error('' + http.status + ' ' + http.statusText);
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -574,22 +467,20 @@ HTTPBindingClient.prototype.post = function (entry, cb) {
|
|||
if(hascb) {
|
||||
var u = this.uri;
|
||||
return HTTPBindingClient.scheduleAsyncRequest(function postRequest(http, done) {
|
||||
http.open("POST", u, true);
|
||||
http.setRequestHeader("Accept", "*/*");
|
||||
http.setRequestHeader("Content-Type", "application/atom+xml");
|
||||
http.open('POST', u, true);
|
||||
http.setRequestHeader('Accept', '*/*');
|
||||
http.setRequestHeader('Content-Type', 'application/atom+xml');
|
||||
http.setRequestHeader('X-Cache-Control', 'no-cache');
|
||||
http.onreadystatechange = function() {
|
||||
if(http.readyState == 4) {
|
||||
if(http.status == 201) {
|
||||
|
||||
// Successful result
|
||||
try {
|
||||
cb(http.responseText);
|
||||
} catch(cbe) {}
|
||||
cb(http.responseText);
|
||||
}
|
||||
else {
|
||||
// Report status code as an exception
|
||||
try {
|
||||
cb(null, new HTTPBindingClient.Exception(http.status, http.statusText));
|
||||
} catch(cbe) {}
|
||||
cb(undefined, new Error('' + http.status + ' ' + http.statusText));
|
||||
}
|
||||
return done();
|
||||
}
|
||||
|
|
@ -603,15 +494,16 @@ HTTPBindingClient.prototype.post = function (entry, cb) {
|
|||
// Call synchronously
|
||||
var http = new XMLHttpRequest();
|
||||
var hascb = cb? true : false;
|
||||
http.open("POST", this.uri, false);
|
||||
http.setRequestHeader("Accept", "*/*");
|
||||
http.setRequestHeader("Content-Type", "application/atom+xml");
|
||||
http.open('POST', this.uri, false);
|
||||
http.setRequestHeader('Accept', '*/*');
|
||||
http.setRequestHeader('Content-Type', 'application/atom+xml');
|
||||
http.setRequestHeader('X-Cache-Control', 'no-cache');
|
||||
http.send(entry);
|
||||
if(http.status == 201)
|
||||
return http.responseText;
|
||||
|
||||
// Return status code as an exception
|
||||
throw new HTTPBindingClient.Exception(http.status, http.statusText);
|
||||
throw new Error('' + http.status + ' ' + http.statusText);
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -622,7 +514,7 @@ HTTPBindingClient.prototype.put = function(id, entry, cb, mode) {
|
|||
var hascb = cb? true : false;
|
||||
|
||||
// Update local storage
|
||||
var oentry = null;
|
||||
var oentry;
|
||||
if(mode != 'remote') {
|
||||
oentry = HTTPBindingClient.getCacheItem(u);
|
||||
HTTPBindingClient.setCacheItem(u, entry);
|
||||
|
|
@ -631,33 +523,31 @@ HTTPBindingClient.prototype.put = function(id, entry, cb, mode) {
|
|||
// Call asynchronously with a callback
|
||||
if(hascb) {
|
||||
return HTTPBindingClient.scheduleAsyncRequest(function putRequest(http, done) {
|
||||
http.open("PUT", u, true);
|
||||
http.setRequestHeader("Accept", "*/*");
|
||||
http.setRequestHeader("Content-Type", "application/atom+xml");
|
||||
http.open('PUT', u, true);
|
||||
http.setRequestHeader('Accept', '*/*');
|
||||
http.setRequestHeader('Content-Type', 'application/atom+xml');
|
||||
http.setRequestHeader('X-Cache-Control', 'no-cache');
|
||||
http.onreadystatechange = function() {
|
||||
if(http.readyState == 4) {
|
||||
if(http.status == 200) {
|
||||
|
||||
// Successful result
|
||||
try {
|
||||
cb();
|
||||
} catch(cbe) {}
|
||||
cb();
|
||||
|
||||
} else {
|
||||
if(http.status == 404) {
|
||||
|
||||
// Undo local storage update
|
||||
if(mode != 'remote') {
|
||||
try {
|
||||
if(oentry != null)
|
||||
HTTPBindingClient.setCacheItem(u, oentry);
|
||||
else
|
||||
HTTPBindingClient.removeCacheItem(u);
|
||||
} catch(e) {}
|
||||
if(oentry)
|
||||
HTTPBindingClient.setCacheItem(u, oentry);
|
||||
else
|
||||
HTTPBindingClient.removeCacheItem(u);
|
||||
}
|
||||
}
|
||||
|
||||
// Report status code as an exception
|
||||
try {
|
||||
cb(new HTTPBindingClient.Exception(http.status, http.statusText));
|
||||
} catch(cbe) {}
|
||||
cb(new Error('' + http.status + ' ' + http.statusText));
|
||||
}
|
||||
return done();
|
||||
}
|
||||
|
|
@ -671,26 +561,25 @@ HTTPBindingClient.prototype.put = function(id, entry, cb, mode) {
|
|||
|
||||
// Call synchronously
|
||||
var http = new XMLHttpRequest();
|
||||
http.open("PUT", u, false);
|
||||
http.setRequestHeader("Accept", "*/*");
|
||||
http.setRequestHeader("Content-Type", "application/atom+xml");
|
||||
http.open('PUT', u, false);
|
||||
http.setRequestHeader('Accept', '*/*');
|
||||
http.setRequestHeader('Content-Type', 'application/atom+xml');
|
||||
http.setRequestHeader('X-Cache-Control', 'no-cache');
|
||||
http.send(entry);
|
||||
if(http.status == 200)
|
||||
return true;
|
||||
if(http.status == 404) {
|
||||
// Undo local storage update
|
||||
if(mode != 'remote') {
|
||||
try {
|
||||
if(oentry != null)
|
||||
HTTPBindingClient.setCacheItem(u, oentry);
|
||||
else
|
||||
HTTPBindingClient.removeCacheItem(u);
|
||||
} catch(e) {}
|
||||
if(oentry)
|
||||
HTTPBindingClient.setCacheItem(u, oentry);
|
||||
else
|
||||
HTTPBindingClient.removeCacheItem(u);
|
||||
}
|
||||
}
|
||||
|
||||
// Return status code as an exception
|
||||
throw new HTTPBindingClient.Exception(http.status, http.statusText);
|
||||
throw new Error('' + http.status + ' ' + http.statusText);
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -708,21 +597,19 @@ HTTPBindingClient.prototype.del = function(id, cb, mode) {
|
|||
// Call asynchronously with a callback
|
||||
if(hascb) {
|
||||
return HTTPBindingClient.scheduleAsyncRequest(function delRequest(http, done) {
|
||||
http.open("DELETE", u, true);
|
||||
http.setRequestHeader("Accept", "*/*");
|
||||
http.open('DELETE', u, true);
|
||||
http.setRequestHeader('Accept', '*/*');
|
||||
http.setRequestHeader('X-Cache-Control', 'no-cache');
|
||||
http.onreadystatechange = function() {
|
||||
if(http.readyState == 4) {
|
||||
if(http.status == 200) {
|
||||
|
||||
// Successful result
|
||||
try {
|
||||
cb();
|
||||
} catch(cbe) {}
|
||||
cb();
|
||||
}
|
||||
else {
|
||||
// Report status code as an exception
|
||||
try {
|
||||
cb(new HTTPBindingClient.Exception(http.status, http.statusText));
|
||||
} catch(cbe) {}
|
||||
cb(new Error('' + http.status + ' ' + http.statusText));
|
||||
}
|
||||
return done();
|
||||
}
|
||||
|
|
@ -736,29 +623,15 @@ HTTPBindingClient.prototype.del = function(id, cb, mode) {
|
|||
|
||||
// Call synchronously
|
||||
var http = new XMLHttpRequest();
|
||||
http.open("DELETE", u, false);
|
||||
http.setRequestHeader("Accept", "*/*");
|
||||
http.open('DELETE', u, false);
|
||||
http.setRequestHeader('Accept', '*/*');
|
||||
http.setRequestHeader('X-Cache-Control', 'no-cache');
|
||||
http.send(null);
|
||||
if(http.status == 200)
|
||||
return true;
|
||||
|
||||
// Report status code as an exception
|
||||
throw new HTTPBindingClient.Exception(http.status, http.statusText);
|
||||
};
|
||||
|
||||
/**
|
||||
* HTTPBindingClient exceptions.
|
||||
*/
|
||||
HTTPBindingClient.Exception = function(code, message) {
|
||||
this.name = "HTTPBindingClientException";
|
||||
this.code = code;
|
||||
this.message = message;
|
||||
};
|
||||
|
||||
HTTPBindingClient.Exception.prototype = new Error();
|
||||
|
||||
HTTPBindingClient.Exception.prototype.toString = function() {
|
||||
return this.name + ": " + this.message;
|
||||
throw new Error('' + http.status + ' ' + http.statusText);
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -770,7 +643,7 @@ var sca = {};
|
|||
/**
|
||||
* Return an HTTP client proxy.
|
||||
*/
|
||||
sca.httpclient = function(name, uri, domain) {
|
||||
sca.httpClient = function(name, uri, domain) {
|
||||
return new HTTPBindingClient(name, uri, domain);
|
||||
};
|
||||
|
||||
|
|
@ -798,15 +671,15 @@ sca.reference = function(comp, rname) {
|
|||
sca.defun = function(ref) {
|
||||
function defapply(name) {
|
||||
return function() {
|
||||
var args = new Array();
|
||||
var args = [];
|
||||
args[0] = name;
|
||||
for(i = 0, n = arguments.length; i < n; i++)
|
||||
for(var i = 0; i < arguments.length; i++)
|
||||
args[i + 1] = arguments[i];
|
||||
return this.apply.apply(this, args);
|
||||
};
|
||||
}
|
||||
|
||||
for(f = 1; f < arguments.length; f++) {
|
||||
for(var f = 1; f < arguments.length; f++) {
|
||||
var fn = arguments[f];
|
||||
ref[fn]= defapply(fn);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -63,12 +63,11 @@ json.jsPropertiesToValues = function(propertiesSoFar, o, i) {
|
|||
var v = json.jsValToValue(jsv);
|
||||
|
||||
if (typeof p == 'string') {
|
||||
var n = '' + p;
|
||||
if (n.slice(0, 1) == '@')
|
||||
return json.jsPropertiesToValues(cons(mklist(attribute, "'" + n.slice(1), v), propertiesSoFar), o, cdr(i));
|
||||
if (p[0] == '@')
|
||||
return json.jsPropertiesToValues(cons(mklist(attribute, "'" + p.substring(1), v), propertiesSoFar), o, cdr(i));
|
||||
if (isList(v) && !json.isJSArray(v))
|
||||
return json.jsPropertiesToValues(cons(cons(element, cons("'" + n, v)), propertiesSoFar), o, cdr(i));
|
||||
return json.jsPropertiesToValues(cons(mklist(element, "'" + n, v), propertiesSoFar), o, cdr(i));
|
||||
return json.jsPropertiesToValues(cons(cons(element, cons("'" + p, v)), propertiesSoFar), o, cdr(i));
|
||||
return json.jsPropertiesToValues(cons(mklist(element, "'" + p, v), propertiesSoFar), o, cdr(i));
|
||||
}
|
||||
return json.jsPropertiesToValues(cons(v, propertiesSoFar), o, cdr(i));
|
||||
};
|
||||
|
|
@ -80,9 +79,9 @@ json.jsValToValue = function(jsv) {
|
|||
if (jsv == null)
|
||||
return null;
|
||||
if (isList(jsv))
|
||||
return json.jsPropertiesToValues(mklist(), jsv, reverse(range(0, jsv.length)));
|
||||
return json.jsPropertiesToValues(nil, jsv, reverse(seq(0, jsv.length)));
|
||||
if (typeof jsv == 'object')
|
||||
return json.jsPropertiesToValues(mklist(), jsv, reverse(properties(jsv)));
|
||||
return json.jsPropertiesToValues(nil, jsv, reverse(properties(jsv)));
|
||||
if (typeof jsv == 'string')
|
||||
return '' + jsv;
|
||||
return jsv;
|
||||
|
|
@ -94,7 +93,7 @@ json.jsValToValue = function(jsv) {
|
|||
json.isJSON = function(l) {
|
||||
if (isNull(l))
|
||||
return false;
|
||||
var s = car(l).slice(0, 1);
|
||||
var s = car(l)[0];
|
||||
return s == "[" || s == "{";
|
||||
};
|
||||
|
||||
|
|
@ -102,10 +101,8 @@ json.isJSON = function(l) {
|
|||
* Convert a list of strings representing a JSON document to a list of values.
|
||||
*/
|
||||
json.readJSON = function(l) {
|
||||
var s = writeStrings(l);
|
||||
var obj;
|
||||
eval('obj = { \"val\": ' + s + " }");
|
||||
return json.jsValToValue(obj.val);
|
||||
var v = JSON.parse(writeStrings(l));
|
||||
return json.jsValToValue(v);
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -126,7 +123,7 @@ json.valueToJSVal = function(v) {
|
|||
if (!isList(v))
|
||||
return v;
|
||||
if (json.isJSArray(v))
|
||||
return json.valuesToJSElements(range(0, v.length), v, 0);
|
||||
return json.valuesToJSElements(seq(0, v.length), v, 0);
|
||||
return json.valuesToJSProperties({}, v);
|
||||
};
|
||||
|
||||
|
|
@ -139,14 +136,14 @@ json.valuesToJSProperties = function(o, l) {
|
|||
var token = car(l);
|
||||
if (isTaggedList(token, attribute)) {
|
||||
var pv = json.valueToJSVal(attributeValue(token));
|
||||
o['@' + attributeName(token).slice(1)] = pv;
|
||||
o['@' + attributeName(token).substring(1)] = pv;
|
||||
} else if (isTaggedList(token, element)) {
|
||||
if (elementHasValue(token)) {
|
||||
var pv = json.valueToJSVal(elementValue(token));
|
||||
o[elementName(token).slice(1)] = pv;
|
||||
o[elementName(token).substring(1)] = pv;
|
||||
} else {
|
||||
var child = {};
|
||||
o[elementName(token).slice(1)] = child;
|
||||
o[elementName(token).substring(1)] = child;
|
||||
json.valuesToJSProperties(child, elementChildren(token));
|
||||
}
|
||||
}
|
||||
|
|
@ -159,11 +156,10 @@ json.valuesToJSProperties = function(o, l) {
|
|||
json.writeJSON = function(l) {
|
||||
var jsv;
|
||||
if (json.isJSArray(l))
|
||||
jsv = json.valuesToJSElements(range(0, l.length), l, 0);
|
||||
jsv = json.valuesToJSElements(seq(0, l.length), l, 0);
|
||||
else
|
||||
jsv = json.valuesToJSProperties({}, l);
|
||||
var s = json.toJSON(jsv);
|
||||
return mklist(s);
|
||||
return mklist(JSON.stringify(jsv));
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -193,69 +189,3 @@ json.jsonResultValue = function(s) {
|
|||
return val;
|
||||
};
|
||||
|
||||
/**
|
||||
* Escape a character.
|
||||
*/
|
||||
json.escapeJSONChar = function(c) {
|
||||
if(c == "\"" || c == "\\") return "\\" + c;
|
||||
if (c == "\b") return "\\b";
|
||||
if (c == "\f") return "\\f";
|
||||
if (c == "\n") return "\\n";
|
||||
if (c == "\r") return "\\r";
|
||||
if (c == "\t") return "\\t";
|
||||
var hex = c.charCodeAt(0).toString(16);
|
||||
if(hex.length == 1) return "\\u000" + hex;
|
||||
if(hex.length == 2) return "\\u00" + hex;
|
||||
if(hex.length == 3) return "\\u0" + hex;
|
||||
return "\\u" + hex;
|
||||
};
|
||||
|
||||
/**
|
||||
* Encode a string into JSON format.
|
||||
*/
|
||||
json.escapeJSONString = function(s) {
|
||||
// The following should suffice but Safari's regex is broken (doesn't support callback substitutions)
|
||||
// return "\"" + s.replace(/([^\u0020-\u007f]|[\\\"])/g, json.escapeJSONChar) + "\"";
|
||||
|
||||
// Rather inefficient way to do it
|
||||
var parts = s.split("");
|
||||
for(var i = 0; i < parts.length; i++) {
|
||||
var c = parts[i];
|
||||
if(c == '"' || c == '\\' || c.charCodeAt(0) < 32 || c.charCodeAt(0) >= 128)
|
||||
parts[i] = json.escapeJSONChar(parts[i]);
|
||||
}
|
||||
return "\"" + parts.join("") + "\"";
|
||||
};
|
||||
|
||||
/**
|
||||
* Marshall objects to JSON format.
|
||||
*/
|
||||
json.toJSON = function(o) {
|
||||
if(o == null)
|
||||
return "null";
|
||||
if(o.constructor == String)
|
||||
return json.escapeJSONString(o);
|
||||
if(o.constructor == Number)
|
||||
return o.toString();
|
||||
if(o.constructor == Boolean)
|
||||
return o.toString();
|
||||
if(o.constructor == Date)
|
||||
return '{javaClass: "java.util.Date", time: ' + o.valueOf() +'}';
|
||||
if(o.constructor == Array) {
|
||||
var v = [];
|
||||
for(var i = 0; i < o.length; i++)
|
||||
v.push(json.toJSON(o[i]));
|
||||
return "[" + v.join(", ") + "]";
|
||||
}
|
||||
var v = [];
|
||||
for(attr in o) {
|
||||
if(o[attr] == null)
|
||||
v.push("\"" + attr + "\": null");
|
||||
else if(typeof o[attr] == "function")
|
||||
; // Skip
|
||||
else
|
||||
v.push(json.escapeJSONString(attr) + ": " + json.toJSON(o[attr]));
|
||||
}
|
||||
return "{" + v.join(", ") + "}";
|
||||
};
|
||||
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
|
@ -24,235 +24,320 @@
|
|||
/**
|
||||
* Scheme-like lists.
|
||||
*/
|
||||
function cell(car, cdr) {
|
||||
this.car = car;
|
||||
this.cdr = cdr;
|
||||
}
|
||||
|
||||
cell.prototype.toString = function() {
|
||||
return writeValue(this);
|
||||
};
|
||||
|
||||
function cons(car, cdr) {
|
||||
var a = new Array();
|
||||
a.push(car);
|
||||
return a.concat(cdr);
|
||||
return new cell(car, cdr);
|
||||
}
|
||||
|
||||
function car(l) {
|
||||
return l[0];
|
||||
}
|
||||
var nil = new cell(undefined, null);
|
||||
|
||||
function first(l) {
|
||||
return l[0];
|
||||
}
|
||||
|
||||
function cdr(l) {
|
||||
return l.slice(1);
|
||||
}
|
||||
|
||||
function rest(l) {
|
||||
return l.slice(1);
|
||||
}
|
||||
|
||||
function cadr(l) {
|
||||
return l[1];
|
||||
}
|
||||
|
||||
function cddr(l) {
|
||||
return l.slice(2);
|
||||
}
|
||||
|
||||
function caddr(l) {
|
||||
return l[2];
|
||||
}
|
||||
|
||||
function cdddr(l) {
|
||||
return l.slice(3);
|
||||
}
|
||||
|
||||
function cadddr(l) {
|
||||
return l[3];
|
||||
}
|
||||
|
||||
function append(a, b) {
|
||||
return a.concat(b);
|
||||
}
|
||||
|
||||
function reverse(l) {
|
||||
return l.slice(0).reverse();
|
||||
}
|
||||
|
||||
function range(a, b) {
|
||||
var l = new Array();
|
||||
for (var x = a; x < b; x++)
|
||||
l.push(x);
|
||||
function mklist() {
|
||||
if(arguments.length == 0)
|
||||
return nil;
|
||||
var l = nil;
|
||||
for(var i = arguments.length - 1; i >= 0; i--)
|
||||
l = cons(arguments[i], l);
|
||||
return l;
|
||||
}
|
||||
|
||||
function mkalist(a) {
|
||||
if(a.length == 0)
|
||||
return nil;
|
||||
var l = nil;
|
||||
for(var i = a.length - 1; i >= 0; i--)
|
||||
l = cons(a[i], l);
|
||||
return l;
|
||||
}
|
||||
|
||||
function car(l) {
|
||||
if(l.cdr == null)
|
||||
throw new Error('car out of bounds');
|
||||
//error('car out of bounds');
|
||||
return l.car;
|
||||
}
|
||||
|
||||
function cdr(l) {
|
||||
if(l.cdr == null)
|
||||
throw new Error('cdr out of bounds');
|
||||
//error('cdr out of bounds');
|
||||
return l.cdr;
|
||||
}
|
||||
|
||||
function cadr(l) {
|
||||
return car(cdr(l));
|
||||
}
|
||||
|
||||
function cddr(l) {
|
||||
return cdr(cdr(l));
|
||||
}
|
||||
|
||||
function caddr(l) {
|
||||
return car(cdr(cdr(l)));
|
||||
}
|
||||
|
||||
function cdddr(l) {
|
||||
return cdr(cdr(cdr(l)));
|
||||
}
|
||||
|
||||
function cadddr(l) {
|
||||
return car(cdr(cdr(cdr(l))));
|
||||
}
|
||||
|
||||
function last(l) {
|
||||
if(l == nil)
|
||||
throw new Error('last out of bounds');
|
||||
//error('last out of bounds');
|
||||
if(cdr(l) == nil)
|
||||
return car(l);
|
||||
return last(cdr(l));
|
||||
}
|
||||
|
||||
function append(a, b) {
|
||||
if(a == nil)
|
||||
return b;
|
||||
return cons(car(a), append(cdr(a), b));
|
||||
}
|
||||
|
||||
function reverse(l) {
|
||||
function reverseIter(acc, l) {
|
||||
if(l == nil)
|
||||
return acc;
|
||||
return reverseIter(cons(car(l), acc), cdr(l));
|
||||
}
|
||||
return reverseIter(nil, l);
|
||||
}
|
||||
|
||||
function seq(start, end) {
|
||||
if(start == end)
|
||||
return mklist(start);
|
||||
if(start < end)
|
||||
return cons(start, seq(start + 1, end));
|
||||
return cons(start, seq(start - 1, end));
|
||||
}
|
||||
|
||||
function isNull(v) {
|
||||
return (v == null || typeof v == 'undefined' || (v.constructor == Array && v.length == 0));
|
||||
return v == nil || v == null || typeof v == 'undefined';
|
||||
}
|
||||
|
||||
function isSymbol(v) {
|
||||
return (typeof v == 'string' && v.slice(0, 1) == "'");
|
||||
return typeof v == 'string' && v[0] == "'";
|
||||
}
|
||||
|
||||
function isString(v) {
|
||||
return (typeof v == 'string' && v.slice(0, 1) != "'");
|
||||
return typeof v == 'string' && v[0] != "'";
|
||||
}
|
||||
|
||||
function isList(v) {
|
||||
return (v != null && typeof v != 'undefined' && v.constructor == Array);
|
||||
return v != null && typeof v != 'undefined' && typeof v.cdr != 'undefined';
|
||||
}
|
||||
|
||||
function isTaggedList(v, t) {
|
||||
return (isList(v) && !isNull(v) && car(v) == t);
|
||||
return isList(v) && v != nil && car(v) == t;
|
||||
}
|
||||
|
||||
var emptylist = new Array();
|
||||
|
||||
function mklist() {
|
||||
if (arguments.length == 0)
|
||||
return emptylist;
|
||||
var a = new Array();
|
||||
for (i = 0; i < arguments.length; i++)
|
||||
a[i] = arguments[i];
|
||||
return a;
|
||||
function mkarray(l) {
|
||||
return reduce(function(a, v) {
|
||||
a[a.length] = v;
|
||||
return a;
|
||||
}, [], l);
|
||||
}
|
||||
|
||||
function length(l) {
|
||||
return l.length;
|
||||
function lengthRef(c, l) {
|
||||
if(l == nil)
|
||||
return c;
|
||||
return lengthRef(c + 1, cdr(l));
|
||||
}
|
||||
return lengthRef(0, l);
|
||||
}
|
||||
|
||||
/**
|
||||
* Scheme-like associations.
|
||||
*/
|
||||
function assoc(k, l) {
|
||||
if (isNull(l))
|
||||
return emptylist;
|
||||
var n = l.length;
|
||||
for(var i = 0; i < n; i++) {
|
||||
if (k == car(l[i]))
|
||||
return l[i];
|
||||
}
|
||||
return emptylist;
|
||||
if(l == nil)
|
||||
return nil;
|
||||
var c = car(l);
|
||||
if(isList(c) && c != nil && k == car(c))
|
||||
return c;
|
||||
return assoc(k, cdr(l));
|
||||
}
|
||||
|
||||
/**
|
||||
* Map, filter and reduce functions.
|
||||
*/
|
||||
function map(f, l) {
|
||||
if (isNull(l))
|
||||
return l;
|
||||
var n = l.length;
|
||||
var a = new Array();
|
||||
for(var i = 0; i < n; i++) {
|
||||
a.push(f(l[i]));
|
||||
}
|
||||
return a;
|
||||
if(l == nil)
|
||||
return nil;
|
||||
return cons(f(car(l)), map(f, cdr(l)));
|
||||
}
|
||||
|
||||
function filter(f, l) {
|
||||
if (isNull(l))
|
||||
return l;
|
||||
var n = l.length;
|
||||
var a = new Array();
|
||||
for(var i = 0; i < n; i++) {
|
||||
if (f(l[i]))
|
||||
a.push(l[i]);
|
||||
}
|
||||
return a;
|
||||
if(l == nil)
|
||||
return nil;
|
||||
if (f(car(l)))
|
||||
return cons(car(l), filter(f, cdr(l)));
|
||||
return filter(f, cdr(l));
|
||||
}
|
||||
|
||||
function reduce(f, i, l) {
|
||||
if (isNull(l))
|
||||
return i;
|
||||
return reduce(f, f(i, car(l)), cdr(l));
|
||||
function reduceAccumulate(acc, l) {
|
||||
if(l == nil)
|
||||
return acc;
|
||||
return reduceAccumulate(f(acc, car(l)), cdr(l));
|
||||
};
|
||||
return reduceAccumulate(i, l);
|
||||
}
|
||||
|
||||
/**
|
||||
* Split a path into a list of segments.
|
||||
* Sort.
|
||||
*/
|
||||
function sort(f, l) {
|
||||
return mkalist(mkarray(l).sort(f));
|
||||
}
|
||||
|
||||
/**
|
||||
* String split, join and tokenize functions.
|
||||
*/
|
||||
function split(s, d) {
|
||||
return mkalist(s.split(d));
|
||||
}
|
||||
|
||||
function join(l, d) {
|
||||
return mkarray(l).join(d);
|
||||
}
|
||||
|
||||
function tokens(path) {
|
||||
return filter(function(s) { return length(s) != 0; }, path.split("/"));
|
||||
return filter(function(s) { return s.length != 0; }, split(path, '/'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Debug log a value.
|
||||
* Log values to debug log.
|
||||
*/
|
||||
var rconsole;
|
||||
if(window.debugging == undefined)
|
||||
window.debugging = false;
|
||||
var remoteLog;
|
||||
var bufferedLog;
|
||||
|
||||
function debug() {
|
||||
if (!window.debugging)
|
||||
return false;
|
||||
var s = '';
|
||||
for(var i = 0; i < arguments.length; i++) {
|
||||
s += writeValue(arguments[i]);
|
||||
if(i < arguments.length)
|
||||
s += ' ';
|
||||
}
|
||||
if(remoteLog)
|
||||
remoteLog.log(s);
|
||||
if (bufferedLog)
|
||||
bufferedLog[bufferedLog.length] = s;
|
||||
return console.log(s);
|
||||
}
|
||||
|
||||
function debug(v) {
|
||||
try {
|
||||
var s = '';
|
||||
for (i = 0; i < arguments.length; i++) {
|
||||
s = s + writeValue(arguments[i]);
|
||||
if (i < arguments.length)
|
||||
s = s + ' ';
|
||||
function error() {
|
||||
var s = '';
|
||||
for(var i = 0; i < arguments.length; i++) {
|
||||
s += writeValue(arguments[i]);
|
||||
var a = arguments[i];
|
||||
if(a != null && typeof a == 'object' && typeof a.stack != 'undefined') {
|
||||
s += ' ';
|
||||
s += writeValue(a.stack);
|
||||
}
|
||||
if(i < arguments.length)
|
||||
s = s + ' ';
|
||||
}
|
||||
|
||||
if (rconsole) {
|
||||
try {
|
||||
rconsole.log(s);
|
||||
} catch (e) {}
|
||||
}
|
||||
try {
|
||||
console.log(s);
|
||||
} catch (e) {}
|
||||
} catch (e) {}
|
||||
if(remoteLog)
|
||||
remoteLog.error(s);
|
||||
if (bufferedLog) {
|
||||
try { throw new Error(); } catch(t) { bufferedLog[bufferedLog.length] = writeValue(t.stack); }
|
||||
bufferedLog[bufferedLog.length] = s;
|
||||
}
|
||||
return console.error(s);
|
||||
}
|
||||
|
||||
/**
|
||||
* Log uncaught errors.
|
||||
*/
|
||||
if (typeof window != 'undefined') {
|
||||
window.onerror = function(msg, url, line) {
|
||||
error('window.onerror', msg, url, line);
|
||||
return false;
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Buffer log entries in memory.
|
||||
*/
|
||||
function bufferLog() {
|
||||
bufferedLog = [];
|
||||
return true;
|
||||
}
|
||||
|
||||
function printLog() {
|
||||
if (!bufferedLog)
|
||||
return false;
|
||||
for(var i in bufferedLog)
|
||||
console.log(bufferedLog[i]);
|
||||
return true;
|
||||
}
|
||||
|
||||
function clearLog() {
|
||||
bufferedLog = [];
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Dump an object to the console.
|
||||
* Dump an object to the log.
|
||||
*/
|
||||
function dump(o) {
|
||||
try {
|
||||
for (f in o) {
|
||||
try {
|
||||
debug('dump ' + f + '=' + o[f]);
|
||||
} catch (e) {}
|
||||
}
|
||||
} catch (e) {}
|
||||
if (!window.debugging)
|
||||
return false;
|
||||
for(var f in o)
|
||||
debug('dump', f, '=', o[f]);
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return true if the current browser is Internet Explorer.
|
||||
*/
|
||||
function isIE() {
|
||||
if (typeof isIE.detected != 'undefined')
|
||||
return isIE.detected;
|
||||
isIE.detected = navigator.appName == 'Microsoft Internet Explorer';
|
||||
return isIE.detected;
|
||||
};
|
||||
function isMSIE() {
|
||||
if(typeof isMSIE.detected != 'undefined')
|
||||
return isMSIE.detected;
|
||||
isMSIE.detected = navigator.userAgent.match(/MSIE/i);
|
||||
return isMSIE.detected;
|
||||
}
|
||||
|
||||
/**
|
||||
* External build configuration.
|
||||
*/
|
||||
var config;
|
||||
if (isNull(config))
|
||||
if(isNull(config))
|
||||
config = {};
|
||||
|
||||
/**
|
||||
* Simple assert function.
|
||||
* Assertion.
|
||||
*/
|
||||
function AssertException() {
|
||||
}
|
||||
|
||||
AssertException.prototype.toString = function () {
|
||||
return 'AssertException';
|
||||
};
|
||||
|
||||
function assert(exp) {
|
||||
if (!exp)
|
||||
throw new AssertException();
|
||||
if(!exp)
|
||||
throw new Error('assertion failed');
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Write a list of strings.
|
||||
*/
|
||||
function writeStrings(l) {
|
||||
if (isNull(l))
|
||||
return '';
|
||||
var s = '';
|
||||
var n = l.length;
|
||||
for(var i = 0; i < n; i++) {
|
||||
s = s + l[i];
|
||||
}
|
||||
return s;
|
||||
return reduce(function(a, s) { return a + s; }, '', l);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -260,22 +345,22 @@ function writeStrings(l) {
|
|||
*/
|
||||
function writeValue(v) {
|
||||
function writePrimitive(p) {
|
||||
if (isSymbol(p))
|
||||
if(isSymbol(p))
|
||||
return '' + p.substring(1);
|
||||
if (isString(p))
|
||||
if(isString(p))
|
||||
return '"' + p + '"';
|
||||
return '' + p;
|
||||
}
|
||||
|
||||
function writeList(l) {
|
||||
if (isNull(l))
|
||||
if(l == nil)
|
||||
return '';
|
||||
return ' ' + writeValue(car(l)) + writeList(cdr(l));
|
||||
}
|
||||
|
||||
if (!isList(v))
|
||||
if(!isList(v))
|
||||
return writePrimitive(v);
|
||||
if (isNull(v))
|
||||
if(v == nil)
|
||||
return '()';
|
||||
return '(' + writeValue(car(v)) + writeList(cdr(v)) + ')';
|
||||
}
|
||||
|
|
@ -284,11 +369,11 @@ function writeValue(v) {
|
|||
* Apply a function and memoize its result.
|
||||
*/
|
||||
function memo(obj, key, f) {
|
||||
if (!('memo' in obj)) {
|
||||
if(typeof obj.memo == 'undefined') {
|
||||
obj.memo = {};
|
||||
return obj.memo[key] = f();
|
||||
}
|
||||
if (key in obj.memo)
|
||||
if(key in obj.memo)
|
||||
return obj.memo[key];
|
||||
return obj.memo[key] = f();
|
||||
}
|
||||
|
|
@ -297,18 +382,19 @@ function memo(obj, key, f) {
|
|||
* Un-memoize stored results.
|
||||
*/
|
||||
function unmemo(obj, prefix) {
|
||||
if (!prefix) {
|
||||
if(!prefix) {
|
||||
obj.memo = {};
|
||||
return true;
|
||||
}
|
||||
if (!('memo' in obj)) {
|
||||
if(typeof obj.memo == 'undefined') {
|
||||
obj.memo = {};
|
||||
return true;
|
||||
}
|
||||
for (key in obj.memo) {
|
||||
if (key.substring(0, prefix.length) == prefix)
|
||||
for(var key in obj.memo) {
|
||||
if(key.substring(0, prefix.length) == prefix)
|
||||
delete obj.memo[key];
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -321,115 +407,112 @@ lstorage.enabled = true;
|
|||
* Get a key.
|
||||
*/
|
||||
lstorage.key = function(i) {
|
||||
if (!lstorage.enabled)
|
||||
return null;
|
||||
try {
|
||||
return localStorage.key(i);
|
||||
} catch(e) {
|
||||
return null;
|
||||
}
|
||||
if(!lstorage.enabled)
|
||||
return undefined;
|
||||
return localStorage.key(i);
|
||||
};
|
||||
|
||||
/**
|
||||
* Return the number of keys.
|
||||
*/
|
||||
lstorage.length = function() {
|
||||
if (!lstorage.enabled)
|
||||
if(!lstorage.enabled)
|
||||
return 0;
|
||||
try {
|
||||
return localStorage.length;
|
||||
} catch(e) {
|
||||
return 0;
|
||||
}
|
||||
return localStorage.length;
|
||||
};
|
||||
|
||||
/**
|
||||
* Get an item.
|
||||
*/
|
||||
lstorage.getItem = function(k) {
|
||||
if (!lstorage.enabled)
|
||||
return null;
|
||||
try {
|
||||
return localStorage.getItem(k);
|
||||
} catch(e) {
|
||||
return null;
|
||||
}
|
||||
if(!lstorage.enabled)
|
||||
return undefined;
|
||||
return localStorage.getItem(k);
|
||||
};
|
||||
|
||||
/**
|
||||
* Set an item.
|
||||
*/
|
||||
lstorage.setItem = function(k, v) {
|
||||
if (!lstorage.enabled)
|
||||
return null;
|
||||
try {
|
||||
if(!lstorage.enabled)
|
||||
return v;
|
||||
if (localStorage.getItem(k) != v)
|
||||
return localStorage.setItem(k, v);
|
||||
} catch(e) {
|
||||
return null;
|
||||
}
|
||||
else
|
||||
return v;
|
||||
};
|
||||
|
||||
/**
|
||||
* Remove an item.
|
||||
*/
|
||||
lstorage.removeItem = function(k) {
|
||||
if (!lstorage.enabled)
|
||||
return null;
|
||||
try {
|
||||
return localStorage.removeItem(k);
|
||||
} catch(e) {
|
||||
return null;
|
||||
}
|
||||
if(!lstorage.enabled)
|
||||
return undefined;
|
||||
return localStorage.removeItem(k);
|
||||
};
|
||||
|
||||
/**
|
||||
* Returns a list of the properties of an object.
|
||||
*/
|
||||
function properties(o) {
|
||||
var a = new Array();
|
||||
for (p in o)
|
||||
a.push(p);
|
||||
return a;
|
||||
var l = nil;
|
||||
for(var p in o)
|
||||
l = cons(p, l);
|
||||
return reverse(l);
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert a DOM node list to a regular list.
|
||||
*/
|
||||
function nodeList(n) {
|
||||
if (n == null || n.length == 0)
|
||||
return nil;
|
||||
var l = nil;
|
||||
for (var i = n.length - 1; i >= 0; i--)
|
||||
l = cons(n[i], l);
|
||||
return l;
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert a host name to a domain name.
|
||||
*/
|
||||
function domainname(host) {
|
||||
function domainName(host) {
|
||||
var ds = host.indexOf('//');
|
||||
if (ds != -1)
|
||||
return domainname(host.substring(ds + 2));
|
||||
if(ds != -1)
|
||||
return domainName(host.substring(ds + 2));
|
||||
var s = host.indexOf('/');
|
||||
if (s != -1)
|
||||
return domainname(host.substring(0, s));
|
||||
var h = reverse(host.split('.'));
|
||||
var d = (!isNull(cddr(h)) && caddr(h) == 'www')? mklist(car(h), cadr(h), caddr(h)) : mklist(car(h), cadr(h));
|
||||
return reverse(d).join('.');
|
||||
if(s != -1)
|
||||
return domainName(host.substring(0, s));
|
||||
var h = reverse(split(host, '.'));
|
||||
var d = (cddr(h) != nil && caddr(h) == 'www')? mklist(car(h), cadr(h), caddr(h)) : mklist(car(h), cadr(h));
|
||||
return join(reverse(d), '.');
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert a host name to a top domain name.
|
||||
*/
|
||||
function topdomainname(host) {
|
||||
var d = reverse(domainname(host).split('.'));
|
||||
return reverse(mklist(car(d), cadr(d))).join('.');
|
||||
function topDomainName(host) {
|
||||
var d = reverse(split(domainName(host),'.'));
|
||||
return join(mklist(car(d), cadr(d)), '.');
|
||||
}
|
||||
|
||||
/**
|
||||
* Return true if a host name is a subdomain.
|
||||
*/
|
||||
function issubdomain(host) {
|
||||
return host.split('.').length > 2;
|
||||
function isSubDomain(host) {
|
||||
return length(split(host, '.')) > 2;
|
||||
}
|
||||
|
||||
/**
|
||||
* Clear auth information from the document cookie.
|
||||
*/
|
||||
function clearauthcookie() {
|
||||
document.cookie = 'TuscanyOpenAuth=; expires=' + new Date(1970,01,01).toGMTString() + '; domain=.' + domainname(window.location.hostname) + '; path=/; secure; httponly';
|
||||
document.cookie = 'TuscanyOAuth1=; expires=' + new Date(1970,01,01).toGMTString() + '; domain=.' + domainname(window.location.hostname) + '; path=/; secure; httponly';
|
||||
document.cookie = 'TuscanyOAuth2=; expires=' + new Date(1970,01,01).toGMTString() + '; domain=.' + domainname(window.location.hostname) + '; path=/; secure; httponly';
|
||||
document.cookie = 'TuscanyOpenIDAuth=; expires=' + new Date(1970,01,01).toGMTString() + '; domain=.' + domainname(window.location.hostname) + '; path=/; secure; httponly';
|
||||
function clearAuthCookie() {
|
||||
var d = new Date(1970,01,01).toGMTString();
|
||||
var dn = domainName(window.location.hostname);
|
||||
document.cookie = 'TuscanyOpenAuth=; expires=' + d + '; domain=.' + dn + '; path=/; secure; httponly';
|
||||
document.cookie = 'TuscanyOAuth1=; expires=' + d + '; domain=.' + dn + '; path=/; secure; httponly';
|
||||
document.cookie = 'TuscanyOAuth2=; expires=' + d + '; domain=.' + dn + '; path=/; secure; httponly';
|
||||
document.cookie = 'TuscanyOpenIDAuth=; expires=' + d + '; domain=.' + dn + '; path=/; secure; httponly';
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
@ -439,7 +522,7 @@ function clearauthcookie() {
|
|||
function format() {
|
||||
var i = 0;
|
||||
var s = '';
|
||||
for (a in arguments) {
|
||||
for(var a = 0; a < arguments.length; a++) {
|
||||
s = i == 0? arguments[a] : s.replace('{' + a + '}', arguments[a]);
|
||||
i++;
|
||||
}
|
||||
|
|
@ -449,10 +532,10 @@ function format() {
|
|||
/**
|
||||
* Parse an XML dateTime.
|
||||
*/
|
||||
function xmldatetime(xml) {
|
||||
function xmlDateTime(xml) {
|
||||
var re = /^([0-9]{4,})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})(\.[0-9]+)?(Z|([+-])([0-9]{2}):([0-9]{2}))?$/;
|
||||
var match = xml.match(re);
|
||||
if (!match)
|
||||
if(!match)
|
||||
return new Date();
|
||||
return new Date(Date.UTC(match[1], parseInt(match[2]) - 1, match[3],
|
||||
match[9]? parseInt(match[4]) + parseInt(match[10]) * (match[9] == '+'? 1 : -1) : match[4],
|
||||
|
|
@ -463,14 +546,14 @@ function xmldatetime(xml) {
|
|||
/**
|
||||
* Encode a string to a url-safe base64 format.
|
||||
*/
|
||||
function safeb64encode(s) {
|
||||
function safeB64Encode(s) {
|
||||
return btoa(s).replace(/\+/g, '-').replace(/\//g, '_').replace(/\=+$/, '');
|
||||
}
|
||||
|
||||
/**
|
||||
* Decode a url-safe base64 encoded string.
|
||||
*/
|
||||
function safeb64decode(s) {
|
||||
function safeB64Decode(s) {
|
||||
return atob((s.replace(/\-/g, '+').replace(/\_/g, '/') + '===').substring(0, s.length + (s.length % 4)));
|
||||
}
|
||||
|
||||
|
|
@ -478,7 +561,7 @@ function safeb64decode(s) {
|
|||
* Return a uuid4.
|
||||
*/
|
||||
function uuid4() {
|
||||
if (window.crypto && window.crypto.getRandomValues) {
|
||||
if(window.crypto && window.crypto.getRandomValues) {
|
||||
var b = new Uint16Array(8);
|
||||
window.crypto.getRandomValues(b);
|
||||
function s4(n) {
|
||||
|
|
@ -497,9 +580,9 @@ function uuid4() {
|
|||
/**
|
||||
* Convert an hexadecimal string to ascii.
|
||||
*/
|
||||
function hex2ascii(x) {
|
||||
function hex2Ascii(x) {
|
||||
var a = '';
|
||||
for (var i = 0; i < x.length; i += 2)
|
||||
for(var i = 0; i < x.length; i += 2)
|
||||
a += String.fromCharCode(parseInt(x.substr(i, 2), 16));
|
||||
return a;
|
||||
}
|
||||
|
|
@ -512,7 +595,7 @@ function hex2ascii(x) {
|
|||
* Set the car of a list.
|
||||
*/
|
||||
function setcar(l, v) {
|
||||
l[0] = v;
|
||||
l.car = v;
|
||||
return l;
|
||||
}
|
||||
|
||||
|
|
@ -520,7 +603,7 @@ function setcar(l, v) {
|
|||
* Set the cadr of a list.
|
||||
*/
|
||||
function setcadr(l, v) {
|
||||
l[1] = v;
|
||||
l.cdr.car = v;
|
||||
return l;
|
||||
}
|
||||
|
||||
|
|
@ -528,35 +611,104 @@ function setcadr(l, v) {
|
|||
* Set the caddr of a list.
|
||||
*/
|
||||
function setcaddr(l, v) {
|
||||
l[2] = v;
|
||||
l.cdr.cdr.car = v;
|
||||
return l;
|
||||
}
|
||||
|
||||
/**
|
||||
* Append the elements of a list to a list.
|
||||
*/
|
||||
function setappend(a, b) {
|
||||
if (isNull(b))
|
||||
return a;
|
||||
a.push(car(b));
|
||||
return setappend(a, cdr(b));
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the cdr of a list.
|
||||
*/
|
||||
function setcdr(a, b) {
|
||||
a.length = 1;
|
||||
return setappend(a, b);
|
||||
a.cdr = b;
|
||||
return a;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the contents of a list.
|
||||
*/
|
||||
function setlist(a, b) {
|
||||
if (b == a)
|
||||
return b;
|
||||
a.length = 0;
|
||||
return setappend(a, b);
|
||||
function setList(a, b) {
|
||||
if(b == a)
|
||||
return a;
|
||||
a.car = b.car;
|
||||
a.cdr = b.cdr;
|
||||
return a;
|
||||
}
|
||||
|
||||
/**
|
||||
* Append the elements of a list to a list.
|
||||
*/
|
||||
function setAppend(a, b) {
|
||||
if(b.cdr == null)
|
||||
return a;
|
||||
return setList(a, append(a, b));
|
||||
}
|
||||
|
||||
/**
|
||||
* Uncomment to run the tests.
|
||||
*/
|
||||
/*
|
||||
(function testUtil() {
|
||||
console.log('Testing...');
|
||||
|
||||
assert(car(cons(1, nil)) == 1);
|
||||
assert(car(mklist(1)) == 1);
|
||||
assert(cadr(mklist(1, 2)) == 2);
|
||||
|
||||
assert(0 == length(nil));
|
||||
assert(1 == length(mklist(1)));
|
||||
assert(2 == length(cons(1, mklist(2))));
|
||||
|
||||
assert(car(append(mklist(1), mklist(2))) == 1);
|
||||
assert(car(cdr(append(mklist(1), mklist(2)))) == 2);
|
||||
assert(car(cdr(cdr(append(mklist(1), mklist(2, 3))))) == 3);
|
||||
assert(isNull(cdr(cdr(cdr(append(mklist(1), mklist(2, 3)))))));
|
||||
assert(last(mklist(1, 2, 3)) == 3);
|
||||
assert('' + mklist(1, 2, 3) == '(1 2 3)');
|
||||
|
||||
function square(v) { return v * v; }
|
||||
assert(isNull(map(square, nil)));
|
||||
var m = map(square, mklist(2, 3));
|
||||
assert(car(m) == 4);
|
||||
assert(car(cdr(m)) == 9);
|
||||
|
||||
function add(x, y) { return x + y; }
|
||||
assert(reduce(add, 0, mklist(1, 2, 3)) == 6);
|
||||
|
||||
function isPositive(x) { return x >= 0; }
|
||||
assert(car(filter(isPositive, mklist(1, -1, 2, -2))) == 1);
|
||||
assert(cadr(filter(isPositive, mklist(1, -1, 2, -2))) == 2);
|
||||
|
||||
assert(isNull(reverse(nil)));
|
||||
assert(car(reverse(mklist(1, 2, 3))) == 3);
|
||||
assert(cadr(reverse(mklist(1, 2, 3))) == 2);
|
||||
|
||||
var l = mklist(mklist('x', 'X'), mklist('a', 'A'), mklist('y', 'Y'), mklist('a', 'AA'));
|
||||
assert(car(assoc('a', l)) == 'a');
|
||||
assert(isNull(assoc('z', l)));
|
||||
|
||||
var s = seq(0.0, 1000.0);
|
||||
assert(1001 == length(s));
|
||||
function seqreduce(acc, v) { return acc + 1.0; }
|
||||
assert(1001 == reduce(seqreduce, 0.0, s));
|
||||
|
||||
function compare(a, b) { return a < b? -1 : a == b? 0 : 1; }
|
||||
var l2 = sort(compare, mklist(4, 3, 1, 2));
|
||||
assert(car(l2) == 1);
|
||||
assert(last(l2) == 4);
|
||||
|
||||
var t = new Date();
|
||||
var p = nil;
|
||||
for(var i = 0; i < 100000; i++) {
|
||||
p = cons(i, p);
|
||||
}
|
||||
for(var i = 0; i < 100000; i++) {
|
||||
var x = car(p);
|
||||
p = cdr(p);
|
||||
}
|
||||
console.log('list perf', new Date() - t, 'ms');
|
||||
|
||||
console.log('OK');
|
||||
return true;
|
||||
})();
|
||||
*/
|
||||
|
||||
|
|
|
|||
|
|
@ -21,18 +21,6 @@
|
|||
* XML handling functions.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Convert a DOM node list to a regular list.
|
||||
*/
|
||||
function nodeList(n) {
|
||||
var l = new Array();
|
||||
if (isNull(n))
|
||||
return l;
|
||||
for (var i = 0; i < n.length; i++)
|
||||
l[i] = n[i];
|
||||
return l;
|
||||
}
|
||||
|
||||
/**
|
||||
* Append a list of nodes to a parent node.
|
||||
*/
|
||||
|
|
@ -41,7 +29,7 @@ function appendNodes(nodes, p) {
|
|||
return p;
|
||||
p.appendChild(car(nodes));
|
||||
return appendNodes(cdr(nodes), p);
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the child attributes of an element.
|
||||
|
|
@ -61,31 +49,29 @@ function childElements(e) {
|
|||
* Return the child text nodes of an element.
|
||||
*/
|
||||
function childText(e) {
|
||||
function trim(s) {
|
||||
return s.replace(/^\s*/, '').replace(/\s*$/, '');
|
||||
}
|
||||
return filter(function(n) { return n.nodeType == 3 && trim(n.nodeValue) != ''; }, nodeList(e.childNodes));
|
||||
return filter(function(n) { return n.nodeType == 3 && n.nodeValue.trim().length != 0; }, nodeList(e.childNodes));
|
||||
}
|
||||
|
||||
/**
|
||||
* Read a list of XML attributes.
|
||||
*/
|
||||
function readAttributes(p, a) {
|
||||
function readAttributes(a) {
|
||||
if (isNull(a))
|
||||
return a;
|
||||
var x = car(a);
|
||||
return cons(mklist(attribute, "'" + x.nodeName, x.nodeValue), readAttributes(p, cdr(a)));
|
||||
return cons(mklist(attribute, "'" + x.name, x.value), readAttributes(cdr(a)));
|
||||
}
|
||||
|
||||
/**
|
||||
* Read an XML element.
|
||||
*/
|
||||
function readElement(e, childf) {
|
||||
var l = append(append(mklist(element, "'" + e.nodeName), readAttributes(e, childf(e))), readElements(childElements(e), childf));
|
||||
var l = append(append(mklist(element, "'" + e.nodeName), readAttributes(childf(e))), readElements(childElements(e), childf));
|
||||
var t = childText(e);
|
||||
if (isNull(t))
|
||||
return l;
|
||||
return append(l, mklist(car(t).nodeValue));
|
||||
var tv = reduce(function(a, n) { return a + n.nodeValue; }, '', t);
|
||||
return append(l, mklist(tv));
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -109,10 +95,10 @@ function isXML(l) {
|
|||
/**
|
||||
* Parse a list of strings representing an XML document.
|
||||
*/
|
||||
var xmlParser = new DOMParser();
|
||||
function parseXML(l) {
|
||||
var s = writeStrings(l);
|
||||
var p = new DOMParser();
|
||||
return p.parseFromString(s, "text/xml");
|
||||
return xmlParser.parseFromString(s, "text/xml");
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -121,7 +107,7 @@ function parseXML(l) {
|
|||
function readXMLDocument(doc) {
|
||||
var root = childElements(doc);
|
||||
if (isNull(root))
|
||||
return mklist();
|
||||
return nil;
|
||||
return mklist(readElement(car(root), childAttributes));
|
||||
}
|
||||
|
||||
|
|
@ -129,29 +115,7 @@ function readXMLDocument(doc) {
|
|||
* Read a list of values from an XHTML element.
|
||||
*/
|
||||
function readXHTMLElement(xhtml) {
|
||||
// Special XHTML attribute filtering on IE
|
||||
function ieChildAttributes(e) {
|
||||
var a = filter(function(n) {
|
||||
// Filter out empty and internal DOM attributes
|
||||
if (n.nodeType != 2 || isNull(n.nodeValue) || n.nodeValue == '')
|
||||
return false;
|
||||
if (n.nodeName == 'contentEditable' || n.nodeName == 'maxLength' || n.nodeName == 'loop' || n.nodeName == 'start')
|
||||
return false;
|
||||
return true;
|
||||
}, nodeList(e.attributes));
|
||||
|
||||
if (e.style.cssText == '')
|
||||
return a;
|
||||
|
||||
// Add style attribute
|
||||
var sa = new Object();
|
||||
sa.nodeName = 'style';
|
||||
sa.nodeValue = e.style.cssText;
|
||||
return cons(sa, a);
|
||||
}
|
||||
|
||||
var childf = (typeof(XMLSerializer) != 'undefined')? childAttributes : ieChildAttributes;
|
||||
return mklist(readElement(xhtml, childf));
|
||||
return mklist(readElement(xhtml, childAttributes));
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -164,10 +128,9 @@ function readXML(l) {
|
|||
/**
|
||||
* Return a list of strings representing an XML document.
|
||||
*/
|
||||
var xmlSerializer = new XMLSerializer();
|
||||
function writeXMLDocument(doc) {
|
||||
if (typeof(XMLSerializer) != 'undefined')
|
||||
return mklist(new XMLSerializer().serializeToString(doc));
|
||||
return mklist(doc.xml);
|
||||
return mklist(xmlSerializer.serializeToString(doc));
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -185,7 +148,7 @@ function writeList(l, node, doc) {
|
|||
|
||||
var token = car(l);
|
||||
if (isTaggedList(token, attribute)) {
|
||||
if (isIE()) {
|
||||
if (isMSIE()) {
|
||||
var aname = attributeName(token).substring(1);
|
||||
if (aname != 'xmlns')
|
||||
node.setAttribute(aname, '' + attributeValue(token));
|
||||
|
|
@ -207,7 +170,7 @@ function writeList(l, node, doc) {
|
|||
}
|
||||
|
||||
var ns = xmlns(elementChildren(tok));
|
||||
if (isIE())
|
||||
if (isMSIE())
|
||||
return doc.createElementNS(ns != null? ns : node.namespaceURI, elementName(tok).substring(1));
|
||||
if (ns == null)
|
||||
return doc.createElement(elementName(tok).substring(1));
|
||||
|
|
@ -251,6 +214,6 @@ function writeXML(l, xmlTag) {
|
|||
writeList(l, doc, doc);
|
||||
if (!xmlTag)
|
||||
return writeXMLDocument(doc);
|
||||
return mklist('<?xml version="1.0" encoding="UTF-8"?>\n' + writeXMLDocument(doc) + '\n');
|
||||
return mklist('<?xml version="1.0" encoding="UTF-8"?>\n' + car(writeXMLDocument(doc)) + '\n');
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -26,8 +26,10 @@ cat >>$root/conf/httpd.conf <<EOF
|
|||
# Generated by: js-conf $*
|
||||
# Serve JavaScript scripts and CSS
|
||||
Alias /ui-min.css $here/htdocs/ui-min.css
|
||||
Alias /base-min.js $here/htdocs/base-min.js
|
||||
Alias /all-min.js $here/htdocs/all-min.js
|
||||
Alias /proxy/ui-min.css $here/htdocs/ui-min.css
|
||||
Alias /proxy/base-min.js $here/htdocs/base-min.js
|
||||
Alias /proxy/all-min.js $here/htdocs/all-min.js
|
||||
|
||||
EOF
|
||||
|
|
@ -39,6 +41,11 @@ AuthType None
|
|||
Session Off
|
||||
Require all granted
|
||||
</Location>
|
||||
<Location /base-min.js>
|
||||
AuthType None
|
||||
Session Off
|
||||
Require all granted
|
||||
</Location>
|
||||
<Location /all-min.js>
|
||||
AuthType None
|
||||
Session Off
|
||||
|
|
@ -49,6 +56,11 @@ AuthType None
|
|||
Session Off
|
||||
Require all granted
|
||||
</Location>
|
||||
<Location /proxy/base-min.js>
|
||||
AuthType None
|
||||
Session Off
|
||||
Require all granted
|
||||
</Location>
|
||||
<Location /proxy/all-min.js>
|
||||
AuthType None
|
||||
Session Off
|
||||
|
|
|
|||
23
sca-cpp/trunk/modules/js/js-extract
Executable file
23
sca-cpp/trunk/modules/js/js-extract
Executable file
|
|
@ -0,0 +1,23 @@
|
|||
#!/bin/sh
|
||||
|
||||
# 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.
|
||||
|
||||
# Extract <script/> sections from an HTML file
|
||||
|
||||
awk 'BEGIN { s=0; } /<\/script>/ { s=0; } { if (s == 1) { print; } } /<script / { s=1; } /<script .*<\/script>/ { s=0; }'
|
||||
|
||||
11
sca-cpp/trunk/patches/page-speed-1.9.patch
Normal file
11
sca-cpp/trunk/patches/page-speed-1.9.patch
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
--- third_party/instaweb/src/net/instaweb/rewriter/elide_attributes_filter.cc
|
||||
+++ third_party/instaweb/src/net/instaweb/rewriter/elide_attributes_filter.cc
|
||||
@@ -82,7 +82,7 @@
|
||||
|
||||
const TagAttrValue kDefaultList[] = {
|
||||
{"script", "language", NULL},
|
||||
- {"script", "type", NULL},
|
||||
+ {"script", "type", "text/javascript"},
|
||||
{"style", "type", NULL},
|
||||
{"br", "clear", "none"},
|
||||
{"a", "shape", "rect"},
|
||||
|
|
@ -416,6 +416,8 @@ cd $build
|
|||
curl -OL https://dl-ssl.google.com/page-speed/sdk/current/page-speed-sdk.zip
|
||||
unzip page-speed-sdk.zip
|
||||
cd page-speed-1.9
|
||||
curl -OL http://svn.apache.org/repos/asf/tuscany/sca-cpp/trunk/patches/page-speed-1.9.patch
|
||||
patch -p0 <page-speed-1.9.patch
|
||||
make builddir=$build/page-speed-1.9-bin CXXFLAGS="-Wno-unused-but-set-variable"
|
||||
if [ "$?" != "0" ]; then
|
||||
exit $?
|
||||
|
|
|
|||
|
|
@ -311,6 +311,8 @@ cd $build
|
|||
curl -OL https://dl-ssl.google.com/page-speed/sdk/current/page-speed-sdk.zip
|
||||
unzip page-speed-sdk.zip
|
||||
cd page-speed-1.9
|
||||
curl -OL http://svn.apache.org/repos/asf/tuscany/sca-cpp/trunk/patches/page-speed-1.9.patch
|
||||
patch -p0 <page-speed-1.9.patch
|
||||
make builddir=$build/page-speed-1.9-bin CXXFLAGS="-Wno-unused-but-set-variable"
|
||||
if [ "$?" != "0" ]; then
|
||||
exit $?
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue