initial commit
8
.gitignore
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
[._]*.s[a-w][a-z]
|
||||
[._]s[a-w][a-z]
|
||||
*.un~
|
||||
Session.vim
|
||||
.netrwhist
|
||||
*~
|
||||
.DS_Store
|
||||
!node_modules
|
||||
21
CONTRIBUTING
Normal file
@@ -0,0 +1,21 @@
|
||||
# Building
|
||||
|
||||
This project uses browserify to manage dependencies and build. Watchify is
|
||||
especially convenient to preserve the write-and-reload model of development.
|
||||
This package lives in the npm index. There is also a bower version of it, but it
|
||||
is deprecated.
|
||||
|
||||
Relevant commands:
|
||||
|
||||
npm run build - builds the module.
|
||||
npm run watch - auto-builds the module whenever any source changes.
|
||||
|
||||
|
||||
# Updating the npm entry
|
||||
|
||||
Once changes are made, a new version can be published to the index using the
|
||||
following commands:
|
||||
|
||||
npm version <NEW_VERSION>
|
||||
npm publish
|
||||
git push
|
||||
202
COPYING
Normal file
@@ -0,0 +1,202 @@
|
||||
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright 2015 Google Inc
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
22
README.md
Normal file
@@ -0,0 +1,22 @@
|
||||
# WebVR Boilerplate
|
||||
|
||||
A [THREE.js][three]-based starting point for cross-platform web-based VR
|
||||
experiences.
|
||||
|
||||
This project relies heavily on the [WebVR Polyfill][polyfill] to provide VR
|
||||
support if the [WebVR API][spec] is not implemented. It also uses the [WebVR
|
||||
UI][ui] project to render the UI to enter VR and magic window modes. See here
|
||||
for a [live demo][demo].
|
||||
|
||||
[three]: http://threejs.org/
|
||||
[polyfill]: https://github.com/googlevr/webvr-polyfill
|
||||
[ui]: https://github.com/googlevr/webvr-ui
|
||||
[spec]: https://w3c.github.io/webvr/
|
||||
[demo]: https://borismus.github.io/webvr-boilerplate/
|
||||
|
||||
## Getting started
|
||||
|
||||
The easiest way to start is to fork or clone this repository. The boilerplate is
|
||||
also available via npm. Easy install:
|
||||
|
||||
npm install webvr-boilerplate
|
||||
486
build/device-info-test.js
Normal file
@@ -0,0 +1,486 @@
|
||||
(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
|
||||
/*
|
||||
* Copyright 2015 Google Inc. All Rights Reserved.
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
var Distortion = require('./distortion/distortion.js');
|
||||
var Util = require('./util.js');
|
||||
|
||||
function Device(params) {
|
||||
this.width = params.width || Util.getScreenWidth();
|
||||
this.height = params.height || Util.getScreenHeight();
|
||||
this.widthMeters = params.widthMeters;
|
||||
this.heightMeters = params.heightMeters;
|
||||
this.bevelMeters = params.bevelMeters;
|
||||
}
|
||||
|
||||
|
||||
// Fallback Android device (based on Nexus 5 measurements) for use when
|
||||
// we can't recognize an Android device.
|
||||
var DEFAULT_ANDROID = new Device({
|
||||
widthMeters: 0.110,
|
||||
heightMeters: 0.062,
|
||||
bevelMeters: 0.004
|
||||
});
|
||||
|
||||
// Fallback iOS device (based on iPhone6) for use when
|
||||
// we can't recognize an Android device.
|
||||
var DEFAULT_IOS = new Device({
|
||||
widthMeters: 0.1038,
|
||||
heightMeters: 0.0584,
|
||||
bevelMeters: 0.004
|
||||
});
|
||||
|
||||
|
||||
var Viewers = {
|
||||
CardboardV1: new CardboardViewer({
|
||||
id: 'CardboardV1',
|
||||
label: 'Cardboard I/O 2014',
|
||||
fov: 40,
|
||||
interLensDistance: 0.060,
|
||||
baselineLensDistance: 0.035,
|
||||
screenLensDistance: 0.042,
|
||||
distortionCoefficients: [0.441, 0.156],
|
||||
inverseCoefficients: [-0.4410035, 0.42756155, -0.4804439, 0.5460139,
|
||||
-0.58821183, 0.5733938, -0.48303202, 0.33299083, -0.17573841,
|
||||
0.0651772, -0.01488963, 0.001559834]
|
||||
}),
|
||||
CardboardV2: new CardboardViewer({
|
||||
id: 'CardboardV2',
|
||||
label: 'Cardboard I/O 2015',
|
||||
fov: 60,
|
||||
interLensDistance: 0.064,
|
||||
baselineLensDistance: 0.035,
|
||||
screenLensDistance: 0.039,
|
||||
distortionCoefficients: [0.34, 0.55],
|
||||
inverseCoefficients: [-0.33836704, -0.18162185, 0.862655, -1.2462051,
|
||||
1.0560602, -0.58208317, 0.21609078, -0.05444823, 0.009177956,
|
||||
-9.904169E-4, 6.183535E-5, -1.6981803E-6]
|
||||
})
|
||||
};
|
||||
|
||||
|
||||
var DEFAULT_LEFT_CENTER = {x: 0.5, y: 0.5};
|
||||
var DEFAULT_RIGHT_CENTER = {x: 0.5, y: 0.5};
|
||||
|
||||
/**
|
||||
* Manages information about the device and the viewer.
|
||||
*
|
||||
* deviceParams indicates the parameters of the device to use (generally
|
||||
* obtained from dpdb.getDeviceParams()). Can be null to mean no device
|
||||
* params were found.
|
||||
*/
|
||||
function DeviceInfo(deviceParams) {
|
||||
this.viewer = Viewers.CardboardV1;
|
||||
this.updateDeviceParams(deviceParams);
|
||||
}
|
||||
|
||||
DeviceInfo.prototype.updateDeviceParams = function(deviceParams) {
|
||||
this.device = this.determineDevice_(deviceParams) || this.device;
|
||||
};
|
||||
|
||||
DeviceInfo.prototype.getDevice = function() {
|
||||
return this.device;
|
||||
};
|
||||
|
||||
DeviceInfo.prototype.setViewer = function(viewer) {
|
||||
this.viewer = viewer;
|
||||
};
|
||||
|
||||
DeviceInfo.prototype.determineDevice_ = function(deviceParams) {
|
||||
if (!deviceParams) {
|
||||
// No parameters, so use a default.
|
||||
if (Util.isIOS()) {
|
||||
console.warn("Using fallback Android device measurements.");
|
||||
return DEFAULT_IOS;
|
||||
} else {
|
||||
console.warn("Using fallback iOS device measurements.");
|
||||
return DEFAULT_ANDROID;
|
||||
}
|
||||
}
|
||||
|
||||
// Compute device screen dimensions based on deviceParams.
|
||||
var METERS_PER_INCH = 0.0254;
|
||||
var metersPerPixelX = METERS_PER_INCH / deviceParams.xdpi;
|
||||
var metersPerPixelY = METERS_PER_INCH / deviceParams.ydpi;
|
||||
var width = Util.getScreenWidth();
|
||||
var height = Util.getScreenHeight();
|
||||
return new Device({
|
||||
widthMeters: metersPerPixelX * width,
|
||||
heightMeters: metersPerPixelY * height,
|
||||
bevelMeters: deviceParams.bevelMm * 0.001,
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Calculates field of view for the left eye.
|
||||
*/
|
||||
DeviceInfo.prototype.getDistortedFieldOfViewLeftEye = function() {
|
||||
var viewer = this.viewer;
|
||||
var device = this.device;
|
||||
|
||||
var distortion = new Distortion(viewer.distortionCoefficients);
|
||||
|
||||
// Device.height and device.width for device in portrait mode, so transpose.
|
||||
var eyeToScreenDistance = viewer.screenLensDistance;
|
||||
|
||||
var outerDist = (device.widthMeters - viewer.interLensDistance) / 2;
|
||||
var innerDist = viewer.interLensDistance / 2;
|
||||
var bottomDist = viewer.baselineLensDistance - device.bevelMeters;
|
||||
var topDist = device.heightMeters - bottomDist;
|
||||
|
||||
var outerAngle = THREE.Math.radToDeg(Math.atan(
|
||||
distortion.distort(outerDist / eyeToScreenDistance)));
|
||||
var innerAngle = THREE.Math.radToDeg(Math.atan(
|
||||
distortion.distort(innerDist / eyeToScreenDistance)));
|
||||
var bottomAngle = THREE.Math.radToDeg(Math.atan(
|
||||
distortion.distort(bottomDist / eyeToScreenDistance)));
|
||||
var topAngle = THREE.Math.radToDeg(Math.atan(
|
||||
distortion.distort(topDist / eyeToScreenDistance)));
|
||||
|
||||
return {
|
||||
leftDegrees: Math.min(outerAngle, viewer.fov),
|
||||
rightDegrees: Math.min(innerAngle, viewer.fov),
|
||||
downDegrees: Math.min(bottomAngle, viewer.fov),
|
||||
upDegrees: Math.min(topAngle, viewer.fov)
|
||||
}
|
||||
};
|
||||
|
||||
DeviceInfo.prototype.getFieldOfViewLeftEye = function(opt_isUndistorted) {
|
||||
return opt_isUndistorted ? this.getUndistortedFieldOfViewLeftEye() :
|
||||
this.getDistortedFieldOfViewLeftEye();
|
||||
};
|
||||
|
||||
DeviceInfo.prototype.getFieldOfViewRightEye = function(opt_isUndistorted) {
|
||||
var fov = this.getFieldOfViewLeftEye(opt_isUndistorted);
|
||||
return {
|
||||
leftDegrees: fov.rightDegrees,
|
||||
rightDegrees: fov.leftDegrees,
|
||||
upDegrees: fov.upDegrees,
|
||||
downDegrees: fov.downDegrees
|
||||
};
|
||||
};
|
||||
|
||||
/**
|
||||
* Calculates a projection matrix for the left eye.
|
||||
*/
|
||||
DeviceInfo.prototype.getProjectionMatrixLeftEye = function(opt_isUndistorted) {
|
||||
var fov = this.getFieldOfViewLeftEye(opt_isUndistorted);
|
||||
|
||||
var projectionMatrix = new THREE.Matrix4();
|
||||
var near = 0.1;
|
||||
var far = 1000;
|
||||
var left = Math.tan(THREE.Math.degToRad(fov.leftDegrees)) * near;
|
||||
var right = Math.tan(THREE.Math.degToRad(fov.rightDegrees)) * near;
|
||||
var bottom = Math.tan(THREE.Math.degToRad(fov.downDegrees)) * near;
|
||||
var top = Math.tan(THREE.Math.degToRad(fov.upDegrees)) * near;
|
||||
|
||||
// makeFrustum expects units in tan-angle space.
|
||||
projectionMatrix.makeFrustum(-left, right, -bottom, top, near, far);
|
||||
|
||||
return projectionMatrix;
|
||||
};
|
||||
|
||||
|
||||
DeviceInfo.prototype.getUndistortedViewportLeftEye = function() {
|
||||
var p = this.getUndistortedParams_();
|
||||
var viewer = this.viewer;
|
||||
var device = this.device;
|
||||
|
||||
var eyeToScreenDistance = viewer.screenLensDistance;
|
||||
var screenWidth = device.widthMeters / eyeToScreenDistance;
|
||||
var screenHeight = device.heightMeters / eyeToScreenDistance;
|
||||
var xPxPerTanAngle = device.width / screenWidth;
|
||||
var yPxPerTanAngle = device.height / screenHeight;
|
||||
|
||||
var x = Math.round((p.eyePosX - p.outerDist) * xPxPerTanAngle);
|
||||
var y = Math.round((p.eyePosY - p.bottomDist) * yPxPerTanAngle);
|
||||
return {
|
||||
x: x,
|
||||
y: y,
|
||||
width: Math.round((p.eyePosX + p.innerDist) * xPxPerTanAngle) - x,
|
||||
height: Math.round((p.eyePosY + p.topDist) * yPxPerTanAngle) - y
|
||||
};
|
||||
};
|
||||
|
||||
/**
|
||||
* Calculates undistorted field of view for the left eye.
|
||||
*/
|
||||
DeviceInfo.prototype.getUndistortedFieldOfViewLeftEye = function() {
|
||||
var p = this.getUndistortedParams_();
|
||||
|
||||
return {
|
||||
leftDegrees: THREE.Math.radToDeg(Math.atan(p.outerDist)),
|
||||
rightDegrees: THREE.Math.radToDeg(Math.atan(p.innerDist)),
|
||||
downDegrees: THREE.Math.radToDeg(Math.atan(p.bottomDist)),
|
||||
upDegrees: THREE.Math.radToDeg(Math.atan(p.topDist))
|
||||
};
|
||||
};
|
||||
|
||||
DeviceInfo.prototype.getUndistortedParams_ = function() {
|
||||
var viewer = this.viewer;
|
||||
var device = this.device;
|
||||
var distortion = new Distortion(viewer.distortionCoefficients);
|
||||
|
||||
// Most of these variables in tan-angle units.
|
||||
var eyeToScreenDistance = viewer.screenLensDistance;
|
||||
var halfLensDistance = viewer.interLensDistance / 2 / eyeToScreenDistance;
|
||||
var screenWidth = device.widthMeters / eyeToScreenDistance;
|
||||
var screenHeight = device.heightMeters / eyeToScreenDistance;
|
||||
|
||||
var eyePosX = screenWidth / 2 - halfLensDistance;
|
||||
var eyePosY = (viewer.baselineLensDistance - device.bevelMeters) / eyeToScreenDistance;
|
||||
|
||||
var maxFov = viewer.fov;
|
||||
var viewerMax = distortion.distortInverse(Math.tan(THREE.Math.degToRad(maxFov)));
|
||||
var outerDist = Math.min(eyePosX, viewerMax);
|
||||
var innerDist = Math.min(halfLensDistance, viewerMax);
|
||||
var bottomDist = Math.min(eyePosY, viewerMax);
|
||||
var topDist = Math.min(screenHeight - eyePosY, viewerMax);
|
||||
|
||||
return {
|
||||
outerDist: outerDist,
|
||||
innerDist: innerDist,
|
||||
topDist: topDist,
|
||||
bottomDist: bottomDist,
|
||||
eyePosX: eyePosX,
|
||||
eyePosY: eyePosY
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
function CardboardViewer(params) {
|
||||
// A machine readable ID.
|
||||
this.id = params.id;
|
||||
// A human readable label.
|
||||
this.label = params.label;
|
||||
|
||||
// Field of view in degrees (per side).
|
||||
this.fov = params.fov;
|
||||
|
||||
// Distance between lens centers in meters.
|
||||
this.interLensDistance = params.interLensDistance;
|
||||
// Distance between viewer baseline and lens center in meters.
|
||||
this.baselineLensDistance = params.baselineLensDistance;
|
||||
// Screen-to-lens distance in meters.
|
||||
this.screenLensDistance = params.screenLensDistance;
|
||||
|
||||
// Distortion coefficients.
|
||||
this.distortionCoefficients = params.distortionCoefficients;
|
||||
// Inverse distortion coefficients.
|
||||
// TODO: Calculate these from distortionCoefficients in the future.
|
||||
this.inverseCoefficients = params.inverseCoefficients;
|
||||
}
|
||||
|
||||
// Export viewer information.
|
||||
DeviceInfo.Viewers = Viewers;
|
||||
module.exports = DeviceInfo;
|
||||
|
||||
},{"./distortion/distortion.js":2,"./util.js":3}],2:[function(require,module,exports){
|
||||
/**
|
||||
* TODO(smus): Implement coefficient inversion.
|
||||
*/
|
||||
function Distortion(coefficients) {
|
||||
this.coefficients = coefficients;
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculates the inverse distortion for a radius.
|
||||
* </p><p>
|
||||
* Allows to compute the original undistorted radius from a distorted one.
|
||||
* See also getApproximateInverseDistortion() for a faster but potentially
|
||||
* less accurate method.
|
||||
*
|
||||
* @param {Number} radius Distorted radius from the lens center in tan-angle units.
|
||||
* @return {Number} The undistorted radius in tan-angle units.
|
||||
*/
|
||||
Distortion.prototype.distortInverse = function(radius) {
|
||||
// Secant method.
|
||||
var r0 = radius / 0.9;
|
||||
var r1 = radius * 0.9;
|
||||
var dr0 = radius - this.distort(r0);
|
||||
while (Math.abs(r1 - r0) > 0.0001 /** 0.1mm */) {
|
||||
var dr1 = radius - this.distort(r1);
|
||||
var r2 = r1 - dr1 * ((r1 - r0) / (dr1 - dr0));
|
||||
r0 = r1;
|
||||
r1 = r2;
|
||||
dr0 = dr1;
|
||||
}
|
||||
return r1;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Distorts a radius by its distortion factor from the center of the lenses.
|
||||
*
|
||||
* @param {Number} radius Radius from the lens center in tan-angle units.
|
||||
* @return {Number} The distorted radius in tan-angle units.
|
||||
*/
|
||||
Distortion.prototype.distort = function(radius) {
|
||||
return radius * this.distortionFactor_(radius);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the distortion factor of a point.
|
||||
*
|
||||
* @param {Number} radius Radius of the point from the lens center in tan-angle units.
|
||||
* @return {Number} The distortion factor. Multiply by this factor to distort points.
|
||||
*/
|
||||
Distortion.prototype.distortionFactor_ = function(radius) {
|
||||
var result = 1.0;
|
||||
var rFactor = 1.0;
|
||||
var rSquared = radius * radius;
|
||||
|
||||
for (var i = 0; i < this.coefficients.length; i++) {
|
||||
var ki = this.coefficients[i];
|
||||
rFactor *= rSquared;
|
||||
result += ki * rFactor;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
module.exports = Distortion;
|
||||
|
||||
},{}],3:[function(require,module,exports){
|
||||
/*
|
||||
* Copyright 2015 Google Inc. All Rights Reserved.
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
var Util = {};
|
||||
|
||||
Util.base64 = function(mimeType, base64) {
|
||||
return 'data:' + mimeType + ';base64,' + base64;
|
||||
};
|
||||
|
||||
Util.isMobile = function() {
|
||||
var check = false;
|
||||
(function(a){if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4)))check = true})(navigator.userAgent||navigator.vendor||window.opera);
|
||||
return check;
|
||||
};
|
||||
|
||||
Util.isFirefox = function() {
|
||||
return /firefox/i.test(navigator.userAgent);
|
||||
};
|
||||
|
||||
Util.isIOS = function() {
|
||||
return /(iPad|iPhone|iPod)/g.test(navigator.userAgent);
|
||||
};
|
||||
|
||||
Util.isIFrame = function() {
|
||||
try {
|
||||
return window.self !== window.top;
|
||||
} catch (e) {
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
Util.appendQueryParameter = function(url, key, value) {
|
||||
// Determine delimiter based on if the URL already GET parameters in it.
|
||||
var delimiter = (url.indexOf('?') < 0 ? '?' : '&');
|
||||
url += delimiter + key + '=' + value;
|
||||
return url;
|
||||
};
|
||||
|
||||
// From http://goo.gl/4WX3tg
|
||||
Util.getQueryParameter = function(name) {
|
||||
name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
|
||||
var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"),
|
||||
results = regex.exec(location.search);
|
||||
return results === null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
|
||||
};
|
||||
|
||||
Util.isLandscapeMode = function() {
|
||||
return (window.orientation == 90 || window.orientation == -90);
|
||||
};
|
||||
|
||||
Util.getScreenWidth = function() {
|
||||
return Math.max(window.screen.width, window.screen.height) *
|
||||
window.devicePixelRatio;
|
||||
};
|
||||
|
||||
Util.getScreenHeight = function() {
|
||||
return Math.min(window.screen.width, window.screen.height) *
|
||||
window.devicePixelRatio;
|
||||
};
|
||||
|
||||
/**
|
||||
* Utility to convert the projection matrix to a vector accepted by the shader.
|
||||
*
|
||||
* @param {Object} opt_params A rectangle to scale this vector by.
|
||||
*/
|
||||
Util.projectionMatrixToVector_ = function(matrix, opt_params) {
|
||||
var params = opt_params || {};
|
||||
var xScale = params.xScale || 1;
|
||||
var yScale = params.yScale || 1;
|
||||
var xTrans = params.xTrans || 0;
|
||||
var yTrans = params.yTrans || 0;
|
||||
|
||||
var elements = matrix.elements;
|
||||
var vec = new THREE.Vector4();
|
||||
vec.set(elements[4*0 + 0] * xScale,
|
||||
elements[4*1 + 1] * yScale,
|
||||
elements[4*2 + 0] - 1 - xTrans,
|
||||
elements[4*2 + 1] - 1 - yTrans).divideScalar(2);
|
||||
return vec;
|
||||
};
|
||||
|
||||
Util.leftProjectionVectorToRight_ = function(left) {
|
||||
//projectionLeft + vec4(0.0, 0.0, 1.0, 0.0)) * vec4(1.0, 1.0, -1.0, 1.0);
|
||||
var out = new THREE.Vector4(0, 0, 1, 0);
|
||||
out.add(left); // out = left + (0, 0, 1, 0).
|
||||
out.z *= -1; // Flip z.
|
||||
|
||||
return out;
|
||||
};
|
||||
|
||||
|
||||
module.exports = Util;
|
||||
|
||||
},{}],4:[function(require,module,exports){
|
||||
var DeviceInfo = require('../src/device-info.js');
|
||||
|
||||
var di = new DeviceInfo();
|
||||
var centroid = di.getLeftEyeCenter();
|
||||
|
||||
// Size the canvas. Render the centroid.
|
||||
var canvas = document.querySelector('canvas');
|
||||
var w = window.innerWidth;
|
||||
var h = window.innerHeight;
|
||||
var x = centroid.x * w/2;
|
||||
var y = centroid.y * h;
|
||||
var size = 10;
|
||||
|
||||
canvas.width = w;
|
||||
canvas.height = h;
|
||||
|
||||
var ctx = canvas.getContext('2d');
|
||||
ctx.clearRect(0, 0, w, h);
|
||||
ctx.fillStyle = 'black';
|
||||
ctx.fillRect(x - size/2, y - size/2, size, size);
|
||||
|
||||
console.log('Placing eye at (%d, %d).', x, y);
|
||||
|
||||
},{"../src/device-info.js":1}]},{},[4]);
|
||||
575
build/webvr-manager.js
Normal file
@@ -0,0 +1,575 @@
|
||||
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.WebVRManager = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){
|
||||
/*
|
||||
* Copyright 2015 Google Inc. All Rights Reserved.
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
var Emitter = _dereq_('./emitter.js');
|
||||
var Modes = _dereq_('./modes.js');
|
||||
var Util = _dereq_('./util.js');
|
||||
|
||||
/**
|
||||
* Everything having to do with the WebVR button.
|
||||
* Emits a 'click' event when it's clicked.
|
||||
*/
|
||||
function ButtonManager(opt_root) {
|
||||
var root = opt_root || document.body;
|
||||
this.loadIcons_();
|
||||
|
||||
// Make the fullscreen button.
|
||||
var fsButton = this.createButton();
|
||||
fsButton.src = this.ICONS.fullscreen;
|
||||
fsButton.title = 'Fullscreen mode';
|
||||
var s = fsButton.style;
|
||||
s.bottom = 0;
|
||||
s.right = 0;
|
||||
fsButton.addEventListener('click', this.createClickHandler_('fs'));
|
||||
root.appendChild(fsButton);
|
||||
this.fsButton = fsButton;
|
||||
|
||||
// Make the VR button.
|
||||
var vrButton = this.createButton();
|
||||
vrButton.src = this.ICONS.cardboard;
|
||||
vrButton.title = 'Virtual reality mode';
|
||||
var s = vrButton.style;
|
||||
s.bottom = 0;
|
||||
s.right = '48px';
|
||||
vrButton.addEventListener('click', this.createClickHandler_('vr'));
|
||||
root.appendChild(vrButton);
|
||||
this.vrButton = vrButton;
|
||||
|
||||
this.isVisible = true;
|
||||
|
||||
}
|
||||
ButtonManager.prototype = new Emitter();
|
||||
|
||||
ButtonManager.prototype.createButton = function() {
|
||||
var button = document.createElement('img');
|
||||
button.className = 'webvr-button';
|
||||
var s = button.style;
|
||||
s.position = 'absolute';
|
||||
s.width = '24px'
|
||||
s.height = '24px';
|
||||
s.backgroundSize = 'cover';
|
||||
s.backgroundColor = 'transparent';
|
||||
s.border = 0;
|
||||
s.userSelect = 'none';
|
||||
s.webkitUserSelect = 'none';
|
||||
s.MozUserSelect = 'none';
|
||||
s.cursor = 'pointer';
|
||||
s.padding = '12px';
|
||||
s.zIndex = 1;
|
||||
s.display = 'none';
|
||||
s.boxSizing = 'content-box';
|
||||
|
||||
// Prevent button from being selected and dragged.
|
||||
button.draggable = false;
|
||||
button.addEventListener('dragstart', function(e) {
|
||||
e.preventDefault();
|
||||
});
|
||||
|
||||
// Style it on hover.
|
||||
button.addEventListener('mouseenter', function(e) {
|
||||
s.filter = s.webkitFilter = 'drop-shadow(0 0 5px rgba(255,255,255,1))';
|
||||
});
|
||||
button.addEventListener('mouseleave', function(e) {
|
||||
s.filter = s.webkitFilter = '';
|
||||
});
|
||||
return button;
|
||||
};
|
||||
|
||||
ButtonManager.prototype.setMode = function(mode, isVRCompatible) {
|
||||
isVRCompatible = isVRCompatible || WebVRConfig.FORCE_ENABLE_VR;
|
||||
if (!this.isVisible) {
|
||||
return;
|
||||
}
|
||||
switch (mode) {
|
||||
case Modes.NORMAL:
|
||||
this.fsButton.style.display = 'block';
|
||||
this.fsButton.src = this.ICONS.fullscreen;
|
||||
this.vrButton.style.display = (isVRCompatible ? 'block' : 'none');
|
||||
break;
|
||||
case Modes.MAGIC_WINDOW:
|
||||
this.fsButton.style.display = 'block';
|
||||
this.fsButton.src = this.ICONS.exitFullscreen;
|
||||
this.vrButton.style.display = 'none';
|
||||
break;
|
||||
case Modes.VR:
|
||||
this.fsButton.style.display = 'none';
|
||||
this.vrButton.style.display = 'none';
|
||||
break;
|
||||
}
|
||||
|
||||
// Hack for Safari Mac/iOS to force relayout (svg-specific issue)
|
||||
// http://goo.gl/hjgR6r
|
||||
var oldValue = this.fsButton.style.display;
|
||||
this.fsButton.style.display = 'inline-block';
|
||||
this.fsButton.offsetHeight;
|
||||
this.fsButton.style.display = oldValue;
|
||||
};
|
||||
|
||||
ButtonManager.prototype.setVisibility = function(isVisible) {
|
||||
this.isVisible = isVisible;
|
||||
this.fsButton.style.display = isVisible ? 'block' : 'none';
|
||||
this.vrButton.style.display = isVisible ? 'block' : 'none';
|
||||
};
|
||||
|
||||
ButtonManager.prototype.createClickHandler_ = function(eventName) {
|
||||
return function(e) {
|
||||
e.stopPropagation();
|
||||
e.preventDefault();
|
||||
this.emit(eventName);
|
||||
}.bind(this);
|
||||
};
|
||||
|
||||
ButtonManager.prototype.loadIcons_ = function() {
|
||||
// Preload some hard-coded SVG.
|
||||
this.ICONS = {};
|
||||
this.ICONS.cardboard = Util.base64('image/svg+xml', 'PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNHB4IiBoZWlnaHQ9IjI0cHgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0iI0ZGRkZGRiI+CiAgICA8cGF0aCBkPSJNMjAuNzQgNkgzLjIxQzIuNTUgNiAyIDYuNTcgMiA3LjI4djEwLjQ0YzAgLjcuNTUgMS4yOCAxLjIzIDEuMjhoNC43OWMuNTIgMCAuOTYtLjMzIDEuMTQtLjc5bDEuNC0zLjQ4Yy4yMy0uNTkuNzktMS4wMSAxLjQ0LTEuMDFzMS4yMS40MiAxLjQ1IDEuMDFsMS4zOSAzLjQ4Yy4xOS40Ni42My43OSAxLjExLjc5aDQuNzljLjcxIDAgMS4yNi0uNTcgMS4yNi0xLjI4VjcuMjhjMC0uNy0uNTUtMS4yOC0xLjI2LTEuMjh6TTcuNSAxNC42MmMtMS4xNyAwLTIuMTMtLjk1LTIuMTMtMi4xMiAwLTEuMTcuOTYtMi4xMyAyLjEzLTIuMTMgMS4xOCAwIDIuMTIuOTYgMi4xMiAyLjEzcy0uOTUgMi4xMi0yLjEyIDIuMTJ6bTkgMGMtMS4xNyAwLTIuMTMtLjk1LTIuMTMtMi4xMiAwLTEuMTcuOTYtMi4xMyAyLjEzLTIuMTNzMi4xMi45NiAyLjEyIDIuMTMtLjk1IDIuMTItMi4xMiAyLjEyeiIvPgogICAgPHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgyNHYyNEgwVjB6Ii8+Cjwvc3ZnPgo=');
|
||||
this.ICONS.fullscreen = Util.base64('image/svg+xml', 'PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNHB4IiBoZWlnaHQ9IjI0cHgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0iI0ZGRkZGRiI+CiAgICA8cGF0aCBkPSJNMCAwaDI0djI0SDB6IiBmaWxsPSJub25lIi8+CiAgICA8cGF0aCBkPSJNNyAxNEg1djVoNXYtMkg3di0zem0tMi00aDJWN2gzVjVINXY1em0xMiA3aC0zdjJoNXYtNWgtMnYzek0xNCA1djJoM3YzaDJWNWgtNXoiLz4KPC9zdmc+Cg==');
|
||||
this.ICONS.exitFullscreen = Util.base64('image/svg+xml', 'PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNHB4IiBoZWlnaHQ9IjI0cHgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0iI0ZGRkZGRiI+CiAgICA8cGF0aCBkPSJNMCAwaDI0djI0SDB6IiBmaWxsPSJub25lIi8+CiAgICA8cGF0aCBkPSJNNSAxNmgzdjNoMnYtNUg1djJ6bTMtOEg1djJoNVY1SDh2M3ptNiAxMWgydi0zaDN2LTJoLTV2NXptMi0xMVY1aC0ydjVoNVY4aC0zeiIvPgo8L3N2Zz4K');
|
||||
this.ICONS.settings = Util.base64('image/svg+xml', 'PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNHB4IiBoZWlnaHQ9IjI0cHgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0iI0ZGRkZGRiI+CiAgICA8cGF0aCBkPSJNMCAwaDI0djI0SDB6IiBmaWxsPSJub25lIi8+CiAgICA8cGF0aCBkPSJNMTkuNDMgMTIuOThjLjA0LS4zMi4wNy0uNjQuMDctLjk4cy0uMDMtLjY2LS4wNy0uOThsMi4xMS0xLjY1Yy4xOS0uMTUuMjQtLjQyLjEyLS42NGwtMi0zLjQ2Yy0uMTItLjIyLS4zOS0uMy0uNjEtLjIybC0yLjQ5IDFjLS41Mi0uNC0xLjA4LS43My0xLjY5LS45OGwtLjM4LTIuNjVDMTQuNDYgMi4xOCAxNC4yNSAyIDE0IDJoLTRjLS4yNSAwLS40Ni4xOC0uNDkuNDJsLS4zOCAyLjY1Yy0uNjEuMjUtMS4xNy41OS0xLjY5Ljk4bC0yLjQ5LTFjLS4yMy0uMDktLjQ5IDAtLjYxLjIybC0yIDMuNDZjLS4xMy4yMi0uMDcuNDkuMTIuNjRsMi4xMSAxLjY1Yy0uMDQuMzItLjA3LjY1LS4wNy45OHMuMDMuNjYuMDcuOThsLTIuMTEgMS42NWMtLjE5LjE1LS4yNC40Mi0uMTIuNjRsMiAzLjQ2Yy4xMi4yMi4zOS4zLjYxLjIybDIuNDktMWMuNTIuNCAxLjA4LjczIDEuNjkuOThsLjM4IDIuNjVjLjAzLjI0LjI0LjQyLjQ5LjQyaDRjLjI1IDAgLjQ2LS4xOC40OS0uNDJsLjM4LTIuNjVjLjYxLS4yNSAxLjE3LS41OSAxLjY5LS45OGwyLjQ5IDFjLjIzLjA5LjQ5IDAgLjYxLS4yMmwyLTMuNDZjLjEyLS4yMi4wNy0uNDktLjEyLS42NGwtMi4xMS0xLjY1ek0xMiAxNS41Yy0xLjkzIDAtMy41LTEuNTctMy41LTMuNXMxLjU3LTMuNSAzLjUtMy41IDMuNSAxLjU3IDMuNSAzLjUtMS41NyAzLjUtMy41IDMuNXoiLz4KPC9zdmc+Cg==');
|
||||
};
|
||||
|
||||
module.exports = ButtonManager;
|
||||
|
||||
},{"./emitter.js":2,"./modes.js":3,"./util.js":4}],2:[function(_dereq_,module,exports){
|
||||
/*
|
||||
* Copyright 2015 Google Inc. All Rights Reserved.
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
function Emitter() {
|
||||
this.callbacks = {};
|
||||
}
|
||||
|
||||
Emitter.prototype.emit = function(eventName) {
|
||||
var callbacks = this.callbacks[eventName];
|
||||
if (!callbacks) {
|
||||
//console.log('No valid callback specified.');
|
||||
return;
|
||||
}
|
||||
var args = [].slice.call(arguments);
|
||||
// Eliminate the first param (the callback).
|
||||
args.shift();
|
||||
for (var i = 0; i < callbacks.length; i++) {
|
||||
callbacks[i].apply(this, args);
|
||||
}
|
||||
};
|
||||
|
||||
Emitter.prototype.on = function(eventName, callback) {
|
||||
if (eventName in this.callbacks) {
|
||||
this.callbacks[eventName].push(callback);
|
||||
} else {
|
||||
this.callbacks[eventName] = [callback];
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = Emitter;
|
||||
|
||||
},{}],3:[function(_dereq_,module,exports){
|
||||
/*
|
||||
* Copyright 2015 Google Inc. All Rights Reserved.
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
var Modes = {
|
||||
UNKNOWN: 0,
|
||||
// Not fullscreen, just tracking.
|
||||
NORMAL: 1,
|
||||
// Magic window immersive mode.
|
||||
MAGIC_WINDOW: 2,
|
||||
// Full screen split screen VR mode.
|
||||
VR: 3,
|
||||
};
|
||||
|
||||
module.exports = Modes;
|
||||
|
||||
},{}],4:[function(_dereq_,module,exports){
|
||||
/*
|
||||
* Copyright 2015 Google Inc. All Rights Reserved.
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
var Util = {};
|
||||
|
||||
Util.base64 = function(mimeType, base64) {
|
||||
return 'data:' + mimeType + ';base64,' + base64;
|
||||
};
|
||||
|
||||
Util.isMobile = function() {
|
||||
var check = false;
|
||||
(function(a){if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4)))check = true})(navigator.userAgent||navigator.vendor||window.opera);
|
||||
return check;
|
||||
};
|
||||
|
||||
Util.isFirefox = function() {
|
||||
return /firefox/i.test(navigator.userAgent);
|
||||
};
|
||||
|
||||
Util.isIOS = function() {
|
||||
return /(iPad|iPhone|iPod)/g.test(navigator.userAgent);
|
||||
};
|
||||
|
||||
Util.isIFrame = function() {
|
||||
try {
|
||||
return window.self !== window.top;
|
||||
} catch (e) {
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
Util.appendQueryParameter = function(url, key, value) {
|
||||
// Determine delimiter based on if the URL already GET parameters in it.
|
||||
var delimiter = (url.indexOf('?') < 0 ? '?' : '&');
|
||||
url += delimiter + key + '=' + value;
|
||||
return url;
|
||||
};
|
||||
|
||||
// From http://goo.gl/4WX3tg
|
||||
Util.getQueryParameter = function(name) {
|
||||
var name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
|
||||
var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"),
|
||||
results = regex.exec(location.search);
|
||||
return results === null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
|
||||
};
|
||||
|
||||
Util.isLandscapeMode = function() {
|
||||
return (window.orientation == 90 || window.orientation == -90);
|
||||
};
|
||||
|
||||
Util.getScreenWidth = function() {
|
||||
return Math.max(window.screen.width, window.screen.height) *
|
||||
window.devicePixelRatio;
|
||||
};
|
||||
|
||||
Util.getScreenHeight = function() {
|
||||
return Math.min(window.screen.width, window.screen.height) *
|
||||
window.devicePixelRatio;
|
||||
};
|
||||
|
||||
module.exports = Util;
|
||||
|
||||
},{}],5:[function(_dereq_,module,exports){
|
||||
/*
|
||||
* Copyright 2015 Google Inc. All Rights Reserved.
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
var ButtonManager = _dereq_('./button-manager.js');
|
||||
var Emitter = _dereq_('./emitter.js');
|
||||
var Modes = _dereq_('./modes.js');
|
||||
var Util = _dereq_('./util.js');
|
||||
|
||||
/**
|
||||
* Helper for getting in and out of VR mode.
|
||||
*/
|
||||
function WebVRManager(renderer, effect, params) {
|
||||
this.params = params || {};
|
||||
|
||||
this.mode = Modes.UNKNOWN;
|
||||
|
||||
// Set option to hide the button.
|
||||
this.hideButton = this.params.hideButton || false;
|
||||
// Whether or not the FOV should be distorted or un-distorted. By default, it
|
||||
// should be distorted, but in the case of vertex shader based distortion,
|
||||
// ensure that we use undistorted parameters.
|
||||
this.predistorted = !!this.params.predistorted;
|
||||
|
||||
// Save the THREE.js renderer and effect for later.
|
||||
this.renderer = renderer;
|
||||
this.effect = effect;
|
||||
var polyfillWrapper = document.querySelector('.webvr-polyfill-fullscreen-wrapper');
|
||||
this.button = new ButtonManager(polyfillWrapper);
|
||||
|
||||
this.isFullscreenDisabled = !!Util.getQueryParameter('no_fullscreen');
|
||||
this.startMode = Modes.NORMAL;
|
||||
var startModeParam = parseInt(Util.getQueryParameter('start_mode'));
|
||||
if (!isNaN(startModeParam)) {
|
||||
this.startMode = startModeParam;
|
||||
}
|
||||
|
||||
if (this.hideButton) {
|
||||
this.button.setVisibility(false);
|
||||
}
|
||||
|
||||
// Check if the browser is compatible with WebVR.
|
||||
this.getDeviceByType_(VRDisplay).then(function(hmd) {
|
||||
this.hmd = hmd;
|
||||
|
||||
// Only enable VR mode if there's a VR device attached or we are running the
|
||||
// polyfill on mobile.
|
||||
if (!this.isVRCompatibleOverride) {
|
||||
this.isVRCompatible = !hmd.isPolyfilled || Util.isMobile();
|
||||
}
|
||||
|
||||
switch (this.startMode) {
|
||||
case Modes.MAGIC_WINDOW:
|
||||
this.setMode_(Modes.MAGIC_WINDOW);
|
||||
break;
|
||||
case Modes.VR:
|
||||
this.enterVRMode_();
|
||||
this.setMode_(Modes.VR);
|
||||
break;
|
||||
default:
|
||||
this.setMode_(Modes.NORMAL);
|
||||
}
|
||||
|
||||
this.emit('initialized');
|
||||
}.bind(this));
|
||||
|
||||
// Hook up button listeners.
|
||||
this.button.on('fs', this.onFSClick_.bind(this));
|
||||
this.button.on('vr', this.onVRClick_.bind(this));
|
||||
|
||||
// Bind to fullscreen events.
|
||||
document.addEventListener('webkitfullscreenchange',
|
||||
this.onFullscreenChange_.bind(this));
|
||||
document.addEventListener('mozfullscreenchange',
|
||||
this.onFullscreenChange_.bind(this));
|
||||
document.addEventListener('msfullscreenchange',
|
||||
this.onFullscreenChange_.bind(this));
|
||||
|
||||
// Bind to VR* specific events.
|
||||
window.addEventListener('vrdisplaypresentchange',
|
||||
this.onVRDisplayPresentChange_.bind(this));
|
||||
window.addEventListener('vrdisplaydeviceparamschange',
|
||||
this.onVRDisplayDeviceParamsChange_.bind(this));
|
||||
}
|
||||
|
||||
WebVRManager.prototype = new Emitter();
|
||||
|
||||
// Expose these values externally.
|
||||
WebVRManager.Modes = Modes;
|
||||
|
||||
WebVRManager.prototype.render = function(scene, camera, timestamp) {
|
||||
// Scene may be an array of two scenes, one for each eye.
|
||||
if (scene instanceof Array) {
|
||||
this.effect.render(scene[0], camera);
|
||||
} else {
|
||||
this.effect.render(scene, camera);
|
||||
}
|
||||
};
|
||||
|
||||
WebVRManager.prototype.setVRCompatibleOverride = function(isVRCompatible) {
|
||||
this.isVRCompatible = isVRCompatible;
|
||||
this.isVRCompatibleOverride = true;
|
||||
|
||||
// Don't actually change modes, just update the buttons.
|
||||
this.button.setMode(this.mode, this.isVRCompatible);
|
||||
};
|
||||
|
||||
WebVRManager.prototype.setFullscreenCallback = function(callback) {
|
||||
this.fullscreenCallback = callback;
|
||||
};
|
||||
|
||||
WebVRManager.prototype.setVRCallback = function(callback) {
|
||||
this.vrCallback = callback;
|
||||
};
|
||||
|
||||
WebVRManager.prototype.setExitFullscreenCallback = function(callback) {
|
||||
this.exitFullscreenCallback = callback;
|
||||
}
|
||||
|
||||
/**
|
||||
* Promise returns true if there is at least one HMD device available.
|
||||
*/
|
||||
WebVRManager.prototype.getDeviceByType_ = function(type) {
|
||||
return new Promise(function(resolve, reject) {
|
||||
navigator.getVRDisplays().then(function(displays) {
|
||||
// Promise succeeds, but check if there are any displays actually.
|
||||
for (var i = 0; i < displays.length; i++) {
|
||||
if (displays[i] instanceof type) {
|
||||
resolve(displays[i]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
resolve(null);
|
||||
}, function() {
|
||||
// No displays are found.
|
||||
resolve(null);
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Helper for entering VR mode.
|
||||
*/
|
||||
WebVRManager.prototype.enterVRMode_ = function() {
|
||||
this.hmd.requestPresent([{
|
||||
source: this.renderer.domElement,
|
||||
predistorted: this.predistorted
|
||||
}]);
|
||||
};
|
||||
|
||||
WebVRManager.prototype.setMode_ = function(mode) {
|
||||
var oldMode = this.mode;
|
||||
if (mode == this.mode) {
|
||||
console.warn('Not changing modes, already in %s', mode);
|
||||
return;
|
||||
}
|
||||
// console.log('Mode change: %s => %s', this.mode, mode);
|
||||
this.mode = mode;
|
||||
this.button.setMode(mode, this.isVRCompatible);
|
||||
|
||||
// Emit an event indicating the mode changed.
|
||||
this.emit('modechange', mode, oldMode);
|
||||
};
|
||||
|
||||
/**
|
||||
* Main button was clicked.
|
||||
*/
|
||||
WebVRManager.prototype.onFSClick_ = function() {
|
||||
switch (this.mode) {
|
||||
case Modes.NORMAL:
|
||||
// TODO: Remove this hack if/when iOS gets real fullscreen mode.
|
||||
// If this is an iframe on iOS, break out and open in no_fullscreen mode.
|
||||
if (Util.isIOS() && Util.isIFrame()) {
|
||||
if (this.fullscreenCallback) {
|
||||
this.fullscreenCallback();
|
||||
} else {
|
||||
var url = window.location.href;
|
||||
url = Util.appendQueryParameter(url, 'no_fullscreen', 'true');
|
||||
url = Util.appendQueryParameter(url, 'start_mode', Modes.MAGIC_WINDOW);
|
||||
top.location.href = url;
|
||||
return;
|
||||
}
|
||||
}
|
||||
this.setMode_(Modes.MAGIC_WINDOW);
|
||||
this.requestFullscreen_();
|
||||
break;
|
||||
case Modes.MAGIC_WINDOW:
|
||||
if (this.isFullscreenDisabled) {
|
||||
window.history.back();
|
||||
return;
|
||||
}
|
||||
if (this.exitFullscreenCallback) {
|
||||
this.exitFullscreenCallback();
|
||||
}
|
||||
this.setMode_(Modes.NORMAL);
|
||||
this.exitFullscreen_();
|
||||
break;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* The VR button was clicked.
|
||||
*/
|
||||
WebVRManager.prototype.onVRClick_ = function() {
|
||||
// TODO: Remove this hack when iOS has fullscreen mode.
|
||||
// If this is an iframe on iOS, break out and open in no_fullscreen mode.
|
||||
if (this.mode == Modes.NORMAL && Util.isIOS() && Util.isIFrame()) {
|
||||
if (this.vrCallback) {
|
||||
this.vrCallback();
|
||||
} else {
|
||||
var url = window.location.href;
|
||||
url = Util.appendQueryParameter(url, 'no_fullscreen', 'true');
|
||||
url = Util.appendQueryParameter(url, 'start_mode', Modes.VR);
|
||||
top.location.href = url;
|
||||
return;
|
||||
}
|
||||
}
|
||||
this.enterVRMode_();
|
||||
};
|
||||
|
||||
WebVRManager.prototype.requestFullscreen_ = function() {
|
||||
var canvas = document.body;
|
||||
//var canvas = this.renderer.domElement;
|
||||
if (canvas.requestFullscreen) {
|
||||
canvas.requestFullscreen();
|
||||
} else if (canvas.mozRequestFullScreen) {
|
||||
canvas.mozRequestFullScreen();
|
||||
} else if (canvas.webkitRequestFullscreen) {
|
||||
canvas.webkitRequestFullscreen();
|
||||
} else if (canvas.msRequestFullscreen) {
|
||||
canvas.msRequestFullscreen();
|
||||
}
|
||||
};
|
||||
|
||||
WebVRManager.prototype.exitFullscreen_ = function() {
|
||||
if (document.exitFullscreen) {
|
||||
document.exitFullscreen();
|
||||
} else if (document.mozCancelFullScreen) {
|
||||
document.mozCancelFullScreen();
|
||||
} else if (document.webkitExitFullscreen) {
|
||||
document.webkitExitFullscreen();
|
||||
} else if (document.msExitFullscreen) {
|
||||
document.msExitFullscreen();
|
||||
}
|
||||
};
|
||||
|
||||
WebVRManager.prototype.onVRDisplayPresentChange_ = function(e) {
|
||||
console.log('onVRDisplayPresentChange_', e);
|
||||
if (this.hmd.isPresenting) {
|
||||
this.setMode_(Modes.VR);
|
||||
} else {
|
||||
this.setMode_(Modes.NORMAL);
|
||||
}
|
||||
};
|
||||
|
||||
WebVRManager.prototype.onVRDisplayDeviceParamsChange_ = function(e) {
|
||||
console.log('onVRDisplayDeviceParamsChange_', e);
|
||||
};
|
||||
|
||||
WebVRManager.prototype.onFullscreenChange_ = function(e) {
|
||||
// If we leave full-screen, go back to normal mode.
|
||||
if (document.webkitFullscreenElement === null ||
|
||||
document.mozFullScreenElement === null) {
|
||||
this.setMode_(Modes.NORMAL);
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = WebVRManager;
|
||||
|
||||
},{"./button-manager.js":1,"./emitter.js":2,"./modes.js":3,"./util.js":4}]},{},[5])(5)
|
||||
});
|
||||
13
fonts/LICENSE
Executable file
@@ -0,0 +1,13 @@
|
||||
Copyright <20> 2004 by MAGENTA Ltd. All Rights Reserved.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright and this permission notice shall be included in all copies of one or more of the Font Software typefaces.
|
||||
|
||||
The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing the word "MgOpen", or if the modifications are accepted for inclusion in the Font Software itself by the each appointed Administrator.
|
||||
|
||||
This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "MgOpen" name.
|
||||
|
||||
The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself.
|
||||
|
||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL MAGENTA OR PERSONS OR BODIES IN CHARGE OF ADMINISTRATION AND MAINTENANCE OF THE FONT SOFTWARE BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||
2
fonts/README
Executable file
@@ -0,0 +1,2 @@
|
||||
Use Facetype.js to generate typeface.json fonts.
|
||||
http://gero3.github.io/facetype.js/
|
||||
190
fonts/droid/NOTICE
Executable file
@@ -0,0 +1,190 @@
|
||||
|
||||
Copyright (c) 2005-2008, The Android Open Source Project
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
18
fonts/droid/README.txt
Executable file
@@ -0,0 +1,18 @@
|
||||
Copyright (C) 2008 The Android Open Source Project
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
##########
|
||||
|
||||
This directory contains the fonts for the platform. They are licensed
|
||||
under the Apache 2 license.
|
||||
1
fonts/droid/droid_sans_bold.typeface.json
Executable file
1
fonts/droid/droid_sans_mono_regular.typeface.json
Executable file
1
fonts/droid/droid_sans_regular.typeface.json
Executable file
1
fonts/droid/droid_serif_bold.typeface.json
Executable file
1
fonts/droid/droid_serif_regular.typeface.json
Executable file
1
fonts/gentilis_bold.typeface.json
Executable file
1
fonts/gentilis_regular.typeface.json
Executable file
1
fonts/helvetiker_bold.typeface.json
Executable file
1
fonts/helvetiker_regular.typeface.json
Executable file
1
fonts/optimer_bold.typeface.json
Executable file
1
fonts/optimer_regular.typeface.json
Executable file
BIN
fonts/ttf/kenpixel.ttf
Executable file
77
gamepad.js
Normal file
@@ -0,0 +1,77 @@
|
||||
var haveEvents = 'ongamepadconnected' in window;
|
||||
var controllers = {};
|
||||
|
||||
function connecthandler(e) {
|
||||
addgamepad(e.gamepad);
|
||||
}
|
||||
|
||||
function addgamepad(gamepad) {
|
||||
controllers[gamepad.index] = gamepad;
|
||||
requestAnimationFrame(updateStatus);
|
||||
}
|
||||
|
||||
function disconnecthandler(e) {
|
||||
removegamepad(e.gamepad);
|
||||
}
|
||||
|
||||
function removegamepad(gamepad) {
|
||||
delete controllers[gamepad.index];
|
||||
}
|
||||
|
||||
|
||||
|
||||
function updateStatus() {
|
||||
if (!haveEvents) {
|
||||
scangamepads();
|
||||
}
|
||||
|
||||
var i = 0;
|
||||
var j;
|
||||
|
||||
for (j in controllers) {
|
||||
var controller = controllers[j];
|
||||
|
||||
for (i = 0; i < controller.buttons.length; i++) {
|
||||
var val = controller.buttons[i];
|
||||
var pressed = val == 1.0;
|
||||
if (typeof(val) == "object") {
|
||||
pressed = val.pressed;
|
||||
val = val.value;
|
||||
}
|
||||
|
||||
if (pressed) {
|
||||
if(buttonPressed) { buttonPressed(i); }
|
||||
}
|
||||
}
|
||||
|
||||
/*var axes = d.getElementsByClassName("axis");
|
||||
for (i = 0; i < controller.axes.length; i++) {
|
||||
var a = axes[i];
|
||||
a.innerHTML = i + ": " + controller.axes[i].toFixed(4);
|
||||
a.setAttribute("value", controller.axes[i] + 1);
|
||||
} */
|
||||
}
|
||||
|
||||
requestAnimationFrame(updateStatus);
|
||||
}
|
||||
|
||||
function scangamepads() {
|
||||
var gamepads = navigator.getGamepads ? navigator.getGamepads() : (navigator.webkitGetGamepads ? navigator.webkitGetGamepads() : []);
|
||||
for (var i = 0; i < gamepads.length; i++) {
|
||||
if (gamepads[i]) {
|
||||
if (gamepads[i].index in controllers) {
|
||||
controllers[gamepads[i].index] = gamepads[i];
|
||||
} else {
|
||||
addgamepad(gamepads[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
window.addEventListener("gamepadconnected", connecthandler);
|
||||
window.addEventListener("gamepaddisconnected", disconnecthandler);
|
||||
|
||||
if (!haveEvents) {
|
||||
setInterval(scangamepads, 500);
|
||||
}
|
||||
33
gamepadtest.html
Normal file
@@ -0,0 +1,33 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<!--
|
||||
Gamepad API Test
|
||||
Written in 2013 by Ted Mielczarek <ted@mielczarek.org>
|
||||
To the extent possible under law, the author(s) have dedicated all copyright and related and neighboring rights to this software to the public domain worldwide. This software is distributed without any warranty.
|
||||
You should have received a copy of the CC0 Public Domain Dedication along with this software. If not, see <http://creativecommons.org/publicdomain/zero/1.0/>.
|
||||
-->
|
||||
<script type="text/javascript" src="./gamepad.js"></script>
|
||||
<style>
|
||||
.buttons, .axes {
|
||||
padding: 1em;
|
||||
}
|
||||
.button {
|
||||
padding: 1em;
|
||||
border-radius: 20px;
|
||||
border: 1px solid black;
|
||||
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAAXNSR0IArs4c6QAAAAxJREFUCNdjYPjPAAACAgEAqiqeJwAAAABJRU5ErkJggg==);
|
||||
background-size: 0% 0%;
|
||||
background-position: 50% 50%;
|
||||
background-repeat: no-repeat;
|
||||
}
|
||||
.pressed {
|
||||
border: 1px solid red;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
179
helper.js
Normal file
@@ -0,0 +1,179 @@
|
||||
var text = "three.js",
|
||||
|
||||
height = 20,
|
||||
size = 70,
|
||||
hover = 30,
|
||||
|
||||
curveSegments = 4,
|
||||
|
||||
bevelThickness = 2,
|
||||
bevelSize = 1.5,
|
||||
bevelSegments = 3,
|
||||
bevelEnabled = true,
|
||||
|
||||
font = undefined,
|
||||
|
||||
fontName = "optimer", // helvetiker, optimer, gentilis, droid sans, droid serif
|
||||
fontWeight = "bold"; // normal bold
|
||||
|
||||
var mirror = true;
|
||||
|
||||
var fontMap = {
|
||||
|
||||
"helvetiker": 0,
|
||||
"optimer": 1,
|
||||
"gentilis": 2,
|
||||
"droid/droid_sans": 3,
|
||||
"droid/droid_serif": 4
|
||||
|
||||
};
|
||||
|
||||
var weightMap = {
|
||||
|
||||
"regular": 0,
|
||||
"bold": 1
|
||||
|
||||
};
|
||||
|
||||
var reverseFontMap = [];
|
||||
var reverseWeightMap = [];
|
||||
|
||||
for (var i in fontMap) reverseFontMap[fontMap[i]] = i;
|
||||
for (var i in weightMap) reverseWeightMap[weightMap[i]] = i;
|
||||
|
||||
var targetRotation = 0;
|
||||
var targetRotationOnMouseDown = 0;
|
||||
|
||||
var mouseX = 0;
|
||||
var mouseXOnMouseDown = 0;
|
||||
|
||||
var windowHalfX = window.innerWidth / 2;
|
||||
var windowHalfY = window.innerHeight / 2;
|
||||
|
||||
var fontIndex = 1;
|
||||
|
||||
function decimalToHex(d) {
|
||||
|
||||
var hex = Number(d).toString(16);
|
||||
hex = "000000".substr(0, 6 - hex.length) + hex;
|
||||
return hex.toUpperCase();
|
||||
|
||||
}
|
||||
|
||||
|
||||
function loadFont() {
|
||||
|
||||
var loader = new THREE.FontLoader();
|
||||
loader.load('fonts/' + fontName + '_' + fontWeight + '.typeface.json', function(response) {
|
||||
|
||||
font = response;
|
||||
|
||||
refreshText();
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
function createText() {
|
||||
|
||||
textGeo = new THREE.TextBufferGeometry(text, {
|
||||
|
||||
font: font,
|
||||
|
||||
size: size,
|
||||
height: height,
|
||||
curveSegments: curveSegments,
|
||||
|
||||
bevelThickness: bevelThickness,
|
||||
bevelSize: bevelSize,
|
||||
bevelEnabled: bevelEnabled,
|
||||
|
||||
material: 0,
|
||||
extrudeMaterial: 1
|
||||
|
||||
});
|
||||
|
||||
textGeo.computeBoundingBox();
|
||||
textGeo.computeVertexNormals();
|
||||
|
||||
// "fix" side normals by removing z-component of normals for side faces
|
||||
// (this doesn't work well for beveled geometry as then we lose nice curvature around z-axis)
|
||||
|
||||
if (!bevelEnabled) {
|
||||
|
||||
var triangleAreaHeuristics = 0.1 * (height * size);
|
||||
|
||||
for (var i = 0; i < textGeo.faces.length; i++) {
|
||||
|
||||
var face = textGeo.faces[i];
|
||||
|
||||
if (face.materialIndex == 1) {
|
||||
|
||||
for (var j = 0; j < face.vertexNormals.length; j++) {
|
||||
|
||||
face.vertexNormals[j].z = 0;
|
||||
face.vertexNormals[j].normalize();
|
||||
|
||||
}
|
||||
|
||||
var va = textGeo.vertices[face.a];
|
||||
var vb = textGeo.vertices[face.b];
|
||||
var vc = textGeo.vertices[face.c];
|
||||
|
||||
var s = THREE.GeometryUtils.triangleArea(va, vb, vc);
|
||||
|
||||
if (s > triangleAreaHeuristics) {
|
||||
|
||||
for (var j = 0; j < face.vertexNormals.length; j++) {
|
||||
|
||||
face.vertexNormals[j].copy(face.normal);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
var centerOffset = -0.5 * (textGeo.boundingBox.max.x - textGeo.boundingBox.min.x);
|
||||
|
||||
textMesh1 = new THREE.Mesh(textGeo, materials);
|
||||
|
||||
textMesh1.position.x = centerOffset;
|
||||
textMesh1.position.y = hover;
|
||||
textMesh1.position.z = 0;
|
||||
|
||||
textMesh1.rotation.x = 0;
|
||||
textMesh1.rotation.y = Math.PI * 2;
|
||||
|
||||
group.add(textMesh1);
|
||||
|
||||
if (mirror) {
|
||||
|
||||
textMesh2 = new THREE.Mesh(textGeo, materials);
|
||||
|
||||
textMesh2.position.x = centerOffset;
|
||||
textMesh2.position.y = -hover;
|
||||
textMesh2.position.z = height;
|
||||
|
||||
textMesh2.rotation.x = Math.PI;
|
||||
textMesh2.rotation.y = Math.PI * 2;
|
||||
|
||||
group.add(textMesh2);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function refreshText() {
|
||||
|
||||
group.remove(textMesh1);
|
||||
if (mirror) group.remove(textMesh2);
|
||||
|
||||
if (!text) return;
|
||||
|
||||
createText();
|
||||
|
||||
}
|
||||
BIN
img/livada.jpg
Normal file
|
After Width: | Height: | Size: 2.4 MiB |
BIN
img/slide1.jpeg
Normal file
|
After Width: | Height: | Size: 51 KiB |
BIN
img/slide10.jpeg
Normal file
|
After Width: | Height: | Size: 101 KiB |
BIN
img/slide11.jpeg
Normal file
|
After Width: | Height: | Size: 105 KiB |
BIN
img/slide12.jpeg
Normal file
|
After Width: | Height: | Size: 100 KiB |
BIN
img/slide13.jpeg
Normal file
|
After Width: | Height: | Size: 88 KiB |
BIN
img/slide14.jpeg
Normal file
|
After Width: | Height: | Size: 84 KiB |
BIN
img/slide15.jpeg
Normal file
|
After Width: | Height: | Size: 84 KiB |
BIN
img/slide16.jpeg
Normal file
|
After Width: | Height: | Size: 83 KiB |
BIN
img/slide17.jpeg
Normal file
|
After Width: | Height: | Size: 83 KiB |
BIN
img/slide18.jpeg
Normal file
|
After Width: | Height: | Size: 103 KiB |
BIN
img/slide2.jpeg
Normal file
|
After Width: | Height: | Size: 44 KiB |
BIN
img/slide2.png
Normal file
|
After Width: | Height: | Size: 30 KiB |
BIN
img/slide3.jpeg
Normal file
|
After Width: | Height: | Size: 101 KiB |
BIN
img/slide4.jpeg
Normal file
|
After Width: | Height: | Size: 97 KiB |
BIN
img/slide5.jpeg
Normal file
|
After Width: | Height: | Size: 138 KiB |
BIN
img/slide6.jpeg
Normal file
|
After Width: | Height: | Size: 86 KiB |
BIN
img/slide7.jpeg
Normal file
|
After Width: | Height: | Size: 82 KiB |
BIN
img/slide8.jpeg
Normal file
|
After Width: | Height: | Size: 313 KiB |
BIN
img/slide9.jpeg
Normal file
|
After Width: | Height: | Size: 396 KiB |
BIN
img/testba.png
Normal file
|
After Width: | Height: | Size: 499 KiB |
1211
index.html
Normal file
113
node_modules/es6-promise/CHANGELOG.md
generated
vendored
Normal file
@@ -0,0 +1,113 @@
|
||||
# Master
|
||||
|
||||
# 4.0.5
|
||||
|
||||
* fix require('es6-promise/auto') for Node < 4
|
||||
|
||||
# 4.0.4
|
||||
|
||||
* fix asap when using https://github.com/Kinvey/titanium-sdk
|
||||
|
||||
# 4.0.3
|
||||
|
||||
* fix Readme links
|
||||
|
||||
# 4.0.2
|
||||
|
||||
* fix require('es6-promise/auto');
|
||||
|
||||
# 4.0.0
|
||||
|
||||
* no longer polyfill automatically, if needed one can still invoke
|
||||
`require('es6-promise/auto')` directly.
|
||||
|
||||
# 3.3.1
|
||||
|
||||
* fix links in readme
|
||||
|
||||
# 3.3.0
|
||||
|
||||
* support polyfil on WebMAF (playstation env)
|
||||
* fix tampering related bug global `constructor` was referenced by mistake.
|
||||
* provide TS Typings
|
||||
* increase compatibliity with sinon.useFakeTimers();
|
||||
* update build tools (use rollup)
|
||||
* directly export promise;
|
||||
|
||||
# 3.2.2
|
||||
|
||||
* IE8: use isArray
|
||||
* update build dependencies
|
||||
|
||||
# 3.2.1
|
||||
|
||||
* fix race tampering issue
|
||||
* use eslint
|
||||
* fix Promise.all tampering
|
||||
* remove unused code
|
||||
* fix issues with NWJS/electron
|
||||
|
||||
# 3.2.0
|
||||
|
||||
* improve tamper resistence of Promise.all Promise.race and
|
||||
Promise.prototype.then (note, this isn't complete, but addresses an exception
|
||||
when used \w core-js, follow up work will address entirely)
|
||||
* remove spec incompatible then chaining fast-path
|
||||
* add eslint
|
||||
* update build deps
|
||||
|
||||
# 3.1.2
|
||||
|
||||
* fix node detection issues with NWJS/electron
|
||||
|
||||
# 3.1.0
|
||||
|
||||
* improve performance of Promise.all when it encounters a non-promise input object input
|
||||
* then/resolve tamper protection
|
||||
* reduce AST size of promise constructor, to facilitate more inlining
|
||||
* Update README.md with details about PhantomJS requirement for running tests
|
||||
* Mangle and compress the minified version
|
||||
|
||||
# 3.0.1
|
||||
|
||||
* no longer include dist/test in npm releases
|
||||
|
||||
# 3.0.0
|
||||
|
||||
* use nextTick() instead of setImmediate() to schedule microtasks with node 0.10. Later versions of
|
||||
nodes are not affected as they were already using nextTick(). Note that using nextTick() might
|
||||
trigger a depreciation warning on 0.10 as described at https://github.com/cujojs/when/issues/410.
|
||||
The reason why nextTick() is preferred is that is setImmediate() would schedule a macrotask
|
||||
instead of a microtask and might result in a different scheduling.
|
||||
If needed you can revert to the former behavior as follow:
|
||||
|
||||
var Promise = require('es6-promise').Promise;
|
||||
Promise._setScheduler(setImmediate);
|
||||
|
||||
# 2.3.0
|
||||
|
||||
* #121: Ability to override the internal asap implementation
|
||||
* #120: Use an ascii character for an apostrophe, for source maps
|
||||
|
||||
# 2.2.0
|
||||
|
||||
* #116: Expose asap() and a way to override the scheduling mechanism on Promise
|
||||
* Lock to v0.2.3 of ember-cli
|
||||
|
||||
# 2.1.1
|
||||
|
||||
* Fix #100 via #105: tell browserify to ignore vertx require
|
||||
* Fix #101 via #102: "follow thenable state, not own state"
|
||||
|
||||
# 2.1.0
|
||||
|
||||
* #59: Automatic polyfill. No need to invoke `ES6Promise.polyfill()` anymore.
|
||||
* ... (see the commit log)
|
||||
|
||||
# 2.0.0
|
||||
|
||||
* re-sync with RSVP. Many large performance improvements and bugfixes.
|
||||
|
||||
# 1.0.0
|
||||
|
||||
* first subset of RSVP
|
||||
19
node_modules/es6-promise/LICENSE
generated
vendored
Normal file
@@ -0,0 +1,19 @@
|
||||
Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
the Software without restriction, including without limitation the rights to
|
||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
of the Software, and to permit persons to whom the Software is furnished to do
|
||||
so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
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.
|
||||
82
node_modules/es6-promise/README.md
generated
vendored
Normal file
@@ -0,0 +1,82 @@
|
||||
# ES6-Promise (subset of [rsvp.js](https://github.com/tildeio/rsvp.js)) [](https://travis-ci.org/stefanpenner/es6-promise)
|
||||
|
||||
This is a polyfill of the [ES6 Promise](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-promise-constructor). The implementation is a subset of [rsvp.js](https://github.com/tildeio/rsvp.js) extracted by @jakearchibald, if you're wanting extra features and more debugging options, check out the [full library](https://github.com/tildeio/rsvp.js).
|
||||
|
||||
For API details and how to use promises, see the <a href="http://www.html5rocks.com/en/tutorials/es6/promises/">JavaScript Promises HTML5Rocks article</a>.
|
||||
|
||||
## Downloads
|
||||
|
||||
* [es6-promise 27.86 KB (7.33 KB gzipped)](https://raw.githubusercontent.com/stefanpenner/es6-promise/master/dist/es6-promise.js)
|
||||
* [es6-promise-auto 27.78 KB (7.3 KB gzipped)](https://raw.githubusercontent.com/stefanpenner/es6-promise/master/dist/es6-promise.auto.js) - Automatically provides/replaces `Promise` if missing or broken.
|
||||
* [es6-promise-min 6.17 KB (2.4 KB gzipped)](https://raw.githubusercontent.com/stefanpenner/es6-promise/master/dist/es6-promise.min.js)
|
||||
* [es6-promise-auto-min 6.19 KB (2.4 KB gzipped)](https://raw.githubusercontent.com/stefanpenner/es6-promise/master/dist/es6-promise.auto.min.js) - Minified version of `es6-promise-auto` above.
|
||||
|
||||
## Node.js
|
||||
|
||||
To install:
|
||||
|
||||
```sh
|
||||
npm install es6-promise
|
||||
```
|
||||
|
||||
To use:
|
||||
|
||||
```js
|
||||
var Promise = require('es6-promise').Promise;
|
||||
```
|
||||
|
||||
## Bower
|
||||
|
||||
To install:
|
||||
|
||||
```sh
|
||||
bower install es6-promise --save
|
||||
```
|
||||
|
||||
|
||||
## Usage in IE<9
|
||||
|
||||
`catch` is a reserved word in IE<9, meaning `promise.catch(func)` throws a syntax error. To work around this, you can use a string to access the property as shown in the following example.
|
||||
|
||||
However, please remember that such technique is already provided by most common minifiers, making the resulting code safe for old browsers and production:
|
||||
|
||||
```js
|
||||
promise['catch'](function(err) {
|
||||
// ...
|
||||
});
|
||||
```
|
||||
|
||||
Or use `.then` instead:
|
||||
|
||||
```js
|
||||
promise.then(undefined, function(err) {
|
||||
// ...
|
||||
});
|
||||
```
|
||||
|
||||
## Auto-polyfill
|
||||
|
||||
To polyfill the global environment (either in Node or in the browser via CommonJS) use the following code snippet:
|
||||
|
||||
```js
|
||||
require('es6-promise').polyfill();
|
||||
```
|
||||
|
||||
Alternatively
|
||||
|
||||
```js
|
||||
require('es6-promise/auto');
|
||||
```
|
||||
|
||||
Notice that we don't assign the result of `polyfill()` to any variable. The `polyfill()` method will patch the global environment (in this case to the `Promise` name) when called.
|
||||
|
||||
## Building & Testing
|
||||
|
||||
You will need to have PhantomJS installed globally in order to run the tests.
|
||||
|
||||
`npm install -g phantomjs`
|
||||
|
||||
* `npm run build` to build
|
||||
* `npm test` to run tests
|
||||
* `npm start` to run a build watcher, and webserver to test
|
||||
* `npm run test:server` for a testem test runner and watching builder
|
||||
4
node_modules/es6-promise/auto.js
generated
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
// This file can be required in Browserify and Node.js for automatic polyfill
|
||||
// To use it: require('es6-promise/auto');
|
||||
'use strict';
|
||||
module.exports = require('./').polyfill();
|
||||
1159
node_modules/es6-promise/dist/es6-promise.auto.js
generated
vendored
Normal file
1
node_modules/es6-promise/dist/es6-promise.auto.map
generated
vendored
Normal file
1
node_modules/es6-promise/dist/es6-promise.auto.min.js
generated
vendored
Normal file
1
node_modules/es6-promise/dist/es6-promise.auto.min.map
generated
vendored
Normal file
1157
node_modules/es6-promise/dist/es6-promise.js
generated
vendored
Normal file
1
node_modules/es6-promise/dist/es6-promise.map
generated
vendored
Normal file
1
node_modules/es6-promise/dist/es6-promise.min.js
generated
vendored
Normal file
1
node_modules/es6-promise/dist/es6-promise.min.map
generated
vendored
Normal file
74
node_modules/es6-promise/es6-promise.d.ts
generated
vendored
Normal file
@@ -0,0 +1,74 @@
|
||||
export interface Thenable <R> {
|
||||
then <U> (onFulfilled?: (value: R) => U | Thenable<U>, onRejected?: (error: any) => U | Thenable<U>): Thenable<U>;
|
||||
then <U> (onFulfilled?: (value: R) => U | Thenable<U>, onRejected?: (error: any) => void): Thenable<U>;
|
||||
}
|
||||
|
||||
export class Promise <R> implements Thenable <R> {
|
||||
/**
|
||||
* If you call resolve in the body of the callback passed to the constructor,
|
||||
* your promise is fulfilled with result object passed to resolve.
|
||||
* If you call reject your promise is rejected with the object passed to resolve.
|
||||
* For consistency and debugging (eg stack traces), obj should be an instanceof Error.
|
||||
* Any errors thrown in the constructor callback will be implicitly passed to reject().
|
||||
*/
|
||||
constructor (callback: (resolve : (value?: R | Thenable<R>) => void, reject: (error?: any) => void) => void);
|
||||
|
||||
/**
|
||||
* onFulfilled is called when/if "promise" resolves. onRejected is called when/if "promise" rejects.
|
||||
* Both are optional, if either/both are omitted the next onFulfilled/onRejected in the chain is called.
|
||||
* Both callbacks have a single parameter , the fulfillment value or rejection reason.
|
||||
* "then" returns a new promise equivalent to the value you return from onFulfilled/onRejected after being passed through Promise.resolve.
|
||||
* If an error is thrown in the callback, the returned promise rejects with that error.
|
||||
*
|
||||
* @param onFulfilled called when/if "promise" resolves
|
||||
* @param onRejected called when/if "promise" rejects
|
||||
*/
|
||||
then <U> (onFulfilled?: (value: R) => U | Thenable<U>, onRejected?: (error: any) => U | Thenable<U>): Promise<U>;
|
||||
then <U> (onFulfilled?: (value: R) => U | Thenable<U>, onRejected?: (error: any) => void): Promise<U>;
|
||||
|
||||
/**
|
||||
* Sugar for promise.then(undefined, onRejected)
|
||||
*
|
||||
* @param onRejected called when/if "promise" rejects
|
||||
*/
|
||||
catch <U> (onRejected?: (error: any) => U | Thenable<U>): Promise<U>;
|
||||
|
||||
/**
|
||||
* Make a new promise from the thenable.
|
||||
* A thenable is promise-like in as far as it has a "then" method.
|
||||
*/
|
||||
static resolve (): Promise<void>;
|
||||
static resolve <R> (value: R | Thenable<R>): Promise<R>;
|
||||
|
||||
/**
|
||||
* Make a promise that rejects to obj. For consistency and debugging (eg stack traces), obj should be an instanceof Error
|
||||
*/
|
||||
static reject <R> (error: any): Promise<R>;
|
||||
|
||||
/**
|
||||
* Make a promise that fulfills when every item in the array fulfills, and rejects if (and when) any item rejects.
|
||||
* the array passed to all can be a mixture of promise-like objects and other objects.
|
||||
* The fulfillment value is an array (in order) of fulfillment values. The rejection value is the first rejection value.
|
||||
*/
|
||||
static all<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(values: [T1 | Thenable<T1>, T2 | Thenable<T2>, T3 | Thenable<T3>, T4 | Thenable <T4>, T5 | Thenable<T5>, T6 | Thenable<T6>, T7 | Thenable<T7>, T8 | Thenable<T8>, T9 | Thenable<T9>, T10 | Thenable<T10>]): Promise<[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10]>;
|
||||
static all<T1, T2, T3, T4, T5, T6, T7, T8, T9>(values: [T1 | Thenable<T1>, T2 | Thenable<T2>, T3 | Thenable<T3>, T4 | Thenable <T4>, T5 | Thenable<T5>, T6 | Thenable<T6>, T7 | Thenable<T7>, T8 | Thenable<T8>, T9 | Thenable<T9>]): Promise<[T1, T2, T3, T4, T5, T6, T7, T8, T9]>;
|
||||
static all<T1, T2, T3, T4, T5, T6, T7, T8>(values: [T1 | Thenable<T1>, T2 | Thenable<T2>, T3 | Thenable<T3>, T4 | Thenable <T4>, T5 | Thenable<T5>, T6 | Thenable<T6>, T7 | Thenable<T7>, T8 | Thenable<T8>]): Promise<[T1, T2, T3, T4, T5, T6, T7, T8]>;
|
||||
static all<T1, T2, T3, T4, T5, T6, T7>(values: [T1 | Thenable<T1>, T2 | Thenable<T2>, T3 | Thenable<T3>, T4 | Thenable <T4>, T5 | Thenable<T5>, T6 | Thenable<T6>, T7 | Thenable<T7>]): Promise<[T1, T2, T3, T4, T5, T6, T7]>;
|
||||
static all<T1, T2, T3, T4, T5, T6>(values: [T1 | Thenable<T1>, T2 | Thenable<T2>, T3 | Thenable<T3>, T4 | Thenable <T4>, T5 | Thenable<T5>, T6 | Thenable<T6>]): Promise<[T1, T2, T3, T4, T5, T6]>;
|
||||
static all<T1, T2, T3, T4, T5>(values: [T1 | Thenable<T1>, T2 | Thenable<T2>, T3 | Thenable<T3>, T4 | Thenable <T4>, T5 | Thenable<T5>]): Promise<[T1, T2, T3, T4, T5]>;
|
||||
static all<T1, T2, T3, T4>(values: [T1 | Thenable<T1>, T2 | Thenable<T2>, T3 | Thenable<T3>, T4 | Thenable <T4>]): Promise<[T1, T2, T3, T4]>;
|
||||
static all<T1, T2, T3>(values: [T1 | Thenable<T1>, T2 | Thenable<T2>, T3 | Thenable<T3>]): Promise<[T1, T2, T3]>;
|
||||
static all<T1, T2>(values: [T1 | Thenable<T1>, T2 | Thenable<T2>]): Promise<[T1, T2]>;
|
||||
static all<T1>(values: [T1 | Thenable<T1>]): Promise<[T1]>;
|
||||
static all<TAll>(values: Array<TAll | Thenable<TAll>>): Promise<TAll[]>;
|
||||
|
||||
/**
|
||||
* Make a Promise that fulfills when any item fulfills, and rejects if any item rejects.
|
||||
*/
|
||||
static race <R> (promises: (R | Thenable<R>)[]): Promise<R>;
|
||||
}
|
||||
|
||||
/**
|
||||
* The polyfill method will patch the global environment (in this case to the Promise name) when called.
|
||||
*/
|
||||
export function polyfill (): void;
|
||||
7
node_modules/es6-promise/lib/es6-promise.js
generated
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
import Promise from './es6-promise/promise';
|
||||
import polyfill from './es6-promise/polyfill';
|
||||
|
||||
// Strange compat..
|
||||
Promise.polyfill = polyfill;
|
||||
Promise.Promise = Promise;
|
||||
export default Promise;
|
||||
270
node_modules/es6-promise/lib/es6-promise/-internal.js
generated
vendored
Normal file
@@ -0,0 +1,270 @@
|
||||
import {
|
||||
objectOrFunction,
|
||||
isFunction
|
||||
} from './utils';
|
||||
|
||||
import {
|
||||
asap
|
||||
} from './asap';
|
||||
|
||||
import originalThen from './then';
|
||||
import originalResolve from './promise/resolve';
|
||||
|
||||
export const PROMISE_ID = Math.random().toString(36).substring(16);
|
||||
|
||||
function noop() {}
|
||||
|
||||
const PENDING = void 0;
|
||||
const FULFILLED = 1;
|
||||
const REJECTED = 2;
|
||||
|
||||
const GET_THEN_ERROR = new ErrorObject();
|
||||
|
||||
function selfFulfillment() {
|
||||
return new TypeError("You cannot resolve a promise with itself");
|
||||
}
|
||||
|
||||
function cannotReturnOwn() {
|
||||
return new TypeError('A promises callback cannot return that same promise.');
|
||||
}
|
||||
|
||||
function getThen(promise) {
|
||||
try {
|
||||
return promise.then;
|
||||
} catch(error) {
|
||||
GET_THEN_ERROR.error = error;
|
||||
return GET_THEN_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
function tryThen(then, value, fulfillmentHandler, rejectionHandler) {
|
||||
try {
|
||||
then.call(value, fulfillmentHandler, rejectionHandler);
|
||||
} catch(e) {
|
||||
return e;
|
||||
}
|
||||
}
|
||||
|
||||
function handleForeignThenable(promise, thenable, then) {
|
||||
asap(promise => {
|
||||
var sealed = false;
|
||||
var error = tryThen(then, thenable, value => {
|
||||
if (sealed) { return; }
|
||||
sealed = true;
|
||||
if (thenable !== value) {
|
||||
resolve(promise, value);
|
||||
} else {
|
||||
fulfill(promise, value);
|
||||
}
|
||||
}, reason => {
|
||||
if (sealed) { return; }
|
||||
sealed = true;
|
||||
|
||||
reject(promise, reason);
|
||||
}, 'Settle: ' + (promise._label || ' unknown promise'));
|
||||
|
||||
if (!sealed && error) {
|
||||
sealed = true;
|
||||
reject(promise, error);
|
||||
}
|
||||
}, promise);
|
||||
}
|
||||
|
||||
function handleOwnThenable(promise, thenable) {
|
||||
if (thenable._state === FULFILLED) {
|
||||
fulfill(promise, thenable._result);
|
||||
} else if (thenable._state === REJECTED) {
|
||||
reject(promise, thenable._result);
|
||||
} else {
|
||||
subscribe(thenable, undefined, value => resolve(promise, value),
|
||||
reason => reject(promise, reason))
|
||||
}
|
||||
}
|
||||
|
||||
function handleMaybeThenable(promise, maybeThenable, then) {
|
||||
if (maybeThenable.constructor === promise.constructor &&
|
||||
then === originalThen &&
|
||||
maybeThenable.constructor.resolve === originalResolve) {
|
||||
handleOwnThenable(promise, maybeThenable);
|
||||
} else {
|
||||
if (then === GET_THEN_ERROR) {
|
||||
reject(promise, GET_THEN_ERROR.error);
|
||||
} else if (then === undefined) {
|
||||
fulfill(promise, maybeThenable);
|
||||
} else if (isFunction(then)) {
|
||||
handleForeignThenable(promise, maybeThenable, then);
|
||||
} else {
|
||||
fulfill(promise, maybeThenable);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function resolve(promise, value) {
|
||||
if (promise === value) {
|
||||
reject(promise, selfFulfillment());
|
||||
} else if (objectOrFunction(value)) {
|
||||
handleMaybeThenable(promise, value, getThen(value));
|
||||
} else {
|
||||
fulfill(promise, value);
|
||||
}
|
||||
}
|
||||
|
||||
function publishRejection(promise) {
|
||||
if (promise._onerror) {
|
||||
promise._onerror(promise._result);
|
||||
}
|
||||
|
||||
publish(promise);
|
||||
}
|
||||
|
||||
function fulfill(promise, value) {
|
||||
if (promise._state !== PENDING) { return; }
|
||||
|
||||
promise._result = value;
|
||||
promise._state = FULFILLED;
|
||||
|
||||
if (promise._subscribers.length !== 0) {
|
||||
asap(publish, promise);
|
||||
}
|
||||
}
|
||||
|
||||
function reject(promise, reason) {
|
||||
if (promise._state !== PENDING) { return; }
|
||||
promise._state = REJECTED;
|
||||
promise._result = reason;
|
||||
|
||||
asap(publishRejection, promise);
|
||||
}
|
||||
|
||||
function subscribe(parent, child, onFulfillment, onRejection) {
|
||||
let { _subscribers } = parent;
|
||||
let { length } = _subscribers;
|
||||
|
||||
parent._onerror = null;
|
||||
|
||||
_subscribers[length] = child;
|
||||
_subscribers[length + FULFILLED] = onFulfillment;
|
||||
_subscribers[length + REJECTED] = onRejection;
|
||||
|
||||
if (length === 0 && parent._state) {
|
||||
asap(publish, parent);
|
||||
}
|
||||
}
|
||||
|
||||
function publish(promise) {
|
||||
let subscribers = promise._subscribers;
|
||||
let settled = promise._state;
|
||||
|
||||
if (subscribers.length === 0) { return; }
|
||||
|
||||
let child, callback, detail = promise._result;
|
||||
|
||||
for (let i = 0; i < subscribers.length; i += 3) {
|
||||
child = subscribers[i];
|
||||
callback = subscribers[i + settled];
|
||||
|
||||
if (child) {
|
||||
invokeCallback(settled, child, callback, detail);
|
||||
} else {
|
||||
callback(detail);
|
||||
}
|
||||
}
|
||||
|
||||
promise._subscribers.length = 0;
|
||||
}
|
||||
|
||||
function ErrorObject() {
|
||||
this.error = null;
|
||||
}
|
||||
|
||||
const TRY_CATCH_ERROR = new ErrorObject();
|
||||
|
||||
function tryCatch(callback, detail) {
|
||||
try {
|
||||
return callback(detail);
|
||||
} catch(e) {
|
||||
TRY_CATCH_ERROR.error = e;
|
||||
return TRY_CATCH_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
function invokeCallback(settled, promise, callback, detail) {
|
||||
let hasCallback = isFunction(callback),
|
||||
value, error, succeeded, failed;
|
||||
|
||||
if (hasCallback) {
|
||||
value = tryCatch(callback, detail);
|
||||
|
||||
if (value === TRY_CATCH_ERROR) {
|
||||
failed = true;
|
||||
error = value.error;
|
||||
value = null;
|
||||
} else {
|
||||
succeeded = true;
|
||||
}
|
||||
|
||||
if (promise === value) {
|
||||
reject(promise, cannotReturnOwn());
|
||||
return;
|
||||
}
|
||||
|
||||
} else {
|
||||
value = detail;
|
||||
succeeded = true;
|
||||
}
|
||||
|
||||
if (promise._state !== PENDING) {
|
||||
// noop
|
||||
} else if (hasCallback && succeeded) {
|
||||
resolve(promise, value);
|
||||
} else if (failed) {
|
||||
reject(promise, error);
|
||||
} else if (settled === FULFILLED) {
|
||||
fulfill(promise, value);
|
||||
} else if (settled === REJECTED) {
|
||||
reject(promise, value);
|
||||
}
|
||||
}
|
||||
|
||||
function initializePromise(promise, resolver) {
|
||||
try {
|
||||
resolver(function resolvePromise(value){
|
||||
resolve(promise, value);
|
||||
}, function rejectPromise(reason) {
|
||||
reject(promise, reason);
|
||||
});
|
||||
} catch(e) {
|
||||
reject(promise, e);
|
||||
}
|
||||
}
|
||||
|
||||
let id = 0;
|
||||
function nextId() {
|
||||
return id++;
|
||||
}
|
||||
|
||||
function makePromise(promise) {
|
||||
promise[PROMISE_ID] = id++;
|
||||
promise._state = undefined;
|
||||
promise._result = undefined;
|
||||
promise._subscribers = [];
|
||||
}
|
||||
|
||||
export {
|
||||
nextId,
|
||||
makePromise,
|
||||
getThen,
|
||||
noop,
|
||||
resolve,
|
||||
reject,
|
||||
fulfill,
|
||||
subscribe,
|
||||
publish,
|
||||
publishRejection,
|
||||
initializePromise,
|
||||
invokeCallback,
|
||||
FULFILLED,
|
||||
REJECTED,
|
||||
PENDING,
|
||||
handleMaybeThenable
|
||||
};
|
||||
120
node_modules/es6-promise/lib/es6-promise/asap.js
generated
vendored
Normal file
@@ -0,0 +1,120 @@
|
||||
let len = 0;
|
||||
let vertxNext;
|
||||
let customSchedulerFn;
|
||||
|
||||
export var asap = function asap(callback, arg) {
|
||||
queue[len] = callback;
|
||||
queue[len + 1] = arg;
|
||||
len += 2;
|
||||
if (len === 2) {
|
||||
// If len is 2, that means that we need to schedule an async flush.
|
||||
// If additional callbacks are queued before the queue is flushed, they
|
||||
// will be processed by this flush that we are scheduling.
|
||||
if (customSchedulerFn) {
|
||||
customSchedulerFn(flush);
|
||||
} else {
|
||||
scheduleFlush();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export function setScheduler(scheduleFn) {
|
||||
customSchedulerFn = scheduleFn;
|
||||
}
|
||||
|
||||
export function setAsap(asapFn) {
|
||||
asap = asapFn;
|
||||
}
|
||||
|
||||
const browserWindow = (typeof window !== 'undefined') ? window : undefined;
|
||||
const browserGlobal = browserWindow || {};
|
||||
const BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver;
|
||||
const isNode = typeof self === 'undefined' && typeof process !== 'undefined' && {}.toString.call(process) === '[object process]';
|
||||
|
||||
// test for web worker but not in IE10
|
||||
const isWorker = typeof Uint8ClampedArray !== 'undefined' &&
|
||||
typeof importScripts !== 'undefined' &&
|
||||
typeof MessageChannel !== 'undefined';
|
||||
|
||||
// node
|
||||
function useNextTick() {
|
||||
// node version 0.10.x displays a deprecation warning when nextTick is used recursively
|
||||
// see https://github.com/cujojs/when/issues/410 for details
|
||||
return () => process.nextTick(flush);
|
||||
}
|
||||
|
||||
// vertx
|
||||
function useVertxTimer() {
|
||||
if (typeof vertxNext !== 'undefined') {
|
||||
return function() {
|
||||
vertxNext(flush);
|
||||
};
|
||||
}
|
||||
|
||||
return useSetTimeout();
|
||||
}
|
||||
|
||||
function useMutationObserver() {
|
||||
let iterations = 0;
|
||||
const observer = new BrowserMutationObserver(flush);
|
||||
const node = document.createTextNode('');
|
||||
observer.observe(node, { characterData: true });
|
||||
|
||||
return () => {
|
||||
node.data = (iterations = ++iterations % 2);
|
||||
};
|
||||
}
|
||||
|
||||
// web worker
|
||||
function useMessageChannel() {
|
||||
const channel = new MessageChannel();
|
||||
channel.port1.onmessage = flush;
|
||||
return () => channel.port2.postMessage(0);
|
||||
}
|
||||
|
||||
function useSetTimeout() {
|
||||
// Store setTimeout reference so es6-promise will be unaffected by
|
||||
// other code modifying setTimeout (like sinon.useFakeTimers())
|
||||
const globalSetTimeout = setTimeout;
|
||||
return () => globalSetTimeout(flush, 1);
|
||||
}
|
||||
|
||||
const queue = new Array(1000);
|
||||
function flush() {
|
||||
for (let i = 0; i < len; i+=2) {
|
||||
let callback = queue[i];
|
||||
let arg = queue[i+1];
|
||||
|
||||
callback(arg);
|
||||
|
||||
queue[i] = undefined;
|
||||
queue[i+1] = undefined;
|
||||
}
|
||||
|
||||
len = 0;
|
||||
}
|
||||
|
||||
function attemptVertx() {
|
||||
try {
|
||||
const r = require;
|
||||
const vertx = r('vertx');
|
||||
vertxNext = vertx.runOnLoop || vertx.runOnContext;
|
||||
return useVertxTimer();
|
||||
} catch(e) {
|
||||
return useSetTimeout();
|
||||
}
|
||||
}
|
||||
|
||||
let scheduleFlush;
|
||||
// Decide what async method to use to triggering processing of queued callbacks:
|
||||
if (isNode) {
|
||||
scheduleFlush = useNextTick();
|
||||
} else if (BrowserMutationObserver) {
|
||||
scheduleFlush = useMutationObserver();
|
||||
} else if (isWorker) {
|
||||
scheduleFlush = useMessageChannel();
|
||||
} else if (browserWindow === undefined && typeof require === 'function') {
|
||||
scheduleFlush = attemptVertx();
|
||||
} else {
|
||||
scheduleFlush = useSetTimeout();
|
||||
}
|
||||
114
node_modules/es6-promise/lib/es6-promise/enumerator.js
generated
vendored
Normal file
@@ -0,0 +1,114 @@
|
||||
import {
|
||||
isArray,
|
||||
isMaybeThenable
|
||||
} from './utils';
|
||||
|
||||
import {
|
||||
noop,
|
||||
reject,
|
||||
fulfill,
|
||||
subscribe,
|
||||
FULFILLED,
|
||||
REJECTED,
|
||||
PENDING,
|
||||
getThen,
|
||||
handleMaybeThenable
|
||||
} from './-internal';
|
||||
|
||||
import then from './then';
|
||||
import Promise from './promise';
|
||||
import originalResolve from './promise/resolve';
|
||||
import originalThen from './then';
|
||||
import { makePromise, PROMISE_ID } from './-internal';
|
||||
|
||||
export default Enumerator;
|
||||
function Enumerator(Constructor, input) {
|
||||
this._instanceConstructor = Constructor;
|
||||
this.promise = new Constructor(noop);
|
||||
|
||||
if (!this.promise[PROMISE_ID]) {
|
||||
makePromise(this.promise);
|
||||
}
|
||||
|
||||
if (isArray(input)) {
|
||||
this._input = input;
|
||||
this.length = input.length;
|
||||
this._remaining = input.length;
|
||||
|
||||
this._result = new Array(this.length);
|
||||
|
||||
if (this.length === 0) {
|
||||
fulfill(this.promise, this._result);
|
||||
} else {
|
||||
this.length = this.length || 0;
|
||||
this._enumerate();
|
||||
if (this._remaining === 0) {
|
||||
fulfill(this.promise, this._result);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
reject(this.promise, validationError());
|
||||
}
|
||||
}
|
||||
|
||||
function validationError() {
|
||||
return new Error('Array Methods must be provided an Array');
|
||||
};
|
||||
|
||||
Enumerator.prototype._enumerate = function() {
|
||||
let { length, _input } = this;
|
||||
|
||||
for (let i = 0; this._state === PENDING && i < length; i++) {
|
||||
this._eachEntry(_input[i], i);
|
||||
}
|
||||
};
|
||||
|
||||
Enumerator.prototype._eachEntry = function(entry, i) {
|
||||
let c = this._instanceConstructor;
|
||||
let { resolve } = c;
|
||||
|
||||
if (resolve === originalResolve) {
|
||||
let then = getThen(entry);
|
||||
|
||||
if (then === originalThen &&
|
||||
entry._state !== PENDING) {
|
||||
this._settledAt(entry._state, i, entry._result);
|
||||
} else if (typeof then !== 'function') {
|
||||
this._remaining--;
|
||||
this._result[i] = entry;
|
||||
} else if (c === Promise) {
|
||||
let promise = new c(noop);
|
||||
handleMaybeThenable(promise, entry, then);
|
||||
this._willSettleAt(promise, i);
|
||||
} else {
|
||||
this._willSettleAt(new c(resolve => resolve(entry)), i);
|
||||
}
|
||||
} else {
|
||||
this._willSettleAt(resolve(entry), i);
|
||||
}
|
||||
};
|
||||
|
||||
Enumerator.prototype._settledAt = function(state, i, value) {
|
||||
let { promise } = this;
|
||||
|
||||
if (promise._state === PENDING) {
|
||||
this._remaining--;
|
||||
|
||||
if (state === REJECTED) {
|
||||
reject(promise, value);
|
||||
} else {
|
||||
this._result[i] = value;
|
||||
}
|
||||
}
|
||||
|
||||
if (this._remaining === 0) {
|
||||
fulfill(promise, this._result);
|
||||
}
|
||||
};
|
||||
|
||||
Enumerator.prototype._willSettleAt = function(promise, i) {
|
||||
let enumerator = this;
|
||||
|
||||
subscribe(promise, undefined, value => enumerator._settledAt(FULFILLED, i, value),
|
||||
reason => enumerator._settledAt(REJECTED, i, reason));
|
||||
};
|
||||
35
node_modules/es6-promise/lib/es6-promise/polyfill.js
generated
vendored
Normal file
@@ -0,0 +1,35 @@
|
||||
/*global self*/
|
||||
import Promise from './promise';
|
||||
|
||||
export default function polyfill() {
|
||||
let local;
|
||||
|
||||
if (typeof global !== 'undefined') {
|
||||
local = global;
|
||||
} else if (typeof self !== 'undefined') {
|
||||
local = self;
|
||||
} else {
|
||||
try {
|
||||
local = Function('return this')();
|
||||
} catch (e) {
|
||||
throw new Error('polyfill failed because global object is unavailable in this environment');
|
||||
}
|
||||
}
|
||||
|
||||
let P = local.Promise;
|
||||
|
||||
if (P) {
|
||||
var promiseToString = null;
|
||||
try {
|
||||
promiseToString = Object.prototype.toString.call(P.resolve());
|
||||
} catch(e) {
|
||||
// silently ignored
|
||||
}
|
||||
|
||||
if (promiseToString === '[object Promise]' && !P.cast){
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
local.Promise = Promise;
|
||||
}
|
||||
383
node_modules/es6-promise/lib/es6-promise/promise.js
generated
vendored
Normal file
@@ -0,0 +1,383 @@
|
||||
import {
|
||||
isFunction
|
||||
} from './utils';
|
||||
|
||||
import {
|
||||
noop,
|
||||
nextId,
|
||||
PROMISE_ID,
|
||||
initializePromise
|
||||
} from './-internal';
|
||||
|
||||
import {
|
||||
asap,
|
||||
setAsap,
|
||||
setScheduler
|
||||
} from './asap';
|
||||
|
||||
import all from './promise/all';
|
||||
import race from './promise/race';
|
||||
import Resolve from './promise/resolve';
|
||||
import Reject from './promise/reject';
|
||||
import then from './then';
|
||||
|
||||
|
||||
function needsResolver() {
|
||||
throw new TypeError('You must pass a resolver function as the first argument to the promise constructor');
|
||||
}
|
||||
|
||||
function needsNew() {
|
||||
throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.");
|
||||
}
|
||||
|
||||
/**
|
||||
Promise objects represent the eventual result of an asynchronous operation. The
|
||||
primary way of interacting with a promise is through its `then` method, which
|
||||
registers callbacks to receive either a promise's eventual value or the reason
|
||||
why the promise cannot be fulfilled.
|
||||
|
||||
Terminology
|
||||
-----------
|
||||
|
||||
- `promise` is an object or function with a `then` method whose behavior conforms to this specification.
|
||||
- `thenable` is an object or function that defines a `then` method.
|
||||
- `value` is any legal JavaScript value (including undefined, a thenable, or a promise).
|
||||
- `exception` is a value that is thrown using the throw statement.
|
||||
- `reason` is a value that indicates why a promise was rejected.
|
||||
- `settled` the final resting state of a promise, fulfilled or rejected.
|
||||
|
||||
A promise can be in one of three states: pending, fulfilled, or rejected.
|
||||
|
||||
Promises that are fulfilled have a fulfillment value and are in the fulfilled
|
||||
state. Promises that are rejected have a rejection reason and are in the
|
||||
rejected state. A fulfillment value is never a thenable.
|
||||
|
||||
Promises can also be said to *resolve* a value. If this value is also a
|
||||
promise, then the original promise's settled state will match the value's
|
||||
settled state. So a promise that *resolves* a promise that rejects will
|
||||
itself reject, and a promise that *resolves* a promise that fulfills will
|
||||
itself fulfill.
|
||||
|
||||
|
||||
Basic Usage:
|
||||
------------
|
||||
|
||||
```js
|
||||
let promise = new Promise(function(resolve, reject) {
|
||||
// on success
|
||||
resolve(value);
|
||||
|
||||
// on failure
|
||||
reject(reason);
|
||||
});
|
||||
|
||||
promise.then(function(value) {
|
||||
// on fulfillment
|
||||
}, function(reason) {
|
||||
// on rejection
|
||||
});
|
||||
```
|
||||
|
||||
Advanced Usage:
|
||||
---------------
|
||||
|
||||
Promises shine when abstracting away asynchronous interactions such as
|
||||
`XMLHttpRequest`s.
|
||||
|
||||
```js
|
||||
function getJSON(url) {
|
||||
return new Promise(function(resolve, reject){
|
||||
let xhr = new XMLHttpRequest();
|
||||
|
||||
xhr.open('GET', url);
|
||||
xhr.onreadystatechange = handler;
|
||||
xhr.responseType = 'json';
|
||||
xhr.setRequestHeader('Accept', 'application/json');
|
||||
xhr.send();
|
||||
|
||||
function handler() {
|
||||
if (this.readyState === this.DONE) {
|
||||
if (this.status === 200) {
|
||||
resolve(this.response);
|
||||
} else {
|
||||
reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']'));
|
||||
}
|
||||
}
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
getJSON('/posts.json').then(function(json) {
|
||||
// on fulfillment
|
||||
}, function(reason) {
|
||||
// on rejection
|
||||
});
|
||||
```
|
||||
|
||||
Unlike callbacks, promises are great composable primitives.
|
||||
|
||||
```js
|
||||
Promise.all([
|
||||
getJSON('/posts'),
|
||||
getJSON('/comments')
|
||||
]).then(function(values){
|
||||
values[0] // => postsJSON
|
||||
values[1] // => commentsJSON
|
||||
|
||||
return values;
|
||||
});
|
||||
```
|
||||
|
||||
@class Promise
|
||||
@param {function} resolver
|
||||
Useful for tooling.
|
||||
@constructor
|
||||
*/
|
||||
export default function Promise(resolver) {
|
||||
this[PROMISE_ID] = nextId();
|
||||
this._result = this._state = undefined;
|
||||
this._subscribers = [];
|
||||
|
||||
if (noop !== resolver) {
|
||||
typeof resolver !== 'function' && needsResolver();
|
||||
this instanceof Promise ? initializePromise(this, resolver) : needsNew();
|
||||
}
|
||||
}
|
||||
|
||||
Promise.all = all;
|
||||
Promise.race = race;
|
||||
Promise.resolve = Resolve;
|
||||
Promise.reject = Reject;
|
||||
Promise._setScheduler = setScheduler;
|
||||
Promise._setAsap = setAsap;
|
||||
Promise._asap = asap;
|
||||
|
||||
Promise.prototype = {
|
||||
constructor: Promise,
|
||||
|
||||
/**
|
||||
The primary way of interacting with a promise is through its `then` method,
|
||||
which registers callbacks to receive either a promise's eventual value or the
|
||||
reason why the promise cannot be fulfilled.
|
||||
|
||||
```js
|
||||
findUser().then(function(user){
|
||||
// user is available
|
||||
}, function(reason){
|
||||
// user is unavailable, and you are given the reason why
|
||||
});
|
||||
```
|
||||
|
||||
Chaining
|
||||
--------
|
||||
|
||||
The return value of `then` is itself a promise. This second, 'downstream'
|
||||
promise is resolved with the return value of the first promise's fulfillment
|
||||
or rejection handler, or rejected if the handler throws an exception.
|
||||
|
||||
```js
|
||||
findUser().then(function (user) {
|
||||
return user.name;
|
||||
}, function (reason) {
|
||||
return 'default name';
|
||||
}).then(function (userName) {
|
||||
// If `findUser` fulfilled, `userName` will be the user's name, otherwise it
|
||||
// will be `'default name'`
|
||||
});
|
||||
|
||||
findUser().then(function (user) {
|
||||
throw new Error('Found user, but still unhappy');
|
||||
}, function (reason) {
|
||||
throw new Error('`findUser` rejected and we're unhappy');
|
||||
}).then(function (value) {
|
||||
// never reached
|
||||
}, function (reason) {
|
||||
// if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'.
|
||||
// If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'.
|
||||
});
|
||||
```
|
||||
If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream.
|
||||
|
||||
```js
|
||||
findUser().then(function (user) {
|
||||
throw new PedagogicalException('Upstream error');
|
||||
}).then(function (value) {
|
||||
// never reached
|
||||
}).then(function (value) {
|
||||
// never reached
|
||||
}, function (reason) {
|
||||
// The `PedgagocialException` is propagated all the way down to here
|
||||
});
|
||||
```
|
||||
|
||||
Assimilation
|
||||
------------
|
||||
|
||||
Sometimes the value you want to propagate to a downstream promise can only be
|
||||
retrieved asynchronously. This can be achieved by returning a promise in the
|
||||
fulfillment or rejection handler. The downstream promise will then be pending
|
||||
until the returned promise is settled. This is called *assimilation*.
|
||||
|
||||
```js
|
||||
findUser().then(function (user) {
|
||||
return findCommentsByAuthor(user);
|
||||
}).then(function (comments) {
|
||||
// The user's comments are now available
|
||||
});
|
||||
```
|
||||
|
||||
If the assimliated promise rejects, then the downstream promise will also reject.
|
||||
|
||||
```js
|
||||
findUser().then(function (user) {
|
||||
return findCommentsByAuthor(user);
|
||||
}).then(function (comments) {
|
||||
// If `findCommentsByAuthor` fulfills, we'll have the value here
|
||||
}, function (reason) {
|
||||
// If `findCommentsByAuthor` rejects, we'll have the reason here
|
||||
});
|
||||
```
|
||||
|
||||
Simple Example
|
||||
--------------
|
||||
|
||||
Synchronous Example
|
||||
|
||||
```javascript
|
||||
let result;
|
||||
|
||||
try {
|
||||
result = findResult();
|
||||
// success
|
||||
} catch(reason) {
|
||||
// failure
|
||||
}
|
||||
```
|
||||
|
||||
Errback Example
|
||||
|
||||
```js
|
||||
findResult(function(result, err){
|
||||
if (err) {
|
||||
// failure
|
||||
} else {
|
||||
// success
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
Promise Example;
|
||||
|
||||
```javascript
|
||||
findResult().then(function(result){
|
||||
// success
|
||||
}, function(reason){
|
||||
// failure
|
||||
});
|
||||
```
|
||||
|
||||
Advanced Example
|
||||
--------------
|
||||
|
||||
Synchronous Example
|
||||
|
||||
```javascript
|
||||
let author, books;
|
||||
|
||||
try {
|
||||
author = findAuthor();
|
||||
books = findBooksByAuthor(author);
|
||||
// success
|
||||
} catch(reason) {
|
||||
// failure
|
||||
}
|
||||
```
|
||||
|
||||
Errback Example
|
||||
|
||||
```js
|
||||
|
||||
function foundBooks(books) {
|
||||
|
||||
}
|
||||
|
||||
function failure(reason) {
|
||||
|
||||
}
|
||||
|
||||
findAuthor(function(author, err){
|
||||
if (err) {
|
||||
failure(err);
|
||||
// failure
|
||||
} else {
|
||||
try {
|
||||
findBoooksByAuthor(author, function(books, err) {
|
||||
if (err) {
|
||||
failure(err);
|
||||
} else {
|
||||
try {
|
||||
foundBooks(books);
|
||||
} catch(reason) {
|
||||
failure(reason);
|
||||
}
|
||||
}
|
||||
});
|
||||
} catch(error) {
|
||||
failure(err);
|
||||
}
|
||||
// success
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
Promise Example;
|
||||
|
||||
```javascript
|
||||
findAuthor().
|
||||
then(findBooksByAuthor).
|
||||
then(function(books){
|
||||
// found books
|
||||
}).catch(function(reason){
|
||||
// something went wrong
|
||||
});
|
||||
```
|
||||
|
||||
@method then
|
||||
@param {Function} onFulfilled
|
||||
@param {Function} onRejected
|
||||
Useful for tooling.
|
||||
@return {Promise}
|
||||
*/
|
||||
then: then,
|
||||
|
||||
/**
|
||||
`catch` is simply sugar for `then(undefined, onRejection)` which makes it the same
|
||||
as the catch block of a try/catch statement.
|
||||
|
||||
```js
|
||||
function findAuthor(){
|
||||
throw new Error('couldn't find that author');
|
||||
}
|
||||
|
||||
// synchronous
|
||||
try {
|
||||
findAuthor();
|
||||
} catch(reason) {
|
||||
// something went wrong
|
||||
}
|
||||
|
||||
// async with promises
|
||||
findAuthor().catch(function(reason){
|
||||
// something went wrong
|
||||
});
|
||||
```
|
||||
|
||||
@method catch
|
||||
@param {Function} onRejection
|
||||
Useful for tooling.
|
||||
@return {Promise}
|
||||
*/
|
||||
catch(onRejection) {
|
||||
return this.then(null, onRejection);
|
||||
}
|
||||
};
|
||||
52
node_modules/es6-promise/lib/es6-promise/promise/all.js
generated
vendored
Normal file
@@ -0,0 +1,52 @@
|
||||
import Enumerator from '../enumerator';
|
||||
|
||||
/**
|
||||
`Promise.all` accepts an array of promises, and returns a new promise which
|
||||
is fulfilled with an array of fulfillment values for the passed promises, or
|
||||
rejected with the reason of the first passed promise to be rejected. It casts all
|
||||
elements of the passed iterable to promises as it runs this algorithm.
|
||||
|
||||
Example:
|
||||
|
||||
```javascript
|
||||
let promise1 = resolve(1);
|
||||
let promise2 = resolve(2);
|
||||
let promise3 = resolve(3);
|
||||
let promises = [ promise1, promise2, promise3 ];
|
||||
|
||||
Promise.all(promises).then(function(array){
|
||||
// The array here would be [ 1, 2, 3 ];
|
||||
});
|
||||
```
|
||||
|
||||
If any of the `promises` given to `all` are rejected, the first promise
|
||||
that is rejected will be given as an argument to the returned promises's
|
||||
rejection handler. For example:
|
||||
|
||||
Example:
|
||||
|
||||
```javascript
|
||||
let promise1 = resolve(1);
|
||||
let promise2 = reject(new Error("2"));
|
||||
let promise3 = reject(new Error("3"));
|
||||
let promises = [ promise1, promise2, promise3 ];
|
||||
|
||||
Promise.all(promises).then(function(array){
|
||||
// Code here never runs because there are rejected promises!
|
||||
}, function(error) {
|
||||
// error.message === "2"
|
||||
});
|
||||
```
|
||||
|
||||
@method all
|
||||
@static
|
||||
@param {Array} entries array of promises
|
||||
@param {String} label optional string for labeling the promise.
|
||||
Useful for tooling.
|
||||
@return {Promise} promise that is fulfilled when all `promises` have been
|
||||
fulfilled, or rejected if any of them become rejected.
|
||||
@static
|
||||
*/
|
||||
export default function all(entries) {
|
||||
return new Enumerator(this, entries).promise;
|
||||
}
|
||||
84
node_modules/es6-promise/lib/es6-promise/promise/race.js
generated
vendored
Normal file
@@ -0,0 +1,84 @@
|
||||
import {
|
||||
isArray
|
||||
} from "../utils";
|
||||
|
||||
/**
|
||||
`Promise.race` returns a new promise which is settled in the same way as the
|
||||
first passed promise to settle.
|
||||
|
||||
Example:
|
||||
|
||||
```javascript
|
||||
let promise1 = new Promise(function(resolve, reject){
|
||||
setTimeout(function(){
|
||||
resolve('promise 1');
|
||||
}, 200);
|
||||
});
|
||||
|
||||
let promise2 = new Promise(function(resolve, reject){
|
||||
setTimeout(function(){
|
||||
resolve('promise 2');
|
||||
}, 100);
|
||||
});
|
||||
|
||||
Promise.race([promise1, promise2]).then(function(result){
|
||||
// result === 'promise 2' because it was resolved before promise1
|
||||
// was resolved.
|
||||
});
|
||||
```
|
||||
|
||||
`Promise.race` is deterministic in that only the state of the first
|
||||
settled promise matters. For example, even if other promises given to the
|
||||
`promises` array argument are resolved, but the first settled promise has
|
||||
become rejected before the other promises became fulfilled, the returned
|
||||
promise will become rejected:
|
||||
|
||||
```javascript
|
||||
let promise1 = new Promise(function(resolve, reject){
|
||||
setTimeout(function(){
|
||||
resolve('promise 1');
|
||||
}, 200);
|
||||
});
|
||||
|
||||
let promise2 = new Promise(function(resolve, reject){
|
||||
setTimeout(function(){
|
||||
reject(new Error('promise 2'));
|
||||
}, 100);
|
||||
});
|
||||
|
||||
Promise.race([promise1, promise2]).then(function(result){
|
||||
// Code here never runs
|
||||
}, function(reason){
|
||||
// reason.message === 'promise 2' because promise 2 became rejected before
|
||||
// promise 1 became fulfilled
|
||||
});
|
||||
```
|
||||
|
||||
An example real-world use case is implementing timeouts:
|
||||
|
||||
```javascript
|
||||
Promise.race([ajax('foo.json'), timeout(5000)])
|
||||
```
|
||||
|
||||
@method race
|
||||
@static
|
||||
@param {Array} promises array of promises to observe
|
||||
Useful for tooling.
|
||||
@return {Promise} a promise which settles in the same way as the first passed
|
||||
promise to settle.
|
||||
*/
|
||||
export default function race(entries) {
|
||||
/*jshint validthis:true */
|
||||
let Constructor = this;
|
||||
|
||||
if (!isArray(entries)) {
|
||||
return new Constructor((_, reject) => reject(new TypeError('You must pass an array to race.')));
|
||||
} else {
|
||||
return new Constructor((resolve, reject) => {
|
||||
let length = entries.length;
|
||||
for (let i = 0; i < length; i++) {
|
||||
Constructor.resolve(entries[i]).then(resolve, reject);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
46
node_modules/es6-promise/lib/es6-promise/promise/reject.js
generated
vendored
Normal file
@@ -0,0 +1,46 @@
|
||||
import {
|
||||
noop,
|
||||
reject as _reject
|
||||
} from '../-internal';
|
||||
|
||||
/**
|
||||
`Promise.reject` returns a promise rejected with the passed `reason`.
|
||||
It is shorthand for the following:
|
||||
|
||||
```javascript
|
||||
let promise = new Promise(function(resolve, reject){
|
||||
reject(new Error('WHOOPS'));
|
||||
});
|
||||
|
||||
promise.then(function(value){
|
||||
// Code here doesn't run because the promise is rejected!
|
||||
}, function(reason){
|
||||
// reason.message === 'WHOOPS'
|
||||
});
|
||||
```
|
||||
|
||||
Instead of writing the above, your code now simply becomes the following:
|
||||
|
||||
```javascript
|
||||
let promise = Promise.reject(new Error('WHOOPS'));
|
||||
|
||||
promise.then(function(value){
|
||||
// Code here doesn't run because the promise is rejected!
|
||||
}, function(reason){
|
||||
// reason.message === 'WHOOPS'
|
||||
});
|
||||
```
|
||||
|
||||
@method reject
|
||||
@static
|
||||
@param {Any} reason value that the returned promise will be rejected with.
|
||||
Useful for tooling.
|
||||
@return {Promise} a promise rejected with the given `reason`.
|
||||
*/
|
||||
export default function reject(reason) {
|
||||
/*jshint validthis:true */
|
||||
let Constructor = this;
|
||||
let promise = new Constructor(noop);
|
||||
_reject(promise, reason);
|
||||
return promise;
|
||||
}
|
||||
48
node_modules/es6-promise/lib/es6-promise/promise/resolve.js
generated
vendored
Normal file
@@ -0,0 +1,48 @@
|
||||
import {
|
||||
noop,
|
||||
resolve as _resolve
|
||||
} from '../-internal';
|
||||
|
||||
/**
|
||||
`Promise.resolve` returns a promise that will become resolved with the
|
||||
passed `value`. It is shorthand for the following:
|
||||
|
||||
```javascript
|
||||
let promise = new Promise(function(resolve, reject){
|
||||
resolve(1);
|
||||
});
|
||||
|
||||
promise.then(function(value){
|
||||
// value === 1
|
||||
});
|
||||
```
|
||||
|
||||
Instead of writing the above, your code now simply becomes the following:
|
||||
|
||||
```javascript
|
||||
let promise = Promise.resolve(1);
|
||||
|
||||
promise.then(function(value){
|
||||
// value === 1
|
||||
});
|
||||
```
|
||||
|
||||
@method resolve
|
||||
@static
|
||||
@param {Any} value value that the returned promise will be resolved with
|
||||
Useful for tooling.
|
||||
@return {Promise} a promise that will become fulfilled with the given
|
||||
`value`
|
||||
*/
|
||||
export default function resolve(object) {
|
||||
/*jshint validthis:true */
|
||||
let Constructor = this;
|
||||
|
||||
if (object && typeof object === 'object' && object.constructor === Constructor) {
|
||||
return object;
|
||||
}
|
||||
|
||||
let promise = new Constructor(noop);
|
||||
_resolve(promise, object);
|
||||
return promise;
|
||||
}
|
||||
32
node_modules/es6-promise/lib/es6-promise/then.js
generated
vendored
Normal file
@@ -0,0 +1,32 @@
|
||||
import {
|
||||
invokeCallback,
|
||||
subscribe,
|
||||
FULFILLED,
|
||||
REJECTED,
|
||||
noop,
|
||||
makePromise,
|
||||
PROMISE_ID
|
||||
} from './-internal';
|
||||
|
||||
import { asap } from './asap';
|
||||
|
||||
export default function then(onFulfillment, onRejection) {
|
||||
const parent = this;
|
||||
|
||||
const child = new this.constructor(noop);
|
||||
|
||||
if (child[PROMISE_ID] === undefined) {
|
||||
makePromise(child);
|
||||
}
|
||||
|
||||
const { _state } = parent;
|
||||
|
||||
if (_state) {
|
||||
const callback = arguments[_state - 1];
|
||||
asap(() => invokeCallback(_state, child, callback, parent._result));
|
||||
} else {
|
||||
subscribe(parent, child, onFulfillment, onRejection);
|
||||
}
|
||||
|
||||
return child;
|
||||
}
|
||||
20
node_modules/es6-promise/lib/es6-promise/utils.js
generated
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
export function objectOrFunction(x) {
|
||||
return typeof x === 'function' || (typeof x === 'object' && x !== null);
|
||||
}
|
||||
|
||||
export function isFunction(x) {
|
||||
return typeof x === 'function';
|
||||
}
|
||||
|
||||
export function isMaybeThenable(x) {
|
||||
return typeof x === 'object' && x !== null;
|
||||
}
|
||||
|
||||
let _isArray;
|
||||
if (!Array.isArray) {
|
||||
_isArray = x => Object.prototype.toString.call(x) === '[object Array]';
|
||||
} else {
|
||||
_isArray = Array.isArray;
|
||||
}
|
||||
|
||||
export const isArray = _isArray;
|
||||
134
node_modules/es6-promise/package.json
generated
vendored
Normal file
@@ -0,0 +1,134 @@
|
||||
{
|
||||
"_args": [
|
||||
[
|
||||
{
|
||||
"raw": "es6-promise@latest",
|
||||
"scope": null,
|
||||
"escapedName": "es6-promise",
|
||||
"name": "es6-promise",
|
||||
"rawSpec": "latest",
|
||||
"spec": "latest",
|
||||
"type": "tag"
|
||||
},
|
||||
"/Users/smus/Projects/webvr-boilerplate"
|
||||
]
|
||||
],
|
||||
"_from": "es6-promise@latest",
|
||||
"_id": "es6-promise@4.0.5",
|
||||
"_inCache": true,
|
||||
"_installable": true,
|
||||
"_location": "/es6-promise",
|
||||
"_nodeVersion": "6.6.0",
|
||||
"_npmOperationalInternal": {
|
||||
"host": "packages-12-west.internal.npmjs.com",
|
||||
"tmp": "tmp/es6-promise-4.0.5.tgz_1475539568489_0.15082282247021794"
|
||||
},
|
||||
"_npmUser": {
|
||||
"name": "stefanpenner",
|
||||
"email": "stefan.penner@gmail.com"
|
||||
},
|
||||
"_npmVersion": "3.10.8",
|
||||
"_phantomChildren": {},
|
||||
"_requested": {
|
||||
"raw": "es6-promise@latest",
|
||||
"scope": null,
|
||||
"escapedName": "es6-promise",
|
||||
"name": "es6-promise",
|
||||
"rawSpec": "latest",
|
||||
"spec": "latest",
|
||||
"type": "tag"
|
||||
},
|
||||
"_requiredBy": [
|
||||
"/"
|
||||
],
|
||||
"_resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.0.5.tgz",
|
||||
"_shasum": "7882f30adde5b240ccfa7f7d78c548330951ae42",
|
||||
"_shrinkwrap": null,
|
||||
"_spec": "es6-promise@latest",
|
||||
"_where": "/Users/smus/Projects/webvr-boilerplate",
|
||||
"author": {
|
||||
"name": "Yehuda Katz, Tom Dale, Stefan Penner and contributors",
|
||||
"url": "Conversion to ES6 API by Jake Archibald"
|
||||
},
|
||||
"browser": {
|
||||
"vertx": false
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/stefanpenner/es6-promise/issues"
|
||||
},
|
||||
"dependencies": {},
|
||||
"description": "A lightweight library that provides tools for organizing asynchronous code",
|
||||
"devDependencies": {
|
||||
"broccoli-babel-transpiler": "^5.6.1",
|
||||
"broccoli-concat": "^3.0.2",
|
||||
"broccoli-merge-trees": "^1.1.1",
|
||||
"broccoli-rollup": "^1.0.2",
|
||||
"broccoli-stew": "^1.2.0",
|
||||
"broccoli-uglify-js": "^0.2.0",
|
||||
"broccoli-watchify": "v1.0.0",
|
||||
"ember-cli": "^2.7.0",
|
||||
"ember-cli-dependency-checker": "^1.3.0",
|
||||
"ember-publisher": "0.0.7",
|
||||
"git-repo-version": "0.4.0",
|
||||
"json3": "^3.3.2",
|
||||
"mocha": "^3.1.0",
|
||||
"promises-aplus-tests-phantom": "^2.1.0-revise",
|
||||
"release-it": "0.0.10"
|
||||
},
|
||||
"directories": {
|
||||
"lib": "lib"
|
||||
},
|
||||
"dist": {
|
||||
"shasum": "7882f30adde5b240ccfa7f7d78c548330951ae42",
|
||||
"tarball": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.0.5.tgz"
|
||||
},
|
||||
"files": [
|
||||
"dist",
|
||||
"lib",
|
||||
"es6-promise.d.ts",
|
||||
"auto.js",
|
||||
"!dist/test"
|
||||
],
|
||||
"gitHead": "6da7ebc01723ec2fd7744c5c08fa9f338992b2e1",
|
||||
"homepage": "https://github.com/stefanpenner/es6-promise#readme",
|
||||
"keywords": [
|
||||
"promises",
|
||||
"futures"
|
||||
],
|
||||
"license": "MIT",
|
||||
"main": "dist/es6-promise.js",
|
||||
"maintainers": [
|
||||
{
|
||||
"name": "jaffathecake",
|
||||
"email": "jaffathecake@gmail.com"
|
||||
},
|
||||
{
|
||||
"name": "stefanpenner",
|
||||
"email": "stefan.penner@gmail.com"
|
||||
}
|
||||
],
|
||||
"name": "es6-promise",
|
||||
"namespace": "es6-promise",
|
||||
"optionalDependencies": {},
|
||||
"readme": "ERROR: No README data found!",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git://github.com/stefanpenner/es6-promise.git"
|
||||
},
|
||||
"scripts": {
|
||||
"build": "ember build --environment production",
|
||||
"build:production": "ember build --env production",
|
||||
"dry-run-release": "ember build --environment production && release-it --dry-run --non-interactive",
|
||||
"lint": "jshint lib",
|
||||
"prepublish": "ember build --environment production",
|
||||
"start": "ember s",
|
||||
"test": "ember test",
|
||||
"test:node": "ember build && mocha ./dist/test/browserify",
|
||||
"test:server": "ember test --server"
|
||||
},
|
||||
"spm": {
|
||||
"main": "dist/es6-promise.js"
|
||||
},
|
||||
"typings": "es6-promise.d.ts",
|
||||
"version": "4.0.5"
|
||||
}
|
||||
21
node_modules/eventemitter3/LICENSE
generated
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2014 Arnout Kazemier
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
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.
|
||||
106
node_modules/eventemitter3/README.md
generated
vendored
Normal file
@@ -0,0 +1,106 @@
|
||||
# EventEmitter3
|
||||
|
||||
[](https://www.npmjs.com/package/eventemitter3)[](https://travis-ci.org/primus/eventemitter3)[](https://david-dm.org/primus/eventemitter3)[](https://coveralls.io/r/primus/eventemitter3?branch=master)[](https://webchat.freenode.net/?channels=primus)
|
||||
|
||||
[](https://saucelabs.com/u/eventemitter3)
|
||||
|
||||
EventEmitter3 is a high performance EventEmitter. It has been micro-optimized
|
||||
for various of code paths making this, one of, if not the fastest EventEmitter
|
||||
available for Node.js and browsers. The module is API compatible with the
|
||||
EventEmitter that ships by default with Node.js but there are some slight
|
||||
differences:
|
||||
|
||||
- Domain support has been removed.
|
||||
- We do not `throw` an error when you emit an `error` event and nobody is
|
||||
listening.
|
||||
- The `newListener` event is removed as the use-cases for this functionality are
|
||||
really just edge cases.
|
||||
- No `setMaxListeners` and its pointless memory leak warnings. If you want to
|
||||
add `end` listeners you should be able to do that without modules complaining.
|
||||
- No `listenerCount` method. Use `EE.listeners(event).length` instead.
|
||||
- Support for custom context for events so there is no need to use `fn.bind`.
|
||||
- The `listeners` method can do existence checking instead of returning only
|
||||
arrays.
|
||||
- The `removeListener` method removes all matching listeners, not only the
|
||||
first.
|
||||
|
||||
It's a drop in replacement for existing EventEmitters, but just faster. Free
|
||||
performance, who wouldn't want that? The EventEmitter is written in EcmaScript 3
|
||||
so it will work in the oldest browsers and node versions that you need to
|
||||
support.
|
||||
|
||||
## Installation
|
||||
|
||||
```bash
|
||||
$ npm install --save eventemitter3 # npm
|
||||
$ component install primus/eventemitter3 # Component
|
||||
$ bower install eventemitter3 # Bower
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
After installation the only thing you need to do is require the module:
|
||||
|
||||
```js
|
||||
var EventEmitter = require('eventemitter3');
|
||||
```
|
||||
|
||||
And you're ready to create your own EventEmitter instances. For the API
|
||||
documentation, please follow the official Node.js documentation:
|
||||
|
||||
http://nodejs.org/api/events.html
|
||||
|
||||
### Contextual emits
|
||||
|
||||
We've upgraded the API of the `EventEmitter.on`, `EventEmitter.once` and
|
||||
`EventEmitter.removeListener` to accept an extra argument which is the `context`
|
||||
or `this` value that should be set for the emitted events. This means you no
|
||||
longer have the overhead of an event that required `fn.bind` in order to get a
|
||||
custom `this` value.
|
||||
|
||||
```js
|
||||
var EE = new EventEmitter()
|
||||
, context = { foo: 'bar' };
|
||||
|
||||
function emitted() {
|
||||
console.log(this === context); // true
|
||||
}
|
||||
|
||||
EE.once('event-name', emitted, context);
|
||||
EE.on('another-event', emitted, context);
|
||||
EE.removeListener('another-event', emitted, context);
|
||||
```
|
||||
|
||||
### Existence
|
||||
|
||||
To check if there is already a listener for a given event you can supply the
|
||||
`listeners` method with an extra boolean argument. This will transform the
|
||||
output from an array, to a boolean value which indicates if there are listeners
|
||||
in place for the given event:
|
||||
|
||||
```js
|
||||
var EE = new EventEmitter();
|
||||
EE.once('event-name', function () {});
|
||||
EE.on('another-event', function () {});
|
||||
|
||||
EE.listeners('event-name', true); // returns true
|
||||
EE.listeners('unknown-name', true); // returns false
|
||||
```
|
||||
|
||||
### Tests and benchmarks
|
||||
|
||||
This module is well tested. You can run:
|
||||
|
||||
- `npm test` to run the tests under Node.js.
|
||||
- `npm run coverage` to get the code coverage.
|
||||
- `npm run test-browser` to run the tests in real browsers via Sauce Labs.
|
||||
|
||||
We also have a set of benchmarks to compare EventEmitter3 with some available
|
||||
alternatives. To run the benchmarks run `npm run benchmark`.
|
||||
|
||||
Tests and benchmarks are not included in the npm package. If you want to play
|
||||
with them you have to clone the GitHub repository.
|
||||
|
||||
## License
|
||||
|
||||
[MIT](LICENSE)
|
||||
50
node_modules/eventemitter3/index.d.ts
generated
vendored
Normal file
@@ -0,0 +1,50 @@
|
||||
export as namespace EventEmitter;
|
||||
|
||||
type ListenerFn = (...args: Array<any>) => void;
|
||||
|
||||
/**
|
||||
* Minimal `EventEmitter` interface that is molded against the Node.js
|
||||
* `EventEmitter` interface.
|
||||
*/
|
||||
export class EventEmitter {
|
||||
static prefixed: string | boolean;
|
||||
|
||||
/**
|
||||
* Return an array listing the events for which the emitter has registered
|
||||
* listeners.
|
||||
*/
|
||||
eventNames(): Array<string | symbol>;
|
||||
|
||||
/**
|
||||
* Return the listeners registered for a given event.
|
||||
*/
|
||||
listeners(event: string | symbol, exists: boolean): Array<ListenerFn> | boolean;
|
||||
listeners(event: string | symbol): Array<ListenerFn>;
|
||||
|
||||
/**
|
||||
* Calls each of the listeners registered for a given event.
|
||||
*/
|
||||
emit(event: string | symbol, ...args: Array<any>): boolean;
|
||||
|
||||
/**
|
||||
* Add a listener for a given event.
|
||||
*/
|
||||
on(event: string | symbol, fn: ListenerFn, context?: any): this;
|
||||
addListener(event: string | symbol, fn: ListenerFn, context?: any): this;
|
||||
|
||||
/**
|
||||
* Add a one-time listener for a given event.
|
||||
*/
|
||||
once(event: string | symbol, fn: ListenerFn, context?: any): this;
|
||||
|
||||
/**
|
||||
* Remove the listeners of a given event.
|
||||
*/
|
||||
removeListener(event: string | symbol, fn?: ListenerFn, context?: any, once?: boolean): this;
|
||||
off(event: string | symbol, fn?: ListenerFn, context?: any, once?: boolean): this;
|
||||
|
||||
/**
|
||||
* Remove all listeners, or those of the specified event.
|
||||
*/
|
||||
removeAllListeners(event?: string | symbol): this;
|
||||
}
|
||||
311
node_modules/eventemitter3/index.js
generated
vendored
Normal file
@@ -0,0 +1,311 @@
|
||||
'use strict';
|
||||
|
||||
var has = Object.prototype.hasOwnProperty
|
||||
, prefix = '~';
|
||||
|
||||
/**
|
||||
* Constructor to create a storage for our `EE` objects.
|
||||
* An `Events` instance is a plain object whose properties are event names.
|
||||
*
|
||||
* @constructor
|
||||
* @api private
|
||||
*/
|
||||
function Events() {}
|
||||
|
||||
//
|
||||
// We try to not inherit from `Object.prototype`. In some engines creating an
|
||||
// instance in this way is faster than calling `Object.create(null)` directly.
|
||||
// If `Object.create(null)` is not supported we prefix the event names with a
|
||||
// character to make sure that the built-in object properties are not
|
||||
// overridden or used as an attack vector.
|
||||
//
|
||||
if (Object.create) {
|
||||
Events.prototype = Object.create(null);
|
||||
|
||||
//
|
||||
// This hack is needed because the `__proto__` property is still inherited in
|
||||
// some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.
|
||||
//
|
||||
if (!new Events().__proto__) prefix = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Representation of a single event listener.
|
||||
*
|
||||
* @param {Function} fn The listener function.
|
||||
* @param {Mixed} context The context to invoke the listener with.
|
||||
* @param {Boolean} [once=false] Specify if the listener is a one-time listener.
|
||||
* @constructor
|
||||
* @api private
|
||||
*/
|
||||
function EE(fn, context, once) {
|
||||
this.fn = fn;
|
||||
this.context = context;
|
||||
this.once = once || false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Minimal `EventEmitter` interface that is molded against the Node.js
|
||||
* `EventEmitter` interface.
|
||||
*
|
||||
* @constructor
|
||||
* @api public
|
||||
*/
|
||||
function EventEmitter() {
|
||||
this._events = new Events();
|
||||
this._eventsCount = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return an array listing the events for which the emitter has registered
|
||||
* listeners.
|
||||
*
|
||||
* @returns {Array}
|
||||
* @api public
|
||||
*/
|
||||
EventEmitter.prototype.eventNames = function eventNames() {
|
||||
var names = []
|
||||
, events
|
||||
, name;
|
||||
|
||||
if (this._eventsCount === 0) return names;
|
||||
|
||||
for (name in (events = this._events)) {
|
||||
if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);
|
||||
}
|
||||
|
||||
if (Object.getOwnPropertySymbols) {
|
||||
return names.concat(Object.getOwnPropertySymbols(events));
|
||||
}
|
||||
|
||||
return names;
|
||||
};
|
||||
|
||||
/**
|
||||
* Return the listeners registered for a given event.
|
||||
*
|
||||
* @param {String|Symbol} event The event name.
|
||||
* @param {Boolean} exists Only check if there are listeners.
|
||||
* @returns {Array|Boolean}
|
||||
* @api public
|
||||
*/
|
||||
EventEmitter.prototype.listeners = function listeners(event, exists) {
|
||||
var evt = prefix ? prefix + event : event
|
||||
, available = this._events[evt];
|
||||
|
||||
if (exists) return !!available;
|
||||
if (!available) return [];
|
||||
if (available.fn) return [available.fn];
|
||||
|
||||
for (var i = 0, l = available.length, ee = new Array(l); i < l; i++) {
|
||||
ee[i] = available[i].fn;
|
||||
}
|
||||
|
||||
return ee;
|
||||
};
|
||||
|
||||
/**
|
||||
* Calls each of the listeners registered for a given event.
|
||||
*
|
||||
* @param {String|Symbol} event The event name.
|
||||
* @returns {Boolean} `true` if the event had listeners, else `false`.
|
||||
* @api public
|
||||
*/
|
||||
EventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {
|
||||
var evt = prefix ? prefix + event : event;
|
||||
|
||||
if (!this._events[evt]) return false;
|
||||
|
||||
var listeners = this._events[evt]
|
||||
, len = arguments.length
|
||||
, args
|
||||
, i;
|
||||
|
||||
if (listeners.fn) {
|
||||
if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);
|
||||
|
||||
switch (len) {
|
||||
case 1: return listeners.fn.call(listeners.context), true;
|
||||
case 2: return listeners.fn.call(listeners.context, a1), true;
|
||||
case 3: return listeners.fn.call(listeners.context, a1, a2), true;
|
||||
case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;
|
||||
case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;
|
||||
case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;
|
||||
}
|
||||
|
||||
for (i = 1, args = new Array(len -1); i < len; i++) {
|
||||
args[i - 1] = arguments[i];
|
||||
}
|
||||
|
||||
listeners.fn.apply(listeners.context, args);
|
||||
} else {
|
||||
var length = listeners.length
|
||||
, j;
|
||||
|
||||
for (i = 0; i < length; i++) {
|
||||
if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);
|
||||
|
||||
switch (len) {
|
||||
case 1: listeners[i].fn.call(listeners[i].context); break;
|
||||
case 2: listeners[i].fn.call(listeners[i].context, a1); break;
|
||||
case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;
|
||||
case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;
|
||||
default:
|
||||
if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {
|
||||
args[j - 1] = arguments[j];
|
||||
}
|
||||
|
||||
listeners[i].fn.apply(listeners[i].context, args);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
};
|
||||
|
||||
/**
|
||||
* Add a listener for a given event.
|
||||
*
|
||||
* @param {String|Symbol} event The event name.
|
||||
* @param {Function} fn The listener function.
|
||||
* @param {Mixed} [context=this] The context to invoke the listener with.
|
||||
* @returns {EventEmitter} `this`.
|
||||
* @api public
|
||||
*/
|
||||
EventEmitter.prototype.on = function on(event, fn, context) {
|
||||
var listener = new EE(fn, context || this)
|
||||
, evt = prefix ? prefix + event : event;
|
||||
|
||||
if (!this._events[evt]) this._events[evt] = listener, this._eventsCount++;
|
||||
else if (!this._events[evt].fn) this._events[evt].push(listener);
|
||||
else this._events[evt] = [this._events[evt], listener];
|
||||
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
* Add a one-time listener for a given event.
|
||||
*
|
||||
* @param {String|Symbol} event The event name.
|
||||
* @param {Function} fn The listener function.
|
||||
* @param {Mixed} [context=this] The context to invoke the listener with.
|
||||
* @returns {EventEmitter} `this`.
|
||||
* @api public
|
||||
*/
|
||||
EventEmitter.prototype.once = function once(event, fn, context) {
|
||||
var listener = new EE(fn, context || this, true)
|
||||
, evt = prefix ? prefix + event : event;
|
||||
|
||||
if (!this._events[evt]) this._events[evt] = listener, this._eventsCount++;
|
||||
else if (!this._events[evt].fn) this._events[evt].push(listener);
|
||||
else this._events[evt] = [this._events[evt], listener];
|
||||
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
* Remove the listeners of a given event.
|
||||
*
|
||||
* @param {String|Symbol} event The event name.
|
||||
* @param {Function} fn Only remove the listeners that match this function.
|
||||
* @param {Mixed} context Only remove the listeners that have this context.
|
||||
* @param {Boolean} once Only remove one-time listeners.
|
||||
* @returns {EventEmitter} `this`.
|
||||
* @api public
|
||||
*/
|
||||
EventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {
|
||||
var evt = prefix ? prefix + event : event;
|
||||
|
||||
if (!this._events[evt]) return this;
|
||||
if (!fn) {
|
||||
if (--this._eventsCount === 0) this._events = new Events();
|
||||
else delete this._events[evt];
|
||||
return this;
|
||||
}
|
||||
|
||||
var listeners = this._events[evt];
|
||||
|
||||
if (listeners.fn) {
|
||||
if (
|
||||
listeners.fn === fn
|
||||
&& (!once || listeners.once)
|
||||
&& (!context || listeners.context === context)
|
||||
) {
|
||||
if (--this._eventsCount === 0) this._events = new Events();
|
||||
else delete this._events[evt];
|
||||
}
|
||||
} else {
|
||||
for (var i = 0, events = [], length = listeners.length; i < length; i++) {
|
||||
if (
|
||||
listeners[i].fn !== fn
|
||||
|| (once && !listeners[i].once)
|
||||
|| (context && listeners[i].context !== context)
|
||||
) {
|
||||
events.push(listeners[i]);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Reset the array, or remove it completely if we have no more listeners.
|
||||
//
|
||||
if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;
|
||||
else if (--this._eventsCount === 0) this._events = new Events();
|
||||
else delete this._events[evt];
|
||||
}
|
||||
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
* Remove all listeners, or those of the specified event.
|
||||
*
|
||||
* @param {String|Symbol} [event] The event name.
|
||||
* @returns {EventEmitter} `this`.
|
||||
* @api public
|
||||
*/
|
||||
EventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {
|
||||
var evt;
|
||||
|
||||
if (event) {
|
||||
evt = prefix ? prefix + event : event;
|
||||
if (this._events[evt]) {
|
||||
if (--this._eventsCount === 0) this._events = new Events();
|
||||
else delete this._events[evt];
|
||||
}
|
||||
} else {
|
||||
this._events = new Events();
|
||||
this._eventsCount = 0;
|
||||
}
|
||||
|
||||
return this;
|
||||
};
|
||||
|
||||
//
|
||||
// Alias methods names because people roll like that.
|
||||
//
|
||||
EventEmitter.prototype.off = EventEmitter.prototype.removeListener;
|
||||
EventEmitter.prototype.addListener = EventEmitter.prototype.on;
|
||||
|
||||
//
|
||||
// This function doesn't apply anymore.
|
||||
//
|
||||
EventEmitter.prototype.setMaxListeners = function setMaxListeners() {
|
||||
return this;
|
||||
};
|
||||
|
||||
//
|
||||
// Expose the prefix.
|
||||
//
|
||||
EventEmitter.prefixed = prefix;
|
||||
|
||||
//
|
||||
// Allow `EventEmitter` to be imported as module namespace.
|
||||
//
|
||||
EventEmitter.EventEmitter = EventEmitter;
|
||||
|
||||
//
|
||||
// Expose the module.
|
||||
//
|
||||
if ('undefined' !== typeof module) {
|
||||
module.exports = EventEmitter;
|
||||
}
|
||||
123
node_modules/eventemitter3/package.json
generated
vendored
Normal file
@@ -0,0 +1,123 @@
|
||||
{
|
||||
"_args": [
|
||||
[
|
||||
{
|
||||
"raw": "eventemitter3@^2.0.2",
|
||||
"scope": null,
|
||||
"escapedName": "eventemitter3",
|
||||
"name": "eventemitter3",
|
||||
"rawSpec": "^2.0.2",
|
||||
"spec": ">=2.0.2 <3.0.0",
|
||||
"type": "range"
|
||||
},
|
||||
"/Users/smus/Projects/webvr-boilerplate/node_modules/webvr-polyfill"
|
||||
]
|
||||
],
|
||||
"_from": "eventemitter3@>=2.0.2 <3.0.0",
|
||||
"_id": "eventemitter3@2.0.2",
|
||||
"_inCache": true,
|
||||
"_installable": true,
|
||||
"_location": "/eventemitter3",
|
||||
"_nodeVersion": "6.7.0",
|
||||
"_npmOperationalInternal": {
|
||||
"host": "packages-16-east.internal.npmjs.com",
|
||||
"tmp": "tmp/eventemitter3-2.0.2.tgz_1475216591620_0.3523867195472121"
|
||||
},
|
||||
"_npmUser": {
|
||||
"name": "lpinca",
|
||||
"email": "luigipinca@gmail.com"
|
||||
},
|
||||
"_npmVersion": "3.10.7",
|
||||
"_phantomChildren": {},
|
||||
"_requested": {
|
||||
"raw": "eventemitter3@^2.0.2",
|
||||
"scope": null,
|
||||
"escapedName": "eventemitter3",
|
||||
"name": "eventemitter3",
|
||||
"rawSpec": "^2.0.2",
|
||||
"spec": ">=2.0.2 <3.0.0",
|
||||
"type": "range"
|
||||
},
|
||||
"_requiredBy": [
|
||||
"/webvr-polyfill",
|
||||
"/webvr-ui"
|
||||
],
|
||||
"_resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-2.0.2.tgz",
|
||||
"_shasum": "20ce4891909ce9f35b088c94fab40e2c96f473ac",
|
||||
"_shrinkwrap": null,
|
||||
"_spec": "eventemitter3@^2.0.2",
|
||||
"_where": "/Users/smus/Projects/webvr-boilerplate/node_modules/webvr-polyfill",
|
||||
"author": {
|
||||
"name": "Arnout Kazemier"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/primus/eventemitter3/issues"
|
||||
},
|
||||
"dependencies": {},
|
||||
"description": "EventEmitter3 focuses on performance while maintaining a Node.js AND browser compatible interface.",
|
||||
"devDependencies": {
|
||||
"assume": "1.4.x",
|
||||
"istanbul": "0.4.x",
|
||||
"mocha": "3.1.x",
|
||||
"pre-commit": "1.1.x",
|
||||
"zuul": "3.11.x"
|
||||
},
|
||||
"directories": {},
|
||||
"dist": {
|
||||
"shasum": "20ce4891909ce9f35b088c94fab40e2c96f473ac",
|
||||
"tarball": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-2.0.2.tgz"
|
||||
},
|
||||
"gitHead": "a9eedef2a58deae7006028662a83d88579486886",
|
||||
"homepage": "https://github.com/primus/eventemitter3#readme",
|
||||
"keywords": [
|
||||
"EventEmitter",
|
||||
"EventEmitter2",
|
||||
"EventEmitter3",
|
||||
"Events",
|
||||
"addEventListener",
|
||||
"addListener",
|
||||
"emit",
|
||||
"emits",
|
||||
"emitter",
|
||||
"event",
|
||||
"once",
|
||||
"pub/sub",
|
||||
"publish",
|
||||
"reactor",
|
||||
"subscribe"
|
||||
],
|
||||
"license": "MIT",
|
||||
"main": "index.js",
|
||||
"maintainers": [
|
||||
{
|
||||
"name": "v1",
|
||||
"email": "npm@3rd-Eden.com"
|
||||
},
|
||||
{
|
||||
"name": "3rdeden",
|
||||
"email": "npm@3rd-Eden.com"
|
||||
},
|
||||
{
|
||||
"name": "lpinca",
|
||||
"email": "luigipinca@gmail.com"
|
||||
}
|
||||
],
|
||||
"name": "eventemitter3",
|
||||
"optionalDependencies": {},
|
||||
"pre-commit": "sync, test",
|
||||
"readme": "ERROR: No README data found!",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git://github.com/primus/eventemitter3.git"
|
||||
},
|
||||
"scripts": {
|
||||
"benchmark": "find benchmarks/run -name '*.js' -exec benchmarks/start.sh {} \\;",
|
||||
"coverage": "istanbul cover _mocha -- test.js",
|
||||
"sync": "node versions.js",
|
||||
"test": "mocha test.js",
|
||||
"test-browser": "zuul -- test.js",
|
||||
"test-node": "istanbul cover _mocha --report lcovonly -- test.js"
|
||||
},
|
||||
"typings": "index.d.ts",
|
||||
"version": "2.0.2"
|
||||
}
|
||||
90
node_modules/object-assign/index.js
generated
vendored
Normal file
@@ -0,0 +1,90 @@
|
||||
/*
|
||||
object-assign
|
||||
(c) Sindre Sorhus
|
||||
@license MIT
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
/* eslint-disable no-unused-vars */
|
||||
var getOwnPropertySymbols = Object.getOwnPropertySymbols;
|
||||
var hasOwnProperty = Object.prototype.hasOwnProperty;
|
||||
var propIsEnumerable = Object.prototype.propertyIsEnumerable;
|
||||
|
||||
function toObject(val) {
|
||||
if (val === null || val === undefined) {
|
||||
throw new TypeError('Object.assign cannot be called with null or undefined');
|
||||
}
|
||||
|
||||
return Object(val);
|
||||
}
|
||||
|
||||
function shouldUseNative() {
|
||||
try {
|
||||
if (!Object.assign) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Detect buggy property enumeration order in older V8 versions.
|
||||
|
||||
// https://bugs.chromium.org/p/v8/issues/detail?id=4118
|
||||
var test1 = new String('abc'); // eslint-disable-line no-new-wrappers
|
||||
test1[5] = 'de';
|
||||
if (Object.getOwnPropertyNames(test1)[0] === '5') {
|
||||
return false;
|
||||
}
|
||||
|
||||
// https://bugs.chromium.org/p/v8/issues/detail?id=3056
|
||||
var test2 = {};
|
||||
for (var i = 0; i < 10; i++) {
|
||||
test2['_' + String.fromCharCode(i)] = i;
|
||||
}
|
||||
var order2 = Object.getOwnPropertyNames(test2).map(function (n) {
|
||||
return test2[n];
|
||||
});
|
||||
if (order2.join('') !== '0123456789') {
|
||||
return false;
|
||||
}
|
||||
|
||||
// https://bugs.chromium.org/p/v8/issues/detail?id=3056
|
||||
var test3 = {};
|
||||
'abcdefghijklmnopqrst'.split('').forEach(function (letter) {
|
||||
test3[letter] = letter;
|
||||
});
|
||||
if (Object.keys(Object.assign({}, test3)).join('') !==
|
||||
'abcdefghijklmnopqrst') {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
} catch (err) {
|
||||
// We don't expect any of the above to throw, but better to be safe.
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = shouldUseNative() ? Object.assign : function (target, source) {
|
||||
var from;
|
||||
var to = toObject(target);
|
||||
var symbols;
|
||||
|
||||
for (var s = 1; s < arguments.length; s++) {
|
||||
from = Object(arguments[s]);
|
||||
|
||||
for (var key in from) {
|
||||
if (hasOwnProperty.call(from, key)) {
|
||||
to[key] = from[key];
|
||||
}
|
||||
}
|
||||
|
||||
if (getOwnPropertySymbols) {
|
||||
symbols = getOwnPropertySymbols(from);
|
||||
for (var i = 0; i < symbols.length; i++) {
|
||||
if (propIsEnumerable.call(from, symbols[i])) {
|
||||
to[symbols[i]] = from[symbols[i]];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return to;
|
||||
};
|
||||
21
node_modules/object-assign/license
generated
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
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.
|
||||
119
node_modules/object-assign/package.json
generated
vendored
Normal file
@@ -0,0 +1,119 @@
|
||||
{
|
||||
"_args": [
|
||||
[
|
||||
{
|
||||
"raw": "object-assign@^4.0.1",
|
||||
"scope": null,
|
||||
"escapedName": "object-assign",
|
||||
"name": "object-assign",
|
||||
"rawSpec": "^4.0.1",
|
||||
"spec": ">=4.0.1 <5.0.0",
|
||||
"type": "range"
|
||||
},
|
||||
"/Users/smus/Projects/webvr-boilerplate/node_modules/webvr-polyfill"
|
||||
]
|
||||
],
|
||||
"_from": "object-assign@>=4.0.1 <5.0.0",
|
||||
"_id": "object-assign@4.1.1",
|
||||
"_inCache": true,
|
||||
"_installable": true,
|
||||
"_location": "/object-assign",
|
||||
"_nodeVersion": "4.6.2",
|
||||
"_npmOperationalInternal": {
|
||||
"host": "packages-12-west.internal.npmjs.com",
|
||||
"tmp": "tmp/object-assign-4.1.1.tgz_1484580915042_0.07107710791751742"
|
||||
},
|
||||
"_npmUser": {
|
||||
"name": "sindresorhus",
|
||||
"email": "sindresorhus@gmail.com"
|
||||
},
|
||||
"_npmVersion": "2.15.11",
|
||||
"_phantomChildren": {},
|
||||
"_requested": {
|
||||
"raw": "object-assign@^4.0.1",
|
||||
"scope": null,
|
||||
"escapedName": "object-assign",
|
||||
"name": "object-assign",
|
||||
"rawSpec": "^4.0.1",
|
||||
"spec": ">=4.0.1 <5.0.0",
|
||||
"type": "range"
|
||||
},
|
||||
"_requiredBy": [
|
||||
"/webvr-polyfill"
|
||||
],
|
||||
"_resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
|
||||
"_shasum": "2109adc7965887cfc05cbbd442cac8bfbb360863",
|
||||
"_shrinkwrap": null,
|
||||
"_spec": "object-assign@^4.0.1",
|
||||
"_where": "/Users/smus/Projects/webvr-boilerplate/node_modules/webvr-polyfill",
|
||||
"author": {
|
||||
"name": "Sindre Sorhus",
|
||||
"email": "sindresorhus@gmail.com",
|
||||
"url": "sindresorhus.com"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/sindresorhus/object-assign/issues"
|
||||
},
|
||||
"dependencies": {},
|
||||
"description": "ES2015 `Object.assign()` ponyfill",
|
||||
"devDependencies": {
|
||||
"ava": "^0.16.0",
|
||||
"lodash": "^4.16.4",
|
||||
"matcha": "^0.7.0",
|
||||
"xo": "^0.16.0"
|
||||
},
|
||||
"directories": {},
|
||||
"dist": {
|
||||
"shasum": "2109adc7965887cfc05cbbd442cac8bfbb360863",
|
||||
"tarball": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
},
|
||||
"files": [
|
||||
"index.js"
|
||||
],
|
||||
"gitHead": "a89774b252c91612203876984bbd6addbe3b5a0e",
|
||||
"homepage": "https://github.com/sindresorhus/object-assign#readme",
|
||||
"keywords": [
|
||||
"object",
|
||||
"assign",
|
||||
"extend",
|
||||
"properties",
|
||||
"es2015",
|
||||
"ecmascript",
|
||||
"harmony",
|
||||
"ponyfill",
|
||||
"prollyfill",
|
||||
"polyfill",
|
||||
"shim",
|
||||
"browser"
|
||||
],
|
||||
"license": "MIT",
|
||||
"maintainers": [
|
||||
{
|
||||
"name": "gaearon",
|
||||
"email": "dan.abramov@gmail.com"
|
||||
},
|
||||
{
|
||||
"name": "sindresorhus",
|
||||
"email": "sindresorhus@gmail.com"
|
||||
},
|
||||
{
|
||||
"name": "spicyj",
|
||||
"email": "ben@benalpert.com"
|
||||
}
|
||||
],
|
||||
"name": "object-assign",
|
||||
"optionalDependencies": {},
|
||||
"readme": "ERROR: No README data found!",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/sindresorhus/object-assign.git"
|
||||
},
|
||||
"scripts": {
|
||||
"bench": "matcha bench.js",
|
||||
"test": "xo && ava"
|
||||
},
|
||||
"version": "4.1.1"
|
||||
}
|
||||
61
node_modules/object-assign/readme.md
generated
vendored
Normal file
@@ -0,0 +1,61 @@
|
||||
# object-assign [](https://travis-ci.org/sindresorhus/object-assign)
|
||||
|
||||
> ES2015 [`Object.assign()`](http://www.2ality.com/2014/01/object-assign.html) [ponyfill](https://ponyfill.com)
|
||||
|
||||
|
||||
## Use the built-in
|
||||
|
||||
Node.js 4 and up, as well as every evergreen browser (Chrome, Edge, Firefox, Opera, Safari),
|
||||
support `Object.assign()` :tada:. If you target only those environments, then by all
|
||||
means, use `Object.assign()` instead of this package.
|
||||
|
||||
|
||||
## Install
|
||||
|
||||
```
|
||||
$ npm install --save object-assign
|
||||
```
|
||||
|
||||
|
||||
## Usage
|
||||
|
||||
```js
|
||||
const objectAssign = require('object-assign');
|
||||
|
||||
objectAssign({foo: 0}, {bar: 1});
|
||||
//=> {foo: 0, bar: 1}
|
||||
|
||||
// multiple sources
|
||||
objectAssign({foo: 0}, {bar: 1}, {baz: 2});
|
||||
//=> {foo: 0, bar: 1, baz: 2}
|
||||
|
||||
// overwrites equal keys
|
||||
objectAssign({foo: 0}, {foo: 1}, {foo: 2});
|
||||
//=> {foo: 2}
|
||||
|
||||
// ignores null and undefined sources
|
||||
objectAssign({foo: 0}, null, {bar: 1}, undefined);
|
||||
//=> {foo: 0, bar: 1}
|
||||
```
|
||||
|
||||
|
||||
## API
|
||||
|
||||
### objectAssign(target, [source, ...])
|
||||
|
||||
Assigns enumerable own properties of `source` objects to the `target` object and returns the `target` object. Additional `source` objects will overwrite previous ones.
|
||||
|
||||
|
||||
## Resources
|
||||
|
||||
- [ES2015 spec - Object.assign](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.assign)
|
||||
|
||||
|
||||
## Related
|
||||
|
||||
- [deep-assign](https://github.com/sindresorhus/deep-assign) - Recursive `Object.assign()`
|
||||
|
||||
|
||||
## License
|
||||
|
||||
MIT © [Sindre Sorhus](https://sindresorhus.com)
|
||||
145
node_modules/screenfull/dist/screenfull.js
generated
vendored
Normal file
@@ -0,0 +1,145 @@
|
||||
/*!
|
||||
* screenfull
|
||||
* v3.0.0 - 2015-11-24
|
||||
* (c) Sindre Sorhus; MIT License
|
||||
*/
|
||||
(function () {
|
||||
'use strict';
|
||||
|
||||
var isCommonjs = typeof module !== 'undefined' && module.exports;
|
||||
var keyboardAllowed = typeof Element !== 'undefined' && 'ALLOW_KEYBOARD_INPUT' in Element;
|
||||
|
||||
var fn = (function () {
|
||||
var val;
|
||||
var valLength;
|
||||
|
||||
var fnMap = [
|
||||
[
|
||||
'requestFullscreen',
|
||||
'exitFullscreen',
|
||||
'fullscreenElement',
|
||||
'fullscreenEnabled',
|
||||
'fullscreenchange',
|
||||
'fullscreenerror'
|
||||
],
|
||||
// new WebKit
|
||||
[
|
||||
'webkitRequestFullscreen',
|
||||
'webkitExitFullscreen',
|
||||
'webkitFullscreenElement',
|
||||
'webkitFullscreenEnabled',
|
||||
'webkitfullscreenchange',
|
||||
'webkitfullscreenerror'
|
||||
|
||||
],
|
||||
// old WebKit (Safari 5.1)
|
||||
[
|
||||
'webkitRequestFullScreen',
|
||||
'webkitCancelFullScreen',
|
||||
'webkitCurrentFullScreenElement',
|
||||
'webkitCancelFullScreen',
|
||||
'webkitfullscreenchange',
|
||||
'webkitfullscreenerror'
|
||||
|
||||
],
|
||||
[
|
||||
'mozRequestFullScreen',
|
||||
'mozCancelFullScreen',
|
||||
'mozFullScreenElement',
|
||||
'mozFullScreenEnabled',
|
||||
'mozfullscreenchange',
|
||||
'mozfullscreenerror'
|
||||
],
|
||||
[
|
||||
'msRequestFullscreen',
|
||||
'msExitFullscreen',
|
||||
'msFullscreenElement',
|
||||
'msFullscreenEnabled',
|
||||
'MSFullscreenChange',
|
||||
'MSFullscreenError'
|
||||
]
|
||||
];
|
||||
|
||||
var i = 0;
|
||||
var l = fnMap.length;
|
||||
var ret = {};
|
||||
|
||||
for (; i < l; i++) {
|
||||
val = fnMap[i];
|
||||
if (val && val[1] in document) {
|
||||
for (i = 0, valLength = val.length; i < valLength; i++) {
|
||||
ret[fnMap[0][i]] = val[i];
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
})();
|
||||
|
||||
var screenfull = {
|
||||
request: function (elem) {
|
||||
var request = fn.requestFullscreen;
|
||||
|
||||
elem = elem || document.documentElement;
|
||||
|
||||
// Work around Safari 5.1 bug: reports support for
|
||||
// keyboard in fullscreen even though it doesn't.
|
||||
// Browser sniffing, since the alternative with
|
||||
// setTimeout is even worse.
|
||||
if (/5\.1[\.\d]* Safari/.test(navigator.userAgent)) {
|
||||
elem[request]();
|
||||
} else {
|
||||
elem[request](keyboardAllowed && Element.ALLOW_KEYBOARD_INPUT);
|
||||
}
|
||||
},
|
||||
exit: function () {
|
||||
document[fn.exitFullscreen]();
|
||||
},
|
||||
toggle: function (elem) {
|
||||
if (this.isFullscreen) {
|
||||
this.exit();
|
||||
} else {
|
||||
this.request(elem);
|
||||
}
|
||||
},
|
||||
raw: fn
|
||||
};
|
||||
|
||||
if (!fn) {
|
||||
if (isCommonjs) {
|
||||
module.exports = false;
|
||||
} else {
|
||||
window.screenfull = false;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
Object.defineProperties(screenfull, {
|
||||
isFullscreen: {
|
||||
get: function () {
|
||||
return Boolean(document[fn.fullscreenElement]);
|
||||
}
|
||||
},
|
||||
element: {
|
||||
enumerable: true,
|
||||
get: function () {
|
||||
return document[fn.fullscreenElement];
|
||||
}
|
||||
},
|
||||
enabled: {
|
||||
enumerable: true,
|
||||
get: function () {
|
||||
// Coerce to boolean in case of old WebKit
|
||||
return Boolean(document[fn.fullscreenEnabled]);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
if (isCommonjs) {
|
||||
module.exports = screenfull;
|
||||
} else {
|
||||
window.screenfull = screenfull;
|
||||
}
|
||||
})();
|
||||
21
node_modules/screenfull/license
generated
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
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.
|
||||
108
node_modules/screenfull/package.json
generated
vendored
Normal file
@@ -0,0 +1,108 @@
|
||||
{
|
||||
"_args": [
|
||||
[
|
||||
{
|
||||
"raw": "screenfull@^3.0.2",
|
||||
"scope": null,
|
||||
"escapedName": "screenfull",
|
||||
"name": "screenfull",
|
||||
"rawSpec": "^3.0.2",
|
||||
"spec": ">=3.0.2 <4.0.0",
|
||||
"type": "range"
|
||||
},
|
||||
"/Users/smus/Projects/webvr-boilerplate/node_modules/webvr-ui"
|
||||
]
|
||||
],
|
||||
"_from": "screenfull@>=3.0.2 <4.0.0",
|
||||
"_id": "screenfull@3.0.2",
|
||||
"_inCache": true,
|
||||
"_installable": true,
|
||||
"_location": "/screenfull",
|
||||
"_nodeVersion": "4.4.5",
|
||||
"_npmOperationalInternal": {
|
||||
"host": "packages-12-west.internal.npmjs.com",
|
||||
"tmp": "tmp/screenfull-3.0.2.tgz_1471045464332_0.06257056491449475"
|
||||
},
|
||||
"_npmUser": {
|
||||
"name": "sindresorhus",
|
||||
"email": "sindresorhus@gmail.com"
|
||||
},
|
||||
"_npmVersion": "2.15.5",
|
||||
"_phantomChildren": {},
|
||||
"_requested": {
|
||||
"raw": "screenfull@^3.0.2",
|
||||
"scope": null,
|
||||
"escapedName": "screenfull",
|
||||
"name": "screenfull",
|
||||
"rawSpec": "^3.0.2",
|
||||
"spec": ">=3.0.2 <4.0.0",
|
||||
"type": "range"
|
||||
},
|
||||
"_requiredBy": [
|
||||
"/webvr-ui"
|
||||
],
|
||||
"_resolved": "https://registry.npmjs.org/screenfull/-/screenfull-3.0.2.tgz",
|
||||
"_shasum": "9fbcce07bad4c680a8f90f2bfc9c41788af55d0c",
|
||||
"_shrinkwrap": null,
|
||||
"_spec": "screenfull@^3.0.2",
|
||||
"_where": "/Users/smus/Projects/webvr-boilerplate/node_modules/webvr-ui",
|
||||
"author": {
|
||||
"name": "Sindre Sorhus",
|
||||
"email": "sindresorhus@gmail.com",
|
||||
"url": "sindresorhus.com"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/sindresorhus/screenfull.js/issues"
|
||||
},
|
||||
"dependencies": {},
|
||||
"description": "Simple wrapper for cross-browser usage of the JavaScript Fullscreen API, which lets you bring the page or any element into fullscreen.",
|
||||
"devDependencies": {
|
||||
"grunt": "^1.0.1",
|
||||
"grunt-contrib-concat": "^1.0.0",
|
||||
"grunt-contrib-uglify": "^2.0.0",
|
||||
"load-grunt-tasks": "^3.3.0",
|
||||
"xo": "*"
|
||||
},
|
||||
"directories": {},
|
||||
"dist": {
|
||||
"shasum": "9fbcce07bad4c680a8f90f2bfc9c41788af55d0c",
|
||||
"tarball": "https://registry.npmjs.org/screenfull/-/screenfull-3.0.2.tgz"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
},
|
||||
"files": [
|
||||
"dist/screenfull.js"
|
||||
],
|
||||
"gitHead": "dcdfb8c24688e041ba861529711089cf0e542169",
|
||||
"homepage": "https://github.com/sindresorhus/screenfull.js#readme",
|
||||
"keywords": [
|
||||
"browser",
|
||||
"fullscreen"
|
||||
],
|
||||
"license": "MIT",
|
||||
"main": "dist/screenfull.js",
|
||||
"maintainers": [
|
||||
{
|
||||
"name": "sindresorhus",
|
||||
"email": "sindresorhus@gmail.com"
|
||||
}
|
||||
],
|
||||
"name": "screenfull",
|
||||
"optionalDependencies": {},
|
||||
"readme": "ERROR: No README data found!",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/sindresorhus/screenfull.js.git"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "xo"
|
||||
},
|
||||
"version": "3.0.2",
|
||||
"xo": {
|
||||
"envs": [
|
||||
"node",
|
||||
"browser"
|
||||
]
|
||||
}
|
||||
}
|
||||
244
node_modules/screenfull/readme.md
generated
vendored
Normal file
@@ -0,0 +1,244 @@
|
||||
# screenfull.js
|
||||
|
||||
> Simple wrapper for cross-browser usage of the JavaScript [Fullscreen API](https://developer.mozilla.org/en/DOM/Using_full-screen_mode), which lets you bring the page or any element into fullscreen. Smoothens out the browser implementation differences, so you don't have to.
|
||||
|
||||
---
|
||||
|
||||
<p align="center"><b>🔥 Want to strengthen your core JavaScript skills and master ES6?</b><br>I would personally recommend this awesome <a href="https://ES6.io/friend/AWESOME">ES6 course</a> by Wes Bos.</p>
|
||||
|
||||
---
|
||||
|
||||
### [Demo](https://sindresorhus.com/screenfull.js)
|
||||
|
||||
### [Check out my other projects](https://github.com/sindresorhus?tab=repositories)
|
||||
|
||||
|
||||
## Install
|
||||
|
||||
Only 0.7 kB gzipped.
|
||||
|
||||
Download the [production version][min] or the [development version][max].
|
||||
|
||||
[min]: https://github.com/sindresorhus/screenfull.js/raw/gh-pages/dist/screenfull.min.js
|
||||
[max]: https://github.com/sindresorhus/screenfull.js/raw/gh-pages/dist/screenfull.js
|
||||
|
||||
```
|
||||
$ npm install --save screenfull
|
||||
```
|
||||
|
||||
Also available on [cdnjs](https://cdnjs.com/libraries/screenfull.js).
|
||||
|
||||
|
||||
## Why?
|
||||
|
||||
### Screenfull
|
||||
|
||||
```js
|
||||
if (screenfull.enabled) {
|
||||
screenfull.request();
|
||||
}
|
||||
```
|
||||
|
||||
### Vanilla JavaScript
|
||||
|
||||
```js
|
||||
document.fullscreenEnabled = document.fullscreenEnabled || document.mozFullScreenEnabled || document.documentElement.webkitRequestFullScreen;
|
||||
|
||||
function requestFullscreen(element) {
|
||||
if (element.requestFullscreen) {
|
||||
element.requestFullscreen();
|
||||
} else if (element.mozRequestFullScreen) {
|
||||
element.mozRequestFullScreen();
|
||||
} else if (element.webkitRequestFullScreen) {
|
||||
element.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT);
|
||||
}
|
||||
}
|
||||
|
||||
if (document.fullscreenEnabled) {
|
||||
requestFullscreen(document.documentElement);
|
||||
}
|
||||
|
||||
// Actually it's more if you want it to work in Safari, but let's not go there...
|
||||
```
|
||||
|
||||
|
||||
## Support
|
||||
|
||||
[Supported browsers](http://caniuse.com/fullscreen)
|
||||
|
||||
Safari doesn't support use of the keyboard in fullscreen.
|
||||
|
||||
|
||||
## Documentation
|
||||
|
||||
|
||||
### Examples
|
||||
|
||||
|
||||
#### Fullscreen the page
|
||||
|
||||
```js
|
||||
document.getElementById('button').addEventListener('click', () => {
|
||||
if (screenfull.enabled) {
|
||||
screenfull.request();
|
||||
} else {
|
||||
// Ignore or do something else
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
|
||||
#### Fullscreen an element
|
||||
|
||||
```js
|
||||
const elem = document.getElementById('target');
|
||||
|
||||
document.getElementById('button').addEventListener('click', () => {
|
||||
if (screenfull.enabled) {
|
||||
screenfull.request(elem);
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
|
||||
#### Fullscreen an element with jQuery
|
||||
|
||||
```js
|
||||
const target = $('#target')[0]; // Get DOM element from jQuery collection
|
||||
|
||||
$('#button').on('click', () => {
|
||||
if (screenfull.enabled) {
|
||||
screenfull.request(target);
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
|
||||
#### Toggle fullscreen on a image with jQuery
|
||||
|
||||
```js
|
||||
$('img').on('click', event => {
|
||||
if (screenfull.enabled) {
|
||||
screenfull.toggle(event.target);
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
|
||||
#### Detect fullscreen change
|
||||
|
||||
```js
|
||||
if (screenfull.enabled) {
|
||||
document.addEventListener(screenfull.raw.fullscreenchange, () => {
|
||||
console.log('Am I fullscreen? ' + (screenfull.isFullscreen ? 'Yes' : 'No'));
|
||||
});
|
||||
}
|
||||
```
|
||||
|
||||
#### Detect fullscreen error
|
||||
|
||||
```js
|
||||
if (screenfull.enabled) {
|
||||
document.addEventListener(screenfull.raw.fullscreenerror, event => {
|
||||
console.error('Failed to enable fullscreen', event);
|
||||
});
|
||||
}
|
||||
```
|
||||
|
||||
See the [demo](https://sindresorhus.com/screenfull.js) for more examples, and view the source.
|
||||
|
||||
#### Fullscreen an element with Angular.js
|
||||
|
||||
You can use the [Angular.js binding](https://github.com/hrajchert/angular-screenfull) to do something like:
|
||||
|
||||
```html
|
||||
<div ngsf-fullscreen>
|
||||
<p>This is a fullscreen element</p>
|
||||
<button ngsf-toggle-fullscreen>Toggle fullscreen</button>
|
||||
</div>
|
||||
```
|
||||
|
||||
### Methods
|
||||
|
||||
#### .request()
|
||||
|
||||
Make an element fullscreen.
|
||||
|
||||
Accepts a DOM element. Default is `<html>`. If called with another element than the currently active, it will switch to that if it's a decendant.
|
||||
|
||||
If your page is inside an `<iframe>` you will need to add a `allowfullscreen` attribute (+ `webkitallowfullscreen` and `mozallowfullscreen`).
|
||||
|
||||
Keep in mind that the browser will only enter fullscreen when initiated by user events like click, touch, key.
|
||||
|
||||
#### .exit()
|
||||
|
||||
Brings you out of fullscreen.
|
||||
|
||||
#### .toggle()
|
||||
|
||||
Requests fullscreen if not active, otherwise exits.
|
||||
|
||||
|
||||
### Properties
|
||||
|
||||
#### .isFullscreen
|
||||
|
||||
Returns a boolean whether fullscreen is active.
|
||||
|
||||
#### .element
|
||||
|
||||
Returns the element currently in fullscreen, otherwise `null`.
|
||||
|
||||
#### .enabled
|
||||
|
||||
Returns a boolean whether you are allowed to enter fullscreen. If your page is inside an `<iframe>` you will need to add a `allowfullscreen` attribute (+ `webkitallowfullscreen` and `mozallowfullscreen`).
|
||||
|
||||
#### .raw
|
||||
|
||||
Exposes the raw properties (prefixed if needed) used internally: `requestFullscreen`, `exitFullscreen`, `fullscreenElement`, `fullscreenEnabled`, `fullscreenchange`, `fullscreenerror`
|
||||
|
||||
```js
|
||||
$(document).on(screenfull.raw.fullscreenchange, () => {
|
||||
console.log('Fullscreen change');
|
||||
});
|
||||
```
|
||||
|
||||
|
||||
## FAQ
|
||||
|
||||
### How can I navigate to a new page when fullscreen?
|
||||
|
||||
That's not supported by browsers for security reasons. There is, however, a dirty workaround. Create a seamless iframe that fills the screen and navigate to the page in that instead.
|
||||
|
||||
```js
|
||||
$('#new-page-btn').click(() => {
|
||||
const iframe = document.createElement('iframe')
|
||||
|
||||
iframe.setAttribute('id', 'external-iframe');
|
||||
iframe.setAttribute('src', 'http://new-page-website.com');
|
||||
iframe.setAttribute('frameborder', 'no');
|
||||
iframe.style.position = 'absolute';
|
||||
iframe.style.top = '0';
|
||||
iframe.style.right = '0';
|
||||
iframe.style.bottom = '0';
|
||||
iframe.style.left = '0';
|
||||
iframe.style.width = '100%';
|
||||
iframe.style.height = '100%';
|
||||
|
||||
$(document.body).prepend(iframe);
|
||||
document.body.style.overflow = 'hidden';
|
||||
});
|
||||
```
|
||||
|
||||
|
||||
## Resources
|
||||
|
||||
- [Using the Fullscreen API in web browsers](http://hacks.mozilla.org/2012/01/using-the-fullscreen-api-in-web-browsers/)
|
||||
- [MDN - Fullscreen API](https://developer.mozilla.org/en/DOM/Using_full-screen_mode)
|
||||
- [W3C Fullscreen spec](http://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html)
|
||||
- [Building an amazing fullscreen mobile experience](http://www.html5rocks.com/en/mobile/fullscreen/)
|
||||
|
||||
|
||||
## License
|
||||
|
||||
MIT © [Sindre Sorhus](https://sindresorhus.com)
|
||||
1
node_modules/test.html
generated
vendored
Normal file
@@ -0,0 +1 @@
|
||||
testing
|
||||
21
node_modules/three/LICENSE
generated
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
The MIT License
|
||||
|
||||
Copyright © 2010-2017 three.js authors
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
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.
|
||||
84
node_modules/three/README.md
generated
vendored
Normal file
@@ -0,0 +1,84 @@
|
||||
three.js
|
||||
========
|
||||
|
||||
[![Latest NPM release][npm-badge]][npm-badge-url]
|
||||
[![License][license-badge]][license-badge-url]
|
||||
[![Dependencies][dependencies-badge]][dependencies-badge-url]
|
||||
[![Dev Dependencies][devDependencies-badge]][devDependencies-badge-url]
|
||||
|
||||
#### JavaScript 3D library ####
|
||||
|
||||
The aim of the project is to create an easy to use, lightweight, 3D library. The library provides <canvas>, <svg>, CSS3D and WebGL renderers.
|
||||
|
||||
[Examples](http://threejs.org/examples/) —
|
||||
[Documentation](http://threejs.org/docs/) —
|
||||
[Wiki](https://github.com/mrdoob/three.js/wiki) —
|
||||
[Migrating](https://github.com/mrdoob/three.js/wiki/Migration-Guide) —
|
||||
[Help](http://stackoverflow.com/questions/tagged/three.js)
|
||||
|
||||
### Usage ###
|
||||
|
||||
Download the [minified library](http://threejs.org/build/three.min.js) and include it in your html.
|
||||
Alternatively see [how to build the library yourself](https://github.com/mrdoob/three.js/wiki/Build-instructions).
|
||||
|
||||
```html
|
||||
<script src="js/three.min.js"></script>
|
||||
```
|
||||
|
||||
This code creates a scene, a camera, and a geometric cube, and it adds the cube to the scene. It then creates a `WebGL` renderer for the scene and camera, and it adds that viewport to the document.body element. Finally it animates the cube within the scene for the camera.
|
||||
|
||||
```javascript
|
||||
var scene, camera, renderer;
|
||||
var geometry, material, mesh;
|
||||
|
||||
init();
|
||||
animate();
|
||||
|
||||
function init() {
|
||||
|
||||
scene = new THREE.Scene();
|
||||
|
||||
camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 1, 10000 );
|
||||
camera.position.z = 1000;
|
||||
|
||||
geometry = new THREE.BoxGeometry( 200, 200, 200 );
|
||||
material = new THREE.MeshBasicMaterial( { color: 0xff0000, wireframe: true } );
|
||||
|
||||
mesh = new THREE.Mesh( geometry, material );
|
||||
scene.add( mesh );
|
||||
|
||||
renderer = new THREE.WebGLRenderer();
|
||||
renderer.setSize( window.innerWidth, window.innerHeight );
|
||||
|
||||
document.body.appendChild( renderer.domElement );
|
||||
|
||||
}
|
||||
|
||||
function animate() {
|
||||
|
||||
requestAnimationFrame( animate );
|
||||
|
||||
mesh.rotation.x += 0.01;
|
||||
mesh.rotation.y += 0.02;
|
||||
|
||||
renderer.render( scene, camera );
|
||||
|
||||
}
|
||||
```
|
||||
|
||||
If everything went well you should see [this](http://jsfiddle.net/hfj7gm6t/).
|
||||
|
||||
### Change log ###
|
||||
|
||||
[releases](https://github.com/mrdoob/three.js/releases)
|
||||
|
||||
|
||||
|
||||
[npm-badge]: https://img.shields.io/npm/v/three.svg
|
||||
[npm-badge-url]: https://www.npmjs.com/package/three
|
||||
[license-badge]: https://img.shields.io/npm/l/three.svg
|
||||
[license-badge-url]: ./LICENSE
|
||||
[dependencies-badge]: https://img.shields.io/david/mrdoob/three.js.svg
|
||||
[dependencies-badge-url]: https://david-dm.org/mrdoob/three.js
|
||||
[devDependencies-badge]: https://img.shields.io/david/dev/mrdoob/three.js.svg
|
||||
[devDependencies-badge-url]: https://david-dm.org/mrdoob/three.js#info=devDependencies
|
||||
43300
node_modules/three/build/three.js
generated
vendored
Normal file
859
node_modules/three/build/three.min.js
generated
vendored
Normal file
42915
node_modules/three/build/three.module.js
generated
vendored
Normal file
13
node_modules/three/examples/fonts/LICENSE
generated
vendored
Normal file
@@ -0,0 +1,13 @@
|
||||
Copyright <20> 2004 by MAGENTA Ltd. All Rights Reserved.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright and this permission notice shall be included in all copies of one or more of the Font Software typefaces.
|
||||
|
||||
The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing the word "MgOpen", or if the modifications are accepted for inclusion in the Font Software itself by the each appointed Administrator.
|
||||
|
||||
This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "MgOpen" name.
|
||||
|
||||
The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself.
|
||||
|
||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL MAGENTA OR PERSONS OR BODIES IN CHARGE OF ADMINISTRATION AND MAINTENANCE OF THE FONT SOFTWARE BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||
2
node_modules/three/examples/fonts/README
generated
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
Use Facetype.js to generate typeface.json fonts.
|
||||
http://gero3.github.io/facetype.js/
|
||||
190
node_modules/three/examples/fonts/droid/NOTICE
generated
vendored
Normal file
@@ -0,0 +1,190 @@
|
||||
|
||||
Copyright (c) 2005-2008, The Android Open Source Project
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
18
node_modules/three/examples/fonts/droid/README.txt
generated
vendored
Normal file
@@ -0,0 +1,18 @@
|
||||
Copyright (C) 2008 The Android Open Source Project
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
##########
|
||||
|
||||
This directory contains the fonts for the platform. They are licensed
|
||||
under the Apache 2 license.
|
||||