[READ-ONLY] Mirror of https://github.com/excaliburjs/Excalibur. 🎮 Your friendly TypeScript 2D game engine for the web 🗡️ excaliburjs.com
excalibur excaliburjs game-development game-engine game-framework gamedev games html5-canvas typescript
2

Configure Feed

Select the types of activity you want to include in your feed.

fix: [#2106] Safari 13.1 Does not boot + Safari Pointers (#2107)

Closes: #2106

## Changes:
- Adds media query API fallback for safari
- Guards against missing Types in safari for pointers

authored by

Erik Onarheim and committed by
GitHub
(Nov 13, 2021, 2:15 PM -0600) a63cbbe9 c0a8822b

+641 -26
+35
.github/workflows/browsersupport.yml
··· 1 + name: Browser Support Tests 2 + env: 3 + BS_USERNAME: ${{ secrets.BS_USERNAME }} 4 + BS_PASSWORD: ${{ secrets.BS_PASSWORD }} 5 + on: 6 + pull_request: 7 + branches: [ main ] 8 + push: 9 + branches: [ main ] 10 + jobs: 11 + build: 12 + runs-on: [ubuntu-latest] 13 + 14 + strategy: 15 + matrix: 16 + node-version: [14.x] 17 + 18 + steps: 19 + - uses: actions/checkout@v2 20 + with: 21 + submodules: true 22 + fetch-depth: 100 23 + - name: Use Node.js ${{ matrix.node-version }} 24 + uses: actions/setup-node@v2 25 + with: 26 + node-version: ${{ matrix.node-version }} 27 + registry-url: 'https://registry.npmjs.org' 28 + - uses: actions/cache@v2 29 + with: 30 + path: ~/.npm 31 + key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} 32 + restore-keys: | 33 + ${{ runner.os }}-node- 34 + - run: npm ci 35 + - run: npm run browserstack
+2
CHANGELOG.md
··· 22 22 23 23 ### Fixed 24 24 25 + - Fixed Safari 13.1 crash when booting Excalibur because of they odd MediaQuery API in older Safari 26 + - Fixed issue where pointers did not work because of missing types 25 27 - Fixed issue with `ArcadeSolver` where stacked/overlapped tiles would double solve the position of the collider for the same overlap 26 28 - Fixed issue where changing the `ex.Sprite.width` or `ex.Sprite.height` did not resize the graphic. 27 29 - Fixed issue where initial Actor anchors set in the constructor were not being set in the graphics component
+201
karma.conf.browsers.js
··· 1 + // Karma configuration 2 + const process = require('process'); 3 + const path = require('path'); 4 + const webpack = require('webpack'); 5 + process.env.CHROME_BIN = require('puppeteer').executablePath(); 6 + 7 + module.exports = (config) => { 8 + config.set({ 9 + // global config of your BrowserStack account 10 + browserStack: { 11 + project: 'Excalibur', 12 + username: process.env.BS_USERNAME, 13 + accessKey: process.env.BS_PASSWORD 14 + }, 15 + singleRun: true, 16 + frameworks: ['jasmine'], 17 + client: { 18 + // Excalibur logs / console logs suppressed when captureConsole = false; 19 + captureConsole: false, 20 + jasmine: { 21 + timeoutInterval: 30000 22 + } 23 + }, 24 + proxies: { 25 + // smooths over loading files because karma prepends '/base/' to everything 26 + '/src/' : '/base/src/' 27 + }, 28 + files: [ 29 + 'src/browsersupport/BrowserSupportSpec.ts', 30 + ], 31 + mime: { 'text/x-typescript': ['ts', 'tsx'] }, 32 + preprocessors: { 33 + './src/browsersupport/BrowserSupportSpec.ts': ['webpack'] 34 + }, 35 + webpack: { 36 + mode: 'none', 37 + devtool: 'source-map', 38 + resolve: { 39 + extensions: ['.ts', '.js'], 40 + alias: { 41 + "@excalibur": path.resolve(__dirname, './src/engine/') 42 + } 43 + }, 44 + plugins: [ 45 + new webpack.DefinePlugin({ 46 + 'process.env.__EX_VERSION': '\'test-runner\'' 47 + }), 48 + ], 49 + module: { 50 + rules: [ 51 + { 52 + test: /\.ts$/, 53 + loader: 'ts-loader', 54 + options: { 55 + projectReferences: true, 56 + configFile: 'tsconfig.json' 57 + } 58 + }, 59 + { 60 + test: /\.css$/, 61 + use: ['css-loader'] 62 + }, 63 + { 64 + test: /\.(png|jpg|gif|mp3)$/i, 65 + use: [ 66 + { 67 + loader: 'url-loader', 68 + options: { 69 + limit: 8192 70 + } 71 + } 72 + ] 73 + }, 74 + { 75 + test: /\.glsl$/, 76 + use: ['raw-loader'] 77 + }, 78 + { 79 + test: /\.ts$/, 80 + enforce: 'post', 81 + include: path.resolve('src/engine/'), 82 + use: { 83 + loader: 'istanbul-instrumenter-loader', 84 + options: { esModules: true } 85 + } 86 + } 87 + ] 88 + } 89 + }, 90 + webpackMiddleware: { 91 + // webpack-dev-middleware configuration 92 + // i. e. 93 + stats: 'normal' 94 + }, 95 + reporters: ['progress', 'summary'], 96 + summaryReporter: { 97 + // 'failed', 'skipped' or 'all' 98 + show: 'all', 99 + // Limit the spec label to this length 100 + specLength: 50, 101 + // Show an 'all' column as a summary 102 + overviewColumn: true, 103 + // Show a list of test clients, 'always', 'never' or 'ifneeded' 104 + browserList: 'always' 105 + }, 106 + browserNoActivityTimeout: 60000, // appveyor is slow :( 107 + // define browsers 108 + customLaunchers: { 109 + bs_latest_chrome_win10: { 110 + base: 'BrowserStack', 111 + browser: 'Chrome', 112 + browser_version: 'latest', 113 + os: 'Windows', 114 + os_version: '10' 115 + }, 116 + bs_latest_minus_1_chrome_win10: { 117 + base: 'BrowserStack', 118 + browser: 'Chrome', 119 + browser_version: 'latest-1', 120 + os: 'Windows', 121 + os_version: '10' 122 + }, 123 + bs_latest_firefox_win10: { 124 + base: 'BrowserStack', 125 + browser: 'Firefox', 126 + browser_version: 'latest', 127 + os: 'Windows', 128 + os_version: '10' 129 + }, 130 + bs_latest_minus_1_firefox_win10: { 131 + base: 'BrowserStack', 132 + browser: 'Firefox', 133 + browser_version: 'latest-1', 134 + os: 'Windows', 135 + os_version: '10' 136 + }, 137 + bs_latest_opera_win10: { 138 + base: 'BrowserStack', 139 + browser: 'Opera', 140 + browser_version: 'latest', 141 + os: 'Windows', 142 + os_version: '10' 143 + }, 144 + bs_latest_minus_1_opera_win10: { 145 + base: 'BrowserStack', 146 + browser: 'Opera', 147 + browser_version: 'latest-1', 148 + os: 'Windows', 149 + os_version: '10' 150 + }, 151 + bs_safari_14_1: { 152 + base: 'BrowserStack', 153 + browser: 'safari', 154 + browser_version: '14.1', 155 + os: 'OS X', 156 + os_version: 'Big Sur' 157 + }, 158 + bs_safari_13_1: { 159 + base: 'BrowserStack', 160 + browser: 'safari', 161 + browser_version: '13.1', 162 + os: 'OS X', 163 + os_version: 'Catalina' 164 + }, 165 + bs_safari_12_1: { 166 + base: 'BrowserStack', 167 + browser: 'safari', 168 + browser_version: '12.1', 169 + os: 'OS X', 170 + os_version: 'Mojave' 171 + }, 172 + }, 173 + 174 + browsers: [ 175 + 'bs_latest_chrome_win10', 176 + 'bs_latest_minus_1_chrome_win10', 177 + 'bs_latest_firefox_win10', 178 + 'bs_latest_minus_1_firefox_win10', 179 + 'bs_latest_opera_win10', 180 + 'bs_latest_minus_1_opera_win10', 181 + 'bs_safari_14_1', 182 + 'bs_safari_13_1', 183 + 'bs_safari_12_1' 184 + ] 185 + // browsers: ['ChromeHeadless_with_audio'], 186 + // customLaunchers: { 187 + // ChromeHeadless_with_audio: { 188 + // base: 'ChromeHeadless', 189 + // flags: ['--autoplay-policy=no-user-gesture-required', '--mute-audio'] 190 + // }, 191 + // ChromeHeadless_with_debug: { 192 + // base: 'ChromeHeadless', 193 + // flags: ['--remote-debugging-port=9334', '--no-sandbox', '--disable-web-security'] 194 + // }, 195 + // Chrome_with_debug: { 196 + // base: 'Chrome', 197 + // flags: ['--remote-debugging-port=9334', '--no-sandbox'] 198 + // } 199 + // } 200 + }); 201 + };
+285 -14
package-lock.json
··· 9711 9711 }, 9712 9712 "async": { 9713 9713 "version": "1.5.2", 9714 - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", 9714 + "resolved": "http://registry.npmjs.org/async/-/async-1.5.2.tgz", 9715 9715 "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", 9716 9716 "dev": true 9717 9717 }, ··· 9796 9796 "dependencies": { 9797 9797 "jsesc": { 9798 9798 "version": "1.3.0", 9799 - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", 9799 + "resolved": "http://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", 9800 9800 "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", 9801 9801 "dev": true 9802 9802 }, ··· 10657 10657 } 10658 10658 } 10659 10659 }, 10660 + "browserstack": { 10661 + "version": "1.5.3", 10662 + "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.5.3.tgz", 10663 + "integrity": "sha512-AO+mECXsW4QcqC9bxwM29O7qWa7bJT94uBFzeb5brylIQwawuEziwq20dPYbins95GlWzOawgyDNdjYAo32EKg==", 10664 + "dev": true, 10665 + "requires": { 10666 + "https-proxy-agent": "^2.2.1" 10667 + }, 10668 + "dependencies": { 10669 + "agent-base": { 10670 + "version": "4.3.0", 10671 + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", 10672 + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", 10673 + "dev": true, 10674 + "requires": { 10675 + "es6-promisify": "^5.0.0" 10676 + } 10677 + }, 10678 + "debug": { 10679 + "version": "3.2.7", 10680 + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", 10681 + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", 10682 + "dev": true, 10683 + "requires": { 10684 + "ms": "^2.1.1" 10685 + } 10686 + }, 10687 + "https-proxy-agent": { 10688 + "version": "2.2.4", 10689 + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", 10690 + "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", 10691 + "dev": true, 10692 + "requires": { 10693 + "agent-base": "^4.3.0", 10694 + "debug": "^3.1.0" 10695 + } 10696 + }, 10697 + "ms": { 10698 + "version": "2.1.3", 10699 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 10700 + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 10701 + "dev": true 10702 + } 10703 + } 10704 + }, 10705 + "browserstack-local": { 10706 + "version": "1.4.8", 10707 + "resolved": "https://registry.npmjs.org/browserstack-local/-/browserstack-local-1.4.8.tgz", 10708 + "integrity": "sha512-s+mc3gTOJwELdLWi4qFVKtGwMbb5JWsR+JxKlMaJkRJxoZ0gg3WREgPxAN0bm6iU5+S4Bi0sz0oxBRZT8BiNsQ==", 10709 + "dev": true, 10710 + "requires": { 10711 + "https-proxy-agent": "^4.0.0", 10712 + "is-running": "^2.1.0", 10713 + "ps-tree": "=1.2.0", 10714 + "temp-fs": "^0.9.9" 10715 + }, 10716 + "dependencies": { 10717 + "agent-base": { 10718 + "version": "5.1.1", 10719 + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", 10720 + "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==", 10721 + "dev": true 10722 + }, 10723 + "debug": { 10724 + "version": "4.3.2", 10725 + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", 10726 + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", 10727 + "dev": true, 10728 + "requires": { 10729 + "ms": "2.1.2" 10730 + } 10731 + }, 10732 + "https-proxy-agent": { 10733 + "version": "4.0.0", 10734 + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", 10735 + "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", 10736 + "dev": true, 10737 + "requires": { 10738 + "agent-base": "5", 10739 + "debug": "4" 10740 + } 10741 + }, 10742 + "ms": { 10743 + "version": "2.1.2", 10744 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 10745 + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 10746 + "dev": true 10747 + } 10748 + } 10749 + }, 10660 10750 "bser": { 10661 10751 "version": "2.1.1", 10662 10752 "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", ··· 12993 13083 "integrity": "sha512-n0XTVMGps+Deyr38jtqKPR5F5hb9owYeRQcKJW39eFvzUk/u/9Ww315werRzbiNMnHCUw/YHDPBphTlEnzdi+A==", 12994 13084 "dev": true 12995 13085 }, 13086 + "es6-promise": { 13087 + "version": "4.2.8", 13088 + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", 13089 + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", 13090 + "dev": true 13091 + }, 13092 + "es6-promisify": { 13093 + "version": "5.0.0", 13094 + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", 13095 + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", 13096 + "dev": true, 13097 + "requires": { 13098 + "es6-promise": "^4.0.3" 13099 + } 13100 + }, 12996 13101 "es6-shim": { 12997 13102 "version": "0.35.6", 12998 13103 "resolved": "https://registry.npmjs.org/es6-shim/-/es6-shim-0.35.6.tgz", ··· 13526 13631 "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", 13527 13632 "dev": true 13528 13633 }, 13634 + "event-stream": { 13635 + "version": "3.3.4", 13636 + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", 13637 + "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", 13638 + "dev": true, 13639 + "requires": { 13640 + "duplexer": "~0.1.1", 13641 + "from": "~0", 13642 + "map-stream": "~0.1.0", 13643 + "pause-stream": "0.0.11", 13644 + "split": "0.3", 13645 + "stream-combiner": "~0.0.4", 13646 + "through": "~2.3.1" 13647 + } 13648 + }, 13529 13649 "eventemitter3": { 13530 13650 "version": "4.0.7", 13531 13651 "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", ··· 14392 14512 "version": "0.5.2", 14393 14513 "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 14394 14514 "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", 14515 + "dev": true 14516 + }, 14517 + "from": { 14518 + "version": "0.1.7", 14519 + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", 14520 + "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", 14395 14521 "dev": true 14396 14522 }, 14397 14523 "from2": { ··· 15597 15723 }, 15598 15724 "is-accessor-descriptor": { 15599 15725 "version": "0.1.6", 15600 - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", 15726 + "resolved": "http://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", 15601 15727 "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", 15602 15728 "dev": true, 15603 15729 "requires": { ··· 15707 15833 }, 15708 15834 "is-data-descriptor": { 15709 15835 "version": "0.1.4", 15710 - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", 15836 + "resolved": "http://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", 15711 15837 "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", 15712 15838 "dev": true, 15713 15839 "requires": { ··· 15898 16024 "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", 15899 16025 "dev": true 15900 16026 }, 16027 + "is-running": { 16028 + "version": "2.1.0", 16029 + "resolved": "https://registry.npmjs.org/is-running/-/is-running-2.1.0.tgz", 16030 + "integrity": "sha1-MKc/9cw4VOT8JUkICen1q/jeCeA=", 16031 + "dev": true 16032 + }, 15901 16033 "is-set": { 15902 16034 "version": "2.0.2", 15903 16035 "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", ··· 16087 16219 }, 16088 16220 "fast-deep-equal": { 16089 16221 "version": "1.1.0", 16090 - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", 16222 + "resolved": "http://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", 16091 16223 "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", 16092 16224 "dev": true 16093 16225 }, ··· 16542 16674 }, 16543 16675 "json5": { 16544 16676 "version": "0.5.1", 16545 - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", 16677 + "resolved": "http://registry.npmjs.org/json5/-/json5-0.5.1.tgz", 16546 16678 "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", 16547 16679 "dev": true 16548 16680 }, ··· 16644 16776 } 16645 16777 } 16646 16778 }, 16779 + "karma-browserstack-launcher": { 16780 + "version": "1.6.0", 16781 + "resolved": "https://registry.npmjs.org/karma-browserstack-launcher/-/karma-browserstack-launcher-1.6.0.tgz", 16782 + "integrity": "sha512-Y/UWPdHZkHIVH2To4GWHCTzmrsB6H7PBWy6pw+TWz5sr4HW2mcE+Uj6qWgoVNxvQU1Pfn5LQQzI6EQ65p8QbiQ==", 16783 + "dev": true, 16784 + "requires": { 16785 + "browserstack": "~1.5.1", 16786 + "browserstack-local": "^1.3.7", 16787 + "q": "~1.5.0" 16788 + } 16789 + }, 16647 16790 "karma-chrome-launcher": { 16648 16791 "version": "3.1.0", 16649 16792 "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.0.tgz", ··· 16753 16896 "dev": true, 16754 16897 "requires": { 16755 16898 "jasmine-core": "^3.6.0" 16899 + } 16900 + }, 16901 + "karma-summary-reporter": { 16902 + "version": "3.0.0", 16903 + "resolved": "https://registry.npmjs.org/karma-summary-reporter/-/karma-summary-reporter-3.0.0.tgz", 16904 + "integrity": "sha512-E8O18XzS1UZ+j5fd/MPKFhg+IvzxenHudfAXocrz3zVS/yfVmurHZvmCI/hHeNo4q6ItIA3yAUThh1ZIM7AkKw==", 16905 + "dev": true, 16906 + "requires": { 16907 + "chalk": "^4.0.0" 16908 + }, 16909 + "dependencies": { 16910 + "ansi-styles": { 16911 + "version": "4.3.0", 16912 + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 16913 + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 16914 + "dev": true, 16915 + "requires": { 16916 + "color-convert": "^2.0.1" 16917 + } 16918 + }, 16919 + "chalk": { 16920 + "version": "4.1.2", 16921 + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 16922 + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 16923 + "dev": true, 16924 + "requires": { 16925 + "ansi-styles": "^4.1.0", 16926 + "supports-color": "^7.1.0" 16927 + } 16928 + }, 16929 + "color-convert": { 16930 + "version": "2.0.1", 16931 + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 16932 + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 16933 + "dev": true, 16934 + "requires": { 16935 + "color-name": "~1.1.4" 16936 + } 16937 + }, 16938 + "color-name": { 16939 + "version": "1.1.4", 16940 + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 16941 + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 16942 + "dev": true 16943 + }, 16944 + "has-flag": { 16945 + "version": "4.0.0", 16946 + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 16947 + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 16948 + "dev": true 16949 + }, 16950 + "supports-color": { 16951 + "version": "7.2.0", 16952 + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 16953 + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 16954 + "dev": true, 16955 + "requires": { 16956 + "has-flag": "^4.0.0" 16957 + } 16958 + } 16756 16959 } 16757 16960 }, 16758 16961 "karma-webpack": { ··· 17071 17274 "integrity": "sha1-beJlMXSt+12e3DPGnT6Sobdvrwg=", 17072 17275 "dev": true 17073 17276 }, 17277 + "map-stream": { 17278 + "version": "0.1.0", 17279 + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", 17280 + "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", 17281 + "dev": true 17282 + }, 17074 17283 "map-visit": { 17075 17284 "version": "1.0.0", 17076 17285 "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", ··· 17165 17374 }, 17166 17375 "media-typer": { 17167 17376 "version": "0.3.0", 17168 - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 17377 + "resolved": "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 17169 17378 "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", 17170 17379 "dev": true 17171 17380 }, ··· 18232 18441 }, 18233 18442 "path-is-absolute": { 18234 18443 "version": "1.0.1", 18235 - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 18444 + "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 18236 18445 "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 18237 18446 "dev": true 18238 18447 }, ··· 18266 18475 "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", 18267 18476 "dev": true 18268 18477 }, 18478 + "pause-stream": { 18479 + "version": "0.0.11", 18480 + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", 18481 + "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", 18482 + "dev": true, 18483 + "requires": { 18484 + "through": "~2.3" 18485 + } 18486 + }, 18269 18487 "pbkdf2": { 18270 18488 "version": "3.1.2", 18271 18489 "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", ··· 18698 18916 "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", 18699 18917 "dev": true 18700 18918 }, 18919 + "ps-tree": { 18920 + "version": "1.2.0", 18921 + "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.2.0.tgz", 18922 + "integrity": "sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==", 18923 + "dev": true, 18924 + "requires": { 18925 + "event-stream": "=3.3.4" 18926 + } 18927 + }, 18701 18928 "pseudomap": { 18702 18929 "version": "1.0.2", 18703 18930 "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", ··· 18829 19056 } 18830 19057 } 18831 19058 }, 19059 + "q": { 19060 + "version": "1.5.1", 19061 + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", 19062 + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", 19063 + "dev": true 19064 + }, 18832 19065 "qjobs": { 18833 19066 "version": "1.2.0", 18834 19067 "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", ··· 19412 19645 }, 19413 19646 "readable-stream": { 19414 19647 "version": "2.3.6", 19415 - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 19648 + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 19416 19649 "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 19417 19650 "dev": true, 19418 19651 "requires": { ··· 20039 20272 }, 20040 20273 "resolve": { 20041 20274 "version": "1.1.7", 20042 - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", 20275 + "resolved": "http://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", 20043 20276 "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", 20044 20277 "dev": true 20045 20278 }, ··· 20146 20379 }, 20147 20380 "safe-regex": { 20148 20381 "version": "1.1.0", 20149 - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", 20382 + "resolved": "http://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", 20150 20383 "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", 20151 20384 "dev": true, 20152 20385 "requires": { ··· 21157 21390 "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", 21158 21391 "dev": true 21159 21392 }, 21393 + "split": { 21394 + "version": "0.3.3", 21395 + "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", 21396 + "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", 21397 + "dev": true, 21398 + "requires": { 21399 + "through": "2" 21400 + } 21401 + }, 21160 21402 "split-string": { 21161 21403 "version": "3.1.0", 21162 21404 "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", ··· 21266 21508 "readable-stream": "^2.0.2" 21267 21509 } 21268 21510 }, 21511 + "stream-combiner": { 21512 + "version": "0.0.4", 21513 + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", 21514 + "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", 21515 + "dev": true, 21516 + "requires": { 21517 + "duplexer": "~0.1.1" 21518 + } 21519 + }, 21269 21520 "stream-each": { 21270 21521 "version": "1.2.3", 21271 21522 "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", ··· 21400 21651 }, 21401 21652 "string_decoder": { 21402 21653 "version": "1.1.1", 21403 - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 21654 + "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 21404 21655 "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 21405 21656 "dev": true, 21406 21657 "requires": { ··· 21409 21660 }, 21410 21661 "strip-ansi": { 21411 21662 "version": "3.0.1", 21412 - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 21663 + "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 21413 21664 "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 21414 21665 "dev": true, 21415 21666 "requires": { ··· 21418 21669 }, 21419 21670 "strip-eof": { 21420 21671 "version": "1.0.0", 21421 - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", 21672 + "resolved": "http://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", 21422 21673 "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", 21423 21674 "dev": true 21424 21675 }, ··· 21712 21963 "isobject": "^4.0.0", 21713 21964 "lodash": "^4.17.21", 21714 21965 "memoizerific": "^1.11.3" 21966 + } 21967 + }, 21968 + "temp-fs": { 21969 + "version": "0.9.9", 21970 + "resolved": "https://registry.npmjs.org/temp-fs/-/temp-fs-0.9.9.tgz", 21971 + "integrity": "sha1-gHFzBDeHByDpQxUy/igUNk+IA9c=", 21972 + "dev": true, 21973 + "requires": { 21974 + "rimraf": "~2.5.2" 21975 + }, 21976 + "dependencies": { 21977 + "rimraf": { 21978 + "version": "2.5.4", 21979 + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.4.tgz", 21980 + "integrity": "sha1-loAAk8vxoMhr2VtGJUZ1NcKd+gQ=", 21981 + "dev": true, 21982 + "requires": { 21983 + "glob": "^7.0.5" 21984 + } 21985 + } 21715 21986 } 21716 21987 }, 21717 21988 "term-size": {
+4 -1
package.json
··· 30 30 "clean": "rimraf .tsbuildinfo ./build/dist ./build ./src/spec/*.js ./src/spec/*.map", 31 31 "linux:ci": "npm run clean && npm run all && npm run coveralls && npm run apidocs", 32 32 "appveyor": "npm run all && npm run nuget 0.0.1", 33 + "browserstack": "karma start karma.conf.browsers.js", 33 34 "nuget": ".\\src\\tools\\NuGet.exe pack Excalibur.nuspec -OutputDirectory .\\build\\dist -version", 34 35 "start": "npm run core:watch", 35 36 "build": "npm run core", ··· 87 88 "jasmine": "3.9.0", 88 89 "jasmine-core": "3.9.0", 89 90 "karma": "6.3.7", 91 + "karma-browserstack-launcher": "1.6.0", 90 92 "karma-chrome-launcher": "3.1.0", 91 93 "karma-coverage": "2.0.3", 92 94 "karma-coverage-istanbul-reporter": "3.0.3", 93 95 "karma-jasmine": "4.0.1", 96 + "karma-summary-reporter": "3.0.0", 94 97 "karma-webpack": "5.0.0", 95 98 "puppeteer": "10.4.0", 96 - "replace-in-file": "6.3.2", 97 99 "react": "17.0.2", 98 100 "react-dom": "17.0.2", 101 + "replace-in-file": "6.3.2", 99 102 "rimraf": "3.0.2", 100 103 "semver": "7.3.5", 101 104 "serve": "12.0.1",
+1 -1
sandbox/tests/pointer/index.html
··· 9 9 <body> 10 10 <p>Click on the squares to see events propagate in z order in the console. The black square cancels the event preventing propagation.</p> 11 11 <script src="../../lib/excalibur.js"></script> 12 - <script src="pointer.js"></script> 12 + <script src="./pointer.js"></script> 13 13 </body> 14 14 </html>
+1 -1
sandbox/tests/screen/index.html
··· 33 33 <input id="containerHeight" name="containerHeight" type="range" min="1" max="100" > 34 34 </div> 35 35 <script src="../../lib/excalibur.js"></script> 36 - <script src="screen.js"></script> 36 + <script src="./screen.js"></script> 37 37 </body> 38 38 </html>
+43
src/browsersupport/BrowserSupportSpec.ts
··· 1 + import * as ex from '@excalibur'; 2 + 3 + describe('Browser integration test', () => { 4 + it('should boot on browser', (done) => { 5 + const boot = () => { 6 + const game = new ex.Engine({ 7 + width: 800, 8 + height: 800 9 + }); 10 + game.start().then(() => { 11 + done() 12 + }); 13 + } 14 + 15 + expect(boot).not.toThrow(); 16 + }); 17 + 18 + it('should allow pointers', (done) => { 19 + const downSpy = jasmine.createSpy("down"); 20 + class Game2 extends ex.Engine { 21 + initialize() { 22 + const player1 = new ex.Actor({x: 0, y: 0, width: 100, height: 100, color: ex.Color.Red}); 23 + this.add(player1); 24 + player1.z = 10; 25 + player1.on("pointerdown", downSpy); 26 + 27 + return this.start(); 28 + } 29 + } 30 + 31 + const pointer = () => { 32 + var game2 = new Game2({width: 600, height: 400}); 33 + 34 + game2.initialize().then(() => { 35 + game2.input.pointers.triggerEvent("down", ex.vec(0, 0)); 36 + expect(downSpy).toHaveBeenCalledTimes(1); 37 + done(); 38 + }); 39 + } 40 + 41 + expect(pointer).not.toThrow(); 42 + }); 43 + });
+31
src/browsersupport/tsconfig.json
··· 1 + { 2 + "compilerOptions": { 3 + "types": ["@types/jasmine", "@types/webpack-env"], 4 + "moduleResolution": "node", 5 + "sourceMap": true, 6 + "experimentalDecorators": true, 7 + "target": "es2015", 8 + "module": "es2015", 9 + "noImplicitAny": false, 10 + "noUnusedLocals": false, 11 + "downlevelIteration": true, 12 + "lib": [ 13 + "dom", 14 + "es5", 15 + "es2015.collection", 16 + "es2015.iterable", 17 + "es2015.promise", 18 + "es2015.proxy", 19 + "es2018.promise", 20 + "es2016", 21 + "es2017.object" 22 + ], 23 + "baseUrl": ".", 24 + "rootDir": "../", 25 + "paths": { 26 + "@excalibur": ["../engine/"] 27 + } 28 + }, 29 + "include": ["./**/*Spec.ts"], 30 + "files": ["../engine/files.d.ts", "../engine/globals.d.ts"] 31 + }
+25 -7
src/engine/Input/PointerEventReceiver.ts
··· 19 19 export type NativeTouchEvent = globalThis.TouchEvent; 20 20 export type NativeWheelEvent = globalThis.WheelEvent; 21 21 22 + function isTouchEvent(value: any): value is NativeTouchEvent { 23 + // Gaurd for Safari <= 13.1 24 + return globalThis.TouchEvent && value instanceof globalThis.TouchEvent; 25 + } 26 + 27 + function isPointerEvent(value: any): value is NativePointerEvent { 28 + // Gaurd for Safari <= 13.1 29 + return globalThis.PointerEvent && value instanceof globalThis.PointerEvent; 30 + } 31 + 22 32 /** 23 33 * The PointerEventProcessor is responsible for collecting all the events from the canvas and transforming them into GlobalCoordinates 24 34 */ ··· 296 306 const eventCoords = new Map<number, GlobalCoordinates>(); 297 307 let button: PointerButton; 298 308 let pointerType: PointerType; 299 - if (ev instanceof TouchEvent) { 309 + if (isTouchEvent(ev)) { 300 310 button = PointerButton.Unknown; 301 311 pointerType = PointerType.Touch; 302 312 // https://developer.mozilla.org/en-US/docs/Web/API/TouchEvent ··· 313 323 pointerType = PointerType.Mouse; 314 324 const coordinates = GlobalCoordinates.fromPagePosition(ev.pageX, ev.pageY, this.engine); 315 325 let nativePointerId = 1; 316 - if (ev instanceof window.PointerEvent) { 326 + if (isPointerEvent(ev)) { 317 327 nativePointerId = ev.pointerId; 318 328 pointerType = this._stringToPointerType(ev.pointerType); 319 329 } ··· 396 406 public triggerEvent(type: 'down' | 'up' | 'move' | 'cancel', pos: Vector) { 397 407 const page = this.engine.screen.worldToPageCoordinates(pos); 398 408 // Send an event to the event receiver 399 - this._handle(new window.PointerEvent('pointer' + type, { 400 - pointerId: 0, 401 - clientX: page.x, 402 - clientY: page.y 403 - })); 409 + if (window.PointerEvent) { 410 + this._handle(new window.PointerEvent('pointer' + type, { 411 + pointerId: 0, 412 + clientX: page.x, 413 + clientY: page.y 414 + })); 415 + } else { 416 + // Safari hack 417 + this._handle(new window.MouseEvent('mouse' + type, { 418 + clientX: page.x, 419 + clientY: page.y 420 + })); 421 + } 404 422 405 423 // Force update pointer system 406 424 const pointerSystem = this.engine.currentScene.world.systemManager.get(PointerSystem);
+13 -2
src/engine/Screen.ts
··· 214 214 this._applyDisplayMode(); 215 215 216 216 this._mediaQueryList = this._browser.window.nativeComponent.matchMedia(`(resolution: ${window.devicePixelRatio}dppx)`); 217 - this._mediaQueryList.addEventListener('change', this._pixelRatioChangeHandler); 217 + 218 + // Safari <=13.1 workaround 219 + if (this._mediaQueryList.addEventListener) { 220 + this._mediaQueryList.addEventListener('change', this._pixelRatioChangeHandler); 221 + } else { 222 + this._mediaQueryList.addListener(this._pixelRatioChangeHandler); 223 + } 218 224 219 225 this._canvas.addEventListener('fullscreenchange', this._fullscreenChangeHandler); 220 226 this.applyResolutionAndViewport(); ··· 229 235 this._resizeObserver.disconnect(); 230 236 } 231 237 this.parent.removeEventListener('resize', this._resizeHandler); 232 - this._mediaQueryList.removeEventListener('change', this._pixelRatioChangeHandler); 238 + // Safari <=13.1 workaround 239 + if (this._mediaQueryList.removeEventListener) { 240 + this._mediaQueryList.removeEventListener('change', this._pixelRatioChangeHandler); 241 + } else { 242 + this._mediaQueryList.removeListener(this._pixelRatioChangeHandler); 243 + } 233 244 this._canvas.removeEventListener('fullscreenchange', this._fullscreenChangeHandler); 234 245 } 235 246 }