mirror of
https://github.com/cappuccino/cappuccino.git
synced 2026-08-25 21:17:03 +00:00
A Cappuccino project has always needed to have a flat file structure to be able to compile from source in the web browser. A new dictionary can be added to the project's Info.plist with the key 'CPFileTranslationDictionary'. It should contain all the path translations in the project to allow the Browser to find out where in the file structure the source files are. Check in the AppKit framework for an example. Also, a include list can be added in the Info.plist for the key 'CPCompileIncludeFileArray'. The file in the list will be included by a '#include' statement for each file that is compiled in this project A last new feature is to add macros in the 'OBJJ_COMPILER_FLAGS' global variable. It is usually declared in the index.html file. It is done with the format '-Dmacroname[=macrodefinition]'. An updated Info.plist file in the AppKit framework will allow the AppKit to compile from the source in the web browser. The following things is needed to get this to work: 1. Replace the AppKit folder in your project's Frameworks folder with a copy of the AppKit folder from the Cappuccino project. 2. Add a copy of the built Aristo2.blend folder to the AppKit's Resource folder. 3. Add "-DPLATFORM_DOM", "-DPLATFORM_BROWSER" and optionally "-DDEBUG" to the global variable 'OBJJ_COMPILER_FLAGS' in the project's index.html file. The app load time will increase (about 3 seconds on a 2018 MacBook Pro) as the AppKit framework is compiled from source. The Foundation framework is not yet tested but it might be working by adding info about the file structure in the Info.plist file.
314 lines
9.5 KiB
JavaScript
314 lines
9.5 KiB
JavaScript
/*
|
|
* OldBrowserCompatibility.js
|
|
* Objective-J
|
|
*
|
|
* Created by Martin Carlberg.
|
|
* Copyright 2013, Martin Carlberg.
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
|
|
// This is for IE8 support. It doesn't have the Object.create function.
|
|
if (!Object.create)
|
|
{
|
|
Object.create = function(o)
|
|
{
|
|
if (arguments.length > 1)
|
|
throw new Error('Object.create implementation only accepts the first parameter.');
|
|
|
|
function F() {}
|
|
F.prototype = o;
|
|
return new F();
|
|
};
|
|
}
|
|
|
|
// This is for IE8 support. It doesn't have the Object.keys function.
|
|
if (!Object.keys)
|
|
{
|
|
Object.keys = (function()
|
|
{
|
|
var hasOwnProperty = Object.prototype.hasOwnProperty,
|
|
hasDontEnumBug = !({toString: null}).propertyIsEnumerable('toString'),
|
|
dontEnums = [
|
|
'toString',
|
|
'toLocaleString',
|
|
'valueOf',
|
|
'hasOwnProperty',
|
|
'isPrototypeOf',
|
|
'propertyIsEnumerable',
|
|
'constructor'
|
|
],
|
|
dontEnumsLength = dontEnums.length;
|
|
|
|
return function (obj)
|
|
{
|
|
if (typeof obj !== 'object' && typeof obj !== 'function' || obj === null)
|
|
throw new TypeError('Object.keys called on non-object');
|
|
|
|
var result = [];
|
|
|
|
for (var prop in obj)
|
|
{
|
|
if (hasOwnProperty.call(obj, prop))
|
|
result.push(prop);
|
|
}
|
|
|
|
if (hasDontEnumBug)
|
|
{
|
|
for (var i = 0; i < dontEnumsLength; i++)
|
|
{
|
|
if (hasOwnProperty.call(obj, dontEnums[i]))
|
|
result.push(dontEnums[i]);
|
|
}
|
|
}
|
|
return result;
|
|
};
|
|
})();
|
|
}
|
|
|
|
// This is for IE8 support. It doesn't have the Array.prototype.indexOf function.
|
|
if (!Array.prototype.indexOf)
|
|
{
|
|
Array.prototype.indexOf = function(searchElement /*, fromIndex */ )
|
|
{
|
|
"use strict";
|
|
if (this === null)
|
|
throw new TypeError();
|
|
|
|
var t = new Object(this),
|
|
len = t.length >>> 0;
|
|
|
|
if (len === 0)
|
|
return -1;
|
|
|
|
var n = 0;
|
|
if (arguments.length > 1)
|
|
{
|
|
n = Number(arguments[1]);
|
|
if (n != n) // shortcut for verifying if it's NaN
|
|
n = 0;
|
|
else if (n !== 0 && n != Infinity && n != -Infinity)
|
|
n = (n > 0 || -1) * Math.floor(Math.abs(n));
|
|
}
|
|
|
|
if (n >= len)
|
|
return -1;
|
|
|
|
var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0);
|
|
for (; k < len; k++)
|
|
{
|
|
if (k in t && t[k] === searchElement)
|
|
return k;
|
|
}
|
|
return -1;
|
|
};
|
|
}
|
|
|
|
// https://tc39.github.io/ecma262/#sec-array.prototype.findindex
|
|
if (!Array.prototype.findIndex) {
|
|
Object.defineProperty(Array.prototype, 'findIndex', {
|
|
value: function(predicate) {
|
|
// 1. Let O be ? ToObject(this value).
|
|
if (this == null) {
|
|
throw new TypeError('"this" is null or not defined');
|
|
}
|
|
|
|
var o = Object(this);
|
|
|
|
// 2. Let len be ? ToLength(? Get(O, "length")).
|
|
var len = o.length >>> 0;
|
|
|
|
// 3. If IsCallable(predicate) is false, throw a TypeError exception.
|
|
if (typeof predicate !== 'function') {
|
|
throw new TypeError('predicate must be a function');
|
|
}
|
|
|
|
// 4. If thisArg was supplied, let T be thisArg; else let T be undefined.
|
|
var thisArg = arguments[1];
|
|
|
|
// 5. Let k be 0.
|
|
var k = 0;
|
|
|
|
// 6. Repeat, while k < len
|
|
while (k < len) {
|
|
// a. Let Pk be ! ToString(k).
|
|
// b. Let kValue be ? Get(O, Pk).
|
|
// c. Let testResult be ToBoolean(? Call(predicate, T, « kValue, k, O »)).
|
|
// d. If testResult is true, return k.
|
|
var kValue = o[k];
|
|
if (predicate.call(thisArg, kValue, k, o)) {
|
|
return k;
|
|
}
|
|
// e. Increase k by 1.
|
|
k++;
|
|
}
|
|
|
|
// 7. Return -1.
|
|
return -1;
|
|
},
|
|
configurable: true,
|
|
writable: true
|
|
});
|
|
}
|
|
|
|
// ECMAScript 6 has added this. It is copied from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String
|
|
if (!String.prototype.startsWith) {
|
|
String.prototype.startsWith = function(searchString, position){
|
|
position = position || 0;
|
|
return this.substr(position, searchString.length) === searchString;
|
|
};
|
|
}
|
|
|
|
// ECMAScript 6 has added this. It is copied from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String
|
|
if (!String.prototype.endsWith) {
|
|
String.prototype.endsWith = function(searchString, position) {
|
|
var subjectString = this.toString();
|
|
if (typeof position !== 'number' || !isFinite(position) || Math.floor(position) !== position || position > subjectString.length) {
|
|
position = subjectString.length;
|
|
}
|
|
position -= searchString.length;
|
|
var lastIndex = subjectString.indexOf(searchString, position);
|
|
return lastIndex !== -1 && lastIndex === position;
|
|
};
|
|
};
|
|
|
|
// ECMAScript 6 has added this. It is copied from https://developer.mozilla.org/nl/docs/Web/JavaScript/Reference/Global_Objects/Array/includes
|
|
// https://tc39.github.io/ecma262/#sec-array.prototype.includes
|
|
if (!Array.prototype.includes) {
|
|
Object.defineProperty(Array.prototype, 'includes', {
|
|
value: function(searchElement, fromIndex) {
|
|
|
|
// 1. Let O be ? ToObject(this value).
|
|
if (this == null) {
|
|
throw new TypeError('"this" is null or not defined');
|
|
}
|
|
|
|
var o = Object(this);
|
|
|
|
// 2. Let len be ? ToLength(? Get(O, "length")).
|
|
var len = o.length >>> 0;
|
|
|
|
// 3. If len is 0, return false.
|
|
if (len === 0) {
|
|
return false;
|
|
}
|
|
|
|
// 4. Let n be ? ToInteger(fromIndex).
|
|
// (If fromIndex is undefined, this step produces the value 0.)
|
|
var n = fromIndex | 0;
|
|
|
|
// 5. If n ≥ 0, then
|
|
// a. Let k be n.
|
|
// 6. Else n < 0,
|
|
// a. Let k be len + n.
|
|
// b. If k < 0, let k be 0.
|
|
var k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);
|
|
|
|
// 7. Repeat, while k < len
|
|
while (k < len) {
|
|
// a. Let elementK be the result of ? Get(O, ! ToString(k)).
|
|
// b. If SameValueZero(searchElement, elementK) is true, return true.
|
|
// c. Increase k by 1.
|
|
// NOTE: === provides the correct "SameValueZero" comparison needed here.
|
|
if (o[k] === searchElement) {
|
|
return true;
|
|
}
|
|
k++;
|
|
}
|
|
|
|
// 8. Return false
|
|
return false;
|
|
}
|
|
});
|
|
}
|
|
|
|
// https://tc39.github.io/ecma262/#sec-array.prototype.find
|
|
if (!Array.prototype.find) {
|
|
Object.defineProperty(Array.prototype, 'find', {
|
|
value: function(predicate) {
|
|
// 1. Let O be ? ToObject(this value).
|
|
if (this == null) {
|
|
throw TypeError('"this" is null or not defined');
|
|
}
|
|
|
|
var o = Object(this);
|
|
|
|
// 2. Let len be ? ToLength(? Get(O, "length")).
|
|
var len = o.length >>> 0;
|
|
|
|
// 3. If IsCallable(predicate) is false, throw a TypeError exception.
|
|
if (typeof predicate !== 'function') {
|
|
throw TypeError('predicate must be a function');
|
|
}
|
|
|
|
// 4. If thisArg was supplied, let T be thisArg; else let T be undefined.
|
|
var thisArg = arguments[1];
|
|
|
|
// 5. Let k be 0.
|
|
var k = 0;
|
|
|
|
// 6. Repeat, while k < len
|
|
while (k < len) {
|
|
// a. Let Pk be ! ToString(k).
|
|
// b. Let kValue be ? Get(O, Pk).
|
|
// c. Let testResult be ToBoolean(? Call(predicate, T, « kValue, k, O »)).
|
|
// d. If testResult is true, return kValue.
|
|
var kValue = o[k];
|
|
if (predicate.call(thisArg, kValue, k, o)) {
|
|
return kValue;
|
|
}
|
|
// e. Increase k by 1.
|
|
k++;
|
|
}
|
|
|
|
// 7. Return undefined.
|
|
return undefined;
|
|
},
|
|
configurable: true,
|
|
writable: true
|
|
});
|
|
}
|
|
|
|
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
|
|
if (typeof Object.assign !== 'function') {
|
|
// Must be writable: true, enumerable: false, configurable: true
|
|
Object.defineProperty(Object, "assign", {
|
|
value: function assign(target, varArgs) { // .length of function is 2
|
|
'use strict';
|
|
if (target === null || target === undefined) {
|
|
throw new TypeError('Cannot convert undefined or null to object');
|
|
}
|
|
|
|
var to = Object(target);
|
|
|
|
for (var index = 1; index < arguments.length; index++) {
|
|
var nextSource = arguments[index];
|
|
|
|
if (nextSource !== null && nextSource !== undefined) {
|
|
for (var nextKey in nextSource) {
|
|
// Avoid bugs when hasOwnProperty is shadowed
|
|
if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {
|
|
to[nextKey] = nextSource[nextKey];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return to;
|
|
},
|
|
writable: true,
|
|
configurable: true
|
|
});
|
|
}
|