mirror of
https://github.com/smallmain/cocos-enhance-kit.git
synced 2025-10-09 14:55:24 +00:00
[adapters] 增加小游戏适配部分源码
This commit is contained in:
18
adapters/platforms/alipay/index.js
Normal file
18
adapters/platforms/alipay/index.js
Normal file
@@ -0,0 +1,18 @@
|
||||
const _global = window;
|
||||
const adapter = _global.__globalAdapter = {};
|
||||
|
||||
Object.assign(adapter, {
|
||||
init () {
|
||||
require('./wrapper/builtin');
|
||||
_global.DOMParser = require('../../common/xmldom/dom-parser').DOMParser;
|
||||
require('./wrapper/unify');
|
||||
require('./wrapper/fs-utils');
|
||||
require('../../common/engine/globalAdapter');
|
||||
require('./wrapper/systemInfo');
|
||||
},
|
||||
|
||||
adaptEngine () {
|
||||
require('../../common/engine');
|
||||
require('./wrapper/engine');
|
||||
},
|
||||
});
|
11
adapters/platforms/alipay/res/ccRequire.js
Normal file
11
adapters/platforms/alipay/res/ccRequire.js
Normal file
@@ -0,0 +1,11 @@
|
||||
let moduleMap = {
|
||||
// tail
|
||||
};
|
||||
|
||||
window.__cocos_require__ = function (moduleName) {
|
||||
let func = moduleMap[moduleName];
|
||||
if (!func) {
|
||||
throw new Error(`cannot find module ${moduleName}`);
|
||||
}
|
||||
return func();
|
||||
};
|
18
adapters/platforms/alipay/res/game.js
Normal file
18
adapters/platforms/alipay/res/game.js
Normal file
@@ -0,0 +1,18 @@
|
||||
require('adapter-js-path');
|
||||
__globalAdapter.init();
|
||||
require('cocos2d-js-path');
|
||||
require('physics-js-path');
|
||||
__globalAdapter.adaptEngine();
|
||||
require('./ccRequire');
|
||||
|
||||
require('./src/settings');
|
||||
// Introduce Cocos Service here
|
||||
require('./main'); // TODO: move to common
|
||||
|
||||
// Adjust devicePixelRatio
|
||||
cc.view._maxPixelRatio = 4;
|
||||
|
||||
// Release Image objects after uploaded gl texture
|
||||
cc.macro.CLEANUP_IMAGE_CACHE = true;
|
||||
|
||||
window.boot();
|
10
adapters/platforms/alipay/res/game.json
Normal file
10
adapters/platforms/alipay/res/game.json
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"screenOrientation": "landscape",
|
||||
"networkTimeout": {
|
||||
"request": 5000,
|
||||
"connectSocket": 5000,
|
||||
"upload": 5000,
|
||||
"download": 5000
|
||||
},
|
||||
"showStatusBar": false
|
||||
}
|
64
adapters/platforms/alipay/res/main.js
Normal file
64
adapters/platforms/alipay/res/main.js
Normal file
@@ -0,0 +1,64 @@
|
||||
window.boot = function () {
|
||||
var settings = window._CCSettings;
|
||||
window._CCSettings = undefined;
|
||||
|
||||
var onStart = function () {
|
||||
|
||||
cc.view.enableRetina(true);
|
||||
cc.view.resizeWithBrowserSize(true);
|
||||
|
||||
var launchScene = settings.launchScene;
|
||||
|
||||
// load scene
|
||||
cc.director.loadScene(launchScene, null,
|
||||
function () {
|
||||
console.log('Success to load scene: ' + launchScene);
|
||||
}
|
||||
);
|
||||
};
|
||||
|
||||
var option = {
|
||||
id: 'GameCanvas',
|
||||
debugMode: settings.debug ? cc.debug.DebugMode.INFO : cc.debug.DebugMode.ERROR,
|
||||
showFPS: settings.debug,
|
||||
frameRate: 60,
|
||||
groupList: settings.groupList,
|
||||
collisionMatrix: settings.collisionMatrix,
|
||||
}
|
||||
|
||||
cc.assetManager.init({
|
||||
bundleVers: settings.bundleVers,
|
||||
subpackages: settings.subpackages,
|
||||
remoteBundles: settings.remoteBundles,
|
||||
server: settings.server
|
||||
});
|
||||
|
||||
var RESOURCES = cc.AssetManager.BuiltinBundleName.RESOURCES;
|
||||
var INTERNAL = cc.AssetManager.BuiltinBundleName.INTERNAL;
|
||||
var MAIN = cc.AssetManager.BuiltinBundleName.MAIN;
|
||||
var START_SCENE = cc.AssetManager.BuiltinBundleName.START_SCENE;
|
||||
var bundleRoot = [INTERNAL];
|
||||
settings.hasResourcesBundle && bundleRoot.push(RESOURCES);
|
||||
settings.hasStartSceneBundle && bundleRoot.push(MAIN);
|
||||
|
||||
var count = 0;
|
||||
function cb (err) {
|
||||
if (err) return console.error(err.message, err.stack);
|
||||
count++;
|
||||
if (count === bundleRoot.length + 1) {
|
||||
// if there is start-scene bundle. should load start-scene bundle in the last stage.
|
||||
// Otherwise the main bundle should be the last
|
||||
cc.assetManager.loadBundle(settings.hasStartSceneBundle ? START_SCENE : MAIN, function (err) {
|
||||
if (!err) cc.game.run(option, onStart);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// load plugins
|
||||
cc.assetManager.loadScript(settings.jsList.map(function (x) { return 'src/' + x;}), cb);
|
||||
|
||||
// load bundles
|
||||
for (var i = 0; i < bundleRoot.length; i++) {
|
||||
cc.assetManager.loadBundle(bundleRoot[i], cb);
|
||||
}
|
||||
};
|
3609
adapters/platforms/alipay/wrapper/builtin.js
Normal file
3609
adapters/platforms/alipay/wrapper/builtin.js
Normal file
File diff suppressed because it is too large
Load Diff
3
adapters/platforms/alipay/wrapper/engine/AudioEngine.js
Normal file
3
adapters/platforms/alipay/wrapper/engine/AudioEngine.js
Normal file
@@ -0,0 +1,3 @@
|
||||
if (cc && cc.audioEngine) {
|
||||
cc.audioEngine._maxAudioInstance = 6;
|
||||
}
|
55
adapters/platforms/alipay/wrapper/engine/Label.js
Normal file
55
adapters/platforms/alipay/wrapper/engine/Label.js
Normal file
@@ -0,0 +1,55 @@
|
||||
if (cc && cc.Label) {
|
||||
const gfx = cc.gfx;
|
||||
const Label = cc.Label;
|
||||
|
||||
// shared label canvas
|
||||
let _sharedLabelCanvas = document.createElement('canvas');
|
||||
let _sharedLabelCanvasCtx = _sharedLabelCanvas.getContext('2d');
|
||||
let canvasData = {
|
||||
canvas: _sharedLabelCanvas,
|
||||
context: _sharedLabelCanvasCtx,
|
||||
};
|
||||
cc.game.on(cc.game.EVENT_ENGINE_INITED, function () {
|
||||
Object.assign(Label._canvasPool, {
|
||||
get() {
|
||||
return canvasData;
|
||||
},
|
||||
|
||||
put() {
|
||||
// do nothing
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
let _originUpdateMaterial = Label.prototype._updateMaterialWebgl;
|
||||
// fix ttf font black border
|
||||
Object.assign(Label.prototype, {
|
||||
_updateMaterialWebgl () {
|
||||
_originUpdateMaterial.call(this);
|
||||
|
||||
// init blend factor
|
||||
let material = this._materials[0];
|
||||
if (!this._frame || !material) {
|
||||
return;
|
||||
}
|
||||
let dstBlendFactor = cc.macro.BlendFactor.ONE_MINUS_SRC_ALPHA;
|
||||
let srcBlendFactor;
|
||||
if (!(__globalAdapter.isDevTool || this.font instanceof cc.BitmapFont)) {
|
||||
// Premultiplied alpha on runtime
|
||||
srcBlendFactor = cc.macro.BlendFactor.ONE;
|
||||
}
|
||||
else {
|
||||
srcBlendFactor = cc.macro.BlendFactor.SRC_ALPHA;
|
||||
}
|
||||
|
||||
// set blend func
|
||||
material.effect.setBlend(
|
||||
true,
|
||||
gfx.BLEND_FUNC_ADD,
|
||||
srcBlendFactor, dstBlendFactor,
|
||||
gfx.BLEND_FUNC_ADD,
|
||||
srcBlendFactor, dstBlendFactor,
|
||||
);
|
||||
},
|
||||
});
|
||||
}
|
2
adapters/platforms/alipay/wrapper/engine/index.js
Normal file
2
adapters/platforms/alipay/wrapper/engine/index.js
Normal file
@@ -0,0 +1,2 @@
|
||||
require('./Label');
|
||||
require('./AudioEngine');
|
262
adapters/platforms/alipay/wrapper/fs-utils.js
Normal file
262
adapters/platforms/alipay/wrapper/fs-utils.js
Normal file
@@ -0,0 +1,262 @@
|
||||
/****************************************************************************
|
||||
Copyright (c) 2017-2019 Xiamen Yaji Software Co., Ltd.
|
||||
|
||||
https://www.cocos.com/
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated engine source code (the "Software"), a limited,
|
||||
worldwide, royalty-free, non-assignable, revocable and non-exclusive license
|
||||
to use Cocos Creator solely to develop games on your target platforms. You shall
|
||||
not use Cocos Creator software for developing other software or tools that's
|
||||
used for developing games. You are not granted to publish, distribute,
|
||||
sublicense, and/or sell copies of Cocos Creator.
|
||||
|
||||
The software or tools in this License Agreement are licensed, not sold.
|
||||
Xiamen Yaji Software Co., Ltd. reserves all rights not expressly granted to you.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
****************************************************************************/
|
||||
var fs = my.getFileSystemManager ? my.getFileSystemManager() : null;
|
||||
var outOfStorageRegExp = /the maximum size of the file storage/; // not exactly right
|
||||
|
||||
var fsUtils = {
|
||||
|
||||
fs,
|
||||
|
||||
isOutOfStorage (errMsg) {
|
||||
return outOfStorageRegExp.test(errMsg);
|
||||
},
|
||||
|
||||
getUserDataPath () {
|
||||
return my.env.USER_DATA_PATH;
|
||||
},
|
||||
|
||||
checkFsValid () {
|
||||
if (!fs) {
|
||||
console.warn('Can not get the file system!');
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
},
|
||||
|
||||
deleteFile (filePath, onComplete) {
|
||||
fs.unlink({
|
||||
filePath: filePath,
|
||||
success: function () {
|
||||
onComplete && onComplete(null);
|
||||
},
|
||||
fail: function (res) {
|
||||
console.warn(`Delete file failed: path: ${filePath} message: ${res.errorMessage}`);
|
||||
onComplete && onComplete(new Error(res.errorMessage));
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
downloadFile (remoteUrl, filePath, header, onProgress, onComplete) {
|
||||
var options = {
|
||||
url: remoteUrl,
|
||||
success: function (res) {
|
||||
if (!filePath) {
|
||||
onComplete && onComplete(null, res.apFilePath);
|
||||
}
|
||||
else {
|
||||
fsUtils.copyFile(res.apFilePath, filePath, onComplete);
|
||||
}
|
||||
},
|
||||
fail: function (res) {
|
||||
console.warn(`Download file failed: path: ${remoteUrl} message: ${res.errorMessage}`);
|
||||
onComplete && onComplete(new Error(res.errorMessage), null);
|
||||
}
|
||||
}
|
||||
if (header) options.header = header;
|
||||
var task = my.downloadFile(options);
|
||||
onProgress && task.onProgressUpdate(onProgress);
|
||||
},
|
||||
|
||||
saveFile (srcPath, destPath, onComplete) {
|
||||
// Hack, seems like my.saveFile dose not work
|
||||
fsUtils.copyFile(srcPath, destPath, onComplete);
|
||||
},
|
||||
|
||||
copyFile (srcPath, destPath, onComplete) {
|
||||
fs.copyFile({
|
||||
srcPath: srcPath,
|
||||
destPath: destPath,
|
||||
success: function () {
|
||||
onComplete && onComplete(null);
|
||||
},
|
||||
fail: function (res) {
|
||||
console.warn(`Copy file failed: path: ${srcPath} message: ${res.errorMessage}`);
|
||||
onComplete && onComplete(new Error(res.errorMessage));
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
writeFile (path, data, encoding, onComplete) {
|
||||
fs.writeFile({
|
||||
filePath: path,
|
||||
encoding: encoding,
|
||||
data: data,
|
||||
success: function () {
|
||||
onComplete && onComplete(null);
|
||||
},
|
||||
fail: function (res) {
|
||||
console.warn(`Write file failed: path: ${path} message: ${res.errorMessage}`);
|
||||
onComplete && onComplete(new Error(res.errorMessage));
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
writeFileSync (path, data, encoding) {
|
||||
try {
|
||||
fs.writeFileSync({
|
||||
filePath: path,
|
||||
data: data,
|
||||
encoding: encoding,
|
||||
});
|
||||
return null;
|
||||
}
|
||||
catch (e) {
|
||||
console.warn(`Write file failed: path: ${path} message: ${e.message}`);
|
||||
return new Error(e.message);
|
||||
}
|
||||
},
|
||||
|
||||
readFile (filePath, encoding, onComplete) {
|
||||
fs.readFile({
|
||||
filePath: filePath,
|
||||
encoding: encoding,
|
||||
success: function (res) {
|
||||
onComplete && onComplete(null, res.data);
|
||||
},
|
||||
fail: function (res) {
|
||||
console.warn(`Read file failed: path: ${filePath} message: ${res.errorMessage}`);
|
||||
onComplete && onComplete (new Error(res.errorMessage), null);
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
readDir (filePath, onComplete) {
|
||||
fs.readdir({
|
||||
dirPath: filePath,
|
||||
success: function (res) {
|
||||
onComplete && onComplete(null, res.files);
|
||||
},
|
||||
fail: function (res) {
|
||||
console.warn(`Read directory failed: path: ${filePath} message: ${res.errorMessage}`);
|
||||
onComplete && onComplete(new Error(res.errorMessage), null);
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
readText (filePath, onComplete) {
|
||||
fsUtils.readFile(filePath, 'utf8', onComplete);
|
||||
},
|
||||
|
||||
readArrayBuffer (filePath, onComplete) {
|
||||
fsUtils.readFile(filePath, '', onComplete);
|
||||
},
|
||||
|
||||
readJson (filePath, onComplete) {
|
||||
fsUtils.readFile(filePath, 'utf8', function (err, text) {
|
||||
var out = null;
|
||||
if (!err) {
|
||||
try {
|
||||
out = JSON.parse(text);
|
||||
}
|
||||
catch (e) {
|
||||
console.warn(`Read json failed: path: ${filePath} message: ${e.message}`);
|
||||
err = new Error(e.message);
|
||||
}
|
||||
}
|
||||
onComplete && onComplete(err, out);
|
||||
});
|
||||
},
|
||||
|
||||
readJsonSync (path) {
|
||||
try {
|
||||
var res = fs.readFileSync({
|
||||
filePath: path,
|
||||
encoding: 'utf8',
|
||||
});
|
||||
return JSON.parse(res.data);
|
||||
}
|
||||
catch (e) {
|
||||
console.warn(`Read json failed: path: ${path} message: ${e.message}`);
|
||||
return new Error(e.message);
|
||||
}
|
||||
},
|
||||
|
||||
makeDirSync (path, recursive) {
|
||||
try {
|
||||
fs.mkdirSync({
|
||||
dirPath: path,
|
||||
recursive: recursive,
|
||||
});
|
||||
return null;
|
||||
}
|
||||
catch (e) {
|
||||
console.warn(`Make directory failed: path: ${path} message: ${e.message}`);
|
||||
return new Error(e.message);
|
||||
}
|
||||
},
|
||||
|
||||
rmdirSync (dirPath, recursive) {
|
||||
try {
|
||||
fs.rmdirSync({ dirPath, recursive });
|
||||
}
|
||||
catch (e) {
|
||||
console.warn(`rm directory failed: path: ${dirPath} message: ${e.message}`);
|
||||
return new Error(e.message);
|
||||
}
|
||||
},
|
||||
|
||||
exists (filePath, onComplete) {
|
||||
fs.access({
|
||||
path: filePath,
|
||||
success: function () {
|
||||
onComplete && onComplete(true);
|
||||
},
|
||||
fail: function () {
|
||||
onComplete && onComplete(false);
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
loadSubpackage(name, onProgress, onComplete) {
|
||||
var task = my.loadSubpackage({
|
||||
name,
|
||||
success: (res) => {
|
||||
onComplete && onComplete();
|
||||
},
|
||||
fail : (res)=>{
|
||||
console.warn(`Load Subpackage failed: path: ${name} message: ${res.errMsg}`);
|
||||
onComplete && onComplete(new Error(`Failed to load subpackage ${name}: ${res.errMsg}`));
|
||||
}
|
||||
});
|
||||
onProgress && task.onProgressUpdate(onProgress);
|
||||
return task;
|
||||
},
|
||||
|
||||
unzip (zipFilePath, targetPath, onComplete) {
|
||||
fs.unzip({
|
||||
zipFilePath,
|
||||
targetPath,
|
||||
success () {
|
||||
onComplete && onComplete(null);
|
||||
},
|
||||
fail (res) {
|
||||
console.warn(`unzip failed: path: ${zipFilePath} message: ${res.errorMessage}`);
|
||||
onComplete && onComplete(new Error('unzip failed: ' + res.errorMessage));
|
||||
},
|
||||
})
|
||||
},
|
||||
};
|
||||
|
||||
window.fsUtils = module.exports = fsUtils;
|
10
adapters/platforms/alipay/wrapper/systemInfo.js
Normal file
10
adapters/platforms/alipay/wrapper/systemInfo.js
Normal file
@@ -0,0 +1,10 @@
|
||||
const adapter = window.__globalAdapter;
|
||||
let adaptSysFunc = adapter.adaptSys;
|
||||
|
||||
Object.assign(adapter, {
|
||||
// Extend adaptSys interface
|
||||
adaptSys (sys) {
|
||||
adaptSysFunc.call(this, sys);
|
||||
sys.platform = sys.ALIPAY_GAME;
|
||||
},
|
||||
});
|
102
adapters/platforms/alipay/wrapper/unify.js
Normal file
102
adapters/platforms/alipay/wrapper/unify.js
Normal file
@@ -0,0 +1,102 @@
|
||||
const utils = require('../../../common/utils');
|
||||
|
||||
if (window.__globalAdapter) {
|
||||
let globalAdapter = window.__globalAdapter;
|
||||
// SystemInfo
|
||||
globalAdapter.isSubContext = false; // sub context not supported
|
||||
globalAdapter.isDevTool = window.navigator && (/AlipayIDE/.test(window.navigator.userAgent));
|
||||
utils.cloneMethod(globalAdapter, my, 'getSystemInfoSync');
|
||||
|
||||
// TouchEvent
|
||||
// my.onTouchStart register touch event listner on body
|
||||
// need to register on canvas
|
||||
globalAdapter.onTouchStart = function (cb) {
|
||||
window.canvas.addEventListener('touchstart', function (res) {
|
||||
cb && cb(res);
|
||||
});
|
||||
};
|
||||
globalAdapter.onTouchMove = function (cb) {
|
||||
window.canvas.addEventListener('touchmove', function (res) {
|
||||
cb && cb(res);
|
||||
});
|
||||
};
|
||||
globalAdapter.onTouchEnd = function (cb) {
|
||||
window.canvas.addEventListener('touchend', function (res) {
|
||||
cb && cb(res);
|
||||
});
|
||||
};
|
||||
globalAdapter.onTouchCancel = function (cb) {
|
||||
window.canvas.addEventListener('touchcancel', function (res) {
|
||||
cb && cb(res);
|
||||
});
|
||||
};
|
||||
|
||||
// Audio
|
||||
globalAdapter.createInnerAudioContext = function() {
|
||||
let audio = my.createInnerAudioContext();
|
||||
audio.onCanplay = audio.onCanPlay.bind(audio);
|
||||
return audio;
|
||||
};
|
||||
|
||||
// FrameRate
|
||||
utils.cloneMethod(globalAdapter, my, 'setPreferredFramesPerSecond');
|
||||
|
||||
// Keyboard
|
||||
utils.cloneMethod(globalAdapter, my, 'showKeyboard');
|
||||
utils.cloneMethod(globalAdapter, my, 'hideKeyboard');
|
||||
utils.cloneMethod(globalAdapter, my, 'updateKeyboard');
|
||||
utils.cloneMethod(globalAdapter, my, 'onKeyboardInput');
|
||||
utils.cloneMethod(globalAdapter, my, 'onKeyboardConfirm');
|
||||
utils.cloneMethod(globalAdapter, my, 'onKeyboardComplete');
|
||||
utils.cloneMethod(globalAdapter, my, 'offKeyboardInput');
|
||||
utils.cloneMethod(globalAdapter, my, 'offKeyboardConfirm');
|
||||
utils.cloneMethod(globalAdapter, my, 'offKeyboardComplete');
|
||||
|
||||
// Message
|
||||
utils.cloneMethod(globalAdapter, my, 'getOpenDataContext');
|
||||
utils.cloneMethod(globalAdapter, my, 'onMessage');
|
||||
|
||||
// SharedCanvas
|
||||
utils.cloneMethod(globalAdapter, my, 'getSharedCanvas');
|
||||
|
||||
// Font
|
||||
utils.cloneMethod(globalAdapter, my, 'loadFont');
|
||||
|
||||
// hide show Event
|
||||
utils.cloneMethod(globalAdapter, my, 'onShow');
|
||||
utils.cloneMethod(globalAdapter, my, 'onHide');
|
||||
|
||||
// Accelerometer
|
||||
let accelerometerCallback = null;
|
||||
let systemInfo = my.getSystemInfoSync();
|
||||
let windowWidth = systemInfo.windowWidth;
|
||||
let windowHeight = systemInfo.windowHeight;
|
||||
let isLandscape = windowWidth > windowHeight;
|
||||
function accelerometerChangeCallback (res, cb) {
|
||||
let resClone = {};
|
||||
|
||||
let x = res.x;
|
||||
let y = res.y;
|
||||
|
||||
if (isLandscape) {
|
||||
let tmp = x;
|
||||
x = -y;
|
||||
y = tmp;
|
||||
}
|
||||
|
||||
resClone.x = x;
|
||||
resClone.y = y;
|
||||
resClone.z = res.z;
|
||||
accelerometerCallback && accelerometerCallback(resClone);
|
||||
}
|
||||
Object.assign(globalAdapter, {
|
||||
startAccelerometer (cb) {
|
||||
accelerometerCallback = cb;
|
||||
my.onAccelerometerChange && my.onAccelerometerChange(accelerometerChangeCallback);
|
||||
},
|
||||
|
||||
stopAccelerometer () {
|
||||
my.offAccelerometerChange && my.offAccelerometerChange(accelerometerChangeCallback);
|
||||
},
|
||||
});
|
||||
}
|
58
adapters/platforms/baidu/index.js
Normal file
58
adapters/platforms/baidu/index.js
Normal file
@@ -0,0 +1,58 @@
|
||||
const _global = GameGlobal;
|
||||
const adapter = _global.__globalAdapter = {};
|
||||
|
||||
Object.assign(adapter, {
|
||||
init () {
|
||||
require('./wrapper/builtin');
|
||||
_global.DOMParser = require('../../common/xmldom/dom-parser').DOMParser;
|
||||
require('./wrapper/unify');
|
||||
require('./wrapper/fs-utils');
|
||||
require('../../common/engine/globalAdapter');
|
||||
require('./wrapper/systemInfo');
|
||||
},
|
||||
|
||||
adaptEngine () {
|
||||
require('../../common/engine');
|
||||
require('./wrapper/engine');
|
||||
require('./wrapper/sub-context-adapter');
|
||||
},
|
||||
|
||||
handleSystemInfo (cb) {
|
||||
if (swan.getOpenDataContext) {
|
||||
swan.getOpenDataContext().postMessage({
|
||||
fromAdapter: true,
|
||||
event: 'main-context-info',
|
||||
sysInfo: __globalAdapter.getSystemInfoSync(), // send system info to open data context
|
||||
innerWidth: window.innerWidth,
|
||||
innerHeight: window.innerHeight,
|
||||
devicePixelRatio: window.devicePixelRatio,
|
||||
});
|
||||
cb && cb();
|
||||
}
|
||||
else {
|
||||
swan.onMessage(function (data) {
|
||||
if (data.fromAdapter) {
|
||||
if (data.event === 'main-context-info') {
|
||||
GameGlobal._env = data.sysInfo; // revieve system info from main context
|
||||
Object.defineProperties(window, {
|
||||
'innerWidth': {
|
||||
value: data.innerWidth,
|
||||
enumerable: true,
|
||||
},
|
||||
'innerHeight': {
|
||||
value: data.innerHeight,
|
||||
enumerable: true,
|
||||
},
|
||||
'devicePixelRatio': {
|
||||
value: data.devicePixelRatio,
|
||||
enumerable: true,
|
||||
},
|
||||
});
|
||||
|
||||
cb && cb();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
},
|
||||
});
|
11
adapters/platforms/baidu/res/ccRequire.js
Normal file
11
adapters/platforms/baidu/res/ccRequire.js
Normal file
@@ -0,0 +1,11 @@
|
||||
let moduleMap = {
|
||||
// tail
|
||||
};
|
||||
|
||||
window.__cocos_require__ = function (moduleName) {
|
||||
let func = moduleMap[moduleName];
|
||||
if (!func) {
|
||||
throw new Error(`cannot find module ${moduleName}`);
|
||||
}
|
||||
return func();
|
||||
};
|
24
adapters/platforms/baidu/res/game.js
Normal file
24
adapters/platforms/baidu/res/game.js
Normal file
@@ -0,0 +1,24 @@
|
||||
require('adapter-js-path');
|
||||
__globalAdapter.init();
|
||||
|
||||
// Ensure getting the system info in open data context
|
||||
__globalAdapter.handleSystemInfo(() => {
|
||||
require('cocos2d-js-path');
|
||||
require('physics-js-path');
|
||||
__globalAdapter.adaptEngine();
|
||||
require('./ccRequire');
|
||||
|
||||
require('./src/settings');
|
||||
// Introduce Cocos Service here
|
||||
require('./main'); // TODO: move to common
|
||||
|
||||
// Adjust devicePixelRatio
|
||||
cc.view._maxPixelRatio = 4;
|
||||
|
||||
if (cc.sys.platform !== cc.sys.BAIDU_GAME_SUB) {
|
||||
// Release Image objects after uploaded gl texture
|
||||
cc.macro.CLEANUP_IMAGE_CACHE = true;
|
||||
}
|
||||
|
||||
window.boot();
|
||||
});
|
11
adapters/platforms/baidu/res/game.json
Normal file
11
adapters/platforms/baidu/res/game.json
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"deviceOrientation": "landscape",
|
||||
"openDataContext": "",
|
||||
"networkTimeout":
|
||||
{
|
||||
"request": 5000,
|
||||
"connectSocket": 5000,
|
||||
"uploadFile": 5000,
|
||||
"downloadFile": 5000
|
||||
}
|
||||
}
|
66
adapters/platforms/baidu/res/main.js
Normal file
66
adapters/platforms/baidu/res/main.js
Normal file
@@ -0,0 +1,66 @@
|
||||
window.boot = function () {
|
||||
var settings = window._CCSettings;
|
||||
window._CCSettings = undefined;
|
||||
|
||||
var onStart = function () {
|
||||
cc.view.enableRetina(true);
|
||||
cc.view.resizeWithBrowserSize(true);
|
||||
|
||||
var launchScene = settings.launchScene;
|
||||
|
||||
// load scene
|
||||
cc.director.loadScene(launchScene, null,
|
||||
function () {
|
||||
console.log('Success to load scene: ' + launchScene);
|
||||
}
|
||||
);
|
||||
};
|
||||
|
||||
var isSubContext = (cc.sys.platform === cc.sys.BAIDU_GAME_SUB);
|
||||
|
||||
var option = {
|
||||
id: 'GameCanvas',
|
||||
debugMode: settings.debug ? cc.debug.DebugMode.INFO : cc.debug.DebugMode.ERROR,
|
||||
showFPS: !isSubContext && settings.debug,
|
||||
frameRate: 60,
|
||||
groupList: settings.groupList,
|
||||
collisionMatrix: settings.collisionMatrix,
|
||||
}
|
||||
|
||||
cc.assetManager.init({
|
||||
bundleVers: settings.bundleVers,
|
||||
subpackages: settings.subpackages,
|
||||
remoteBundles: settings.remoteBundles,
|
||||
server: settings.server,
|
||||
subContextRoot: settings.subContextRoot
|
||||
});
|
||||
|
||||
var RESOURCES = cc.AssetManager.BuiltinBundleName.RESOURCES;
|
||||
var INTERNAL = cc.AssetManager.BuiltinBundleName.INTERNAL;
|
||||
var MAIN = cc.AssetManager.BuiltinBundleName.MAIN;
|
||||
var START_SCENE = cc.AssetManager.BuiltinBundleName.START_SCENE;
|
||||
var bundleRoot = [INTERNAL];
|
||||
settings.hasResourcesBundle && bundleRoot.push(RESOURCES);
|
||||
settings.hasStartSceneBundle && bundleRoot.push(MAIN);
|
||||
|
||||
var count = 0;
|
||||
function cb (err) {
|
||||
if (err) return console.error(err.message, err.stack);
|
||||
count++;
|
||||
if (count === bundleRoot.length + 1) {
|
||||
// if there is start-scene bundle. should load start-scene bundle in the last stage
|
||||
// Otherwise the main bundle should be the last
|
||||
cc.assetManager.loadBundle(settings.hasStartSceneBundle ? START_SCENE : MAIN, function (err) {
|
||||
if (!err) cc.game.run(option, onStart);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// load plugins
|
||||
cc.assetManager.loadScript(settings.jsList.map(function (x) { return 'src/' + x;}), cb);
|
||||
|
||||
// load bundles
|
||||
for (var i = 0; i < bundleRoot.length; i++) {
|
||||
cc.assetManager.loadBundle(bundleRoot[i], cb);
|
||||
}
|
||||
};
|
14
adapters/platforms/baidu/res/project.swan.json
Normal file
14
adapters/platforms/baidu/res/project.swan.json
Normal file
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"appid": "",
|
||||
"compileType": "game",
|
||||
"libVersion": "1.0.0",
|
||||
"bundle":
|
||||
{
|
||||
"exclude": ["node_moudules"],
|
||||
"entry": "game.js",
|
||||
"compilers": [
|
||||
{
|
||||
"type": "babel"
|
||||
}]
|
||||
}
|
||||
}
|
228
adapters/platforms/baidu/wrapper/builtin/Audio.js
Normal file
228
adapters/platforms/baidu/wrapper/builtin/Audio.js
Normal file
@@ -0,0 +1,228 @@
|
||||
/* eslint-disable */
|
||||
import HTMLAudioElement from './HTMLAudioElement'
|
||||
|
||||
let SN_SEED = 1
|
||||
|
||||
const _innerAudioContextMap = {}
|
||||
|
||||
class AudioMock {
|
||||
play() {}
|
||||
pause() {}
|
||||
stop() {}
|
||||
seek() {}
|
||||
destroy() {}
|
||||
|
||||
onCanplay() {}
|
||||
offCanplay() {}
|
||||
onEnded() {}
|
||||
offEnded() {}
|
||||
onError() {}
|
||||
offError() {}
|
||||
onPause() {}
|
||||
offPause() {}
|
||||
onPlay() {}
|
||||
offPlay() {}
|
||||
onSeeked() {}
|
||||
offSeeked() {}
|
||||
onSeeking() {}
|
||||
offSeeking() {}
|
||||
onStop() {}
|
||||
offStop() {}
|
||||
onTimeUpdate() {}
|
||||
offTimeUpdate() {}
|
||||
offWaiting() {}
|
||||
onWaitin() {}
|
||||
}
|
||||
|
||||
export default class Audio extends HTMLAudioElement {
|
||||
|
||||
constructor(url) {
|
||||
super()
|
||||
|
||||
this._$sn = SN_SEED++;
|
||||
|
||||
this.readyState = Audio.HAVE_NOTHING
|
||||
|
||||
const innerAudioContext = swan.createInnerAudioContext
|
||||
? swan.createInnerAudioContext()
|
||||
: new AudioMock();
|
||||
|
||||
_innerAudioContextMap[this._$sn] = innerAudioContext
|
||||
|
||||
this._canplayEvents = [
|
||||
'load',
|
||||
'loadend',
|
||||
'canplay',
|
||||
'canplaythrough',
|
||||
'loadedmetadata'
|
||||
]
|
||||
|
||||
innerAudioContext.onCanplay(() => {
|
||||
this._loaded = true
|
||||
this.readyState = Audio.HAVE_CURRENT_DATA
|
||||
|
||||
this._canplayEvents.forEach((type) => {
|
||||
this.dispatchEvent({ type: type })
|
||||
})
|
||||
})
|
||||
innerAudioContext.onPlay(() => {
|
||||
this._paused = _innerAudioContextMap[this._$sn].paused
|
||||
this.dispatchEvent({ type: 'play' })
|
||||
})
|
||||
innerAudioContext.onPause(() => {
|
||||
this._paused = _innerAudioContextMap[this._$sn].paused
|
||||
this.dispatchEvent({ type: 'pause' })
|
||||
})
|
||||
innerAudioContext.onEnded(() => {
|
||||
this._paused = _innerAudioContextMap[this._$sn].paused
|
||||
if (_innerAudioContextMap[this._$sn].loop === false) {
|
||||
this.dispatchEvent({ type: 'ended' })
|
||||
}
|
||||
this.readyState = Audio.HAVE_ENOUGH_DATA
|
||||
})
|
||||
innerAudioContext.onError(() => {
|
||||
this._paused = _innerAudioContextMap[this._$sn].paused
|
||||
this.dispatchEvent({ type: 'error' })
|
||||
})
|
||||
|
||||
if (url) {
|
||||
this.src = url
|
||||
} else {
|
||||
this._src = ''
|
||||
}
|
||||
|
||||
this._loop = innerAudioContext.loop
|
||||
this._autoplay = innerAudioContext.autoplay
|
||||
this._paused = innerAudioContext.paused
|
||||
this._volume = innerAudioContext.volume
|
||||
this._muted = false
|
||||
}
|
||||
|
||||
addEventListener(type, listener, options = {}) {
|
||||
type = String(type).toLowerCase()
|
||||
|
||||
super.addEventListener(type, listener, options)
|
||||
|
||||
if (this._loaded && this._canplayEvents.indexOf(type) !== -1) {
|
||||
this.dispatchEvent({ type: type })
|
||||
}
|
||||
}
|
||||
|
||||
load() {
|
||||
// console.warn('HTMLAudioElement.load() is not implemented.')
|
||||
// weixin doesn't need call load() manually
|
||||
}
|
||||
|
||||
play() {
|
||||
_innerAudioContextMap[this._$sn].play()
|
||||
}
|
||||
|
||||
resume() {
|
||||
_innerAudioContextMap[this._$sn].resume()
|
||||
}
|
||||
|
||||
pause() {
|
||||
_innerAudioContextMap[this._$sn].pause()
|
||||
}
|
||||
|
||||
destroy() {
|
||||
_innerAudioContextMap[this._$sn].destroy()
|
||||
}
|
||||
|
||||
canPlayType(mediaType = '') {
|
||||
if (typeof mediaType !== 'string') {
|
||||
return ''
|
||||
}
|
||||
|
||||
if (mediaType.indexOf('audio/mpeg') > -1 || mediaType.indexOf('audio/mp4')) {
|
||||
return 'probably'
|
||||
}
|
||||
return ''
|
||||
}
|
||||
|
||||
get currentTime() {
|
||||
return _innerAudioContextMap[this._$sn].currentTime
|
||||
}
|
||||
|
||||
set currentTime(value) {
|
||||
_innerAudioContextMap[this._$sn].seek(value)
|
||||
}
|
||||
|
||||
get duration() {
|
||||
return _innerAudioContextMap[this._$sn].duration
|
||||
}
|
||||
|
||||
get src() {
|
||||
return this._src
|
||||
}
|
||||
|
||||
set src(value) {
|
||||
this._src = value
|
||||
this._loaded = false
|
||||
this.readyState = Audio.HAVE_NOTHING
|
||||
|
||||
const innerAudioContext = _innerAudioContextMap[this._$sn]
|
||||
|
||||
innerAudioContext.src = value
|
||||
}
|
||||
|
||||
get loop() {
|
||||
return this._loop
|
||||
}
|
||||
|
||||
set loop(value) {
|
||||
this._loop = value
|
||||
_innerAudioContextMap[this._$sn].loop = value
|
||||
}
|
||||
|
||||
get autoplay() {
|
||||
return this._autoplay
|
||||
}
|
||||
|
||||
set autoplay(value) {
|
||||
this._autoplay = value
|
||||
_innerAudioContextMap[this._$sn].autoplay = value
|
||||
}
|
||||
|
||||
get paused() {
|
||||
return this._paused
|
||||
}
|
||||
|
||||
get volume() {
|
||||
return this._volume
|
||||
}
|
||||
|
||||
set volume(value) {
|
||||
this._volume = value
|
||||
if (!this._muted) {
|
||||
_innerAudioContextMap[this._$sn].volume = value
|
||||
}
|
||||
}
|
||||
|
||||
get muted() {
|
||||
return this._muted
|
||||
}
|
||||
|
||||
set muted(value) {
|
||||
this._muted = value
|
||||
if (value) {
|
||||
_innerAudioContextMap[this._$sn].volume = 0
|
||||
} else {
|
||||
_innerAudioContextMap[this._$sn].volume = this._volume
|
||||
}
|
||||
}
|
||||
|
||||
cloneNode() {
|
||||
const newAudio = new Audio()
|
||||
newAudio.loop = this.loop
|
||||
newAudio.autoplay = this.autoplay
|
||||
newAudio.src = this.src
|
||||
return newAudio
|
||||
}
|
||||
}
|
||||
|
||||
Audio.HAVE_NOTHING = 0
|
||||
Audio.HAVE_METADATA = 1
|
||||
Audio.HAVE_CURRENT_DATA = 2
|
||||
Audio.HAVE_FUTURE_DATA = 3
|
||||
Audio.HAVE_ENOUGH_DATA = 4
|
60
adapters/platforms/baidu/wrapper/builtin/Base64.js
Normal file
60
adapters/platforms/baidu/wrapper/builtin/Base64.js
Normal file
@@ -0,0 +1,60 @@
|
||||
/* eslint-disable */
|
||||
let chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
|
||||
|
||||
function InvalidCharacterError(message) {
|
||||
this.message = message;
|
||||
}
|
||||
InvalidCharacterError.prototype = new Error;
|
||||
InvalidCharacterError.prototype.name = 'InvalidCharacterError';
|
||||
|
||||
// encoder
|
||||
// [https://gist.github.com/999166] by [https://github.com/nignag]
|
||||
|
||||
function btoa(input) {
|
||||
let str = String(input);
|
||||
let output = '';
|
||||
for (
|
||||
// initialize result and counter
|
||||
let block, charCode, idx = 0, map = chars;
|
||||
// if the next str index does not exist:
|
||||
// change the mapping table to "="
|
||||
// check if d has no fractional digits
|
||||
str.charAt(idx | 0) || (map = '=', idx % 1);
|
||||
// "8 - idx % 1 * 8" generates the sequence 2, 4, 6, 8
|
||||
output += map.charAt(63 & block >> 8 - idx % 1 * 8)
|
||||
) {
|
||||
charCode = str.charCodeAt(idx += 3 / 4);
|
||||
if (charCode > 0xFF) {
|
||||
throw new InvalidCharacterError("'btoa' failed: The string to be encoded contains characters outside of the Latin1 range.");
|
||||
}
|
||||
block = block << 8 | charCode;
|
||||
}
|
||||
return output;
|
||||
}
|
||||
|
||||
// decoder
|
||||
// [https://gist.github.com/1020396] by [https://github.com/atk]
|
||||
function atob(input) {
|
||||
let str = String(input).replace(/=+$/, '');
|
||||
if (str.length % 4 === 1) {
|
||||
throw new InvalidCharacterError("'atob' failed: The string to be decoded is not correctly encoded.");
|
||||
}
|
||||
let output = '';
|
||||
for (
|
||||
// initialize result and counters
|
||||
let bc = 0, bs, buffer, idx = 0;
|
||||
// get next character
|
||||
buffer = str.charAt(idx++);
|
||||
// character found in table? initialize bit storage and add its ascii value;
|
||||
~buffer && (bs = bc % 4 ? bs * 64 + buffer : buffer,
|
||||
// and if not first of each 4 characters,
|
||||
// convert the first 8 bits to one ascii character
|
||||
bc++ % 4) ? output += String.fromCharCode(255 & bs >> (-2 * bc & 6)) : 0
|
||||
) {
|
||||
// try to find character in table (0-63, not found => -1)
|
||||
buffer = chars.indexOf(buffer);
|
||||
}
|
||||
return output;
|
||||
}
|
||||
|
||||
export { btoa, atob }
|
10
adapters/platforms/baidu/wrapper/builtin/Body.js
Normal file
10
adapters/platforms/baidu/wrapper/builtin/Body.js
Normal file
@@ -0,0 +1,10 @@
|
||||
/* eslint-disable */
|
||||
import HTMLElement from './HTMLElement'
|
||||
|
||||
export default class Body extends HTMLElement {
|
||||
constructor() {
|
||||
// 为了性能, 此处不按照标准的DOM层级关系设计
|
||||
// 将 body 设置为 0级, parent元素为null
|
||||
super('body', 0)
|
||||
}
|
||||
}
|
48
adapters/platforms/baidu/wrapper/builtin/Canvas.js
Normal file
48
adapters/platforms/baidu/wrapper/builtin/Canvas.js
Normal file
@@ -0,0 +1,48 @@
|
||||
/* eslint-disable */
|
||||
import * as Mixin from './util/mixin'
|
||||
// import HTMLCanvasElement from './HTMLCanvasElement'
|
||||
|
||||
// TODO
|
||||
let hasModifiedCanvasPrototype = false
|
||||
let hasInit2DContextConstructor = false
|
||||
let hasInitWebGLContextConstructor = false
|
||||
|
||||
export default function Canvas() {
|
||||
const canvas = swan.createCanvas()
|
||||
|
||||
const _getContext = canvas.getContext;
|
||||
|
||||
// canvas.__proto__.__proto__.__proto__ = new HTMLCanvasElement()
|
||||
|
||||
if (!('tagName' in canvas)) {
|
||||
canvas.tagName = 'CANVAS'
|
||||
}
|
||||
|
||||
canvas.type = 'canvas'
|
||||
|
||||
Mixin.parentNode(canvas);
|
||||
Mixin.style(canvas);
|
||||
Mixin.classList(canvas);
|
||||
Mixin.clientRegion(canvas);
|
||||
Mixin.offsetRegion(canvas);
|
||||
|
||||
canvas.focus = function() {};
|
||||
canvas.blur = function() {};
|
||||
|
||||
canvas.addEventListener = function(type, listener, options = {}) {
|
||||
// console.log('canvas.addEventListener', type);
|
||||
document.addEventListener(type, listener, options);
|
||||
}
|
||||
|
||||
canvas.removeEventListener = function(type, listener) {
|
||||
// console.log('canvas.removeEventListener', type);
|
||||
document.removeEventListener(type, listener);
|
||||
}
|
||||
|
||||
canvas.dispatchEvent = function(event = {}) {
|
||||
console.log('canvas.dispatchEvent', event.type, event);
|
||||
// nothing to do
|
||||
}
|
||||
|
||||
return canvas
|
||||
}
|
@@ -0,0 +1,8 @@
|
||||
/* eslint-disable */
|
||||
import HTMLElement from './HTMLElement'
|
||||
|
||||
export default class DocumentElement extends HTMLElement {
|
||||
constructor() {
|
||||
super('html', 0)
|
||||
}
|
||||
}
|
28
adapters/platforms/baidu/wrapper/builtin/Element.js
Normal file
28
adapters/platforms/baidu/wrapper/builtin/Element.js
Normal file
@@ -0,0 +1,28 @@
|
||||
/* eslint-disable */
|
||||
import Node from './Node'
|
||||
|
||||
export default class Element extends Node {
|
||||
|
||||
constructor() {
|
||||
super()
|
||||
|
||||
this.className = ''
|
||||
this.children = []
|
||||
}
|
||||
|
||||
setAttribute(name, value) {
|
||||
this[name] = value
|
||||
}
|
||||
|
||||
getAttribute(name) {
|
||||
return this[name]
|
||||
}
|
||||
|
||||
setAttributeNS(name, value) {
|
||||
this[name] = value
|
||||
}
|
||||
|
||||
getAttributeNS(name) {
|
||||
return this[name]
|
||||
}
|
||||
}
|
17
adapters/platforms/baidu/wrapper/builtin/Event.js
Executable file
17
adapters/platforms/baidu/wrapper/builtin/Event.js
Executable file
@@ -0,0 +1,17 @@
|
||||
/* eslint-disable */
|
||||
import { noop } from './util/index.js'
|
||||
|
||||
export default class Event {
|
||||
constructor(type) {
|
||||
|
||||
this.cancelBubble = false
|
||||
this.cancelable = false
|
||||
this.target = null
|
||||
this.currentTarget = null
|
||||
this.preventDefault = noop
|
||||
this.stopPropagation = noop
|
||||
|
||||
this.type = type
|
||||
this.timeStamp = Date.now()
|
||||
}
|
||||
}
|
@@ -0,0 +1,8 @@
|
||||
/* eslint-disable */
|
||||
import Event from '../Event'
|
||||
|
||||
export default class MouseEvent extends Event {
|
||||
constructor(type) {
|
||||
super(type)
|
||||
}
|
||||
}
|
@@ -0,0 +1,183 @@
|
||||
/* eslint-disable */
|
||||
import { noop } from '../util/index.js'
|
||||
import Event from '../Event'
|
||||
|
||||
export default class PointerEvent extends Event {
|
||||
|
||||
constructor(type) {
|
||||
super(type)
|
||||
|
||||
this.target = window.canvas
|
||||
this.currentTarget = window.canvas
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
const CLONE_PROPS = [
|
||||
|
||||
// MouseEvent
|
||||
'bubbles',
|
||||
'cancelable',
|
||||
'view',
|
||||
'detail',
|
||||
'screenX',
|
||||
'screenY',
|
||||
'clientX',
|
||||
'clientY',
|
||||
'ctrlKey',
|
||||
'altKey',
|
||||
'shiftKey',
|
||||
'metaKey',
|
||||
'button',
|
||||
'relatedTarget',
|
||||
|
||||
// PointerEvent
|
||||
'pointerId',
|
||||
'width',
|
||||
'height',
|
||||
'pressure',
|
||||
'tiltX',
|
||||
'tiltY',
|
||||
'pointerType',
|
||||
'hwTimestamp',
|
||||
'isPrimary',
|
||||
|
||||
// event instance
|
||||
'pageX',
|
||||
'pageY',
|
||||
'timeStamp'
|
||||
];
|
||||
|
||||
const CLONE_DEFAULTS = [
|
||||
|
||||
// MouseEvent
|
||||
false,
|
||||
false,
|
||||
null,
|
||||
null,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
false,
|
||||
false,
|
||||
false,
|
||||
false,
|
||||
0,
|
||||
null,
|
||||
|
||||
// DOM Level 3
|
||||
0,
|
||||
|
||||
// PointerEvent
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
'',
|
||||
0,
|
||||
false,
|
||||
|
||||
// event instance
|
||||
0,
|
||||
0,
|
||||
0
|
||||
];
|
||||
|
||||
const POINTER_TYPE = 'touch';
|
||||
|
||||
function touchToPointer(type, touch, rawEvent) {
|
||||
const e = new PointerEvent(type);
|
||||
|
||||
for (let i = 0; i < CLONE_PROPS.length; i++) {
|
||||
const p = CLONE_PROPS[i];
|
||||
e[p] = touch[p] || CLONE_DEFAULTS[i];
|
||||
}
|
||||
|
||||
e.type = type;
|
||||
e.target = window.canvas;
|
||||
e.currentTarget = window.canvas;
|
||||
e.buttons = typeToButtons(type);
|
||||
e.which = e.buttons;
|
||||
|
||||
e.pointerId = (touch.identifier || 0) + 2;
|
||||
e.bubbles = true;
|
||||
e.cancelable = true;
|
||||
// e.detail = this.clickCount;
|
||||
e.button = 0;
|
||||
|
||||
e.width = (touch.radiusX || 0.5) * 2;
|
||||
e.height = (touch.radiusY || 0.5) * 2;
|
||||
e.pressure = touch.force || 0.5;
|
||||
e.isPrimary = isPrimaryPointer(touch);
|
||||
e.pointerType = POINTER_TYPE;
|
||||
|
||||
// forward modifier keys
|
||||
e.altKey = rawEvent.altKey;
|
||||
e.ctrlKey = rawEvent.ctrlKey;
|
||||
e.metaKey = rawEvent.metaKey;
|
||||
e.shiftKey = rawEvent.shiftKey;
|
||||
|
||||
if (rawEvent.preventDefault) {
|
||||
e.preventDefault = function() {
|
||||
rawEvent.preventDefault();
|
||||
};
|
||||
}
|
||||
|
||||
return e;
|
||||
}
|
||||
|
||||
function typeToButtons(type) {
|
||||
let ret = 0;
|
||||
if (type === 'touchstart' || type === 'touchmove' || type === 'pointerdown' || type === 'pointermove') {
|
||||
ret = 1;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
let firstPointer = null;
|
||||
|
||||
function isPrimaryPointer(touch) {
|
||||
return firstPointer === touch.identifier;
|
||||
}
|
||||
|
||||
function setPrimaryPointer(touch) {
|
||||
if (firstPointer === null) {
|
||||
firstPointer = touch.identifier;
|
||||
}
|
||||
}
|
||||
|
||||
function removePrimaryPointer(touch) {
|
||||
if (firstPointer === touch.identifier) {
|
||||
firstPointer = null;
|
||||
}
|
||||
}
|
||||
|
||||
function eventHandlerFactory(type) {
|
||||
return (rawEvent) => {
|
||||
|
||||
const changedTouches = rawEvent.changedTouches;
|
||||
|
||||
for (let i = 0; i < changedTouches.length; i++) {
|
||||
const touch = changedTouches[i];
|
||||
|
||||
if (i === 0 && type === 'pointerdown') {
|
||||
setPrimaryPointer(touch);
|
||||
} else if (type === 'pointerup' || type === 'pointercancel') {
|
||||
removePrimaryPointer(touch);
|
||||
}
|
||||
|
||||
const event = touchToPointer(type, touch, rawEvent);
|
||||
document.dispatchEvent(event);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (swan.onTouchStart) {
|
||||
swan.onTouchStart(eventHandlerFactory('pointerdown'))
|
||||
swan.onTouchMove(eventHandlerFactory('pointermove'))
|
||||
swan.onTouchEnd(eventHandlerFactory('pointerup'))
|
||||
swan.onTouchCancel(eventHandlerFactory('pointercancel'))
|
||||
}
|
36
adapters/platforms/baidu/wrapper/builtin/EventIniter/TouchEvent.js
Executable file
36
adapters/platforms/baidu/wrapper/builtin/EventIniter/TouchEvent.js
Executable file
@@ -0,0 +1,36 @@
|
||||
/* eslint-disable */
|
||||
import { noop } from '../util/index.js'
|
||||
import Event from '../Event'
|
||||
|
||||
export default class TouchEvent extends Event {
|
||||
|
||||
constructor(type) {
|
||||
super(type)
|
||||
|
||||
this.touches = []
|
||||
this.targetTouches = []
|
||||
this.changedTouches = []
|
||||
|
||||
this.target = window.canvas
|
||||
this.currentTarget = window.canvas
|
||||
}
|
||||
}
|
||||
|
||||
function eventHandlerFactory(type) {
|
||||
return (rawEvent) => {
|
||||
const event = new TouchEvent(type)
|
||||
|
||||
event.changedTouches = rawEvent.changedTouches
|
||||
event.touches = rawEvent.touches
|
||||
event.targetTouches = Array.prototype.slice.call(rawEvent.touches)
|
||||
event.timeStamp = rawEvent.timeStamp
|
||||
|
||||
document.dispatchEvent(event)
|
||||
}
|
||||
}
|
||||
if (swan.onTouchStart) {
|
||||
swan.onTouchStart(eventHandlerFactory('touchstart'))
|
||||
swan.onTouchMove(eventHandlerFactory('touchmove'))
|
||||
swan.onTouchEnd(eventHandlerFactory('touchend'))
|
||||
swan.onTouchCancel(eventHandlerFactory('touchcancel'))
|
||||
}
|
4
adapters/platforms/baidu/wrapper/builtin/EventIniter/index.js
Executable file
4
adapters/platforms/baidu/wrapper/builtin/EventIniter/index.js
Executable file
@@ -0,0 +1,4 @@
|
||||
/* eslint-disable */
|
||||
export { default as TouchEvent } from './TouchEvent'
|
||||
export { default as PointerEvent } from './PointerEvent'
|
||||
export { default as MouseEvent } from './MouseEvent'
|
58
adapters/platforms/baidu/wrapper/builtin/EventTarget.js
Normal file
58
adapters/platforms/baidu/wrapper/builtin/EventTarget.js
Normal file
@@ -0,0 +1,58 @@
|
||||
/* eslint-disable */
|
||||
const _events = new WeakMap()
|
||||
|
||||
export default class EventTarget {
|
||||
constructor() {
|
||||
_events.set(this, {})
|
||||
}
|
||||
|
||||
addEventListener(type, listener, options = {}) {
|
||||
let events = _events.get(this)
|
||||
|
||||
if (!events) {
|
||||
events = {}
|
||||
_events.set(this, events)
|
||||
}
|
||||
if (!events[type]) {
|
||||
events[type] = []
|
||||
}
|
||||
events[type].push(listener)
|
||||
|
||||
if (options.capture) {
|
||||
// console.warn('EventTarget.addEventListener: options.capture is not implemented.')
|
||||
}
|
||||
if (options.once) {
|
||||
// console.warn('EventTarget.addEventListener: options.once is not implemented.')
|
||||
}
|
||||
if (options.passive) {
|
||||
// console.warn('EventTarget.addEventListener: options.passive is not implemented.')
|
||||
}
|
||||
}
|
||||
|
||||
removeEventListener(type, listener, options = {}) {
|
||||
const events = _events.get(this)
|
||||
|
||||
if (events) {
|
||||
const listeners = events[type]
|
||||
|
||||
if (listeners && listeners.length > 0) {
|
||||
for (let i = listeners.length; i--; i > 0) {
|
||||
if (listeners[i] === listener) {
|
||||
listeners.splice(i, 1)
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dispatchEvent(event = {}) {
|
||||
const listeners = _events.get(this)[event.type]
|
||||
|
||||
if (listeners) {
|
||||
for (let i = 0; i < listeners.length; i++) {
|
||||
listeners[i](event)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
7
adapters/platforms/baidu/wrapper/builtin/FileReader.js
Normal file
7
adapters/platforms/baidu/wrapper/builtin/FileReader.js
Normal file
@@ -0,0 +1,7 @@
|
||||
/* eslint-disable */
|
||||
/*
|
||||
* TODO 使用 swan.readFile 来封装 FileReader
|
||||
*/
|
||||
export default class FileReader {
|
||||
construct() {}
|
||||
}
|
@@ -0,0 +1,8 @@
|
||||
/* eslint-disable */
|
||||
import HTMLMediaElement from './HTMLMediaElement'
|
||||
|
||||
export default class HTMLAudioElement extends HTMLMediaElement {
|
||||
constructor() {
|
||||
super('audio')
|
||||
}
|
||||
}
|
@@ -0,0 +1,21 @@
|
||||
/* eslint-disable */
|
||||
// import HTMLElement from './HTMLElement';
|
||||
|
||||
// export default class HTMLCanvasElement extends HTMLElement
|
||||
// {
|
||||
// constructor(){
|
||||
// super('canvas')
|
||||
// }
|
||||
// };
|
||||
|
||||
import Canvas from './Canvas'
|
||||
import HTMLElement from './HTMLElement'
|
||||
|
||||
GameGlobal.screencanvas = GameGlobal.screencanvas || new Canvas();
|
||||
const canvas = GameGlobal.screencanvas;
|
||||
|
||||
const canvasConstructor = canvas.constructor;
|
||||
|
||||
// canvasConstructor.__proto__.__proto__ = new HTMLElement();
|
||||
|
||||
export default canvasConstructor;
|
33
adapters/platforms/baidu/wrapper/builtin/HTMLElement.js
Normal file
33
adapters/platforms/baidu/wrapper/builtin/HTMLElement.js
Normal file
@@ -0,0 +1,33 @@
|
||||
/* eslint-disable */
|
||||
import { noop } from './util/index.js'
|
||||
import * as Mixin from './util/mixin'
|
||||
import Element from './Element'
|
||||
|
||||
export default class HTMLElement extends Element {
|
||||
|
||||
constructor(tagName = '', level) {
|
||||
super()
|
||||
|
||||
this.className = ''
|
||||
this.childern = []
|
||||
|
||||
this.focus = noop
|
||||
this.blur = noop
|
||||
|
||||
this.insertBefore = noop
|
||||
this.appendChild = noop
|
||||
this.removeChild = noop
|
||||
this.remove = noop
|
||||
|
||||
this.innerHTML = ''
|
||||
|
||||
this.tagName = tagName.toUpperCase()
|
||||
|
||||
Mixin.parentNode(this, level);
|
||||
Mixin.style(this);
|
||||
Mixin.classList(this);
|
||||
Mixin.clientRegion(this);
|
||||
Mixin.offsetRegion(this);
|
||||
Mixin.scrollRegion(this);
|
||||
}
|
||||
}
|
17
adapters/platforms/baidu/wrapper/builtin/HTMLImageElement.js
Normal file
17
adapters/platforms/baidu/wrapper/builtin/HTMLImageElement.js
Normal file
@@ -0,0 +1,17 @@
|
||||
/* eslint-disable */
|
||||
// import HTMLElement from './HTMLElement';
|
||||
|
||||
// export default class HTMLImageElement extends HTMLElement
|
||||
// {
|
||||
// constructor(){
|
||||
// super('img')
|
||||
// }
|
||||
// };
|
||||
|
||||
import HTMLElement from './HTMLElement'
|
||||
|
||||
const imageConstructor = swan.createImage().constructor;
|
||||
|
||||
// imageConstructor.__proto__.__proto__ = new HTMLElement();
|
||||
|
||||
export default imageConstructor;
|
20
adapters/platforms/baidu/wrapper/builtin/HTMLMediaElement.js
Normal file
20
adapters/platforms/baidu/wrapper/builtin/HTMLMediaElement.js
Normal file
@@ -0,0 +1,20 @@
|
||||
/* eslint-disable */
|
||||
import HTMLElement from './HTMLElement'
|
||||
|
||||
export default class HTMLMediaElement extends HTMLElement {
|
||||
constructor(tagName) {
|
||||
super(tagName)
|
||||
}
|
||||
|
||||
addTextTrack() {}
|
||||
|
||||
captureStream() {}
|
||||
|
||||
fastSeek() {}
|
||||
|
||||
load() {}
|
||||
|
||||
pause() {}
|
||||
|
||||
play() {}
|
||||
}
|
@@ -0,0 +1,9 @@
|
||||
/* eslint-disable */
|
||||
import HTMLMediaElement from './HTMLMediaElement';
|
||||
|
||||
export default class HTMLVideoElement extends HTMLMediaElement
|
||||
{
|
||||
constructor(){
|
||||
super('video')
|
||||
}
|
||||
};
|
18
adapters/platforms/baidu/wrapper/builtin/Image.js
Normal file
18
adapters/platforms/baidu/wrapper/builtin/Image.js
Normal file
@@ -0,0 +1,18 @@
|
||||
/* eslint-disable */
|
||||
import * as Mixin from './util/mixin'
|
||||
import HTMLImageElement from './HTMLImageElement'
|
||||
|
||||
export default function() {
|
||||
const image = swan.createImage();
|
||||
|
||||
// image.__proto__.__proto__.__proto__ = new HTMLImageElement();
|
||||
|
||||
if (!('tagName' in image)) {
|
||||
image.tagName = 'IMG'
|
||||
}
|
||||
|
||||
Mixin.parentNode(image);
|
||||
Mixin.classList(image);
|
||||
|
||||
return image;
|
||||
};
|
6
adapters/platforms/baidu/wrapper/builtin/ImageBitmap.js
Normal file
6
adapters/platforms/baidu/wrapper/builtin/ImageBitmap.js
Normal file
@@ -0,0 +1,6 @@
|
||||
/* eslint-disable */
|
||||
export default class ImageBitmap {
|
||||
constructor() {
|
||||
// TODO
|
||||
}
|
||||
}
|
34
adapters/platforms/baidu/wrapper/builtin/Node.js
Executable file
34
adapters/platforms/baidu/wrapper/builtin/Node.js
Executable file
@@ -0,0 +1,34 @@
|
||||
/* eslint-disable */
|
||||
import EventTarget from './EventTarget.js'
|
||||
|
||||
export default class Node extends EventTarget {
|
||||
constructor() {
|
||||
super()
|
||||
this.childNodes = []
|
||||
}
|
||||
|
||||
appendChild(node) {
|
||||
this.childNodes.push(node)
|
||||
// if (node instanceof Node) {
|
||||
// this.childNodes.push(node)
|
||||
// } else {
|
||||
// throw new TypeError('Failed to executed \'appendChild\' on \'Node\': parameter 1 is not of type \'Node\'.')
|
||||
// }
|
||||
}
|
||||
|
||||
cloneNode() {
|
||||
const copyNode = Object.create(this)
|
||||
|
||||
Object.assign(copyNode, this)
|
||||
return copyNode
|
||||
}
|
||||
|
||||
removeChild(node) {
|
||||
const index = this.childNodes.findIndex((child) => child === node)
|
||||
|
||||
if (index > -1) {
|
||||
return this.childNodes.splice(index, 1)
|
||||
}
|
||||
return null
|
||||
}
|
||||
}
|
@@ -0,0 +1,6 @@
|
||||
/* eslint-disable */
|
||||
export default class WebGLRenderingContext {
|
||||
constructor() {
|
||||
// TODO
|
||||
}
|
||||
}
|
87
adapters/platforms/baidu/wrapper/builtin/WebSocket.js
Executable file
87
adapters/platforms/baidu/wrapper/builtin/WebSocket.js
Executable file
@@ -0,0 +1,87 @@
|
||||
/* eslint-disable */
|
||||
const _socketTask = new WeakMap()
|
||||
|
||||
export default class WebSocket {
|
||||
constructor(url, protocols = []) {
|
||||
this.binaryType = '' // TODO 更新 binaryType
|
||||
this.bufferedAmount = 0 // TODO 更新 bufferedAmount
|
||||
this.extensions = ''
|
||||
|
||||
this.onclose = null
|
||||
this.onerror = null
|
||||
this.onmessage = null
|
||||
this.onopen = null
|
||||
|
||||
this.protocol = '' // TODO 小程序内目前获取不到,实际上需要根据服务器选择的 sub-protocol 返回
|
||||
this.readyState = 3
|
||||
|
||||
if (typeof url !== 'string' || !(/(^ws:\/\/)|(^wss:\/\/)/).test(url)) {
|
||||
throw new TypeError(`Failed to construct 'WebSocket': The URL '${url}' is invalid`)
|
||||
}
|
||||
|
||||
this.url = url
|
||||
this.readyState = WebSocket.CONNECTING
|
||||
|
||||
const socketTask = swan.connectSocket({
|
||||
url,
|
||||
protocols: Array.isArray(protocols) ? protocols : [protocols]
|
||||
})
|
||||
|
||||
_socketTask.set(this, socketTask)
|
||||
|
||||
socketTask.onClose((res) => {
|
||||
this.readyState = WebSocket.CLOSED
|
||||
if (typeof this.onclose === 'function') {
|
||||
this.onclose(res)
|
||||
}
|
||||
})
|
||||
|
||||
socketTask.onMessage((res) => {
|
||||
if (typeof this.onmessage === 'function') {
|
||||
this.onmessage(res)
|
||||
}
|
||||
})
|
||||
|
||||
socketTask.onOpen(() => {
|
||||
this.readyState = WebSocket.OPEN
|
||||
if (typeof this.onopen === 'function') {
|
||||
this.onopen()
|
||||
}
|
||||
})
|
||||
|
||||
socketTask.onError((res) => {
|
||||
if (typeof this.onerror === 'function') {
|
||||
this.onerror(new Error(res.errMsg))
|
||||
}
|
||||
})
|
||||
|
||||
return this
|
||||
}
|
||||
|
||||
close(code, reason) {
|
||||
this.readyState = WebSocket.CLOSING
|
||||
const socketTask = _socketTask.get(this)
|
||||
|
||||
socketTask.close({
|
||||
code,
|
||||
reason
|
||||
})
|
||||
}
|
||||
|
||||
send(data) {
|
||||
if (typeof data !== 'string' && !(data instanceof ArrayBuffer)) {
|
||||
throw new TypeError(`Failed to send message: The data ${data} is invalid`)
|
||||
}
|
||||
|
||||
const socketTask = _socketTask.get(this)
|
||||
|
||||
socketTask.send({
|
||||
data
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
WebSocket.CONNECTING = 0 // The connection is not yet open.
|
||||
WebSocket.OPEN = 1 // The connection is open and ready to communicate.
|
||||
WebSocket.CLOSING = 2 // The connection is in the process of closing.
|
||||
WebSocket.CLOSED = 3 // The connection is closed or couldn't be opened.
|
23
adapters/platforms/baidu/wrapper/builtin/WindowProperties.js
Executable file
23
adapters/platforms/baidu/wrapper/builtin/WindowProperties.js
Executable file
@@ -0,0 +1,23 @@
|
||||
/* eslint-disable */
|
||||
const { screenWidth, screenHeight, devicePixelRatio } = swan.getSystemInfoSync
|
||||
? swan.getSystemInfoSync()
|
||||
: { screenWidth: 0, screenHeight: 0, devicePixelRatio: 1} // Mock data
|
||||
|
||||
export const innerWidth = screenWidth
|
||||
export const innerHeight = screenHeight
|
||||
export { devicePixelRatio }
|
||||
export const screen = {
|
||||
width: screenWidth,
|
||||
height: screenHeight,
|
||||
availWidth: innerWidth,
|
||||
availHeight: innerHeight,
|
||||
availLeft: 0,
|
||||
availTop: 0,
|
||||
}
|
||||
export const scrollX = 0
|
||||
export const scrollY = 0
|
||||
export const ontouchstart = null
|
||||
export const ontouchmove = null
|
||||
export const ontouchend = null
|
||||
|
||||
export { default as performance } from './performance'
|
44
adapters/platforms/baidu/wrapper/builtin/Worker.js
Normal file
44
adapters/platforms/baidu/wrapper/builtin/Worker.js
Normal file
@@ -0,0 +1,44 @@
|
||||
/* eslint-disable */
|
||||
export default class Worker {
|
||||
|
||||
constructor(file) {
|
||||
this.onmessage = null
|
||||
|
||||
// 目前 微信小游戏中 Worker 最大并发数量限制为 1 个,
|
||||
// 所以创建新Worker前, 需要结束现有的 Worker.terminate
|
||||
if (Worker.previousWorker) {
|
||||
Worker.previousWorker.terminate()
|
||||
}
|
||||
Worker.previousWorker = this
|
||||
|
||||
this._file = file
|
||||
|
||||
this._worker = swan.createWorker(file)
|
||||
|
||||
this._worker.onMessage((res) => {
|
||||
if (this.onmessage) {
|
||||
this.onmessage({
|
||||
target: this,
|
||||
data: res,
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
postMessage(message, transferList) {
|
||||
this._worker.postMessage(message, transferList)
|
||||
}
|
||||
|
||||
terminate() {
|
||||
this._worker.terminate()
|
||||
Worker.previousWorker = null
|
||||
}
|
||||
}
|
||||
|
||||
Worker.previousWorker = null
|
||||
|
||||
// export default function(file) {
|
||||
// const worker = swan.createWorker(file)
|
||||
|
||||
// return worker
|
||||
// }
|
229
adapters/platforms/baidu/wrapper/builtin/XMLHttpRequest.js
Executable file
229
adapters/platforms/baidu/wrapper/builtin/XMLHttpRequest.js
Executable file
@@ -0,0 +1,229 @@
|
||||
/* eslint-disable */
|
||||
import EventTarget from './EventTarget.js'
|
||||
|
||||
const _url = new WeakMap()
|
||||
const _method = new WeakMap()
|
||||
const _requestHeader = new WeakMap()
|
||||
const _responseHeader = new WeakMap()
|
||||
const _requestTask = new WeakMap()
|
||||
|
||||
let fs;
|
||||
|
||||
function _triggerEvent(type, event = {}) {
|
||||
event.target = event.target || this
|
||||
|
||||
if (typeof this[`on${type}`] === 'function') {
|
||||
this[`on${type}`].call(this, event)
|
||||
}
|
||||
}
|
||||
|
||||
function _changeReadyState(readyState, event = {}) {
|
||||
this.readyState = readyState
|
||||
|
||||
event.readyState = readyState;
|
||||
|
||||
_triggerEvent.call(this, 'readystatechange', event)
|
||||
}
|
||||
|
||||
function _isRelativePath(url) {
|
||||
return !(/^(http|https|ftp|wxfile):\/\/.*/i.test(url));
|
||||
}
|
||||
|
||||
export default class XMLHttpRequest extends EventTarget {
|
||||
|
||||
constructor() {
|
||||
super();
|
||||
|
||||
/*
|
||||
* TODO 这一批事件应该是在 XMLHttpRequestEventTarget.prototype 上面的
|
||||
*/
|
||||
this.onabort = null
|
||||
this.onerror = null
|
||||
this.onload = null
|
||||
this.onloadstart = null
|
||||
this.onprogress = null
|
||||
this.ontimeout = null
|
||||
this.onloadend = null
|
||||
|
||||
this.onreadystatechange = null
|
||||
this.readyState = 0
|
||||
this.response = null
|
||||
this.responseText = null
|
||||
this.responseType = ''
|
||||
this.responseXML = null
|
||||
this.status = 0
|
||||
this.statusText = ''
|
||||
this.upload = {}
|
||||
this.withCredentials = false
|
||||
|
||||
_requestHeader.set(this, {
|
||||
'content-type': 'application/x-www-form-urlencoded'
|
||||
})
|
||||
_responseHeader.set(this, {})
|
||||
}
|
||||
|
||||
abort() {
|
||||
const myRequestTask = _requestTask.get(this)
|
||||
|
||||
if (myRequestTask) {
|
||||
myRequestTask.abort()
|
||||
}
|
||||
}
|
||||
|
||||
getAllResponseHeaders() {
|
||||
const responseHeader = _responseHeader.get(this)
|
||||
|
||||
return Object.keys(responseHeader).map((header) => {
|
||||
return `${header}: ${responseHeader[header]}`
|
||||
}).join('\n')
|
||||
}
|
||||
|
||||
getResponseHeader(header) {
|
||||
return _responseHeader.get(this)[header]
|
||||
}
|
||||
|
||||
open(method, url /* async, user, password 这几个参数在小程序内不支持*/ ) {
|
||||
_method.set(this, method)
|
||||
_url.set(this, url)
|
||||
_changeReadyState.call(this, XMLHttpRequest.OPENED)
|
||||
}
|
||||
|
||||
overrideMimeType() {}
|
||||
|
||||
send(data = '') {
|
||||
if (this.readyState !== XMLHttpRequest.OPENED) {
|
||||
throw new Error("Failed to execute 'send' on 'XMLHttpRequest': The object's state must be OPENED.")
|
||||
} else {
|
||||
const url = _url.get(this)
|
||||
const header = _requestHeader.get(this)
|
||||
const responseType = this.responseType
|
||||
|
||||
const relative = _isRelativePath(url)
|
||||
let encoding;
|
||||
|
||||
if (responseType === 'arraybuffer') {
|
||||
// encoding = 'binary'
|
||||
} else {
|
||||
encoding = 'utf8'
|
||||
}
|
||||
|
||||
delete this.response;
|
||||
this.response = null;
|
||||
|
||||
const onSuccess = ({ data, statusCode, header }) => {
|
||||
statusCode = statusCode === undefined ? 200 : statusCode;
|
||||
if (typeof data !== 'string' && !(data instanceof ArrayBuffer)) {
|
||||
try {
|
||||
data = JSON.stringify(data)
|
||||
} catch (e) {
|
||||
data = data
|
||||
}
|
||||
}
|
||||
|
||||
this.status = statusCode
|
||||
if (header) {
|
||||
_responseHeader.set(this, header)
|
||||
}
|
||||
_triggerEvent.call(this, 'loadstart')
|
||||
_changeReadyState.call(this, XMLHttpRequest.HEADERS_RECEIVED)
|
||||
_changeReadyState.call(this, XMLHttpRequest.LOADING)
|
||||
|
||||
this.response = data
|
||||
|
||||
if (data instanceof ArrayBuffer) {
|
||||
Object.defineProperty(this, 'responseText', {
|
||||
enumerable: true,
|
||||
configurable: true,
|
||||
get: function() {
|
||||
throw "InvalidStateError : responseType is " + this.responseType;
|
||||
}
|
||||
});
|
||||
} else {
|
||||
Object.defineProperty(this, 'responseText', {
|
||||
enumerable: true,
|
||||
configurable: true,
|
||||
value: data
|
||||
});
|
||||
}
|
||||
_changeReadyState.call(this, XMLHttpRequest.DONE)
|
||||
_triggerEvent.call(this, 'load')
|
||||
_triggerEvent.call(this, 'loadend')
|
||||
}
|
||||
|
||||
const onFail = ({ errMsg }) => {
|
||||
// TODO 规范错误
|
||||
|
||||
if (errMsg.indexOf('abort') !== -1) {
|
||||
_triggerEvent.call(this, 'abort')
|
||||
} else {
|
||||
_triggerEvent.call(this, 'error', {
|
||||
message: errMsg
|
||||
})
|
||||
}
|
||||
_triggerEvent.call(this, 'loadend')
|
||||
|
||||
if (relative) {
|
||||
// 用户即使没监听error事件, 也给出相应的警告
|
||||
console.warn(errMsg)
|
||||
}
|
||||
}
|
||||
|
||||
if (relative) {
|
||||
var options = {
|
||||
'filePath': url,
|
||||
'success': onSuccess,
|
||||
'fail': onFail
|
||||
}
|
||||
if (encoding) {
|
||||
options['encoding'] = encoding;
|
||||
}
|
||||
if (!fs) {
|
||||
fs = swan.getFileSystemManager();
|
||||
}
|
||||
fs.readFile(options)
|
||||
return
|
||||
}
|
||||
|
||||
swan.request({
|
||||
data,
|
||||
url: url,
|
||||
method: _method.get(this),
|
||||
header: header,
|
||||
responseType: responseType,
|
||||
success: onSuccess,
|
||||
fail: onFail
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
setRequestHeader(header, value) {
|
||||
const myHeader = _requestHeader.get(this)
|
||||
|
||||
myHeader[header] = value
|
||||
_requestHeader.set(this, myHeader)
|
||||
}
|
||||
|
||||
addEventListener(type, listener) {
|
||||
if (typeof listener !== 'function') {
|
||||
return;
|
||||
}
|
||||
|
||||
this['on' + type] = (event = {}) => {
|
||||
event.target = event.target || this
|
||||
listener.call(this, event)
|
||||
}
|
||||
}
|
||||
|
||||
removeEventListener(type, listener) {
|
||||
if (this['on' + type] === listener) {
|
||||
this['on' + type] = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// TODO 没法模拟 HEADERS_RECEIVED 和 LOADING 两个状态
|
||||
XMLHttpRequest.UNSEND = 0
|
||||
XMLHttpRequest.OPENED = 1
|
||||
XMLHttpRequest.HEADERS_RECEIVED = 2
|
||||
XMLHttpRequest.LOADING = 3
|
||||
XMLHttpRequest.DONE = 4
|
185
adapters/platforms/baidu/wrapper/builtin/document.js
Normal file
185
adapters/platforms/baidu/wrapper/builtin/document.js
Normal file
@@ -0,0 +1,185 @@
|
||||
/* eslint-disable */
|
||||
import * as window from './window'
|
||||
import Event from './Event'
|
||||
import HTMLElement from './HTMLElement'
|
||||
import HTMLVideoElement from './HTMLVideoElement'
|
||||
import Image from './Image'
|
||||
import Audio from './Audio'
|
||||
import Canvas from './Canvas'
|
||||
import DocumentElement from './DocumentElement'
|
||||
import Body from './Body'
|
||||
import './EventIniter/index.js'
|
||||
import location from './location';
|
||||
|
||||
const events = {}
|
||||
|
||||
const document = {
|
||||
readyState: 'complete',
|
||||
visibilityState: 'visible', // 'visible' , 'hidden'
|
||||
hidden: false,
|
||||
fullscreen: true,
|
||||
|
||||
URL: location.href,
|
||||
|
||||
location: window.location,
|
||||
|
||||
scripts: [],
|
||||
style: {},
|
||||
|
||||
ontouchstart: null,
|
||||
ontouchmove: null,
|
||||
ontouchend: null,
|
||||
onvisibilitychange: null,
|
||||
|
||||
parentNode: null,
|
||||
parentElement: null,
|
||||
|
||||
createElement(tagName) {
|
||||
tagName = tagName.toLowerCase();
|
||||
if (tagName === 'canvas') {
|
||||
return new Canvas()
|
||||
} else if (tagName === 'audio') {
|
||||
return new Audio()
|
||||
} else if (tagName === 'img') {
|
||||
return new Image()
|
||||
} else if (tagName === 'video') {
|
||||
return new HTMLVideoElement()
|
||||
}
|
||||
|
||||
return new HTMLElement(tagName)
|
||||
},
|
||||
|
||||
createElementNS(nameSpace, tagName) {
|
||||
return this.createElement(tagName);
|
||||
},
|
||||
|
||||
createTextNode(text) {
|
||||
// TODO: Do we need the TextNode Class ???
|
||||
return text;
|
||||
},
|
||||
|
||||
getElementById(id) {
|
||||
if (id === window.canvas.id) {
|
||||
return window.canvas
|
||||
}
|
||||
return null
|
||||
},
|
||||
|
||||
getElementsByTagName(tagName) {
|
||||
tagName = tagName.toLowerCase();
|
||||
if (tagName === 'head') {
|
||||
return [document.head]
|
||||
} else if (tagName === 'body') {
|
||||
return [document.body]
|
||||
} else if (tagName === 'canvas') {
|
||||
return [window.canvas]
|
||||
}
|
||||
return []
|
||||
},
|
||||
|
||||
getElementsByTagNameNS(nameSpace, tagName) {
|
||||
return this.getElementsByTagName(tagName);
|
||||
},
|
||||
|
||||
getElementsByName(tagName) {
|
||||
if (tagName === 'head') {
|
||||
return [document.head]
|
||||
} else if (tagName === 'body') {
|
||||
return [document.body]
|
||||
} else if (tagName === 'canvas') {
|
||||
return [window.canvas]
|
||||
}
|
||||
return []
|
||||
},
|
||||
|
||||
querySelector(query) {
|
||||
if (query === 'head') {
|
||||
return document.head
|
||||
} else if (query === 'body') {
|
||||
return document.body
|
||||
} else if (query === 'canvas') {
|
||||
return window.canvas
|
||||
} else if (query === `#${window.canvas.id}`) {
|
||||
return window.canvas
|
||||
}
|
||||
return null
|
||||
},
|
||||
|
||||
querySelectorAll(query) {
|
||||
if (query === 'head') {
|
||||
return [document.head]
|
||||
} else if (query === 'body') {
|
||||
return [document.body]
|
||||
} else if (query === 'canvas') {
|
||||
return [window.canvas]
|
||||
}
|
||||
return []
|
||||
},
|
||||
|
||||
addEventListener(type, listener) {
|
||||
if (!events[type]) {
|
||||
events[type] = []
|
||||
}
|
||||
events[type].push(listener)
|
||||
},
|
||||
|
||||
removeEventListener(type, listener) {
|
||||
const listeners = events[type]
|
||||
|
||||
if (listeners && listeners.length > 0) {
|
||||
for (let i = listeners.length; i--; i > 0) {
|
||||
if (listeners[i] === listener) {
|
||||
listeners.splice(i, 1)
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
dispatchEvent(event) {
|
||||
const type = event.type;
|
||||
const listeners = events[type]
|
||||
|
||||
if (listeners) {
|
||||
for (let i = 0; i < listeners.length; i++) {
|
||||
listeners[i](event)
|
||||
}
|
||||
}
|
||||
|
||||
if (event.target && typeof event.target['on' + type] === 'function') {
|
||||
event.target['on' + type](event)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
document.documentElement = new DocumentElement()
|
||||
document.head = new HTMLElement('head')
|
||||
document.body = new Body()
|
||||
|
||||
function onVisibilityChange(visible) {
|
||||
|
||||
return function() {
|
||||
|
||||
document.visibilityState = visible ? 'visible' : 'hidden';
|
||||
|
||||
const hidden = !visible;
|
||||
if (document.hidden === hidden) {
|
||||
return;
|
||||
}
|
||||
document.hidden = hidden;
|
||||
|
||||
const event = new Event('visibilitychange');
|
||||
|
||||
event.target = document;
|
||||
event.timeStamp = Date.now();
|
||||
|
||||
document.dispatchEvent(event);
|
||||
}
|
||||
}
|
||||
|
||||
if (swan.onHide) {
|
||||
swan.onHide(onVisibilityChange(false));
|
||||
swan.onShow(onVisibilityChange(true));
|
||||
}
|
||||
|
||||
export default document
|
69
adapters/platforms/baidu/wrapper/builtin/index.js
Normal file
69
adapters/platforms/baidu/wrapper/builtin/index.js
Normal file
@@ -0,0 +1,69 @@
|
||||
/* eslint-disable */
|
||||
import * as _$window from './window'
|
||||
import document from './document'
|
||||
import isDevtool from './util/isDevtool';
|
||||
import HTMLElement from './HTMLElement'
|
||||
|
||||
// Avoid being static analyzed in webpack
|
||||
const _window = _$window
|
||||
|
||||
const global = GameGlobal
|
||||
|
||||
GameGlobal.global = GameGlobal.global || global
|
||||
|
||||
function inject() {
|
||||
_window.document = document;
|
||||
|
||||
_window.addEventListener = (type, listener) => {
|
||||
_window.document.addEventListener(type, listener)
|
||||
}
|
||||
_window.removeEventListener = (type, listener) => {
|
||||
_window.document.removeEventListener(type, listener)
|
||||
}
|
||||
_window.dispatchEvent = _window.document.dispatchEvent;
|
||||
|
||||
if (isDevtool()) {
|
||||
for (const key in _window) {
|
||||
const descriptor = Object.getOwnPropertyDescriptor(global, key)
|
||||
|
||||
if (!descriptor || descriptor.configurable === true) {
|
||||
Object.defineProperty(window, key, {
|
||||
value: _window[key]
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
for (const key in _window.document) {
|
||||
const descriptor = Object.getOwnPropertyDescriptor(global.document, key)
|
||||
|
||||
if (!descriptor || descriptor.configurable === true) {
|
||||
Object.defineProperty(global.document, key, {
|
||||
value: _window.document[key]
|
||||
})
|
||||
}
|
||||
}
|
||||
window.parent = window
|
||||
} else {
|
||||
for (const key in _window) {
|
||||
global[key] = _window[key]
|
||||
}
|
||||
global.window = global
|
||||
global.top = global.parent = global
|
||||
}
|
||||
}
|
||||
|
||||
if (swan.getSharedCanvas) {
|
||||
const sharedCanvas = swan.getSharedCanvas();
|
||||
// sharedCanvas.__proto__.__proto__ = new HTMLCanvasElement;
|
||||
if (!_window.sharedCanvas) {
|
||||
// 兼容微信
|
||||
_window.sharedCanvas = sharedCanvas;
|
||||
}
|
||||
sharedCanvas.addEventListener = _window.addEventListener;
|
||||
sharedCanvas.removeEventListener = _window.removeEventListener;
|
||||
}
|
||||
|
||||
if (!GameGlobal.__isAdapterInjected) {
|
||||
GameGlobal.__isAdapterInjected = true
|
||||
inject()
|
||||
}
|
32
adapters/platforms/baidu/wrapper/builtin/localStorage.js
Executable file
32
adapters/platforms/baidu/wrapper/builtin/localStorage.js
Executable file
@@ -0,0 +1,32 @@
|
||||
/* eslint-disable */
|
||||
const localStorage = {
|
||||
get length() {
|
||||
const { keys } = swan.getStorageInfoSync()
|
||||
return keys.length
|
||||
},
|
||||
|
||||
key(n) {
|
||||
const { keys } = swan.getStorageInfoSync()
|
||||
|
||||
return keys[n]
|
||||
},
|
||||
|
||||
getItem(key) {
|
||||
const value = swan.getStorageSync(key);
|
||||
return value === "" ? null : value;
|
||||
},
|
||||
|
||||
setItem(key, value) {
|
||||
return swan.setStorageSync(key, value)
|
||||
},
|
||||
|
||||
removeItem(key) {
|
||||
swan.removeStorageSync(key)
|
||||
},
|
||||
|
||||
clear() {
|
||||
swan.clearStorageSync()
|
||||
}
|
||||
}
|
||||
|
||||
export default localStorage
|
15
adapters/platforms/baidu/wrapper/builtin/location.js
Executable file
15
adapters/platforms/baidu/wrapper/builtin/location.js
Executable file
@@ -0,0 +1,15 @@
|
||||
/* eslint-disable */
|
||||
const location = {
|
||||
href: 'game.js',
|
||||
search: '',
|
||||
hash: '',
|
||||
|
||||
reload() {
|
||||
},
|
||||
|
||||
replace(href) {
|
||||
this.href = href
|
||||
},
|
||||
}
|
||||
|
||||
export default location
|
37
adapters/platforms/baidu/wrapper/builtin/navigator.js
Executable file
37
adapters/platforms/baidu/wrapper/builtin/navigator.js
Executable file
@@ -0,0 +1,37 @@
|
||||
/* eslint-disable */
|
||||
import { noop } from './util/index.js'
|
||||
|
||||
// TODO 开放域下用 userAgent
|
||||
const systemInfo = swan.getSystemInfoSync && swan.getSystemInfoSync()
|
||||
|
||||
const system = (systemInfo && systemInfo.system) || '';
|
||||
const platform = (systemInfo && systemInfo.platform) || '';
|
||||
const language = (systemInfo && systemInfo.language) || '"zh_CN"';
|
||||
|
||||
const android = system.toLowerCase().indexOf('android') !== -1;
|
||||
|
||||
const uaDesc = android ? 'Android; CPU Android 6.0' : 'iPhone; CPU iPhone OS 10_3_1 like Mac OS X';
|
||||
const ua = `Mozilla/5.0 (${uaDesc}) AppleWebKit/603.1.30 (KHTML, like Gecko) Mobile/14E8301 MicroMessenger/6.6.0 SwanGame NetType/WIFI Language/${language}`;
|
||||
|
||||
const navigator = {
|
||||
platform,
|
||||
language: language,
|
||||
appVersion: `5.0 (${uaDesc}) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1`,
|
||||
userAgent: ua,
|
||||
onLine: true, // TODO 用 swan.getNetworkStateChange 和 swan.onNetworkStateChange 来返回真实的状态
|
||||
|
||||
// TODO 用 swan.getLocation 来封装 geolocation
|
||||
geolocation: {
|
||||
getCurrentPosition: noop,
|
||||
watchPosition: noop,
|
||||
clearWatch: noop
|
||||
}
|
||||
}
|
||||
|
||||
if (swan.onNetworkStatusChange) {
|
||||
swan.onNetworkStatusChange(function(event){
|
||||
navigator.onLine = event.isConnected;
|
||||
});
|
||||
}
|
||||
|
||||
export default navigator
|
23
adapters/platforms/baidu/wrapper/builtin/performance.js
Normal file
23
adapters/platforms/baidu/wrapper/builtin/performance.js
Normal file
@@ -0,0 +1,23 @@
|
||||
/* eslint-disable */
|
||||
import isDevtool from './util/isDevtool';
|
||||
|
||||
let performance
|
||||
|
||||
if (swan.getPerformance) {
|
||||
const swanPerf = swan.getPerformance()
|
||||
const initTime = swanPerf.now()
|
||||
|
||||
const clientPerfAdapter = Object.assign({}, swanPerf, {
|
||||
now: function() {
|
||||
return (swanPerf.now() - initTime) / 1000
|
||||
}
|
||||
})
|
||||
|
||||
performance = isDevtool() ? swanPerf : clientPerfAdapter
|
||||
}
|
||||
else {
|
||||
performance = {};
|
||||
performance.now = Date.now;
|
||||
}
|
||||
|
||||
export default performance
|
@@ -0,0 +1,20 @@
|
||||
/* eslint-disable */
|
||||
import CommonComputedStyle from './CommonComputedStyle'
|
||||
|
||||
function getCanvasComputedStyle(canvas) {
|
||||
const rect = canvas.getBoundingClientRect();
|
||||
const style = Object.assign(CommonComputedStyle, {
|
||||
"display": "inline",
|
||||
"position": "static",
|
||||
"inlineSize": rect.width + "px",
|
||||
"perspectiveOrigin": rect.width / 2 + "px " + rect.height / 2 + "px",
|
||||
"transformOrigin": rect.width / 2 + "px " + rect.height / 2 + "px",
|
||||
"webkitLogicalWidth": rect.width + "px",
|
||||
"webkitLogicalHeight": rect.height + "px",
|
||||
"width": rect.width + "px",
|
||||
"height": rect.height + "px",
|
||||
});
|
||||
return style;
|
||||
}
|
||||
|
||||
export default getCanvasComputedStyle;
|
@@ -0,0 +1,593 @@
|
||||
/* eslint-disable */
|
||||
const style = {
|
||||
"0": "animation-delay",
|
||||
"1": "animation-direction",
|
||||
"2": "animation-duration",
|
||||
"3": "animation-fill-mode",
|
||||
"4": "animation-iteration-count",
|
||||
"5": "animation-name",
|
||||
"6": "animation-play-state",
|
||||
"7": "animation-timing-function",
|
||||
"8": "background-attachment",
|
||||
"9": "background-blend-mode",
|
||||
"10": "background-clip",
|
||||
"11": "background-color",
|
||||
"12": "background-image",
|
||||
"13": "background-origin",
|
||||
"14": "background-position",
|
||||
"15": "background-repeat",
|
||||
"16": "background-size",
|
||||
"17": "border-bottom-color",
|
||||
"18": "border-bottom-left-radius",
|
||||
"19": "border-bottom-right-radius",
|
||||
"20": "border-bottom-style",
|
||||
"21": "border-bottom-width",
|
||||
"22": "border-collapse",
|
||||
"23": "border-image-outset",
|
||||
"24": "border-image-repeat",
|
||||
"25": "border-image-slice",
|
||||
"26": "border-image-source",
|
||||
"27": "border-image-width",
|
||||
"28": "border-left-color",
|
||||
"29": "border-left-style",
|
||||
"30": "border-left-width",
|
||||
"31": "border-right-color",
|
||||
"32": "border-right-style",
|
||||
"33": "border-right-width",
|
||||
"34": "border-top-color",
|
||||
"35": "border-top-left-radius",
|
||||
"36": "border-top-right-radius",
|
||||
"37": "border-top-style",
|
||||
"38": "border-top-width",
|
||||
"39": "bottom",
|
||||
"40": "box-shadow",
|
||||
"41": "box-sizing",
|
||||
"42": "break-after",
|
||||
"43": "break-before",
|
||||
"44": "break-inside",
|
||||
"45": "caption-side",
|
||||
"46": "clear",
|
||||
"47": "clip",
|
||||
"48": "color",
|
||||
"49": "content",
|
||||
"50": "cursor",
|
||||
"51": "direction",
|
||||
"52": "display",
|
||||
"53": "empty-cells",
|
||||
"54": "float",
|
||||
"55": "font-family",
|
||||
"56": "font-kerning",
|
||||
"57": "font-size",
|
||||
"58": "font-stretch",
|
||||
"59": "font-style",
|
||||
"60": "font-variant",
|
||||
"61": "font-variant-ligatures",
|
||||
"62": "font-variant-caps",
|
||||
"63": "font-variant-numeric",
|
||||
"64": "font-variant-east-asian",
|
||||
"65": "font-weight",
|
||||
"66": "height",
|
||||
"67": "image-rendering",
|
||||
"68": "isolation",
|
||||
"69": "justify-items",
|
||||
"70": "justify-self",
|
||||
"71": "left",
|
||||
"72": "letter-spacing",
|
||||
"73": "line-height",
|
||||
"74": "list-style-image",
|
||||
"75": "list-style-position",
|
||||
"76": "list-style-type",
|
||||
"77": "margin-bottom",
|
||||
"78": "margin-left",
|
||||
"79": "margin-right",
|
||||
"80": "margin-top",
|
||||
"81": "max-height",
|
||||
"82": "max-width",
|
||||
"83": "min-height",
|
||||
"84": "min-width",
|
||||
"85": "mix-blend-mode",
|
||||
"86": "object-fit",
|
||||
"87": "object-position",
|
||||
"88": "offset-distance",
|
||||
"89": "offset-path",
|
||||
"90": "offset-rotate",
|
||||
"91": "opacity",
|
||||
"92": "orphans",
|
||||
"93": "outline-color",
|
||||
"94": "outline-offset",
|
||||
"95": "outline-style",
|
||||
"96": "outline-width",
|
||||
"97": "overflow-anchor",
|
||||
"98": "overflow-wrap",
|
||||
"99": "overflow-x",
|
||||
"100": "overflow-y",
|
||||
"101": "padding-bottom",
|
||||
"102": "padding-left",
|
||||
"103": "padding-right",
|
||||
"104": "padding-top",
|
||||
"105": "pointer-events",
|
||||
"106": "position",
|
||||
"107": "resize",
|
||||
"108": "right",
|
||||
"109": "scroll-behavior",
|
||||
"110": "speak",
|
||||
"111": "table-layout",
|
||||
"112": "tab-size",
|
||||
"113": "text-align",
|
||||
"114": "text-align-last",
|
||||
"115": "text-decoration",
|
||||
"116": "text-decoration-line",
|
||||
"117": "text-decoration-style",
|
||||
"118": "text-decoration-color",
|
||||
"119": "text-decoration-skip-ink",
|
||||
"120": "text-underline-position",
|
||||
"121": "text-indent",
|
||||
"122": "text-rendering",
|
||||
"123": "text-shadow",
|
||||
"124": "text-size-adjust",
|
||||
"125": "text-overflow",
|
||||
"126": "text-transform",
|
||||
"127": "top",
|
||||
"128": "touch-action",
|
||||
"129": "transition-delay",
|
||||
"130": "transition-duration",
|
||||
"131": "transition-property",
|
||||
"132": "transition-timing-function",
|
||||
"133": "unicode-bidi",
|
||||
"134": "vertical-align",
|
||||
"135": "visibility",
|
||||
"136": "white-space",
|
||||
"137": "widows",
|
||||
"138": "width",
|
||||
"139": "will-change",
|
||||
"140": "word-break",
|
||||
"141": "word-spacing",
|
||||
"142": "word-wrap",
|
||||
"143": "z-index",
|
||||
"144": "zoom",
|
||||
"145": "-webkit-appearance",
|
||||
"146": "backface-visibility",
|
||||
"147": "-webkit-border-horizontal-spacing",
|
||||
"148": "-webkit-border-image",
|
||||
"149": "-webkit-border-vertical-spacing",
|
||||
"150": "-webkit-box-align",
|
||||
"151": "-webkit-box-decoration-break",
|
||||
"152": "-webkit-box-direction",
|
||||
"153": "-webkit-box-flex",
|
||||
"154": "-webkit-box-flex-group",
|
||||
"155": "-webkit-box-lines",
|
||||
"156": "-webkit-box-ordinal-group",
|
||||
"157": "-webkit-box-orient",
|
||||
"158": "-webkit-box-pack",
|
||||
"159": "-webkit-box-reflect",
|
||||
"160": "column-count",
|
||||
"161": "column-gap",
|
||||
"162": "column-rule-color",
|
||||
"163": "column-rule-style",
|
||||
"164": "column-rule-width",
|
||||
"165": "column-span",
|
||||
"166": "column-width",
|
||||
"167": "align-content",
|
||||
"168": "align-items",
|
||||
"169": "align-self",
|
||||
"170": "flex-basis",
|
||||
"171": "flex-grow",
|
||||
"172": "flex-shrink",
|
||||
"173": "flex-direction",
|
||||
"174": "flex-wrap",
|
||||
"175": "justify-content",
|
||||
"176": "-webkit-font-smoothing",
|
||||
"177": "grid-auto-columns",
|
||||
"178": "grid-auto-flow",
|
||||
"179": "grid-auto-rows",
|
||||
"180": "grid-column-end",
|
||||
"181": "grid-column-start",
|
||||
"182": "grid-template-areas",
|
||||
"183": "grid-template-columns",
|
||||
"184": "grid-template-rows",
|
||||
"185": "grid-row-end",
|
||||
"186": "grid-row-start",
|
||||
"187": "grid-column-gap",
|
||||
"188": "grid-row-gap",
|
||||
"189": "-webkit-highlight",
|
||||
"190": "hyphens",
|
||||
"191": "-webkit-hyphenate-character",
|
||||
"192": "-webkit-line-break",
|
||||
"193": "-webkit-line-clamp",
|
||||
"194": "-webkit-locale",
|
||||
"195": "-webkit-margin-before-collapse",
|
||||
"196": "-webkit-margin-after-collapse",
|
||||
"197": "-webkit-mask-box-image",
|
||||
"198": "-webkit-mask-box-image-outset",
|
||||
"199": "-webkit-mask-box-image-repeat",
|
||||
"200": "-webkit-mask-box-image-slice",
|
||||
"201": "-webkit-mask-box-image-source",
|
||||
"202": "-webkit-mask-box-image-width",
|
||||
"203": "-webkit-mask-clip",
|
||||
"204": "-webkit-mask-composite",
|
||||
"205": "-webkit-mask-image",
|
||||
"206": "-webkit-mask-origin",
|
||||
"207": "-webkit-mask-position",
|
||||
"208": "-webkit-mask-repeat",
|
||||
"209": "-webkit-mask-size",
|
||||
"210": "order",
|
||||
"211": "perspective",
|
||||
"212": "perspective-origin",
|
||||
"213": "-webkit-print-color-adjust",
|
||||
"214": "-webkit-rtl-ordering",
|
||||
"215": "shape-outside",
|
||||
"216": "shape-image-threshold",
|
||||
"217": "shape-margin",
|
||||
"218": "-webkit-tap-highlight-color",
|
||||
"219": "-webkit-text-combine",
|
||||
"220": "-webkit-text-decorations-in-effect",
|
||||
"221": "-webkit-text-emphasis-color",
|
||||
"222": "-webkit-text-emphasis-position",
|
||||
"223": "-webkit-text-emphasis-style",
|
||||
"224": "-webkit-text-fill-color",
|
||||
"225": "-webkit-text-orientation",
|
||||
"226": "-webkit-text-security",
|
||||
"227": "-webkit-text-stroke-color",
|
||||
"228": "-webkit-text-stroke-width",
|
||||
"229": "transform",
|
||||
"230": "transform-origin",
|
||||
"231": "transform-style",
|
||||
"232": "-webkit-user-drag",
|
||||
"233": "-webkit-user-modify",
|
||||
"234": "user-select",
|
||||
"235": "-webkit-writing-mode",
|
||||
"236": "-webkit-app-region",
|
||||
"237": "buffered-rendering",
|
||||
"238": "clip-path",
|
||||
"239": "clip-rule",
|
||||
"240": "mask",
|
||||
"241": "filter",
|
||||
"242": "flood-color",
|
||||
"243": "flood-opacity",
|
||||
"244": "lighting-color",
|
||||
"245": "stop-color",
|
||||
"246": "stop-opacity",
|
||||
"247": "color-interpolation",
|
||||
"248": "color-interpolation-filters",
|
||||
"249": "color-rendering",
|
||||
"250": "fill",
|
||||
"251": "fill-opacity",
|
||||
"252": "fill-rule",
|
||||
"253": "marker-end",
|
||||
"254": "marker-mid",
|
||||
"255": "marker-start",
|
||||
"256": "mask-type",
|
||||
"257": "shape-rendering",
|
||||
"258": "stroke",
|
||||
"259": "stroke-dasharray",
|
||||
"260": "stroke-dashoffset",
|
||||
"261": "stroke-linecap",
|
||||
"262": "stroke-linejoin",
|
||||
"263": "stroke-miterlimit",
|
||||
"264": "stroke-opacity",
|
||||
"265": "stroke-width",
|
||||
"266": "alignment-baseline",
|
||||
"267": "baseline-shift",
|
||||
"268": "dominant-baseline",
|
||||
"269": "text-anchor",
|
||||
"270": "writing-mode",
|
||||
"271": "vector-effect",
|
||||
"272": "paint-order",
|
||||
"273": "d",
|
||||
"274": "cx",
|
||||
"275": "cy",
|
||||
"276": "x",
|
||||
"277": "y",
|
||||
"278": "r",
|
||||
"279": "rx",
|
||||
"280": "ry",
|
||||
"281": "caret-color",
|
||||
"282": "line-break",
|
||||
|
||||
"display": "inline",
|
||||
"dominantBaseline": "auto",
|
||||
"emptyCells": "show",
|
||||
"fill": "rgb(0, 0, 0)",
|
||||
"fillOpacity": "1",
|
||||
"fillRule": "nonzero",
|
||||
"filter": "none",
|
||||
"flex": "0 1 auto",
|
||||
"flexBasis": "auto",
|
||||
"flexDirection": "row",
|
||||
"flexFlow": "row nowrap",
|
||||
"flexGrow": "0",
|
||||
"flexShrink": "1",
|
||||
"flexWrap": "nowrap",
|
||||
"float": "none",
|
||||
"floodColor": "rgb(0, 0, 0)",
|
||||
"floodOpacity": "1",
|
||||
"font": "normal normal 400 normal 16px / normal \"PingFang SC\"",
|
||||
"fontDisplay": "",
|
||||
"fontFamily": "\"PingFang SC\"",
|
||||
"fontFeatureSettings": "normal",
|
||||
"fontKerning": "auto",
|
||||
"fontSize": "16px",
|
||||
"fontStretch": "100%",
|
||||
"fontStyle": "normal",
|
||||
"fontVariant": "normal",
|
||||
"fontVariantCaps": "normal",
|
||||
"fontVariantEastAsian": "normal",
|
||||
"fontVariantLigatures": "normal",
|
||||
"fontVariantNumeric": "normal",
|
||||
"fontVariationSettings": "normal",
|
||||
"fontWeight": "400",
|
||||
"grid": "none / none / none / row / auto / auto",
|
||||
"gridArea": "auto / auto / auto / auto",
|
||||
"gridAutoColumns": "auto",
|
||||
"gridAutoFlow": "row",
|
||||
"gridAutoRows": "auto",
|
||||
"gridColumn": "auto / auto",
|
||||
"gridColumnEnd": "auto",
|
||||
"gridColumnGap": "0px",
|
||||
"gridColumnStart": "auto",
|
||||
"gridGap": "0px 0px",
|
||||
"gridRow": "auto / auto",
|
||||
"gridRowEnd": "auto",
|
||||
"gridRowGap": "0px",
|
||||
"gridRowStart": "auto",
|
||||
"gridTemplate": "none / none / none",
|
||||
"gridTemplateAreas": "none",
|
||||
"gridTemplateColumns": "none",
|
||||
"gridTemplateRows": "none",
|
||||
"height": "0px",
|
||||
"hyphens": "manual",
|
||||
"imageRendering": "auto",
|
||||
"inlineSize": "0px",
|
||||
"isolation": "auto",
|
||||
"justifyContent": "normal",
|
||||
"justifyItems": "normal",
|
||||
"justifySelf": "auto",
|
||||
"left": "auto",
|
||||
"letterSpacing": "normal",
|
||||
"lightingColor": "rgb(255, 255, 255)",
|
||||
"lineBreak": "auto",
|
||||
"lineHeight": "normal",
|
||||
"listStyle": "disc outside none",
|
||||
"listStyleImage": "none",
|
||||
"listStylePosition": "outside",
|
||||
"listStyleType": "disc",
|
||||
"margin": "0px",
|
||||
"marginBottom": "0px",
|
||||
"marginLeft": "0px",
|
||||
"marginRight": "0px",
|
||||
"marginTop": "0px",
|
||||
"marker": "",
|
||||
"markerEnd": "none",
|
||||
"markerMid": "none",
|
||||
"markerStart": "none",
|
||||
"mask": "none",
|
||||
"maskType": "luminance",
|
||||
"maxBlockSize": "none",
|
||||
"maxHeight": "none",
|
||||
"maxInlineSize": "none",
|
||||
"maxWidth": "none",
|
||||
"maxZoom": "",
|
||||
"minBlockSize": "0px",
|
||||
"minHeight": "0px",
|
||||
"minInlineSize": "0px",
|
||||
"minWidth": "0px",
|
||||
"minZoom": "",
|
||||
"mixBlendMode": "normal",
|
||||
"objectFit": "fill",
|
||||
"objectPosition": "50% 50%",
|
||||
"offset": "none 0px auto 0deg",
|
||||
"offsetDistance": "0px",
|
||||
"offsetPath": "none",
|
||||
"offsetRotate": "auto 0deg",
|
||||
"opacity": "1",
|
||||
"order": "0",
|
||||
"orientation": "",
|
||||
"orphans": "2",
|
||||
"outline": "rgb(0, 0, 0) none 0px",
|
||||
"outlineColor": "rgb(0, 0, 0)",
|
||||
"outlineOffset": "0px",
|
||||
"outlineStyle": "none",
|
||||
"outlineWidth": "0px",
|
||||
"overflow": "visible",
|
||||
"overflowAnchor": "auto",
|
||||
"overflowWrap": "normal",
|
||||
"overflowX": "visible",
|
||||
"overflowY": "visible",
|
||||
"overscrollBehavior": "auto auto",
|
||||
"overscrollBehaviorX": "auto",
|
||||
"overscrollBehaviorY": "auto",
|
||||
"padding": "0px",
|
||||
"paddingBottom": "0px",
|
||||
"paddingLeft": "0px",
|
||||
"paddingRight": "0px",
|
||||
"paddingTop": "0px",
|
||||
"page": "",
|
||||
"pageBreakAfter": "auto",
|
||||
"pageBreakBefore": "auto",
|
||||
"pageBreakInside": "auto",
|
||||
"paintOrder": "fill stroke markers",
|
||||
"perspective": "none",
|
||||
"perspectiveOrigin": "0px 0px",
|
||||
"placeContent": "normal normal",
|
||||
"placeItems": "normal normal",
|
||||
"placeSelf": "auto auto",
|
||||
"pointerEvents": "auto",
|
||||
"position": "static",
|
||||
"quotes": "",
|
||||
"r": "0px",
|
||||
"resize": "none",
|
||||
"right": "auto",
|
||||
"rx": "auto",
|
||||
"ry": "auto",
|
||||
"scrollBehavior": "auto",
|
||||
"shapeImageThreshold": "0",
|
||||
"shapeMargin": "0px",
|
||||
"shapeOutside": "none",
|
||||
"shapeRendering": "auto",
|
||||
"size": "",
|
||||
"speak": "normal",
|
||||
"src": "",
|
||||
"stopColor": "rgb(0, 0, 0)",
|
||||
"stopOpacity": "1",
|
||||
"stroke": "none",
|
||||
"strokeDasharray": "none",
|
||||
"strokeDashoffset": "0px",
|
||||
"strokeLinecap": "butt",
|
||||
"strokeLinejoin": "miter",
|
||||
"strokeMiterlimit": "4",
|
||||
"strokeOpacity": "1",
|
||||
"strokeWidth": "1px",
|
||||
"tabSize": "8",
|
||||
"tableLayout": "auto",
|
||||
"textAlign": "start",
|
||||
"textAlignLast": "auto",
|
||||
"textAnchor": "start",
|
||||
"textCombineUpright": "none",
|
||||
"textDecoration": "none solid rgb(0, 0, 0)",
|
||||
"textDecorationColor": "rgb(0, 0, 0)",
|
||||
"textDecorationLine": "none",
|
||||
"textDecorationSkipInk": "auto",
|
||||
"textDecorationStyle": "solid",
|
||||
"textIndent": "0px",
|
||||
"textOrientation": "mixed",
|
||||
"textOverflow": "clip",
|
||||
"textRendering": "auto",
|
||||
"textShadow": "none",
|
||||
"textSizeAdjust": "auto",
|
||||
"textTransform": "none",
|
||||
"textUnderlinePosition": "auto",
|
||||
"top": "auto",
|
||||
"touchAction": "auto",
|
||||
"transform": "none",
|
||||
"transformBox": "view-box",
|
||||
"transformOrigin": "0px 0px",
|
||||
"transformStyle": "flat",
|
||||
"transition": "all 0s ease 0s",
|
||||
"transitionDelay": "0s",
|
||||
"transitionDuration": "0s",
|
||||
"transitionProperty": "all",
|
||||
"transitionTimingFunction": "ease",
|
||||
"unicodeBidi": "normal",
|
||||
"unicodeRange": "",
|
||||
"userSelect": "auto",
|
||||
"userZoom": "",
|
||||
"vectorEffect": "none",
|
||||
"verticalAlign": "baseline",
|
||||
"visibility": "visible",
|
||||
"webkitAppRegion": "no-drag",
|
||||
"webkitAppearance": "none",
|
||||
"webkitBorderAfter": "0px none rgb(0, 0, 0)",
|
||||
"webkitBorderAfterColor": "rgb(0, 0, 0)",
|
||||
"webkitBorderAfterStyle": "none",
|
||||
"webkitBorderAfterWidth": "0px",
|
||||
"webkitBorderBefore": "0px none rgb(0, 0, 0)",
|
||||
"webkitBorderBeforeColor": "rgb(0, 0, 0)",
|
||||
"webkitBorderBeforeStyle": "none",
|
||||
"webkitBorderBeforeWidth": "0px",
|
||||
"webkitBorderEnd": "0px none rgb(0, 0, 0)",
|
||||
"webkitBorderEndColor": "rgb(0, 0, 0)",
|
||||
"webkitBorderEndStyle": "none",
|
||||
"webkitBorderEndWidth": "0px",
|
||||
"webkitBorderHorizontalSpacing": "0px",
|
||||
"webkitBorderImage": "none",
|
||||
"webkitBorderStart": "0px none rgb(0, 0, 0)",
|
||||
"webkitBorderStartColor": "rgb(0, 0, 0)",
|
||||
"webkitBorderStartStyle": "none",
|
||||
"webkitBorderStartWidth": "0px",
|
||||
"webkitBorderVerticalSpacing": "0px",
|
||||
"webkitBoxAlign": "stretch",
|
||||
"webkitBoxDecorationBreak": "slice",
|
||||
"webkitBoxDirection": "normal",
|
||||
"webkitBoxFlex": "0",
|
||||
"webkitBoxFlexGroup": "1",
|
||||
"webkitBoxLines": "single",
|
||||
"webkitBoxOrdinalGroup": "1",
|
||||
"webkitBoxOrient": "horizontal",
|
||||
"webkitBoxPack": "start",
|
||||
"webkitBoxReflect": "none",
|
||||
"webkitColumnBreakAfter": "auto",
|
||||
"webkitColumnBreakBefore": "auto",
|
||||
"webkitColumnBreakInside": "auto",
|
||||
"webkitFontSizeDelta": "",
|
||||
"webkitFontSmoothing": "auto",
|
||||
"webkitHighlight": "none",
|
||||
"webkitHyphenateCharacter": "auto",
|
||||
"webkitLineBreak": "auto",
|
||||
"webkitLineClamp": "none",
|
||||
"webkitLocale": "auto",
|
||||
"webkitLogicalHeight": "0px",
|
||||
"webkitLogicalWidth": "0px",
|
||||
"webkitMarginAfter": "0px",
|
||||
"webkitMarginAfterCollapse": "collapse",
|
||||
"webkitMarginBefore": "0px",
|
||||
"webkitMarginBeforeCollapse": "collapse",
|
||||
"webkitMarginBottomCollapse": "collapse",
|
||||
"webkitMarginCollapse": "",
|
||||
"webkitMarginEnd": "0px",
|
||||
"webkitMarginStart": "0px",
|
||||
"webkitMarginTopCollapse": "collapse",
|
||||
"webkitMask": "",
|
||||
"webkitMaskBoxImage": "none",
|
||||
"webkitMaskBoxImageOutset": "0px",
|
||||
"webkitMaskBoxImageRepeat": "stretch",
|
||||
"webkitMaskBoxImageSlice": "0 fill",
|
||||
"webkitMaskBoxImageSource": "none",
|
||||
"webkitMaskBoxImageWidth": "auto",
|
||||
"webkitMaskClip": "border-box",
|
||||
"webkitMaskComposite": "source-over",
|
||||
"webkitMaskImage": "none",
|
||||
"webkitMaskOrigin": "border-box",
|
||||
"webkitMaskPosition": "0% 0%",
|
||||
"webkitMaskPositionX": "0%",
|
||||
"webkitMaskPositionY": "0%",
|
||||
"webkitMaskRepeat": "repeat",
|
||||
"webkitMaskRepeatX": "",
|
||||
"webkitMaskRepeatY": "",
|
||||
"webkitMaskSize": "auto",
|
||||
"webkitMaxLogicalHeight": "none",
|
||||
"webkitMaxLogicalWidth": "none",
|
||||
"webkitMinLogicalHeight": "0px",
|
||||
"webkitMinLogicalWidth": "0px",
|
||||
"webkitPaddingAfter": "0px",
|
||||
"webkitPaddingBefore": "0px",
|
||||
"webkitPaddingEnd": "0px",
|
||||
"webkitPaddingStart": "0px",
|
||||
"webkitPerspectiveOriginX": "",
|
||||
"webkitPerspectiveOriginY": "",
|
||||
"webkitPrintColorAdjust": "economy",
|
||||
"webkitRtlOrdering": "logical",
|
||||
"webkitRubyPosition": "before",
|
||||
"webkitTapHighlightColor": "rgba(0, 0, 0, 0.4)",
|
||||
"webkitTextCombine": "none",
|
||||
"webkitTextDecorationsInEffect": "none",
|
||||
"webkitTextEmphasis": "",
|
||||
"webkitTextEmphasisColor": "rgb(0, 0, 0)",
|
||||
"webkitTextEmphasisPosition": "over right",
|
||||
"webkitTextEmphasisStyle": "none",
|
||||
"webkitTextFillColor": "rgb(0, 0, 0)",
|
||||
"webkitTextOrientation": "vertical-right",
|
||||
"webkitTextSecurity": "none",
|
||||
"webkitTextStroke": "",
|
||||
"webkitTextStrokeColor": "rgb(0, 0, 0)",
|
||||
"webkitTextStrokeWidth": "0px",
|
||||
"webkitTransformOriginX": "",
|
||||
"webkitTransformOriginY": "",
|
||||
"webkitTransformOriginZ": "",
|
||||
"webkitUserDrag": "auto",
|
||||
"webkitUserModify": "read-only",
|
||||
"webkitWritingMode": "horizontal-tb",
|
||||
"whiteSpace": "normal",
|
||||
"widows": "2",
|
||||
"width": "0px",
|
||||
"willChange": "auto",
|
||||
"wordBreak": "normal",
|
||||
"wordSpacing": "0px",
|
||||
"wordWrap": "normal",
|
||||
"writingMode": "horizontal-tb",
|
||||
"x": "0px",
|
||||
"y": "0px",
|
||||
"zIndex": "auto",
|
||||
"zoom": "1"
|
||||
};
|
||||
|
||||
export default style;
|
@@ -0,0 +1,21 @@
|
||||
/* eslint-disable */
|
||||
import CommonComputedStyle from './CommonComputedStyle'
|
||||
|
||||
function getImageComputedStyle(image) {
|
||||
const width = image.width;
|
||||
const height = image.height;
|
||||
const style = Object.assign(CommonComputedStyle, {
|
||||
"display": "inline",
|
||||
"position": "static",
|
||||
"inlineSize": width + "px",
|
||||
"perspectiveOrigin": width / 2 + "px " + height / 2 + "px",
|
||||
"transformOrigin": width / 2 + "px " + height / 2 + "px",
|
||||
"webkitLogicalWidth": width + "px",
|
||||
"webkitLogicalHeight": height + "px",
|
||||
"width": width + "px",
|
||||
"height": height + "px",
|
||||
});
|
||||
return style;
|
||||
}
|
||||
|
||||
export default getImageComputedStyle;
|
2
adapters/platforms/baidu/wrapper/builtin/util/index.js
Executable file
2
adapters/platforms/baidu/wrapper/builtin/util/index.js
Executable file
@@ -0,0 +1,2 @@
|
||||
/* eslint-disable */
|
||||
export function noop() {}
|
16
adapters/platforms/baidu/wrapper/builtin/util/isDevtool.js
Normal file
16
adapters/platforms/baidu/wrapper/builtin/util/isDevtool.js
Normal file
@@ -0,0 +1,16 @@
|
||||
/* eslint-disable */
|
||||
let isDevtool = false;
|
||||
if (swan.getSystemInfoSync) {
|
||||
const { platform } = swan.getSystemInfoSync();
|
||||
isDevtool = platform === 'devtools';
|
||||
}
|
||||
else {
|
||||
let descriptor = Object.getOwnPropertyDescriptor(global, 'window')
|
||||
// 开发者工具无法重定义 window
|
||||
isDevtool = !(!descriptor || descriptor.configurable === true);
|
||||
}
|
||||
|
||||
|
||||
export default function () {
|
||||
return isDevtool;
|
||||
}
|
125
adapters/platforms/baidu/wrapper/builtin/util/mixin.js
Normal file
125
adapters/platforms/baidu/wrapper/builtin/util/mixin.js
Normal file
@@ -0,0 +1,125 @@
|
||||
/* eslint-disable */
|
||||
import { innerWidth, innerHeight } from '../WindowProperties'
|
||||
|
||||
export function parentNode(obj, level) {
|
||||
if (!('parentNode' in obj)) {
|
||||
let _parent;
|
||||
|
||||
if (level === 0) {
|
||||
_parent = function() {
|
||||
// return document
|
||||
return null
|
||||
}
|
||||
} else if (level === 1) {
|
||||
_parent = function() {
|
||||
return document.documentElement
|
||||
}
|
||||
} else {
|
||||
_parent = function() {
|
||||
return document.body
|
||||
}
|
||||
}
|
||||
|
||||
Object.defineProperty(obj, 'parentNode', {
|
||||
enumerable: true,
|
||||
get: _parent
|
||||
})
|
||||
}
|
||||
|
||||
if (!('parentElement' in obj)) {
|
||||
let _parent;
|
||||
|
||||
if (level === 0) {
|
||||
_parent = function() {
|
||||
return null
|
||||
}
|
||||
} else if (level === 1) {
|
||||
_parent = function() {
|
||||
return document.documentElement
|
||||
}
|
||||
} else {
|
||||
_parent = function() {
|
||||
return document.body
|
||||
}
|
||||
}
|
||||
|
||||
Object.defineProperty(obj, 'parentElement', {
|
||||
enumerable: true,
|
||||
get: _parent
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
export function style(obj) {
|
||||
obj.style = obj.style || {}
|
||||
|
||||
Object.assign(obj.style, {
|
||||
top: '0px',
|
||||
left: '0px',
|
||||
width: innerWidth + 'px',
|
||||
height: innerHeight + 'px',
|
||||
margin: '0px',
|
||||
padding: '0px',
|
||||
removeProperty() {},
|
||||
setProperty() {}
|
||||
})
|
||||
}
|
||||
|
||||
export function clientRegion(obj) {
|
||||
if (!('clientLeft' in obj)) {
|
||||
obj.clientLeft = 0
|
||||
obj.clientTop = 0
|
||||
}
|
||||
if (!('clientWidth' in obj)) {
|
||||
obj.clientWidth = innerWidth
|
||||
obj.clientHeight = innerHeight
|
||||
}
|
||||
|
||||
if (!('getBoundingClientRect' in obj)) {
|
||||
obj.getBoundingClientRect = function() {
|
||||
const ret = {
|
||||
x: 0,
|
||||
y: 0,
|
||||
top: 0,
|
||||
left: 0,
|
||||
width: this.clientWidth,
|
||||
height: this.clientHeight
|
||||
}
|
||||
ret.right = ret.width
|
||||
ret.bottom = ret.height
|
||||
|
||||
return ret
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export function offsetRegion(obj) {
|
||||
if (!('offsetLeft' in obj)) {
|
||||
obj.offsetLeft = 0
|
||||
obj.offsetTop = 0
|
||||
}
|
||||
if (!('offsetWidth' in obj)) {
|
||||
obj.offsetWidth = innerWidth
|
||||
obj.offsetHeight = innerHeight
|
||||
}
|
||||
}
|
||||
|
||||
export function scrollRegion(obj) {
|
||||
if (!('scrollLeft' in obj)) {
|
||||
obj.scrollLeft = 0
|
||||
obj.scrollTop = 0
|
||||
}
|
||||
if (!('scrollWidth' in obj)) {
|
||||
obj.scrollWidth = innerWidth
|
||||
obj.scrollHeight = innerHeight
|
||||
}
|
||||
}
|
||||
|
||||
export function classList(obj) {
|
||||
const noop = function() {}
|
||||
obj.classList = []
|
||||
obj.classList.add = noop
|
||||
obj.classList.remove = noop
|
||||
obj.classList.contains = noop
|
||||
obj.classList.toggle = noop
|
||||
}
|
125
adapters/platforms/baidu/wrapper/builtin/window.js
Normal file
125
adapters/platforms/baidu/wrapper/builtin/window.js
Normal file
@@ -0,0 +1,125 @@
|
||||
/* eslint-disable */
|
||||
import Canvas from './Canvas'
|
||||
|
||||
import CommonComputedStyle from './style/CommonComputedStyle'
|
||||
import getImageComputedStyle from './style/ImageComputedStyle'
|
||||
import getCanvasComputedStyle from './style/CanvasComputedStyle'
|
||||
import Event from './Event'
|
||||
import isDevtool from './util/isDevtool';
|
||||
|
||||
export { default as navigator } from './navigator'
|
||||
export { default as XMLHttpRequest } from './XMLHttpRequest'
|
||||
export { default as WebSocket } from './WebSocket'
|
||||
export { default as Worker } from './Worker'
|
||||
export { default as Image } from './Image'
|
||||
export { default as ImageBitmap } from './ImageBitmap'
|
||||
export { default as Audio } from './Audio'
|
||||
// export { default as FileReader } from './FileReader' // TODO: FileReader adaption blocks in BAIDU_DEV_TOOL
|
||||
export { default as HTMLElement } from './HTMLElement'
|
||||
export { default as HTMLImageElement } from './HTMLImageElement'
|
||||
export { default as HTMLCanvasElement } from './HTMLCanvasElement'
|
||||
export { default as HTMLMediaElement } from './HTMLMediaElement'
|
||||
export { default as HTMLAudioElement } from './HTMLAudioElement'
|
||||
export { default as HTMLVideoElement } from './HTMLVideoElement'
|
||||
export { default as WebGLRenderingContext } from './WebGLRenderingContext'
|
||||
export { TouchEvent, PointerEvent, MouseEvent } from './EventIniter/index.js'
|
||||
export { default as localStorage } from './localStorage'
|
||||
export { default as location } from './location'
|
||||
export { btoa, atob } from './Base64.js'
|
||||
export * from './WindowProperties'
|
||||
|
||||
|
||||
// 暴露全局的 canvas
|
||||
GameGlobal.screencanvas = GameGlobal.screencanvas || new Canvas()
|
||||
const canvas = GameGlobal.screencanvas;
|
||||
|
||||
function getComputedStyle(dom) {
|
||||
const tagName = dom.tagName;
|
||||
|
||||
if (tagName === "CANVAS") {
|
||||
return getCanvasComputedStyle(dom);
|
||||
} else if (tagName === "IMG") {
|
||||
return getImageComputedStyle(dom);
|
||||
}
|
||||
|
||||
return CommonComputedStyle;
|
||||
}
|
||||
|
||||
function scrollTo(x, y) {
|
||||
// x = Math.min(window.innerWidth, Math.max(0, x));
|
||||
// y = Math.min(window.innerHeight, Math.max(0, y));
|
||||
// We can't scroll the page of WeChatTinyGame, so it'll always be 0.
|
||||
|
||||
// window.scrollX = 0;
|
||||
// window.scrollY = 0;
|
||||
}
|
||||
|
||||
function scrollBy(dx, dy) {
|
||||
window.scrollTo(window.scrollX + dx, window.scrollY + dy);
|
||||
}
|
||||
|
||||
function alert(msg) {
|
||||
console.log(msg);
|
||||
}
|
||||
|
||||
function focus() {}
|
||||
|
||||
function blur() {}
|
||||
|
||||
if (isDevtool() && swan.getPerformance) {
|
||||
const wxPerf = swan.getPerformance();
|
||||
const consoleTimers = {};
|
||||
console.time = function(name) {
|
||||
consoleTimers[name] = wxPerf.now();
|
||||
};
|
||||
|
||||
console.timeEnd = function(name) {
|
||||
const timeStart = consoleTimers[name];
|
||||
if(!timeStart) {
|
||||
return;
|
||||
}
|
||||
|
||||
const timeElapsed = wxPerf.now() - timeStart;
|
||||
console.log(name + ": " + timeElapsed / 1000 + "ms");
|
||||
delete consoleTimers[name];
|
||||
};
|
||||
}
|
||||
|
||||
function eventHandlerFactory() {
|
||||
return (res) => {
|
||||
const event = new Event('resize')
|
||||
|
||||
event.target = window;
|
||||
event.timeStamp = Date.now();
|
||||
event.res = res;
|
||||
event.windowWidth = res.windowWidth;
|
||||
event.windowHeight = res.windowHeight;
|
||||
document.dispatchEvent(event);
|
||||
}
|
||||
}
|
||||
// TODO
|
||||
// swan.onWindowResize(eventHandlerFactory())
|
||||
|
||||
const _setTimeout = setTimeout;
|
||||
const _clearTimeout = clearTimeout;
|
||||
const _setInterval = setInterval;
|
||||
const _clearInterval = clearInterval;
|
||||
const _requestAnimationFrame = requestAnimationFrame;
|
||||
const _cancelAnimationFrame = cancelAnimationFrame;
|
||||
|
||||
export {
|
||||
canvas,
|
||||
alert,
|
||||
focus,
|
||||
blur,
|
||||
getComputedStyle,
|
||||
scrollTo,
|
||||
scrollBy,
|
||||
|
||||
_setTimeout as setTimeout,
|
||||
_clearTimeout as clearTimeout,
|
||||
_setInterval as setInterval,
|
||||
_clearInterval as clearInterval,
|
||||
_requestAnimationFrame as requestAnimationFrame,
|
||||
_cancelAnimationFrame as cancelAnimationFrame
|
||||
}
|
24
adapters/platforms/baidu/wrapper/engine/Texture2D.js
Normal file
24
adapters/platforms/baidu/wrapper/engine/Texture2D.js
Normal file
@@ -0,0 +1,24 @@
|
||||
if (cc.Texture2D) {
|
||||
cc.Texture2D.prototype._checkPackable = function () {
|
||||
let dynamicAtlas = cc.dynamicAtlasManager;
|
||||
if (!dynamicAtlas) return;
|
||||
|
||||
if (this._isCompressed()) {
|
||||
this._packable = false;
|
||||
return;
|
||||
}
|
||||
|
||||
let w = this.width, h = this.height;
|
||||
if (!this._image ||
|
||||
w > dynamicAtlas.maxFrameSize || h > dynamicAtlas.maxFrameSize ||
|
||||
this._getHash() !== dynamicAtlas.Atlas.DEFAULT_HASH) {
|
||||
this._packable = false;
|
||||
return;
|
||||
}
|
||||
|
||||
// HACK: Can't tell if it's a Canvas or an Image by instanceof on Baidu.
|
||||
if (this._image && this._image.getContext) {
|
||||
this._packable = true;
|
||||
}
|
||||
};
|
||||
}
|
1
adapters/platforms/baidu/wrapper/engine/index.js
Normal file
1
adapters/platforms/baidu/wrapper/engine/index.js
Normal file
@@ -0,0 +1 @@
|
||||
require('./Texture2D');
|
267
adapters/platforms/baidu/wrapper/fs-utils.js
Normal file
267
adapters/platforms/baidu/wrapper/fs-utils.js
Normal file
@@ -0,0 +1,267 @@
|
||||
/****************************************************************************
|
||||
Copyright (c) 2017-2019 Xiamen Yaji Software Co., Ltd.
|
||||
|
||||
https://www.cocos.com/
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated engine source code (the "Software"), a limited,
|
||||
worldwide, royalty-free, non-assignable, revocable and non-exclusive license
|
||||
to use Cocos Creator solely to develop games on your target platforms. You shall
|
||||
not use Cocos Creator software for developing other software or tools that's
|
||||
used for developing games. You are not granted to publish, distribute,
|
||||
sublicense, and/or sell copies of Cocos Creator.
|
||||
|
||||
The software or tools in this License Agreement are licensed, not sold.
|
||||
Xiamen Yaji Software Co., Ltd. reserves all rights not expressly granted to you.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
****************************************************************************/
|
||||
var fs = swan.getFileSystemManager ? swan.getFileSystemManager() : null;
|
||||
var outOfStorageRegExp = /file size over/;
|
||||
|
||||
var fsUtils = {
|
||||
|
||||
fs,
|
||||
|
||||
isOutOfStorage (errMsg) {
|
||||
return outOfStorageRegExp.test(errMsg);
|
||||
},
|
||||
|
||||
getUserDataPath () {
|
||||
return swan.env.USER_DATA_PATH;
|
||||
},
|
||||
|
||||
checkFsValid () {
|
||||
if (!fs) {
|
||||
console.warn('can not get the file system!');
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
},
|
||||
|
||||
deleteFile (filePath, onComplete) {
|
||||
fs.unlink({
|
||||
filePath: filePath,
|
||||
success: function () {
|
||||
onComplete && onComplete(null);
|
||||
},
|
||||
fail: function (res) {
|
||||
console.warn(`Delete file failed: path: ${filePath} message: ${res.errMsg}`);
|
||||
onComplete && onComplete(new Error(res.errMsg));
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
downloadFile (remoteUrl, filePath, header, onProgress, onComplete) {
|
||||
var options = {
|
||||
url: remoteUrl,
|
||||
success: function (res) {
|
||||
if (res.statusCode === 200) {
|
||||
onComplete && onComplete(null, res.tempFilePath || res.filePath);
|
||||
}
|
||||
else {
|
||||
if (res.filePath) {
|
||||
fsUtils.deleteFile(res.filePath);
|
||||
}
|
||||
console.warn(`Download file failed: path: ${remoteUrl} message: ${res.statusCode}`);
|
||||
onComplete && onComplete(new Error(res.statusCode), null);
|
||||
}
|
||||
},
|
||||
fail: function (res) {
|
||||
console.warn(`Download file failed: path: ${remoteUrl} message: ${res.errMsg}`);
|
||||
onComplete && onComplete(new Error(res.errMsg), null);
|
||||
}
|
||||
}
|
||||
if (filePath) options.filePath = filePath;
|
||||
if (header) options.header = header;
|
||||
var task = swan.downloadFile(options);
|
||||
onProgress && task.onProgressUpdate(onProgress);
|
||||
},
|
||||
|
||||
saveFile (srcPath, destPath, onComplete) {
|
||||
swan.saveFile({
|
||||
tempFilePath: srcPath,
|
||||
filePath: destPath,
|
||||
success: function (res) {
|
||||
onComplete && onComplete(null);
|
||||
},
|
||||
fail: function (res) {
|
||||
console.warn(`Save file failed: path: ${srcPath} message: ${res.errMsg}`);
|
||||
onComplete && onComplete(new Error(res.errMsg));
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
copyFile (srcPath, destPath, onComplete) {
|
||||
fs.copyFile({
|
||||
srcPath: srcPath,
|
||||
destPath: destPath,
|
||||
success: function () {
|
||||
onComplete && onComplete(null);
|
||||
},
|
||||
fail: function (res) {
|
||||
console.warn(`Copy file failed: path: ${srcPath} message: ${res.errMsg}`);
|
||||
onComplete && onComplete(new Error(res.errMsg));
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
writeFile (path, data, encoding, onComplete) {
|
||||
fs.writeFile({
|
||||
filePath: path,
|
||||
encoding: encoding,
|
||||
data: data,
|
||||
success: function () {
|
||||
onComplete && onComplete(null);
|
||||
},
|
||||
fail: function (res) {
|
||||
console.warn(`Write file failed: path: ${path} message: ${res.errMsg}`);
|
||||
onComplete && onComplete(new Error(res.errMsg));
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
writeFileSync (path, data, encoding) {
|
||||
try {
|
||||
fs.writeFileSync(path, data, encoding);
|
||||
return null;
|
||||
}
|
||||
catch (e) {
|
||||
console.warn(`Write file failed: path: ${path} message: ${e.message}`);
|
||||
return new Error(e.message);
|
||||
}
|
||||
},
|
||||
|
||||
readFile (filePath, encoding, onComplete) {
|
||||
fs.readFile({
|
||||
filePath: filePath,
|
||||
encoding: encoding,
|
||||
success: function (res) {
|
||||
onComplete && onComplete(null, res.data);
|
||||
},
|
||||
fail: function (res) {
|
||||
console.warn(`Read file failed: path: ${filePath} message: ${res.errMsg}`);
|
||||
onComplete && onComplete (new Error(res.errMsg), null);
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
readDir (filePath, onComplete) {
|
||||
fs.readdir({
|
||||
dirPath: filePath,
|
||||
success: function (res) {
|
||||
onComplete && onComplete(null, res.files);
|
||||
},
|
||||
fail: function (res) {
|
||||
console.warn(`Read directory failed: path: ${filePath} message: ${res.errMsg}`);
|
||||
onComplete && onComplete(new Error(res.errMsg), null);
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
readText (filePath, onComplete) {
|
||||
fsUtils.readFile(filePath, 'utf8', onComplete);
|
||||
},
|
||||
|
||||
readArrayBuffer (filePath, onComplete) {
|
||||
fsUtils.readFile(filePath, '', onComplete);
|
||||
},
|
||||
|
||||
readJson (filePath, onComplete) {
|
||||
fsUtils.readFile(filePath, 'utf8', function (err, text) {
|
||||
var out = null;
|
||||
if (!err) {
|
||||
try {
|
||||
out = JSON.parse(text);
|
||||
}
|
||||
catch (e) {
|
||||
console.warn(`Read json failed: path: ${filePath} message: ${e.message}`);
|
||||
err = new Error(e.message);
|
||||
}
|
||||
}
|
||||
onComplete && onComplete(err, out);
|
||||
});
|
||||
},
|
||||
|
||||
readJsonSync (path) {
|
||||
try {
|
||||
var str = fs.readFileSync(path, 'utf8');
|
||||
return JSON.parse(str);
|
||||
}
|
||||
catch (e) {
|
||||
console.warn(`Read json failed: path: ${path} message: ${e.message}`);
|
||||
return new Error(e.message);
|
||||
}
|
||||
},
|
||||
|
||||
makeDirSync (path, recursive) {
|
||||
try {
|
||||
fs.mkdirSync(path, recursive);
|
||||
return null;
|
||||
}
|
||||
catch (e) {
|
||||
console.warn(`Make directory failed: path: ${path} message: ${e.message}`);
|
||||
return new Error(e.message);
|
||||
}
|
||||
},
|
||||
|
||||
rmdirSync (dirPath, recursive) {
|
||||
try {
|
||||
fs.rmdirSync(dirPath, recursive);
|
||||
}
|
||||
catch (e) {
|
||||
console.warn(`rm directory failed: path: ${dirPath} message: ${e.message}`);
|
||||
return new Error(e.message);
|
||||
}
|
||||
},
|
||||
|
||||
exists (filePath, onComplete) {
|
||||
fs.access({
|
||||
path: filePath,
|
||||
success: function () {
|
||||
onComplete && onComplete(true);
|
||||
},
|
||||
fail: function () {
|
||||
onComplete && onComplete(false);
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
loadSubpackage (name, onProgress, onComplete) {
|
||||
var task = swan.loadSubpackage({
|
||||
name: name,
|
||||
success: function () {
|
||||
onComplete && onComplete();
|
||||
},
|
||||
fail: function (res) {
|
||||
console.warn(`Load Subpackage failed: path: ${name} message: ${res.errMsg}`);
|
||||
onComplete && onComplete(new Error(`Failed to load subpackage ${name}: ${res.errMsg}`));
|
||||
}
|
||||
});
|
||||
onProgress && task.onProgressUpdate(onProgress);
|
||||
return task;
|
||||
},
|
||||
|
||||
unzip (zipFilePath, targetPath, onComplete) {
|
||||
fs.unzip({
|
||||
zipFilePath,
|
||||
targetPath,
|
||||
success () {
|
||||
onComplete && onComplete(null);
|
||||
},
|
||||
fail (res) {
|
||||
console.warn(`unzip failed: path: ${zipFilePath} message: ${res.errMsg}`);
|
||||
onComplete && onComplete(new Error('unzip failed: ' + res.errMsg));
|
||||
},
|
||||
})
|
||||
},
|
||||
};
|
||||
|
||||
window.fsUtils = module.exports = fsUtils;
|
||||
|
101
adapters/platforms/baidu/wrapper/sub-context-adapter.js
Normal file
101
adapters/platforms/baidu/wrapper/sub-context-adapter.js
Normal file
@@ -0,0 +1,101 @@
|
||||
// Ensure recieving message from main context before engine being inited
|
||||
let isEngineReady = false;
|
||||
const game = cc.game;
|
||||
game.once(game.EVENT_ENGINE_INITED, function () {
|
||||
isEngineReady = true;
|
||||
});
|
||||
|
||||
var viewportInMain = {
|
||||
x: 0,
|
||||
y: 0,
|
||||
width: 0,
|
||||
height: 0
|
||||
};
|
||||
|
||||
// Touch conversion
|
||||
cc.view.convertToLocationInView = function (tx, ty, relatedPos, out) {
|
||||
var result = out || cc.v2();
|
||||
var x = this._devicePixelRatio * (tx - relatedPos.left);
|
||||
var y = this._devicePixelRatio * (relatedPos.top + relatedPos.height - ty);
|
||||
// Move to real viewport area
|
||||
x = (x - viewportInMain.x) * this._viewportRect.width / viewportInMain.width;
|
||||
y = (y - viewportInMain.y) * this._viewportRect.height / viewportInMain.height;
|
||||
if (this._isRotated) {
|
||||
result.x = this._viewportRect.width - y;
|
||||
result.y = x;
|
||||
}
|
||||
else {
|
||||
result.x = x;
|
||||
result.y = y;
|
||||
}
|
||||
return result;
|
||||
};
|
||||
|
||||
// In sub context, run main loop after subContextView component get enabled.
|
||||
game._prepareFinished = function (cb) {
|
||||
this._prepared = true;
|
||||
|
||||
// Init engine
|
||||
this._initEngine();
|
||||
cc.assetManager.builtins.init(() => {
|
||||
// Log engine version
|
||||
console.log('Cocos Creator v' + cc.ENGINE_VERSION);
|
||||
|
||||
this._setAnimFrame();
|
||||
|
||||
this.emit(this.EVENT_GAME_INITED);
|
||||
|
||||
if (cb) cb();
|
||||
});
|
||||
};
|
||||
|
||||
swan.onMessage(function (data) {
|
||||
if (data.fromEngine) {
|
||||
if (data.event === 'boot') {
|
||||
game._banRunningMainLoop = false;
|
||||
if (game._firstSceneLaunched) {
|
||||
game._runMainLoop();
|
||||
}
|
||||
}
|
||||
else if (data.event === 'viewport') {
|
||||
viewportInMain.x = data.x;
|
||||
viewportInMain.y = data.y;
|
||||
viewportInMain.width = data.width;
|
||||
viewportInMain.height = data.height;
|
||||
}
|
||||
else if (data.event === 'resize') {
|
||||
window.dispatchEvent({type: 'resize'});
|
||||
}
|
||||
else if (isEngineReady) {
|
||||
if (data.event === 'mainLoop') {
|
||||
if (data.value) {
|
||||
game.resume();
|
||||
}
|
||||
else {
|
||||
game.pause();
|
||||
}
|
||||
}
|
||||
else if (data.event === 'frameRate') {
|
||||
game.setFrameRate(data.value);
|
||||
}
|
||||
else if (data.event === 'step') {
|
||||
game.step();
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// Canvas component adaptation
|
||||
|
||||
cc.Canvas.prototype.update = function () {
|
||||
if (this._width !== game.canvas.width || this._height !== game.canvas.height) {
|
||||
this.applySettings();
|
||||
}
|
||||
};
|
||||
|
||||
let originalApplySettings = cc.Canvas.prototype.applySettings;
|
||||
cc.Canvas.prototype.applySettings = function () {
|
||||
originalApplySettings.call(this);
|
||||
this._width = game.canvas.width;
|
||||
this._height = game.canvas.height;
|
||||
};
|
25
adapters/platforms/baidu/wrapper/systemInfo.js
Normal file
25
adapters/platforms/baidu/wrapper/systemInfo.js
Normal file
@@ -0,0 +1,25 @@
|
||||
const adapter = window.__globalAdapter;
|
||||
let adaptSysFunc = adapter.adaptSys;
|
||||
|
||||
Object.assign(adapter, {
|
||||
// Extend adaptSys interface
|
||||
adaptSys (sys) {
|
||||
adaptSysFunc.call(this, sys, GameGlobal._env);
|
||||
delete GameGlobal._env; // release env
|
||||
|
||||
// baidugame subdomain
|
||||
if (!swan.getOpenDataContext) {
|
||||
sys.platform = sys.BAIDU_GAME_SUB;
|
||||
}
|
||||
else {
|
||||
sys.platform = sys.BAIDU_GAME;
|
||||
}
|
||||
|
||||
// sys.glExtension = function (name) {
|
||||
// if (name === 'OES_texture_float') {
|
||||
// return false;
|
||||
// }
|
||||
// return !!cc.renderer.device.ext(name);
|
||||
// };
|
||||
},
|
||||
});
|
114
adapters/platforms/baidu/wrapper/unify.js
Normal file
114
adapters/platforms/baidu/wrapper/unify.js
Normal file
@@ -0,0 +1,114 @@
|
||||
const utils = require('../../../common/utils');
|
||||
|
||||
if (window.__globalAdapter) {
|
||||
let globalAdapter = window.__globalAdapter;
|
||||
let isLandscape = false; // getSystemInfoSync not supported in sub context
|
||||
// SystemInfo
|
||||
if (swan.getSystemInfoSync) {
|
||||
let systemInfo = swan.getSystemInfoSync();
|
||||
let windowWidth = systemInfo.windowWidth;
|
||||
let windowHeight = systemInfo.windowHeight;
|
||||
isLandscape = windowWidth > windowHeight;
|
||||
globalAdapter.isDevTool = systemInfo.platform === 'devtools';
|
||||
}
|
||||
else {
|
||||
// can't define window in devtool
|
||||
let descriptor = Object.getOwnPropertyDescriptor(global, 'window');
|
||||
globalAdapter.isDevTool = !(!descriptor || descriptor.configurable === true);
|
||||
|
||||
}
|
||||
globalAdapter.isSubContext = (swan.getOpenDataContext === undefined);
|
||||
utils.cloneMethod(globalAdapter, swan, 'getSystemInfoSync');
|
||||
|
||||
// TouchEvent
|
||||
utils.cloneMethod(globalAdapter, swan, 'onTouchStart');
|
||||
utils.cloneMethod(globalAdapter, swan, 'onTouchMove');
|
||||
utils.cloneMethod(globalAdapter, swan, 'onTouchEnd');
|
||||
utils.cloneMethod(globalAdapter, swan, 'onTouchCancel');
|
||||
|
||||
// Audio
|
||||
utils.cloneMethod(globalAdapter, swan, 'createInnerAudioContext');
|
||||
|
||||
// FrameRate
|
||||
utils.cloneMethod(globalAdapter, swan, 'setPreferredFramesPerSecond');
|
||||
|
||||
// Keyboard
|
||||
utils.cloneMethod(globalAdapter, swan, 'showKeyboard');
|
||||
utils.cloneMethod(globalAdapter, swan, 'hideKeyboard');
|
||||
utils.cloneMethod(globalAdapter, swan, 'updateKeyboard');
|
||||
utils.cloneMethod(globalAdapter, swan, 'onKeyboardInput');
|
||||
utils.cloneMethod(globalAdapter, swan, 'onKeyboardConfirm');
|
||||
utils.cloneMethod(globalAdapter, swan, 'onKeyboardComplete');
|
||||
utils.cloneMethod(globalAdapter, swan, 'offKeyboardInput');
|
||||
utils.cloneMethod(globalAdapter, swan, 'offKeyboardConfirm');
|
||||
utils.cloneMethod(globalAdapter, swan, 'offKeyboardComplete');
|
||||
|
||||
// Message
|
||||
utils.cloneMethod(globalAdapter, swan, 'getOpenDataContext');
|
||||
utils.cloneMethod(globalAdapter, swan, 'onMessage');
|
||||
|
||||
// SharedCanvas
|
||||
utils.cloneMethod(globalAdapter, swan, 'getSharedCanvas');
|
||||
|
||||
// Font
|
||||
utils.cloneMethod(globalAdapter, swan, 'loadFont');
|
||||
|
||||
// hide show Event
|
||||
utils.cloneMethod(globalAdapter, swan, 'onShow');
|
||||
utils.cloneMethod(globalAdapter, swan, 'onHide');
|
||||
|
||||
// Accelerometer
|
||||
let isAccelerometerInit = false;
|
||||
let deviceOrientation = 1;
|
||||
if (swan.onDeviceOrientationChange) {
|
||||
swan.onDeviceOrientationChange(function (res) {
|
||||
if (res.value === 'landscape') {
|
||||
deviceOrientation = 1;
|
||||
}
|
||||
else if (res.value === 'landscapeReverse') {
|
||||
deviceOrientation = -1;
|
||||
}
|
||||
});
|
||||
}
|
||||
Object.assign(globalAdapter, {
|
||||
startAccelerometer (cb) {
|
||||
if (!isAccelerometerInit) {
|
||||
isAccelerometerInit = true;
|
||||
swan.onAccelerometerChange && swan.onAccelerometerChange(function (res) {
|
||||
let resClone = {};
|
||||
let x = res.x;
|
||||
let y = res.y;
|
||||
if (isLandscape) {
|
||||
let tmp = x;
|
||||
x = -y;
|
||||
y = tmp;
|
||||
}
|
||||
|
||||
resClone.x = x * deviceOrientation;
|
||||
resClone.y = y * deviceOrientation;
|
||||
resClone.z = res.z;
|
||||
cb && cb(resClone);
|
||||
});
|
||||
}
|
||||
else {
|
||||
swan.startAccelerometer && swan.startAccelerometer({
|
||||
fail (err) {
|
||||
console.error('start accelerometer failed', err);
|
||||
},
|
||||
// success () {},
|
||||
// complete () {},
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
stopAccelerometer () {
|
||||
swan.stopAccelerometer && swan.stopAccelerometer({
|
||||
fail (err) {
|
||||
console.error('stop accelerometer failed', err);
|
||||
},
|
||||
// success () {},
|
||||
// complete () {},
|
||||
});
|
||||
},
|
||||
});
|
||||
}
|
19
adapters/platforms/bytedance/index.js
Normal file
19
adapters/platforms/bytedance/index.js
Normal file
@@ -0,0 +1,19 @@
|
||||
const _global = GameGlobal;
|
||||
const adapter = _global.__globalAdapter = {};
|
||||
|
||||
Object.assign(adapter, {
|
||||
init () {
|
||||
require('./wrapper/builtin');
|
||||
_global.DOMParser = require('../../common/xmldom/dom-parser').DOMParser;
|
||||
require('./wrapper/unify');
|
||||
require('./wrapper/fs-utils');
|
||||
require('../../common/engine/globalAdapter');
|
||||
require('./wrapper/systemInfo');
|
||||
},
|
||||
|
||||
adaptEngine () {
|
||||
require('../../common/engine');
|
||||
require('./wrapper/engine');
|
||||
require('./wrapper/sub-context-adapter');
|
||||
},
|
||||
});
|
11
adapters/platforms/bytedance/res/ccRequire.js
Normal file
11
adapters/platforms/bytedance/res/ccRequire.js
Normal file
@@ -0,0 +1,11 @@
|
||||
let moduleMap = {
|
||||
// tail
|
||||
};
|
||||
|
||||
window.__cocos_require__ = function (moduleName) {
|
||||
let func = moduleMap[moduleName];
|
||||
if (!func) {
|
||||
throw new Error(`cannot find module ${moduleName}`);
|
||||
}
|
||||
return func();
|
||||
};
|
3
adapters/platforms/bytedance/res/cocos/plugin.json
Normal file
3
adapters/platforms/bytedance/res/cocos/plugin.json
Normal file
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"main": "cocos2d-js-min.js"
|
||||
}
|
9
adapters/platforms/bytedance/res/cocos/signature.json
Normal file
9
adapters/platforms/bytedance/res/cocos/signature.json
Normal file
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"provider": "tt9186e73b0ebd04c2",
|
||||
"signature": [
|
||||
{
|
||||
"path": "cocos2d-js-min.js",
|
||||
"md5": ""
|
||||
}
|
||||
]
|
||||
}
|
20
adapters/platforms/bytedance/res/game.js
Normal file
20
adapters/platforms/bytedance/res/game.js
Normal file
@@ -0,0 +1,20 @@
|
||||
require('adapter-js-path');
|
||||
__globalAdapter.init();
|
||||
require('cocos2d-js-path');
|
||||
require('physics-js-path');
|
||||
__globalAdapter.adaptEngine();
|
||||
require('./ccRequire');
|
||||
|
||||
require('./src/settings');
|
||||
// Introduce Cocos Service here
|
||||
require('./main'); // TODO: move to common
|
||||
|
||||
// Adjust devicePixelRatio
|
||||
cc.view._maxPixelRatio = 4;
|
||||
|
||||
if (cc.sys.platform !== cc.sys.BYTEDANCE_GAME_SUB) {
|
||||
// Release Image objects after uploaded gl texture
|
||||
cc.macro.CLEANUP_IMAGE_CACHE = true;
|
||||
}
|
||||
|
||||
window.boot();
|
18
adapters/platforms/bytedance/res/game.json
Normal file
18
adapters/platforms/bytedance/res/game.json
Normal file
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"deviceOrientation": "portrait",
|
||||
"showStatusBar": false,
|
||||
"openDataContext": "",
|
||||
"networkTimeout": {
|
||||
"request": 5000,
|
||||
"connectSocket": 20000,
|
||||
"uploadFile": 5000,
|
||||
"downloadFile": 5000
|
||||
},
|
||||
"plugins": {
|
||||
"cocos": {
|
||||
"provider": "tt9186e73b0ebd04c2",
|
||||
"version": "",
|
||||
"path": "cocos"
|
||||
}
|
||||
}
|
||||
}
|
67
adapters/platforms/bytedance/res/main.js
Normal file
67
adapters/platforms/bytedance/res/main.js
Normal file
@@ -0,0 +1,67 @@
|
||||
window.boot = function () {
|
||||
var settings = window._CCSettings;
|
||||
window._CCSettings = undefined;
|
||||
|
||||
var onStart = function () {
|
||||
cc.view.enableRetina(true);
|
||||
cc.view.resizeWithBrowserSize(true);
|
||||
|
||||
var launchScene = settings.launchScene;
|
||||
|
||||
// load scene
|
||||
cc.director.loadScene(launchScene, null,
|
||||
function () {
|
||||
console.log('Success to load scene: ' + launchScene);
|
||||
}
|
||||
);
|
||||
|
||||
};
|
||||
|
||||
var isSubContext = __globalAdapter.isSubContext;
|
||||
|
||||
var option = {
|
||||
id: 'GameCanvas',
|
||||
debugMode: settings.debug ? cc.debug.DebugMode.INFO : cc.debug.DebugMode.ERROR,
|
||||
showFPS: !isSubContext && settings.debug,
|
||||
frameRate: 60,
|
||||
groupList: settings.groupList,
|
||||
collisionMatrix: settings.collisionMatrix,
|
||||
}
|
||||
|
||||
cc.assetManager.init({
|
||||
bundleVers: settings.bundleVers,
|
||||
subpackages: settings.subpackages,
|
||||
remoteBundles: settings.remoteBundles,
|
||||
server: settings.server,
|
||||
subContextRoot: settings.subContextRoot
|
||||
});
|
||||
|
||||
var RESOURCES = cc.AssetManager.BuiltinBundleName.RESOURCES;
|
||||
var INTERNAL = cc.AssetManager.BuiltinBundleName.INTERNAL;
|
||||
var MAIN = cc.AssetManager.BuiltinBundleName.MAIN;
|
||||
var START_SCENE = cc.AssetManager.BuiltinBundleName.START_SCENE;
|
||||
var bundleRoot = [INTERNAL];
|
||||
settings.hasResourcesBundle && bundleRoot.push(RESOURCES);
|
||||
settings.hasStartSceneBundle && bundleRoot.push(MAIN);
|
||||
|
||||
var count = 0;
|
||||
function cb (err) {
|
||||
if (err) return console.error(err.message, err.stack);
|
||||
count++;
|
||||
if (count === bundleRoot.length + 1) {
|
||||
// if there is start-scene bundle. should load start-scene bundle in the last stage
|
||||
// Otherwise the main bundle should be the last
|
||||
cc.assetManager.loadBundle(settings.hasStartSceneBundle ? START_SCENE : MAIN, function (err) {
|
||||
if (!err) cc.game.run(option, onStart);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// load plugins
|
||||
cc.assetManager.loadScript(settings.jsList.map(function (x) { return 'src/' + x;}), cb);
|
||||
|
||||
// load bundles
|
||||
for (var i = 0; i < bundleRoot.length; i++) {
|
||||
cc.assetManager.loadBundle(bundleRoot[i], cb);
|
||||
}
|
||||
};
|
11
adapters/platforms/bytedance/res/project.config.json
Normal file
11
adapters/platforms/bytedance/res/project.config.json
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"setting": {
|
||||
"urlCheck": true,
|
||||
"es6": true,
|
||||
"postcss": true,
|
||||
"minified": true,
|
||||
"newFeature": true
|
||||
},
|
||||
"appid": "testappId",
|
||||
"projectname": ""
|
||||
}
|
205
adapters/platforms/bytedance/wrapper/builtin/Audio.js
Normal file
205
adapters/platforms/bytedance/wrapper/builtin/Audio.js
Normal file
@@ -0,0 +1,205 @@
|
||||
import HTMLAudioElement from './HTMLAudioElement'
|
||||
|
||||
const HAVE_NOTHING = 0
|
||||
const HAVE_METADATA = 1
|
||||
const HAVE_CURRENT_DATA = 2
|
||||
const HAVE_FUTURE_DATA = 3
|
||||
const HAVE_ENOUGH_DATA = 4
|
||||
|
||||
let SN_SEED = 1
|
||||
|
||||
const _innerAudioContextMap = {}
|
||||
|
||||
export default class Audio extends HTMLAudioElement {
|
||||
|
||||
constructor(url) {
|
||||
super()
|
||||
|
||||
this._$sn = SN_SEED++;
|
||||
|
||||
this.HAVE_NOTHING = HAVE_NOTHING
|
||||
this.HAVE_METADATA = HAVE_METADATA
|
||||
this.HAVE_CURRENT_DATA = HAVE_CURRENT_DATA
|
||||
this.HAVE_FUTURE_DATA = HAVE_FUTURE_DATA
|
||||
this.HAVE_ENOUGH_DATA = HAVE_ENOUGH_DATA
|
||||
|
||||
this.readyState = HAVE_NOTHING
|
||||
|
||||
const innerAudioContext = tt.createInnerAudioContext()
|
||||
|
||||
_innerAudioContextMap[this._$sn] = innerAudioContext
|
||||
|
||||
this._canplayEvents = [
|
||||
'load',
|
||||
'loadend',
|
||||
'canplay',
|
||||
'canplaythrough',
|
||||
'loadedmetadata'
|
||||
]
|
||||
|
||||
innerAudioContext.onCanplay(() => {
|
||||
this._loaded = true
|
||||
this.readyState = this.HAVE_CURRENT_DATA
|
||||
this._canplayEvents.forEach((type) => {
|
||||
this.dispatchEvent({ type: type })
|
||||
})
|
||||
})
|
||||
innerAudioContext.onPlay(() => {
|
||||
this._paused = _innerAudioContextMap[this._$sn].paused
|
||||
this.dispatchEvent({ type: 'play' })
|
||||
})
|
||||
innerAudioContext.onPause(() => {
|
||||
this._paused = _innerAudioContextMap[this._$sn].paused
|
||||
this.dispatchEvent({ type: 'pause' })
|
||||
})
|
||||
innerAudioContext.onEnded(() => {
|
||||
this._paused = _innerAudioContextMap[this._$sn].paused
|
||||
if (_innerAudioContextMap[this._$sn].loop === false) {
|
||||
this.dispatchEvent({ type: 'ended' })
|
||||
}
|
||||
this.readyState = HAVE_ENOUGH_DATA
|
||||
})
|
||||
innerAudioContext.onError(() => {
|
||||
this._paused = _innerAudioContextMap[this._$sn].paused
|
||||
this.dispatchEvent({ type: 'error' })
|
||||
})
|
||||
|
||||
if (url) {
|
||||
this.src = url
|
||||
} else {
|
||||
this._src = ''
|
||||
}
|
||||
|
||||
this._loop = innerAudioContext.loop
|
||||
this._autoplay = innerAudioContext.autoplay
|
||||
this._paused = innerAudioContext.paused
|
||||
this._volume = innerAudioContext.volume
|
||||
this._muted = false;
|
||||
}
|
||||
|
||||
addEventListener(type, listener, options = {}) {
|
||||
super.addEventListener(type, listener, options)
|
||||
|
||||
type = String(type).toLowerCase()
|
||||
|
||||
if (this._loaded && this._canplayEvents.indexOf(type) !== -1) {
|
||||
this.dispatchEvent({ type: type })
|
||||
}
|
||||
}
|
||||
|
||||
load() {
|
||||
// console.warn('HTMLAudioElement.load() is not implemented.')
|
||||
// weixin doesn't need call load() manually
|
||||
}
|
||||
|
||||
play() {
|
||||
_innerAudioContextMap[this._$sn].play()
|
||||
}
|
||||
|
||||
resume() {
|
||||
_innerAudioContextMap[this._$sn].resume()
|
||||
}
|
||||
|
||||
pause() {
|
||||
_innerAudioContextMap[this._$sn].pause()
|
||||
}
|
||||
|
||||
stop() {
|
||||
_innerAudioContextMap[this._$sn].stop()
|
||||
}
|
||||
|
||||
destroy() {
|
||||
_innerAudioContextMap[this._$sn].destroy()
|
||||
}
|
||||
|
||||
canPlayType(mediaType = '') {
|
||||
if (typeof mediaType !== 'string') {
|
||||
return ''
|
||||
}
|
||||
|
||||
if (mediaType.indexOf('audio/mpeg') > -1 || mediaType.indexOf('audio/mp4')) {
|
||||
return 'probably'
|
||||
}
|
||||
return ''
|
||||
}
|
||||
|
||||
get currentTime() {
|
||||
return _innerAudioContextMap[this._$sn].currentTime
|
||||
}
|
||||
|
||||
set currentTime(value) {
|
||||
_innerAudioContextMap[this._$sn].seek(value)
|
||||
}
|
||||
|
||||
get duration () {
|
||||
return _innerAudioContextMap[this._$sn].duration
|
||||
}
|
||||
|
||||
get src() {
|
||||
return this._src
|
||||
}
|
||||
|
||||
set src(value) {
|
||||
this._src = value
|
||||
this._loaded = false
|
||||
this.readyState = this.HAVE_NOTHING
|
||||
|
||||
const innerAudioContext = _innerAudioContextMap[this._$sn]
|
||||
|
||||
innerAudioContext.src = value
|
||||
}
|
||||
|
||||
get loop() {
|
||||
return this._loop
|
||||
}
|
||||
|
||||
set loop(value) {
|
||||
this._loop = value
|
||||
_innerAudioContextMap[this._$sn].loop = value
|
||||
}
|
||||
|
||||
get autoplay() {
|
||||
return this.autoplay
|
||||
}
|
||||
|
||||
set autoplay(value) {
|
||||
this._autoplay = value
|
||||
_innerAudioContextMap[this._$sn].autoplay = value
|
||||
}
|
||||
|
||||
get paused() {
|
||||
return this._paused;
|
||||
}
|
||||
|
||||
get volume() {
|
||||
return this._volume;
|
||||
}
|
||||
|
||||
set volume(value) {
|
||||
this._volume = value;
|
||||
if (!this._muted) {
|
||||
_innerAudioContextMap[this._$sn].volume = value;
|
||||
}
|
||||
}
|
||||
|
||||
get muted() {
|
||||
return this._muted;
|
||||
}
|
||||
|
||||
set muted(value) {
|
||||
this._muted = value;
|
||||
if (value) {
|
||||
_innerAudioContextMap[this._$sn].volume = 0;
|
||||
} else {
|
||||
_innerAudioContextMap[this._$sn].volume = this._volume;
|
||||
}
|
||||
}
|
||||
|
||||
cloneNode() {
|
||||
const newAudio = new Audio()
|
||||
newAudio.loop = this.loop
|
||||
newAudio.autoplay = this.autoplay
|
||||
newAudio.src = this.src
|
||||
return newAudio
|
||||
}
|
||||
}
|
64
adapters/platforms/bytedance/wrapper/builtin/Canvas.js
Normal file
64
adapters/platforms/bytedance/wrapper/builtin/Canvas.js
Normal file
@@ -0,0 +1,64 @@
|
||||
// import HTMLCanvasElement from './HTMLCanvasElement'
|
||||
import { innerWidth, innerHeight } from './WindowProperties'
|
||||
|
||||
let hasModifiedCanvasPrototype = false
|
||||
let hasInit2DContextConstructor = false
|
||||
let hasInitWebGLContextConstructor = false
|
||||
|
||||
export default function Canvas() {
|
||||
const canvas = tt.createCanvas()
|
||||
|
||||
canvas.type = 'canvas'
|
||||
|
||||
// canvas.__proto__.__proto__.__proto__ = new HTMLCanvasElement()
|
||||
|
||||
const _getContext = canvas.getContext
|
||||
|
||||
canvas.getBoundingClientRect = () => {
|
||||
const ret = {
|
||||
top: 0,
|
||||
left: 0,
|
||||
width: window.innerWidth,
|
||||
height: window.innerHeight
|
||||
}
|
||||
return ret
|
||||
}
|
||||
|
||||
canvas.style = {
|
||||
top: '0px',
|
||||
left: '0px',
|
||||
width: innerWidth + 'px',
|
||||
height: innerHeight + 'px',
|
||||
}
|
||||
|
||||
canvas.addEventListener = function (type, listener, options = {}) {
|
||||
// console.log('canvas.addEventListener', type);
|
||||
document.addEventListener(type, listener, options);
|
||||
}
|
||||
|
||||
canvas.removeEventListener = function (type, listener) {
|
||||
// console.log('canvas.removeEventListener', type);
|
||||
document.removeEventListener(type, listener);
|
||||
}
|
||||
|
||||
canvas.dispatchEvent = function (event = {}) {
|
||||
console.log('canvas.dispatchEvent' , event.type, event);
|
||||
// nothing to do
|
||||
}
|
||||
|
||||
Object.defineProperty(canvas, 'clientWidth', {
|
||||
enumerable: true,
|
||||
get: function get() {
|
||||
return innerWidth
|
||||
}
|
||||
})
|
||||
|
||||
Object.defineProperty(canvas, 'clientHeight', {
|
||||
enumerable: true,
|
||||
get: function get() {
|
||||
return innerHeight
|
||||
}
|
||||
})
|
||||
|
||||
return canvas
|
||||
}
|
10
adapters/platforms/bytedance/wrapper/builtin/Element.js
Normal file
10
adapters/platforms/bytedance/wrapper/builtin/Element.js
Normal file
@@ -0,0 +1,10 @@
|
||||
import Node from './Node'
|
||||
|
||||
export default class Element extends Node {
|
||||
className = ''
|
||||
children = []
|
||||
|
||||
constructor() {
|
||||
super()
|
||||
}
|
||||
}
|
14
adapters/platforms/bytedance/wrapper/builtin/Event.js
Normal file
14
adapters/platforms/bytedance/wrapper/builtin/Event.js
Normal file
@@ -0,0 +1,14 @@
|
||||
import {noop} from './util'
|
||||
|
||||
export default class Event {
|
||||
cancelBubble = false
|
||||
cancelable = false
|
||||
target = null
|
||||
timestampe = Date.now()
|
||||
preventDefault = noop
|
||||
stopPropagation = noop
|
||||
|
||||
constructor(type) {
|
||||
this.type = type
|
||||
}
|
||||
}
|
@@ -0,0 +1,5 @@
|
||||
export default class MouseEvent {
|
||||
constructor() {
|
||||
|
||||
}
|
||||
}
|
@@ -0,0 +1,32 @@
|
||||
import { noop } from '../util/index.js'
|
||||
|
||||
export default class TouchEvent {
|
||||
touches = []
|
||||
targetTouches = []
|
||||
changedTouches = []
|
||||
preventDefault = noop
|
||||
stopPropagation = noop
|
||||
|
||||
constructor(type) {
|
||||
this.type = type
|
||||
this.target = window.canvas
|
||||
this.currentTarget = window.canvas
|
||||
}
|
||||
}
|
||||
|
||||
function touchEventHandlerFactory(type) {
|
||||
return (event) => {
|
||||
const touchEvent = new TouchEvent(type)
|
||||
|
||||
touchEvent.touches = event.touches
|
||||
touchEvent.targetTouches = Array.prototype.slice.call(event.touches)
|
||||
touchEvent.changedTouches = event.changedTouches
|
||||
touchEvent.timeStamp = event.timeStamp
|
||||
document.dispatchEvent(touchEvent)
|
||||
}
|
||||
}
|
||||
|
||||
tt.onTouchStart(touchEventHandlerFactory('touchstart'))
|
||||
tt.onTouchMove(touchEventHandlerFactory('touchmove'))
|
||||
tt.onTouchEnd(touchEventHandlerFactory('touchend'))
|
||||
tt.onTouchCancel(touchEventHandlerFactory('touchcancel'))
|
@@ -0,0 +1,2 @@
|
||||
export TouchEvent from './TouchEvent'
|
||||
export MouseEvent from './MouseEvent'
|
57
adapters/platforms/bytedance/wrapper/builtin/EventTarget.js
Normal file
57
adapters/platforms/bytedance/wrapper/builtin/EventTarget.js
Normal file
@@ -0,0 +1,57 @@
|
||||
const _events = new WeakMap()
|
||||
|
||||
export default class EventTarget {
|
||||
constructor() {
|
||||
_events.set(this, {})
|
||||
}
|
||||
|
||||
addEventListener(type, listener, options = {}) {
|
||||
let events = _events.get(this)
|
||||
|
||||
if (!events) {
|
||||
events = {}
|
||||
_events.set(this, events)
|
||||
}
|
||||
if (!events[type]) {
|
||||
events[type] = []
|
||||
}
|
||||
events[type].push(listener)
|
||||
|
||||
if (options.capture) {
|
||||
// console.warn('EventTarget.addEventListener: options.capture is not implemented.')
|
||||
}
|
||||
if (options.once) {
|
||||
// console.warn('EventTarget.addEventListener: options.once is not implemented.')
|
||||
}
|
||||
if (options.passive) {
|
||||
// console.warn('EventTarget.addEventListener: options.passive is not implemented.')
|
||||
}
|
||||
}
|
||||
|
||||
removeEventListener(type, listener) {
|
||||
const events = _events.get(this)
|
||||
|
||||
if (events) {
|
||||
const listeners = events[type]
|
||||
|
||||
if (listeners && listeners.length > 0) {
|
||||
for (let i = listeners.length; i--; i > 0) {
|
||||
if (listeners[i] === listener) {
|
||||
listeners.splice(i, 1)
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dispatchEvent(event = {}) {
|
||||
const listeners = _events.get(this)[event.type]
|
||||
|
||||
if (listeners) {
|
||||
for (let i = 0; i < listeners.length; i++) {
|
||||
listeners[i](event)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,7 @@
|
||||
/*
|
||||
* TODO 使用 tt.readFile 来封装 FileReader
|
||||
*/
|
||||
export default class FileReader {
|
||||
construct() {
|
||||
}
|
||||
}
|
@@ -0,0 +1,7 @@
|
||||
import HTMLMediaElement from './HTMLMediaElement'
|
||||
|
||||
export default class HTMLAudioElement extends HTMLMediaElement {
|
||||
constructor() {
|
||||
super('audio')
|
||||
}
|
||||
}
|
@@ -0,0 +1,20 @@
|
||||
// import HTMLElement from './HTMLElement';
|
||||
|
||||
// export default class HTMLCanvasElement extends HTMLElement
|
||||
// {
|
||||
// constructor(){
|
||||
// super('canvas')
|
||||
// }
|
||||
// };
|
||||
|
||||
import Canvas from './Canvas'
|
||||
import HTMLElement from './HTMLElement'
|
||||
|
||||
GameGlobal.screencanvas = GameGlobal.screencanvas || new Canvas();
|
||||
const canvas = GameGlobal.screencanvas;
|
||||
|
||||
const canvasConstructor = canvas.constructor;
|
||||
|
||||
// canvasConstructor.__proto__.__proto__ = new HTMLElement();
|
||||
|
||||
export default canvasConstructor;
|
54
adapters/platforms/bytedance/wrapper/builtin/HTMLElement.js
Normal file
54
adapters/platforms/bytedance/wrapper/builtin/HTMLElement.js
Normal file
@@ -0,0 +1,54 @@
|
||||
import Element from './Element'
|
||||
import { noop } from './util/index.js'
|
||||
import { innerWidth, innerHeight } from './WindowProperties'
|
||||
|
||||
export default class HTMLElement extends Element {
|
||||
className = ''
|
||||
childern = []
|
||||
style = {
|
||||
width: `${innerWidth}px`,
|
||||
height: `${innerHeight}px`
|
||||
}
|
||||
|
||||
insertBefore = noop
|
||||
|
||||
innerHTML = ''
|
||||
|
||||
constructor(tagName = '') {
|
||||
super()
|
||||
this.tagName = tagName.toUpperCase()
|
||||
}
|
||||
|
||||
setAttribute(name, value) {
|
||||
this[name] = value
|
||||
}
|
||||
|
||||
getAttribute(name) {
|
||||
return this[name]
|
||||
}
|
||||
|
||||
get clientWidth() {
|
||||
const ret = parseInt(this.style.fontSize, 10) * this.innerHTML.length
|
||||
|
||||
return Number.isNaN(ret) ? 0 : ret
|
||||
}
|
||||
|
||||
get clientHeight() {
|
||||
const ret = parseInt(this.style.fontSize, 10)
|
||||
|
||||
return Number.isNaN(ret) ? 0 : ret
|
||||
}
|
||||
|
||||
getBoundingClientRect() {
|
||||
return {
|
||||
top: 0,
|
||||
left: 0,
|
||||
width: innerWidth,
|
||||
height: innerHeight
|
||||
}
|
||||
}
|
||||
|
||||
focus() {
|
||||
|
||||
}
|
||||
}
|
@@ -0,0 +1,16 @@
|
||||
// import HTMLElement from './HTMLElement';
|
||||
|
||||
// export default class HTMLImageElement extends HTMLElement
|
||||
// {
|
||||
// constructor(){
|
||||
// super('img')
|
||||
// }
|
||||
// };
|
||||
|
||||
import HTMLElement from './HTMLElement'
|
||||
|
||||
const imageConstructor = tt.createImage().constructor;
|
||||
|
||||
// imageConstructor.__proto__.__proto__ = new HTMLElement();
|
||||
|
||||
export default imageConstructor;
|
@@ -0,0 +1,25 @@
|
||||
import HTMLElement from './HTMLElement'
|
||||
|
||||
export default class HTMLMediaElement extends HTMLElement {
|
||||
constructor(type) {
|
||||
super(type)
|
||||
}
|
||||
|
||||
addTextTrack() {
|
||||
}
|
||||
|
||||
captureStream() {
|
||||
}
|
||||
|
||||
fastSeek() {
|
||||
}
|
||||
|
||||
load() {
|
||||
}
|
||||
|
||||
pause() {
|
||||
}
|
||||
|
||||
play() {
|
||||
}
|
||||
}
|
@@ -0,0 +1,8 @@
|
||||
import HTMLMediaElement from './HTMLMediaElement';
|
||||
|
||||
export default class HTMLVideoElement extends HTMLMediaElement
|
||||
{
|
||||
constructor(){
|
||||
super('video')
|
||||
}
|
||||
};
|
9
adapters/platforms/bytedance/wrapper/builtin/Image.js
Normal file
9
adapters/platforms/bytedance/wrapper/builtin/Image.js
Normal file
@@ -0,0 +1,9 @@
|
||||
import HTMLImageElement from './HTMLImageElement'
|
||||
|
||||
export default function() {
|
||||
const image = tt.createImage();
|
||||
|
||||
// image.__proto__.__proto__.__proto__ = new HTMLImageElement();
|
||||
|
||||
return image;
|
||||
};
|
@@ -0,0 +1,5 @@
|
||||
export default class ImageBitmap {
|
||||
constructor() {
|
||||
// TODO
|
||||
}
|
||||
}
|
34
adapters/platforms/bytedance/wrapper/builtin/Node.js
Normal file
34
adapters/platforms/bytedance/wrapper/builtin/Node.js
Normal file
@@ -0,0 +1,34 @@
|
||||
import EventTarget from './EventTarget.js'
|
||||
|
||||
export default class Node extends EventTarget {
|
||||
constructor() {
|
||||
super()
|
||||
}
|
||||
|
||||
childNodes = []
|
||||
|
||||
appendChild(node) {
|
||||
this.childNodes.push(node)
|
||||
// if (node instanceof Node) {
|
||||
// this.childNodes.push(node)
|
||||
// } else {
|
||||
// throw new TypeError('Failed to executed \'appendChild\' on \'Node\': parameter 1 is not of type \'Node\'.')
|
||||
// }
|
||||
}
|
||||
|
||||
cloneNode() {
|
||||
const copyNode = Object.create(this)
|
||||
|
||||
Object.assign(copyNode, this)
|
||||
return copyNode
|
||||
}
|
||||
|
||||
removeChild(node) {
|
||||
const index = this.childNodes.findIndex((child) => child === node)
|
||||
|
||||
if (index > -1) {
|
||||
return this.childNodes.splice(index, 1)
|
||||
}
|
||||
return null
|
||||
}
|
||||
}
|
@@ -0,0 +1,5 @@
|
||||
export default class WebGLRenderingContext {
|
||||
constructor() {
|
||||
// TODO
|
||||
}
|
||||
}
|
87
adapters/platforms/bytedance/wrapper/builtin/WebSocket.js
Normal file
87
adapters/platforms/bytedance/wrapper/builtin/WebSocket.js
Normal file
@@ -0,0 +1,87 @@
|
||||
const _socketTask = new WeakMap()
|
||||
|
||||
export default class WebSocket {
|
||||
static CONNECTING = 0 // The connection is not yet open.
|
||||
static OPEN = 1 // The connection is open and ready to communicate.
|
||||
static CLOSING = 2 // The connection is in the process of closing.
|
||||
static CLOSED = 3 // The connection is closed or couldn't be opened.
|
||||
|
||||
binaryType = '' // TODO 更新 binaryType
|
||||
bufferedAmount = 0 // TODO 更新 bufferedAmount
|
||||
extensions = ''
|
||||
|
||||
onclose = null
|
||||
onerror = null
|
||||
onmessage = null
|
||||
onopen = null
|
||||
|
||||
protocol = '' // TODO 小程序内目前获取不到,实际上需要根据服务器选择的 sub-protocol 返回
|
||||
readyState = 3
|
||||
|
||||
constructor(url, protocols = []) {
|
||||
if (typeof url !== 'string' || !(/(^ws:\/\/)|(^wss:\/\/)/).test(url)) {
|
||||
throw new TypeError(`Failed to construct 'WebSocket': The URL '${url}' is invalid`)
|
||||
}
|
||||
|
||||
this.url = url
|
||||
this.readyState = WebSocket.CONNECTING
|
||||
|
||||
const socketTask = tt.connectSocket({
|
||||
url,
|
||||
protocols: Array.isArray(protocols) ? protocols : [protocols],
|
||||
tcpNoDelay: true
|
||||
})
|
||||
|
||||
_socketTask.set(this, socketTask)
|
||||
|
||||
socketTask.onClose((res) => {
|
||||
this.readyState = WebSocket.CLOSED
|
||||
if (typeof this.onclose === 'function') {
|
||||
this.onclose(res)
|
||||
}
|
||||
})
|
||||
|
||||
socketTask.onMessage((res) => {
|
||||
if (typeof this.onmessage === 'function') {
|
||||
this.onmessage(res)
|
||||
}
|
||||
})
|
||||
|
||||
socketTask.onOpen(() => {
|
||||
this.readyState = WebSocket.OPEN
|
||||
if (typeof this.onopen === 'function') {
|
||||
this.onopen()
|
||||
}
|
||||
})
|
||||
|
||||
socketTask.onError((res) => {
|
||||
if (typeof this.onerror === 'function') {
|
||||
this.onerror(new Error(res.errMsg))
|
||||
}
|
||||
})
|
||||
|
||||
return this
|
||||
}
|
||||
|
||||
close(code, reason) {
|
||||
this.readyState = WebSocket.CLOSING
|
||||
const socketTask = _socketTask.get(this)
|
||||
|
||||
socketTask.close({
|
||||
code,
|
||||
reason
|
||||
})
|
||||
}
|
||||
|
||||
send(data) {
|
||||
if (typeof data !== 'string' && !(data instanceof ArrayBuffer) && !ArrayBuffer.isView(data)) {
|
||||
throw new TypeError(`Failed to send message: The data ${data} is invalid`)
|
||||
}
|
||||
|
||||
const socketTask = _socketTask.get(this)
|
||||
|
||||
socketTask.send({
|
||||
data
|
||||
})
|
||||
}
|
||||
}
|
@@ -0,0 +1,21 @@
|
||||
const { screenWidth, screenHeight, devicePixelRatio } = tt.getSystemInfoSync()
|
||||
|
||||
export const innerWidth = screenWidth
|
||||
export const innerHeight = screenHeight
|
||||
export { devicePixelRatio }
|
||||
export const screen = {
|
||||
width: screenWidth,
|
||||
height: screenHeight,
|
||||
availWidth: innerWidth,
|
||||
availHeight: innerHeight,
|
||||
availLeft: 0,
|
||||
availTop: 0,
|
||||
}
|
||||
|
||||
export const performance = {
|
||||
now: Date.now
|
||||
};
|
||||
|
||||
export const ontouchstart = null;
|
||||
export const ontouchmove = null;
|
||||
export const ontouchend = null;
|
5
adapters/platforms/bytedance/wrapper/builtin/Worker.js
Normal file
5
adapters/platforms/bytedance/wrapper/builtin/Worker.js
Normal file
@@ -0,0 +1,5 @@
|
||||
export default function(file) {
|
||||
const worker = tt.createWorker(file);
|
||||
|
||||
return worker;
|
||||
};
|
170
adapters/platforms/bytedance/wrapper/builtin/XMLHttpRequest.js
Normal file
170
adapters/platforms/bytedance/wrapper/builtin/XMLHttpRequest.js
Normal file
@@ -0,0 +1,170 @@
|
||||
import EventTarget from './EventTarget.js'
|
||||
|
||||
const _url = new WeakMap()
|
||||
const _method = new WeakMap()
|
||||
const _requestHeader = new WeakMap()
|
||||
const _responseHeader = new WeakMap()
|
||||
const _requestTask = new WeakMap()
|
||||
|
||||
function _triggerEvent(type, ...args) {
|
||||
if (typeof this[`on${type}`] === 'function') {
|
||||
this[`on${type}`].apply(this, args)
|
||||
}
|
||||
}
|
||||
|
||||
function _changeReadyState(readyState) {
|
||||
this.readyState = readyState
|
||||
_triggerEvent.call(this, 'readystatechange')
|
||||
}
|
||||
|
||||
export default class XMLHttpRequest extends EventTarget {
|
||||
// TODO 没法模拟 HEADERS_RECEIVED 和 LOADING 两个状态
|
||||
static UNSEND = 0
|
||||
static OPENED = 1
|
||||
static HEADERS_RECEIVED = 2
|
||||
static LOADING = 3
|
||||
static DONE = 4
|
||||
|
||||
/*
|
||||
* TODO 这一批事件应该是在 XMLHttpRequestEventTarget.prototype 上面的
|
||||
*/
|
||||
onabort = null
|
||||
onerror = null
|
||||
onload = null
|
||||
onloadstart = null
|
||||
onprogress = null
|
||||
ontimeout = null
|
||||
onloadend = null
|
||||
|
||||
onreadystatechange = null
|
||||
readyState = 0
|
||||
response = null
|
||||
responseText = null
|
||||
responseType = ''
|
||||
responseXML = null
|
||||
status = 0
|
||||
statusText = ''
|
||||
upload = {}
|
||||
withCredentials = false
|
||||
|
||||
constructor() {
|
||||
super();
|
||||
|
||||
_requestHeader.set(this, {
|
||||
'content-type': 'application/x-www-form-urlencoded'
|
||||
})
|
||||
_responseHeader.set(this, {})
|
||||
}
|
||||
|
||||
abort() {
|
||||
const myRequestTask = _requestTask.get(this)
|
||||
|
||||
if (myRequestTask) {
|
||||
myRequestTask.abort()
|
||||
}
|
||||
}
|
||||
|
||||
getAllResponseHeaders() {
|
||||
const responseHeader = _responseHeader.get(this)
|
||||
|
||||
return Object.keys(responseHeader).map((header) => {
|
||||
return `${header}: ${responseHeader[header]}`
|
||||
}).join('\n')
|
||||
}
|
||||
|
||||
getResponseHeader(header) {
|
||||
return _responseHeader.get(this)[header]
|
||||
}
|
||||
|
||||
open(method, url/* async, user, password 这几个参数在小程序内不支持*/) {
|
||||
_method.set(this, method)
|
||||
_url.set(this, url)
|
||||
_changeReadyState.call(this, XMLHttpRequest.OPENED)
|
||||
}
|
||||
|
||||
overrideMimeType() {
|
||||
}
|
||||
|
||||
send(data = '') {
|
||||
if (this.readyState !== XMLHttpRequest.OPENED) {
|
||||
throw new Error("Failed to execute 'send' on 'XMLHttpRequest': The object's state must be OPENED.")
|
||||
} else {
|
||||
let myRequestTask = tt.request({
|
||||
data,
|
||||
url: _url.get(this),
|
||||
method: _method.get(this),
|
||||
header: _requestHeader.get(this),
|
||||
dataType: 'other',
|
||||
responseType: this.responseType === 'arraybuffer' ? 'arraybuffer' : 'text',
|
||||
success: ({ data, statusCode, header }) => {
|
||||
this.status = statusCode
|
||||
_responseHeader.set(this, header)
|
||||
_triggerEvent.call(this, 'loadstart')
|
||||
_changeReadyState.call(this, XMLHttpRequest.HEADERS_RECEIVED)
|
||||
_changeReadyState.call(this, XMLHttpRequest.LOADING)
|
||||
|
||||
switch (this.responseType) {
|
||||
case 'json':
|
||||
this.responseText = data;
|
||||
try {
|
||||
this.response = JSON.parse(data);
|
||||
}
|
||||
catch (e) {
|
||||
this.response = null;
|
||||
}
|
||||
break;
|
||||
case '':
|
||||
case 'text':
|
||||
this.responseText = this.response = data;
|
||||
break;
|
||||
case 'arraybuffer':
|
||||
this.response = data;
|
||||
this.responseText = '';
|
||||
var bytes = new Uint8Array(data);
|
||||
var len = bytes.byteLength;
|
||||
|
||||
for (var i = 0; i < len; i++) {
|
||||
this.responseText += String.fromCharCode(bytes[i]);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
this.response = null;
|
||||
}
|
||||
_changeReadyState.call(this, XMLHttpRequest.DONE)
|
||||
_triggerEvent.call(this, 'load')
|
||||
_triggerEvent.call(this, 'loadend')
|
||||
},
|
||||
fail: ({ errMsg }) => {
|
||||
// TODO 规范错误
|
||||
if (errMsg.indexOf('abort') !== -1) {
|
||||
_triggerEvent.call(this, 'abort')
|
||||
} else if (errMsg.indexOf('timeout') !== -1) {
|
||||
_triggerEvent.call(this, 'timeout')
|
||||
} else {
|
||||
_triggerEvent.call(this, 'error', errMsg)
|
||||
}
|
||||
_triggerEvent.call(this, 'loadend')
|
||||
}
|
||||
})
|
||||
|
||||
_requestTask.set(this, myRequestTask);
|
||||
}
|
||||
}
|
||||
|
||||
setRequestHeader(header, value) {
|
||||
const myHeader = _requestHeader.get(this)
|
||||
|
||||
myHeader[header] = value
|
||||
_requestHeader.set(this, myHeader)
|
||||
}
|
||||
|
||||
addEventListener(type, listener) {
|
||||
if (typeof listener === 'function') {
|
||||
let _this = this
|
||||
let event = { target: _this }
|
||||
this['on' + type] = function (event) {
|
||||
listener.call(_this, event)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
127
adapters/platforms/bytedance/wrapper/builtin/document.js
Normal file
127
adapters/platforms/bytedance/wrapper/builtin/document.js
Normal file
@@ -0,0 +1,127 @@
|
||||
import * as window from './window'
|
||||
import HTMLElement from './HTMLElement'
|
||||
import HTMLVideoElement from './HTMLVideoElement'
|
||||
import Image from './Image'
|
||||
import Audio from './Audio'
|
||||
import Canvas from './Canvas'
|
||||
import './EventIniter/index.js'
|
||||
|
||||
const events = {}
|
||||
|
||||
const document = {
|
||||
readyState: 'complete',
|
||||
visibilityState: 'visible',
|
||||
documentElement: window,
|
||||
hidden: false,
|
||||
style: {},
|
||||
location: window.location,
|
||||
ontouchstart: null,
|
||||
ontouchmove: null,
|
||||
ontouchend: null,
|
||||
|
||||
head: new HTMLElement('head'),
|
||||
body: new HTMLElement('body'),
|
||||
|
||||
createElement(tagName) {
|
||||
if (tagName === 'canvas') {
|
||||
return new Canvas()
|
||||
} else if (tagName === 'audio') {
|
||||
return new Audio()
|
||||
} else if (tagName === 'img') {
|
||||
return new Image()
|
||||
}else if (tagName === 'video') {
|
||||
return new HTMLVideoElement()
|
||||
}
|
||||
|
||||
return new HTMLElement(tagName)
|
||||
},
|
||||
|
||||
createElementNS(nameSpace, tagName) {
|
||||
return this.createElement(tagName);
|
||||
},
|
||||
|
||||
getElementById(id) {
|
||||
if (id === window.canvas.id) {
|
||||
return window.canvas
|
||||
}
|
||||
return null
|
||||
},
|
||||
|
||||
getElementsByTagName(tagName) {
|
||||
if (tagName === 'head') {
|
||||
return [document.head]
|
||||
} else if (tagName === 'body') {
|
||||
return [document.body]
|
||||
} else if (tagName === 'canvas') {
|
||||
return [window.canvas]
|
||||
}
|
||||
return []
|
||||
},
|
||||
|
||||
getElementsByName(tagName) {
|
||||
if (tagName === 'head') {
|
||||
return [document.head]
|
||||
} else if (tagName === 'body') {
|
||||
return [document.body]
|
||||
} else if (tagName === 'canvas') {
|
||||
return [window.canvas]
|
||||
}
|
||||
return []
|
||||
},
|
||||
|
||||
querySelector(query) {
|
||||
if (query === 'head') {
|
||||
return document.head
|
||||
} else if (query === 'body') {
|
||||
return document.body
|
||||
} else if (query === 'canvas') {
|
||||
return window.canvas
|
||||
} else if (query === `#${window.canvas.id}`) {
|
||||
return window.canvas
|
||||
}
|
||||
return null
|
||||
},
|
||||
|
||||
querySelectorAll(query) {
|
||||
if (query === 'head') {
|
||||
return [document.head]
|
||||
} else if (query === 'body') {
|
||||
return [document.body]
|
||||
} else if (query === 'canvas') {
|
||||
return [window.canvas]
|
||||
}
|
||||
return []
|
||||
},
|
||||
|
||||
addEventListener(type, listener) {
|
||||
if (!events[type]) {
|
||||
events[type] = []
|
||||
}
|
||||
events[type].push(listener)
|
||||
},
|
||||
|
||||
removeEventListener(type, listener) {
|
||||
const listeners = events[type]
|
||||
|
||||
if (listeners && listeners.length > 0) {
|
||||
for (let i = listeners.length; i--; i > 0) {
|
||||
if (listeners[i] === listener) {
|
||||
listeners.splice(i, 1)
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
dispatchEvent(event) {
|
||||
const listeners = events[event.type]
|
||||
|
||||
if (listeners) {
|
||||
for (let i = 0; i < listeners.length; i++) {
|
||||
listeners[i](event)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export default document
|
55
adapters/platforms/bytedance/wrapper/builtin/index.js
Normal file
55
adapters/platforms/bytedance/wrapper/builtin/index.js
Normal file
@@ -0,0 +1,55 @@
|
||||
import * as _window from './window'
|
||||
import document from './document'
|
||||
import HTMLElement from './HTMLElement'
|
||||
|
||||
const global = GameGlobal
|
||||
|
||||
function inject () {
|
||||
_window.document = document;
|
||||
|
||||
_window.addEventListener = (type, listener) => {
|
||||
_window.document.addEventListener(type, listener)
|
||||
}
|
||||
_window.removeEventListener = (type, listener) => {
|
||||
_window.document.removeEventListener(type, listener)
|
||||
}
|
||||
_window.dispatchEvent = _window.document.dispatchEvent;
|
||||
|
||||
const { platform } = tt.getSystemInfoSync()
|
||||
|
||||
// 开发者工具无法重定义 window
|
||||
if (typeof __devtoolssubcontext === 'undefined' && platform === 'devtools') {
|
||||
for (const key in _window) {
|
||||
const descriptor = Object.getOwnPropertyDescriptor(global, key)
|
||||
|
||||
if (!descriptor || descriptor.configurable === true) {
|
||||
Object.defineProperty(window, key, {
|
||||
value: _window[key]
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
for (const key in _window.document) {
|
||||
const descriptor = Object.getOwnPropertyDescriptor(global.document, key)
|
||||
|
||||
if (!descriptor || descriptor.configurable === true) {
|
||||
Object.defineProperty(global.document, key, {
|
||||
value: _window.document[key]
|
||||
})
|
||||
}
|
||||
}
|
||||
window.parent = window
|
||||
} else {
|
||||
for (const key in _window) {
|
||||
global[key] = _window[key]
|
||||
}
|
||||
global.window = _window
|
||||
window = global
|
||||
window.top = window.parent = window
|
||||
}
|
||||
}
|
||||
|
||||
if (!GameGlobal.__isAdapterInjected) {
|
||||
GameGlobal.__isAdapterInjected = true
|
||||
inject()
|
||||
}
|
31
adapters/platforms/bytedance/wrapper/builtin/localStorage.js
Normal file
31
adapters/platforms/bytedance/wrapper/builtin/localStorage.js
Normal file
@@ -0,0 +1,31 @@
|
||||
const localStorage = {
|
||||
get length() {
|
||||
const { keys } = tt.getStorageInfoSync()
|
||||
|
||||
return keys.length
|
||||
},
|
||||
|
||||
key(n) {
|
||||
const { keys } = tt.getStorageInfoSync()
|
||||
|
||||
return keys[n]
|
||||
},
|
||||
|
||||
getItem(key) {
|
||||
return tt.getStorageSync(key)
|
||||
},
|
||||
|
||||
setItem(key, value) {
|
||||
return tt.setStorageSync(key, value)
|
||||
},
|
||||
|
||||
removeItem(key) {
|
||||
tt.removeStorageSync(key)
|
||||
},
|
||||
|
||||
clear() {
|
||||
tt.clearStorageSync()
|
||||
}
|
||||
}
|
||||
|
||||
export default localStorage
|
7
adapters/platforms/bytedance/wrapper/builtin/location.js
Normal file
7
adapters/platforms/bytedance/wrapper/builtin/location.js
Normal file
@@ -0,0 +1,7 @@
|
||||
const location = {
|
||||
href: 'game.js',
|
||||
reload() {
|
||||
}
|
||||
}
|
||||
|
||||
export default location
|
38
adapters/platforms/bytedance/wrapper/builtin/navigator.js
Normal file
38
adapters/platforms/bytedance/wrapper/builtin/navigator.js
Normal file
@@ -0,0 +1,38 @@
|
||||
import { noop } from './util/index.js'
|
||||
|
||||
// TODO 需要 tt.getSystemInfo 获取更详细信息
|
||||
const systemInfo = tt.getSystemInfoSync()
|
||||
console.log(systemInfo)
|
||||
|
||||
const system = systemInfo.system;
|
||||
const platform = systemInfo.platform;
|
||||
const language = systemInfo.language;
|
||||
const version = systemInfo.version;
|
||||
|
||||
const android = system.toLowerCase().indexOf('android') !== -1;
|
||||
|
||||
const uaDesc = android ? `Android; CPU ${system}` : `iPhone; CPU iPhone OS ${system} like Mac OS X`;
|
||||
const ua = `Mozilla/5.0 (${uaDesc}) AppleWebKit/603.1.30 (KHTML, like Gecko) Mobile/14E8301 MicroMessenger/${version} MiniGame NetType/WIFI Language/${language}`;
|
||||
|
||||
const navigator = {
|
||||
platform,
|
||||
language: language,
|
||||
appVersion: `5.0 (${uaDesc}) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1`,
|
||||
userAgent: ua,
|
||||
onLine: true, // TODO 用 tt.getNetworkStateChange 和 tt.onNetworkStateChange 来返回真实的状态
|
||||
|
||||
// TODO 用 tt.getLocation 来封装 geolocation
|
||||
geolocation: {
|
||||
getCurrentPosition: noop,
|
||||
watchPosition: noop,
|
||||
clearWatch: noop
|
||||
}
|
||||
}
|
||||
|
||||
if (tt.onNetworkStatusChange) {
|
||||
tt.onNetworkStatusChange(function(event){
|
||||
navigator.onLine = event.isConnected;
|
||||
});
|
||||
}
|
||||
|
||||
export default navigator
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user