Bug 1245875 - Remove Tilt from tree. r=vporof,jwalker

This commit is contained in:
Alexandre Poirot 2016-03-03 02:27:22 -08:00
parent 5fa36a6829
commit ca1358a569
75 changed files with 21 additions and 12522 deletions

View File

@ -103,7 +103,6 @@ devtools/client/scratchpad/**
devtools/client/shadereditor/**
devtools/client/shared/**
devtools/client/sourceeditor/**
devtools/client/tilt/**
devtools/client/webaudioeditor/**
devtools/client/webconsole/**
devtools/client/webide/**

View File

@ -17,8 +17,8 @@ function* spawnTest() {
let options = yield helpers.openTab(TEST_URI);
yield helpers.openToolbar(options);
let tiltEnabledOrig = prefBranch.getBoolPref("devtools.tilt.enabled");
info("originally: devtools.tilt.enabled = " + tiltEnabledOrig);
let netmonEnabledOrig = prefBranch.getBoolPref("devtools.netmonitor.enabled");
info("originally: devtools.netmonitor.enabled = " + netmonEnabledOrig);
yield helpers.audit(options, [
{
@ -66,11 +66,11 @@ function* spawnTest() {
},
},
{
setup: 'pref show devtools.til',
setup: 'pref show devtools.netmoni',
check: {
input: 'pref show devtools.til',
hints: 't.enabled',
markup: 'VVVVVVVVVVIIIIIIIIIIII',
input: 'pref show devtools.netmoni',
hints: 'tor.enabled',
markup: 'VVVVVVVVVVIIIIIIIIIIIIIIII',
status: 'ERROR',
tooltipState: 'true:importantFieldFlag',
args: {
@ -79,32 +79,32 @@ function* spawnTest() {
},
},
{
setup: 'pref reset devtools.tilt.enabled',
setup: 'pref reset devtools.netmonitor.enabled',
check: {
input: 'pref reset devtools.tilt.enabled',
input: 'pref reset devtools.netmonitor.enabled',
hints: '',
markup: 'VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV',
markup: 'VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV',
status: 'VALID'
},
},
{
setup: 'pref show devtools.tilt.enabled 4',
setup: 'pref show devtools.netmonitor.enabled 4',
check: {
input: 'pref show devtools.tilt.enabled 4',
input: 'pref show devtools.netmonitor.enabled 4',
hints: '',
markup: 'VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVE',
markup: 'VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVE',
status: 'ERROR'
},
},
{
setup: 'pref set devtools.tilt.enabled 4',
setup: 'pref set devtools.netmonitor.enabled 4',
check: {
input: 'pref set devtools.tilt.enabled 4',
input: 'pref set devtools.netmonitor.enabled 4',
hints: '',
markup: 'VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVE',
markup: 'VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVE',
status: 'ERROR',
args: {
setting: { arg: ' devtools.tilt.enabled' },
setting: { arg: ' devtools.netmonitor.enabled' },
value: { status: 'ERROR', message: 'Can\'t use \'4\'.' },
}
},
@ -132,19 +132,19 @@ function* spawnTest() {
},
},
{
setup: 'pref show devtools.tilt.enabled',
setup: 'pref show devtools.netmonitor.enabled',
check: {
args: {
setting: {
value: options.requisition.system.settings.get("devtools.tilt.enabled")
value: options.requisition.system.settings.get("devtools.netmonitor.enabled")
}
},
},
exec: {
output: "devtools.tilt.enabled: " + tiltEnabledOrig,
output: "devtools.netmonitor.enabled: " + netmonEnabledOrig,
},
post: function() {
prefBranch.setBoolPref("devtools.tilt.enabled", tiltEnabledOrig);
prefBranch.setBoolPref("devtools.netmonitor.enabled", netmonEnabledOrig);
}
},
]);

View File

@ -81,12 +81,6 @@ function testToggleToolboxButtons() {
let toolboxButtonNodes = [...doc.querySelectorAll(".command-button")];
let toggleableTools = toolbox.toolboxButtons;
// Tilt is disabled in E10S mode so we skip the tilt button if E10S is
// enabled.
if (toolbox.target.isMultiProcess) {
toolboxButtonNodes = [...doc.querySelectorAll(".command-button:not(#command-button-tilt)")];
}
// The noautohide button is only displayed in the browser toolbox
toggleableTools = toggleableTools.filter(tool => tool.id != "command-button-noautohide");
toolboxButtonNodes = toolboxButtonNodes.filter(btn => btn.id != "command-button-noautohide");

View File

@ -174,9 +174,6 @@ OptionsPanel.prototype = {
};
for (let tool of toggleableButtons) {
if (this.toolbox.target.isMultiProcess && tool.id === "command-button-tilt") {
continue;
}
if (!tool.isTargetSupported(this.toolbox.target)) {
continue;
}

View File

@ -89,8 +89,6 @@ const ToolboxButtons = exports.ToolboxButtons = [
isTargetSupported: target => !target.isAddon },
{ id: "command-button-responsive" },
{ id: "command-button-paintflashing" },
{ id: "command-button-tilt",
commands: "devtools/client/tilt/tilt-commands" },
{ id: "command-button-scratchpad" },
{ id: "command-button-eyedropper" },
{ id: "command-button-screenshot" },
@ -1008,12 +1006,6 @@ Toolbox.prototype = {
return false;
}
// Disable tilt in E10S mode. Removing it from the list of toolbox buttons
// allows a bunch of tests to pass without modification.
if (this.target.isMultiProcess && options.id === "command-button-tilt") {
return false;
}
return {
id: options.id,
button: button,
@ -1050,22 +1042,6 @@ Toolbox.prototype = {
});
this._updateNoautohideButton();
// Tilt is handled separately because it is disabled in E10S mode. Because
// we have removed tilt from toolboxButtons we have to deal with it here.
let tiltEnabled = !this.target.isMultiProcess &&
Services.prefs.getBoolPref("devtools.command-button-tilt.enabled");
let tiltButton = this.doc.getElementById("command-button-tilt");
// Remote toolboxes don't add the button to the DOM at all
if (!tiltButton) {
return;
}
if (tiltEnabled) {
tiltButton.removeAttribute("hidden");
} else {
tiltButton.setAttribute("hidden", "true");
}
},
/**

View File

@ -177,8 +177,6 @@ devtools.jar:
skin/images/command-responsivemode@2x.png (themes/images/command-responsivemode@2x.png)
skin/images/command-scratchpad.png (themes/images/command-scratchpad.png)
skin/images/command-scratchpad@2x.png (themes/images/command-scratchpad@2x.png)
skin/images/command-tilt.png (themes/images/command-tilt.png)
skin/images/command-tilt@2x.png (themes/images/command-tilt@2x.png)
skin/images/command-pick.png (themes/images/command-pick.png)
skin/images/command-pick@2x.png (themes/images/command-pick@2x.png)
skin/images/command-frames.png (themes/images/command-frames.png)

View File

@ -1,49 +0,0 @@
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
# LOCALIZATION NOTE These strings are used inside the Tilt Inspector
# which is available from the Web Developer sub-menu -> 'Tilt'.
#
# The correct localization of this file might be to keep it in
# English, or another language commonly spoken among web developers.
# You want to make that choice consistent across the developer tools.
# A good criteria is the language in which you'd find the best
# documentation on web development on the web.
# LOCALIZATION NOTE (initTilt.error): Tilt requires WebGL capabilities, which
# are not available on every hardware. This message is displayed as an modal
# popup window when initialization fails because of unsupported hardware.
initTilt.error = Could not initialize Tilt, please check the\ntroubleshooting information available at http://get.webgl.org/troubleshooting
# LOCALIZATION NOTE (initWebGL.error): Tilt requires WebGL capabilities, which
# are not available on every hardware. This message is displayed in the console
# when initialization fails because of unsupported hardware.
initWebGL.error = Could not initialize the WebGL context, your hardware or drivers may not support it.
# LOCALIZATION NOTE (linkProgram.error): This error happens when the WebGL
# context can't link two compiled shader programs together. It is displayed in
# the Error Console.
linkProgram.error = Could not initialize shader program: %S
# LOCALIZATION NOTE (compileShader.source.error): This error is caused when the
# source (uri or path) of a shader is not the expected one. It is displayed in
# the Error Console.
compileShader.source.error = Bad shader source type (expected String).
# LOCALIATION NOTE (compileShader.type.error): There are two types of shader
# programs - vertex and fragment. At a shader initialization, if none of these
# two types is specified, this compile-time error is shown. It is displayed in
# the Error Console.
compileShader.type.error = Wrong shader type specified for: %S
# LOCALIZATION NOTE (compileShader.compile.error): If the shader source and
# type are correctly specified, there may be syntax errors in the shader code.
# If this is the case, this compile-time error is shown. It is displayed in
# the Error Console.
compileShader.compile.error = Shader compile status:\n%S
# LOCALIZATION NOTE (compileShader.source.error): This error is caused when the
# source (canvas or image) of a texture is not as expected. It is displayed in
# the Error Console.
initTexture.source.error = Bad texture source type (expected Image).

View File

@ -33,7 +33,6 @@ DIRS += [
'storage',
'styleeditor',
'themes',
'tilt',
'webaudioeditor',
'webconsole',
'webide',

View File

@ -33,7 +33,7 @@ pref("devtools.toolbox.sidebar.width", 500);
pref("devtools.toolbox.host", "bottom");
pref("devtools.toolbox.previousHost", "side");
pref("devtools.toolbox.selectedTool", "webconsole");
pref("devtools.toolbox.toolbarSpec", '["splitconsole", "paintflashing toggle","tilt toggle","scratchpad","resize toggle","eyedropper","screenshot --fullpage", "rulers", "measure"]');
pref("devtools.toolbox.toolbarSpec", '["splitconsole", "paintflashing toggle","scratchpad","resize toggle","eyedropper","screenshot --fullpage", "rulers", "measure"]');
pref("devtools.toolbox.sideEnabled", true);
pref("devtools.toolbox.zoomValue", "1");
pref("devtools.toolbox.splitconsoleEnabled", false);
@ -44,7 +44,6 @@ pref("devtools.command-button-pick.enabled", true);
pref("devtools.command-button-frames.enabled", true);
pref("devtools.command-button-splitconsole.enabled", true);
pref("devtools.command-button-paintflashing.enabled", false);
pref("devtools.command-button-tilt.enabled", false);
pref("devtools.command-button-scratchpad.enabled", false);
pref("devtools.command-button-responsive.enabled", true);
pref("devtools.command-button-eyedropper.enabled", false);
@ -172,11 +171,6 @@ pref("devtools.netmonitor.har.forceExport", false);
pref("devtools.netmonitor.har.pageLoadedTimeout", 1500);
pref("devtools.netmonitor.har.enableAutoExportToFile", false);
// Enable the Tilt inspector
pref("devtools.tilt.enabled", true);
pref("devtools.tilt.intro_transition", true);
pref("devtools.tilt.outro_transition", true);
// Scratchpad settings
// - recentFileMax: The maximum number of recently-opened files
// stored. Setting this preference to 0 will not

View File

@ -160,11 +160,6 @@ Telemetry.prototype = {
userHistogram: "DEVTOOLS_STORAGE_OPENED_PER_USER_FLAG",
timerHistogram: "DEVTOOLS_STORAGE_TIME_ACTIVE_SECONDS"
},
tilt: {
histogram: "DEVTOOLS_TILT_OPENED_COUNT",
userHistogram: "DEVTOOLS_TILT_OPENED_PER_USER_FLAG",
timerHistogram: "DEVTOOLS_TILT_TIME_ACTIVE_SECONDS"
},
paintflashing: {
histogram: "DEVTOOLS_PAINTFLASHING_OPENED_COUNT",
userHistogram: "DEVTOOLS_PAINTFLASHING_OPENED_PER_USER_FLAG",

View File

@ -136,9 +136,6 @@ skip-if = e10s # Bug 937167 - e10s paintflashing
[browser_telemetry_button_responsive.js]
skip-if = e10s # Bug 1067145 - e10s responsiveview
[browser_telemetry_button_scratchpad.js]
[browser_telemetry_button_tilt.js]
skip-if = e10s # Bug 1086492 - Disable tilt for e10s
# Bug 937166 - Make tilt work in E10S mode
[browser_telemetry_sidebar.js]
[browser_telemetry_toolbox.js]
[browser_telemetry_toolboxtabs_canvasdebugger.js]

View File

@ -1,110 +0,0 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
const TEST_URI = "data:text/html;charset=utf-8," +
"<p>browser_telemetry_button_tilt.js</p>";
// Because we need to gather stats for the period of time that a tool has been
// opened we make use of setTimeout() to create tool active times.
const TOOL_DELAY = 200;
add_task(function*() {
yield addTab(TEST_URI);
let Telemetry = loadTelemetryAndRecordLogs();
let target = TargetFactory.forTab(gBrowser.selectedTab);
let toolbox = yield gDevTools.showToolbox(target, "inspector");
// Wait for the inspector to be initialized
yield toolbox.getPanel("inspector").once("inspector-updated");
info("inspector opened");
info("testing the tilt button");
yield testButton(toolbox, Telemetry);
stopRecordingTelemetryLogs(Telemetry);
yield gDevTools.closeToolbox(target);
gBrowser.removeCurrentTab();
});
function* testButton(toolbox, Telemetry) {
info("Testing command-button-tilt");
let button = toolbox.doc.querySelector("#command-button-tilt");
ok(button, "Captain, we have the button");
yield delayedClicks(button, 4)
checkResults("_TILT_", Telemetry);
}
function delayedClicks(node, clicks) {
return new Promise(resolve => {
let clicked = 0;
// See TOOL_DELAY for why we need setTimeout here
setTimeout(function delayedClick() {
if (clicked >= clicks) {
resolve();
return;
}
info("Clicking button " + node.id);
// Depending on odd/even click we are either opening
// or closing tilt
let event;
if (clicked % 2 == 0) {
info("Waiting for opening\n");
event = "tilt-initialized";
} else {
dump("Waiting for closing\n");
event = "tilt-destroyed";
}
let f = function () {
Services.obs.removeObserver(f, event, false);
setTimeout(delayedClick, 200);
};
Services.obs.addObserver(f, event, false);
clicked++;
node.click();
}, TOOL_DELAY);
});
}
function checkResults(histIdFocus, Telemetry) {
let result = Telemetry.prototype.telemetryInfo;
for (let [histId, value] of Iterator(result)) {
if (histId.startsWith("DEVTOOLS_INSPECTOR_") ||
!histId.includes(histIdFocus)) {
// Inspector stats are tested in
// browser_telemetry_toolboxtabs_{toolname}.js so we skip them here
// because we only open the inspector once for this test.
continue;
}
if (histId.endsWith("OPENED_PER_USER_FLAG")) {
ok(value.length === 1 && value[0] === true,
"Per user value " + histId + " has a single value of true");
} else if (histId.endsWith("OPENED_COUNT")) {
ok(value.length > 1, histId + " has more than one entry");
let okay = value.every(function(element) {
return element === true;
});
ok(okay, "All " + histId + " entries are === true");
} else if (histId.endsWith("TIME_ACTIVE_SECONDS")) {
ok(value.length > 1, histId + " has more than one entry");
let okay = value.every(function(element) {
return element > 0;
});
ok(okay, "All " + histId + " entries have time > 0");
}
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 311 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 449 B

View File

@ -742,10 +742,6 @@
background-image: url("chrome://devtools/skin/images/command-responsivemode.png");
}
#command-button-tilt > image {
background-image: url("chrome://devtools/skin/images/command-tilt.png");
}
#command-button-scratchpad > image {
background-image: url("chrome://devtools/skin/images/command-scratchpad.png");
}
@ -791,10 +787,6 @@
background-image: url("chrome://devtools/skin/images/command-responsivemode@2x.png");
}
#command-button-tilt > image {
background-image: url("chrome://devtools/skin/images/command-tilt@2x.png");
}
#command-button-scratchpad > image {
background-image: url("chrome://devtools/skin/images/command-scratchpad@2x.png");
}

View File

@ -1,281 +0,0 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set ts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
"use strict";
/**
* Given the initialization data (sizes and information about
* each DOM node) this worker sends back the arrays representing
* vertices, texture coords, colors, indices and all the needed data for
* rendering the DOM visualization mesh.
*
* Used in the TiltVisualization.Presenter object.
*/
self.onmessage = function TWC_onMessage(event)
{
let data = event.data;
let maxGroupNodes = parseInt(data.maxGroupNodes);
let style = data.style;
let texWidth = data.texWidth;
let texHeight = data.texHeight;
let nodesInfo = data.nodesInfo;
let mesh = {
allVertices: [],
groups: [],
width: 0,
height: 0
};
let vertices;
let texCoord;
let color;
let stacksIndices;
let wireframeIndices;
let index;
// seed the random function to get the same values each time
// we're doing this to avoid ugly z-fighting with overlapping nodes
self.random.seed(0);
// go through all the dom nodes and compute the verts, texcoord etc.
for (let n = 0, len = nodesInfo.length; n < len; n++) {
// check if we need to start creating a new group
if (n % maxGroupNodes === 0) {
vertices = []; // recreate the arrays used to construct the 3D mesh data
texCoord = [];
color = [];
stacksIndices = [];
wireframeIndices = [];
index = 0;
}
let info = nodesInfo[n];
let coord = info.coord;
// calculate the stack x, y, z, width and height coordinates
let z = coord.depth + coord.thickness;
let y = coord.top;
let x = coord.left;
let w = coord.width;
let h = coord.height;
// the maximum texture size slices the visualization mesh where needed
if (x + w > texWidth) {
w = texWidth - x;
}
if (y + h > texHeight) {
h = texHeight - y;
}
x += self.random.next();
y += self.random.next();
w -= self.random.next() * 0.1;
h -= self.random.next() * 0.1;
let xpw = x + w;
let yph = y + h;
let zmt = coord.depth;
let xotw = x / texWidth;
let yoth = y / texHeight;
let xpwotw = xpw / texWidth;
let yphoth = yph / texHeight;
// calculate the margin fill color
let fill = style[info.name] || style.highlight.defaultFill;
let r = fill[0];
let g = fill[1];
let b = fill[2];
let g10 = r * 1.1;
let g11 = g * 1.1;
let g12 = b * 1.1;
let g20 = r * 0.6;
let g21 = g * 0.6;
let g22 = b * 0.6;
// compute the vertices
vertices.push(x, y, z, /* front */ // 0
x, yph, z, // 1
xpw, yph, z, // 2
xpw, y, z, // 3
// we don't duplicate vertices for the left and right faces, because
// they can be reused from the bottom and top faces; we do, however,
// duplicate some vertices from front face, because it has custom
// texture coordinates which are not shared by the other faces
x, y, z, /* front */ // 4
x, yph, z, // 5
xpw, yph, z, // 6
xpw, y, z, // 7
x, y, zmt, /* back */ // 8
x, yph, zmt, // 9
xpw, yph, zmt, // 10
xpw, y, zmt); // 11
// compute the texture coordinates
texCoord.push(xotw, yoth,
xotw, yphoth,
xpwotw, yphoth,
xpwotw, yoth,
-1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0);
// compute the colors for each vertex in the mesh
color.push(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
g10, g11, g12,
g10, g11, g12,
g10, g11, g12,
g10, g11, g12,
g20, g21, g22,
g20, g21, g22,
g20, g21, g22,
g20, g21, g22);
let i = index; // number of vertex points, used to create the indices array
let ip1 = i + 1;
let ip2 = ip1 + 1;
let ip3 = ip2 + 1;
let ip4 = ip3 + 1;
let ip5 = ip4 + 1;
let ip6 = ip5 + 1;
let ip7 = ip6 + 1;
let ip8 = ip7 + 1;
let ip9 = ip8 + 1;
let ip10 = ip9 + 1;
let ip11 = ip10 + 1;
// compute the stack indices
stacksIndices.unshift(i, ip1, ip2, i, ip2, ip3,
ip8, ip9, ip5, ip8, ip5, ip4,
ip7, ip6, ip10, ip7, ip10, ip11,
ip8, ip4, ip7, ip8, ip7, ip11,
ip5, ip9, ip10, ip5, ip10, ip6);
// compute the wireframe indices
if (coord.thickness !== 0) {
wireframeIndices.unshift(i, ip1, ip1, ip2,
ip2, ip3, ip3, i,
ip8, i, ip9, ip1,
ip11, ip3, ip10, ip2);
}
// there are 12 vertices in a stack representing a node
index += 12;
// set the maximum mesh width and height to calculate the center offset
mesh.width = Math.max(w, mesh.width);
mesh.height = Math.max(h, mesh.height);
// check if we need to save the currently active group; this happens after
// we filled all the "slots" in a group or there aren't any remaining nodes
if (((n + 1) % maxGroupNodes === 0) || (n === len - 1)) {
mesh.groups.push({
vertices: vertices,
texCoord: texCoord,
color: color,
stacksIndices: stacksIndices,
wireframeIndices: wireframeIndices
});
mesh.allVertices = mesh.allVertices.concat(vertices);
}
}
self.postMessage(mesh);
close();
};
/**
* Utility functions for generating random numbers using the Alea algorithm.
*/
self.random = {
/**
* The generator function, automatically created with seed 0.
*/
_generator: null,
/**
* Returns a new random number between [0..1)
*/
next: function RNG_next()
{
return this._generator();
},
/**
* From http://baagoe.com/en/RandomMusings/javascript
* Johannes Baagoe <baagoe@baagoe.com>, 2010
*
* Seeds a random generator function with a set of passed arguments.
*/
seed: function RNG_seed()
{
let s0 = 0;
let s1 = 0;
let s2 = 0;
let c = 1;
if (arguments.length === 0) {
return this.seed(+new Date());
} else {
s0 = this.mash(" ");
s1 = this.mash(" ");
s2 = this.mash(" ");
for (let i = 0, len = arguments.length; i < len; i++) {
s0 -= this.mash(arguments[i]);
if (s0 < 0) {
s0 += 1;
}
s1 -= this.mash(arguments[i]);
if (s1 < 0) {
s1 += 1;
}
s2 -= this.mash(arguments[i]);
if (s2 < 0) {
s2 += 1;
}
}
let random = function() {
let t = 2091639 * s0 + c * 2.3283064365386963e-10; // 2^-32
s0 = s1;
s1 = s2;
return (s2 = t - (c = t | 0));
};
random.uint32 = function() {
return random() * 0x100000000; // 2^32
};
random.fract53 = function() {
return random() +
(random() * 0x200000 | 0) * 1.1102230246251565e-16; // 2^-53
};
return (this._generator = random);
}
},
/**
* From http://baagoe.com/en/RandomMusings/javascript
* Johannes Baagoe <baagoe@baagoe.com>, 2010
*/
mash: function RNG_mash(data)
{
let h, n = 0xefc8249d;
data = data.toString();
for (let i = 0, len = data.length; i < len; i++) {
n += data.charCodeAt(i);
h = 0.02519603282416938 * n;
n = h >>> 0;
h -= n;
h *= n;
n = h >>> 0;
h -= n;
n += h * 0x100000000; // 2^32
}
return (n >>> 0) * 2.3283064365386963e-10; // 2^-32
}
};

View File

@ -1,186 +0,0 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set ts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
"use strict";
/**
* This worker handles picking, given a set of vertices and a ray (calculates
* the intersection points and offers back information about the closest hit).
*
* Used in the TiltVisualization.Presenter object.
*/
self.onmessage = function TWP_onMessage(event)
{
let data = event.data;
let vertices = data.vertices;
let ray = data.ray;
let intersection = null;
let hit = [];
// calculates the squared distance between two points
function dsq(p1, p2) {
let xd = p2[0] - p1[0];
let yd = p2[1] - p1[1];
let zd = p2[2] - p1[2];
return xd * xd + yd * yd + zd * zd;
}
// check each stack face in the visualization mesh for intersections with
// the mouse ray (using a ray picking algorithm)
for (let i = 0, len = vertices.length; i < len; i += 36) {
// the front quad
let v0f = [vertices[i], vertices[i + 1], vertices[i + 2]];
let v1f = [vertices[i + 3], vertices[i + 4], vertices[i + 5]];
let v2f = [vertices[i + 6], vertices[i + 7], vertices[i + 8]];
let v3f = [vertices[i + 9], vertices[i + 10], vertices[i + 11]];
// the back quad
let v0b = [vertices[i + 24], vertices[i + 25], vertices[i + 26]];
let v1b = [vertices[i + 27], vertices[i + 28], vertices[i + 29]];
let v2b = [vertices[i + 30], vertices[i + 31], vertices[i + 32]];
let v3b = [vertices[i + 33], vertices[i + 34], vertices[i + 35]];
// don't do anything with degenerate quads
if (!v0f[0] && !v1f[0] && !v2f[0] && !v3f[0]) {
continue;
}
// for each triangle in the stack box, check for the intersections
if (self.intersect(v0f, v1f, v2f, ray, hit) || // front left
self.intersect(v0f, v2f, v3f, ray, hit) || // front right
self.intersect(v0b, v1b, v1f, ray, hit) || // left back
self.intersect(v0b, v1f, v0f, ray, hit) || // left front
self.intersect(v3f, v2b, v3b, ray, hit) || // right back
self.intersect(v3f, v2f, v2b, ray, hit) || // right front
self.intersect(v0b, v0f, v3f, ray, hit) || // top left
self.intersect(v0b, v3f, v3b, ray, hit) || // top right
self.intersect(v1f, v1b, v2b, ray, hit) || // bottom left
self.intersect(v1f, v2b, v2f, ray, hit)) { // bottom right
// calculate the distance between the intersection hit point and camera
let d = dsq(hit, ray.origin);
// we're picking the closest stack in the mesh from the camera
if (intersection === null || d < intersection.distance) {
intersection = {
// each mesh stack is composed of 12 vertices, so there's information
// about a node once in 12 * 3 = 36 iterations (to avoid duplication)
index: i / 36,
distance: d
};
}
}
}
self.postMessage(intersection);
close();
};
/**
* Utility function for finding intersections between a ray and a triangle.
*/
self.intersect = (function() {
// creates a new instance of a vector
function create() {
return new Float32Array(3);
}
// performs a vector addition
function add(aVec, aVec2, aDest) {
aDest[0] = aVec[0] + aVec2[0];
aDest[1] = aVec[1] + aVec2[1];
aDest[2] = aVec[2] + aVec2[2];
return aDest;
}
// performs a vector subtraction
function subtract(aVec, aVec2, aDest) {
aDest[0] = aVec[0] - aVec2[0];
aDest[1] = aVec[1] - aVec2[1];
aDest[2] = aVec[2] - aVec2[2];
return aDest;
}
// performs a vector scaling
function scale(aVec, aVal, aDest) {
aDest[0] = aVec[0] * aVal;
aDest[1] = aVec[1] * aVal;
aDest[2] = aVec[2] * aVal;
return aDest;
}
// generates the cross product of two vectors
function cross(aVec, aVec2, aDest) {
let x = aVec[0];
let y = aVec[1];
let z = aVec[2];
let x2 = aVec2[0];
let y2 = aVec2[1];
let z2 = aVec2[2];
aDest[0] = y * z2 - z * y2;
aDest[1] = z * x2 - x * z2;
aDest[2] = x * y2 - y * x2;
return aDest;
}
// calculates the dot product of two vectors
function dot(aVec, aVec2) {
return aVec[0] * aVec2[0] + aVec[1] * aVec2[1] + aVec[2] * aVec2[2];
}
let edge1 = create();
let edge2 = create();
let pvec = create();
let tvec = create();
let qvec = create();
let lvec = create();
// checks for ray-triangle intersections using the Fast Minimum-Storage
// (simplified) algorithm by Tomas Moller and Ben Trumbore
return function intersect(aVert0, aVert1, aVert2, aRay, aDest) {
let dir = aRay.direction;
let orig = aRay.origin;
// find vectors for two edges sharing vert0
subtract(aVert1, aVert0, edge1);
subtract(aVert2, aVert0, edge2);
// begin calculating determinant - also used to calculate the U parameter
cross(dir, edge2, pvec);
// if determinant is near zero, ray lines in plane of triangle
let inv_det = 1 / dot(edge1, pvec);
// calculate distance from vert0 to ray origin
subtract(orig, aVert0, tvec);
// calculate U parameter and test bounds
let u = dot(tvec, pvec) * inv_det;
if (u < 0 || u > 1) {
return false;
}
// prepare to test V parameter
cross(tvec, edge1, qvec);
// calculate V parameter and test bounds
let v = dot(dir, qvec) * inv_det;
if (v < 0 || u + v > 1) {
return false;
}
// calculate T, ray intersects triangle
let t = dot(edge2, qvec) * inv_det;
scale(dir, t, lvec);
add(orig, lvec, aDest);
return true;
};
}());

View File

@ -1,17 +0,0 @@
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
DevToolsModules(
'tilt-commands.js',
'tilt-gl.js',
'tilt-math.js',
'tilt-utils.js',
'tilt-visualizer-style.js',
'tilt-visualizer.js',
'tilt.js',
'TiltWorkerCrafter.js',
'TiltWorkerPicker.js'
)
BROWSER_CHROME_MANIFESTS += ['test/browser.ini']

View File

@ -1,4 +0,0 @@
{
// Extend from the shared list of defined globals for mochitests.
"extends": "../../../.eslintrc.mochitests"
}

View File

@ -1,54 +0,0 @@
[DEFAULT]
tags = devtools
skip-if = e10s # Bug 1086492 - Disable tilt for e10s
# Bug 937166 - Make tilt work in E10S mode
subsuite = devtools
support-files = head.js
[browser_tilt_01_lazy_getter.js]
[browser_tilt_02_notifications-seq.js]
[browser_tilt_02_notifications-tabs.js]
[browser_tilt_02_notifications.js]
[browser_tilt_03_tab_switch.js]
skip-if = true # Bug 1093215 - Failed assertion
[browser_tilt_04_initialization.js]
[browser_tilt_05_destruction-esc.js]
[browser_tilt_05_destruction-url.js]
[browser_tilt_05_destruction.js]
[browser_tilt_arcball-reset-typeahead.js]
[browser_tilt_arcball-reset.js]
[browser_tilt_arcball.js]
[browser_tilt_controller.js]
[browser_tilt_gl01.js]
[browser_tilt_gl02.js]
[browser_tilt_gl03.js]
[browser_tilt_gl04.js]
[browser_tilt_gl05.js]
[browser_tilt_gl06.js]
[browser_tilt_gl07.js]
[browser_tilt_gl08.js]
[browser_tilt_math01.js]
[browser_tilt_math02.js]
[browser_tilt_math03.js]
[browser_tilt_math04.js]
[browser_tilt_math05.js]
[browser_tilt_math06.js]
[browser_tilt_math07.js]
[browser_tilt_picking.js]
[browser_tilt_picking_delete.js]
[browser_tilt_picking_highlight01-offs.js]
[browser_tilt_picking_highlight01.js]
[browser_tilt_picking_highlight02.js]
[browser_tilt_picking_highlight03.js]
[browser_tilt_picking_inspector.js]
[browser_tilt_picking_miv.js]
[browser_tilt_utils01.js]
[browser_tilt_utils02.js]
[browser_tilt_utils03.js]
[browser_tilt_utils04.js]
[browser_tilt_utils05.js]
[browser_tilt_utils06.js]
[browser_tilt_utils07.js]
[browser_tilt_utils08.js]
[browser_tilt_visualizer.js]
[browser_tilt_zoom.js]

View File

@ -1,14 +0,0 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
function test() {
ok(Tilt,
"The Tilt object wasn't got correctly via defineLazyGetter.");
is(Tilt.chromeWindow, window,
"The top-level window wasn't saved correctly");
ok(Tilt.visualizers,
"The holder object for all the instances of the visualizer doesn't exist.")
ok(Tilt.NOTIFICATIONS,
"The notifications constants weren't referenced correctly.");
}

View File

@ -1,99 +0,0 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
var tabEvents = "";
function test() {
if (!isTiltEnabled()) {
aborting();
info("Skipping notifications test because Tilt isn't enabled.");
return;
}
if (!isWebGLSupported()) {
aborting();
info("Skipping notifications test because WebGL isn't supported.");
return;
}
requestLongerTimeout(10);
waitForExplicitFinish();
createTab(function() {
Services.obs.addObserver(finalize, DESTROYED, false);
Services.obs.addObserver(obs_STARTUP, STARTUP, false);
Services.obs.addObserver(obs_INITIALIZING, INITIALIZING, false);
Services.obs.addObserver(obs_INITIALIZED, INITIALIZED, false);
Services.obs.addObserver(obs_DESTROYING, DESTROYING, false);
Services.obs.addObserver(obs_BEFORE_DESTROYED, BEFORE_DESTROYED, false);
Services.obs.addObserver(obs_DESTROYED, DESTROYED, false);
info("Starting up the Tilt notifications test.");
createTilt({}, false, function suddenDeath()
{
ok(false, "Tilt could not be initialized properly.");
cleanup();
});
});
}
function obs_STARTUP(win) {
info("Handling the STARTUP notification.");
is(win, gBrowser.selectedBrowser.contentWindow, "Saw the correct window");
tabEvents += "STARTUP;";
}
function obs_INITIALIZING(win) {
info("Handling the INITIALIZING notification.");
is(win, gBrowser.selectedBrowser.contentWindow, "Saw the correct window");
tabEvents += "INITIALIZING;";
}
function obs_INITIALIZED(win) {
info("Handling the INITIALIZED notification.");
is(win, gBrowser.selectedBrowser.contentWindow, "Saw the correct window");
tabEvents += "INITIALIZED;";
Tilt.destroy(Tilt.currentWindowId, true);
}
function obs_DESTROYING(win) {
info("Handling the DESTROYING( notification.");
is(win, gBrowser.selectedBrowser.contentWindow, "Saw the correct window");
tabEvents += "DESTROYING;";
}
function obs_BEFORE_DESTROYED(win) {
info("Handling the BEFORE_DESTROYED notification.");
is(win, gBrowser.selectedBrowser.contentWindow, "Saw the correct window");
tabEvents += "BEFORE_DESTROYED;";
}
function obs_DESTROYED(win) {
info("Handling the DESTROYED notification.");
is(win, gBrowser.selectedBrowser.contentWindow, "Saw the correct window");
tabEvents += "DESTROYED;";
}
function finalize(win) {
is(win, gBrowser.selectedBrowser.contentWindow, "Saw the correct window");
is(tabEvents, "STARTUP;INITIALIZING;INITIALIZED;DESTROYING;BEFORE_DESTROYED;DESTROYED;",
"The notifications weren't fired in the correct order.");
cleanup();
}
function cleanup() {
info("Cleaning up the notifications test.");
Services.obs.removeObserver(finalize, DESTROYED);
Services.obs.removeObserver(obs_INITIALIZING, INITIALIZING);
Services.obs.removeObserver(obs_INITIALIZED, INITIALIZED);
Services.obs.removeObserver(obs_DESTROYING, DESTROYING);
Services.obs.removeObserver(obs_BEFORE_DESTROYED, BEFORE_DESTROYED);
Services.obs.removeObserver(obs_DESTROYED, DESTROYED);
Services.obs.removeObserver(obs_STARTUP, STARTUP);
gBrowser.removeCurrentTab();
finish();
}

View File

@ -1,179 +0,0 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
var tab0, tab1, tab2;
var testStep = -1;
var expected = [];
function expect(notification, win) {
expected.push({ notification: notification, window: win });
}
function notification(win, topic) {
if (expected.length == 0) {
is(topic, null, "Shouldn't see a notification");
return;
}
let { notification, window } = expected.shift();
if (Cu.isDeadWrapper(window)) {
// Sometimes we end up with a nuked window reference here :-(
return;
}
is(topic, notification, "Saw the expected notification");
is(win, window, "Saw the expected window");
}
function after(notification, callback) {
function observer() {
Services.obs.removeObserver(observer, notification);
executeSoon(callback);
}
Services.obs.addObserver(observer, notification, false);
}
function test() {
if (!isTiltEnabled()) {
aborting();
info("Skipping tab switch test because Tilt isn't enabled.");
return;
}
if (!isWebGLSupported()) {
aborting();
info("Skipping tab switch test because WebGL isn't supported.");
return;
}
Services.obs.addObserver(notification, STARTUP, false);
Services.obs.addObserver(notification, INITIALIZING, false);
Services.obs.addObserver(notification, INITIALIZED, false);
Services.obs.addObserver(notification, DESTROYING, false);
Services.obs.addObserver(notification, BEFORE_DESTROYED, false);
Services.obs.addObserver(notification, DESTROYED, false);
Services.obs.addObserver(notification, SHOWN, false);
Services.obs.addObserver(notification, HIDDEN, false);
waitForExplicitFinish();
tab0 = gBrowser.selectedTab;
nextStep();
}
function createTab2() {
}
var testSteps = [
function step0() {
tab1 = createTab(function() {
expect(STARTUP, tab1.linkedBrowser.contentWindow);
expect(INITIALIZING, tab1.linkedBrowser.contentWindow);
expect(INITIALIZED, tab1.linkedBrowser.contentWindow);
after(INITIALIZED, nextStep);
createTilt({}, false, function suddenDeath()
{
ok(false, "Tilt could not be initialized properly.");
cleanup();
});
});
},
function step1() {
expect(HIDDEN, tab1.linkedBrowser.contentWindow);
tab2 = createTab(function() {
expect(STARTUP, tab2.linkedBrowser.contentWindow);
expect(INITIALIZING, tab2.linkedBrowser.contentWindow);
expect(INITIALIZED, tab2.linkedBrowser.contentWindow);
after(INITIALIZED, nextStep);
createTilt({}, false, function suddenDeath()
{
ok(false, "Tilt could not be initialized properly.");
cleanup();
});
});
},
function step2() {
expect(HIDDEN, tab2.linkedBrowser.contentWindow);
after(HIDDEN, nextStep);
gBrowser.selectedTab = tab0;
},
function step3() {
expect(SHOWN, tab2.linkedBrowser.contentWindow);
after(SHOWN, nextStep);
gBrowser.selectedTab = tab2;
},
function step4() {
expect(HIDDEN, tab2.linkedBrowser.contentWindow);
expect(SHOWN, tab1.linkedBrowser.contentWindow);
after(SHOWN, nextStep);
gBrowser.selectedTab = tab1;
},
function step5() {
expect(HIDDEN, tab1.linkedBrowser.contentWindow);
expect(SHOWN, tab2.linkedBrowser.contentWindow);
after(SHOWN, nextStep);
gBrowser.selectedTab = tab2;
},
function step6() {
expect(DESTROYING, tab2.linkedBrowser.contentWindow);
expect(BEFORE_DESTROYED, tab2.linkedBrowser.contentWindow);
expect(DESTROYED, tab2.linkedBrowser.contentWindow);
after(DESTROYED, nextStep);
Tilt.destroy(Tilt.currentWindowId, true);
},
function step7() {
expect(SHOWN, tab1.linkedBrowser.contentWindow);
gBrowser.removeCurrentTab();
tab2 = null;
expect(DESTROYING, tab1.linkedBrowser.contentWindow);
expect(HIDDEN, tab1.linkedBrowser.contentWindow);
expect(BEFORE_DESTROYED, tab1.linkedBrowser.contentWindow);
expect(DESTROYED, tab1.linkedBrowser.contentWindow);
after(DESTROYED, nextStep);
gBrowser.removeCurrentTab();
tab1 = null;
},
function step8_cleanup() {
is(gBrowser.selectedTab, tab0, "Should be back to the first tab");
cleanup();
}
];
function cleanup() {
if (tab1) {
gBrowser.removeTab(tab1);
tab1 = null;
}
if (tab2) {
gBrowser.removeTab(tab2);
tab2 = null;
}
Services.obs.removeObserver(notification, STARTUP);
Services.obs.removeObserver(notification, INITIALIZING);
Services.obs.removeObserver(notification, INITIALIZED);
Services.obs.removeObserver(notification, DESTROYING);
Services.obs.removeObserver(notification, BEFORE_DESTROYED);
Services.obs.removeObserver(notification, DESTROYED);
Services.obs.removeObserver(notification, SHOWN);
Services.obs.removeObserver(notification, HIDDEN);
finish();
}
function nextStep() {
let step = testSteps.shift();
info("Executing " + step.name);
step();
}

View File

@ -1,131 +0,0 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
var tab0, tab1;
var testStep = -1;
var tabEvents = "";
function test() {
if (!isTiltEnabled()) {
aborting();
info("Skipping notifications test because Tilt isn't enabled.");
return;
}
if (!isWebGLSupported()) {
aborting();
info("Skipping notifications test because WebGL isn't supported.");
return;
}
requestLongerTimeout(10);
waitForExplicitFinish();
gBrowser.tabContainer.addEventListener("TabSelect", tabSelect, false);
createNewTab();
}
function createNewTab() {
tab0 = gBrowser.selectedTab;
tab1 = createTab(function() {
Services.obs.addObserver(finalize, DESTROYED, false);
Services.obs.addObserver(tab_STARTUP, STARTUP, false);
Services.obs.addObserver(tab_INITIALIZING, INITIALIZING, false);
Services.obs.addObserver(tab_DESTROYING, DESTROYING, false);
Services.obs.addObserver(tab_SHOWN, SHOWN, false);
Services.obs.addObserver(tab_HIDDEN, HIDDEN, false);
info("Starting up the Tilt notifications test.");
createTilt({
onTiltOpen: function()
{
testStep = 0;
tabSelect();
}
}, false, function suddenDeath()
{
ok(false, "Tilt could not be initialized properly.");
cleanup();
});
});
}
function tab_STARTUP(win) {
info("Handling the STARTUP notification.");
is(win, tab1.linkedBrowser.contentWindow, "Saw the correct window");
tabEvents += "STARTUP;";
}
function tab_INITIALIZING(win) {
info("Handling the INITIALIZING notification.");
is(win, tab1.linkedBrowser.contentWindow, "Saw the correct window");
tabEvents += "INITIALIZING;";
}
function tab_DESTROYING(win) {
info("Handling the DESTROYING notification.");
is(win, tab1.linkedBrowser.contentWindow, "Saw the correct window");
tabEvents += "DESTROYING;";
}
function tab_SHOWN(win) {
info("Handling the SHOWN notification.");
is(win, tab1.linkedBrowser.contentWindow, "Saw the correct window");
tabEvents += "SHOWN;";
}
function tab_HIDDEN(win) {
info("Handling the HIDDEN notification.");
is(win, tab1.linkedBrowser.contentWindow, "Saw the correct window");
tabEvents += "HIDDEN;";
}
var testSteps = [
function step0() {
info("Selecting tab0.");
gBrowser.selectedTab = tab0;
},
function step1() {
info("Selecting tab1.");
gBrowser.selectedTab = tab1;
},
function step2() {
info("Killing it.");
Tilt.destroy(Tilt.currentWindowId, true);
}
];
function finalize(win) {
is(win, tab1.linkedBrowser.contentWindow, "Saw the correct window");
is(tabEvents, "STARTUP;INITIALIZING;HIDDEN;SHOWN;DESTROYING;",
"The notifications weren't fired in the correct order.");
cleanup();
}
function cleanup() {
info("Cleaning up the notifications test.");
tab0 = null;
tab1 = null;
Services.obs.removeObserver(finalize, DESTROYED);
Services.obs.removeObserver(tab_INITIALIZING, INITIALIZING);
Services.obs.removeObserver(tab_DESTROYING, DESTROYING);
Services.obs.removeObserver(tab_SHOWN, SHOWN);
Services.obs.removeObserver(tab_HIDDEN, HIDDEN);
Services.obs.removeObserver(tab_STARTUP, STARTUP);
gBrowser.tabContainer.removeEventListener("TabSelect", tabSelect);
gBrowser.removeCurrentTab();
finish();
}
function tabSelect() {
if (testStep !== -1) {
executeSoon(testSteps[testStep]);
testStep++;
}
}

View File

@ -1,110 +0,0 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
var tab0, tab1, tab2;
var testStep = -1;
function test() {
// This test relies on a timeout to indicate pass or fail. All tests need at
// least one pass, fail or todo so let's create a dummy pass.
ok(true, "Each test requires at least one pass, fail or todo so here is a pass.");
if (!isTiltEnabled()) {
info("Skipping tab switch test because Tilt isn't enabled.");
return;
}
if (!isWebGLSupported()) {
info("Skipping tab switch test because WebGL isn't supported.");
return;
}
waitForExplicitFinish();
gBrowser.tabContainer.addEventListener("TabSelect", tabSelect, false);
createTab1();
}
function createTab1() {
tab0 = gBrowser.selectedTab;
tab1 = createTab(function() {
createTilt({
onTiltOpen: function()
{
createTab2();
}
}, false, function suddenDeath()
{
ok(false, "Tilt could not be initialized properly.");
cleanup();
});
});
}
function createTab2() {
tab2 = createTab(function() {
createTilt({
onTiltOpen: function()
{
testStep = 0;
tabSelect();
}
}, false, function suddenDeath()
{
ok(false, "Tilt could not be initialized properly.");
cleanup();
});
});
}
var testSteps = [
function step0() {
gBrowser.selectedTab = tab1;
},
function step1() {
gBrowser.selectedTab = tab0;
},
function step2() {
gBrowser.selectedTab = tab1;
},
function step3() {
gBrowser.selectedTab = tab2;
},
function step4() {
Tilt.destroy(Tilt.currentWindowId);
gBrowser.removeCurrentTab();
tab2 = null;
},
function step5() {
Tilt.destroy(Tilt.currentWindowId);
gBrowser.removeCurrentTab();
tab1 = null;
},
function step6_cleanup() {
cleanup();
}
];
function cleanup() {
gBrowser.tabContainer.removeEventListener("TabSelect", tabSelect, false);
if (tab1) {
gBrowser.removeTab(tab1);
tab1 = null;
}
if (tab2) {
gBrowser.removeTab(tab2);
tab2 = null;
}
finish();
}
function tabSelect() {
if (testStep !== -1) {
executeSoon(testSteps[testStep]);
testStep++;
}
}

View File

@ -1,59 +0,0 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
function test() {
if (!isTiltEnabled()) {
aborting();
info("Skipping initialization test because Tilt isn't enabled.");
return;
}
if (!isWebGLSupported()) {
aborting();
info("Skipping initialization test because WebGL isn't supported.");
return;
}
waitForExplicitFinish();
createTab(function() {
let id = TiltUtils.getWindowId(gBrowser.selectedBrowser.contentWindow);
is(id, Tilt.currentWindowId,
"The unique window identifiers should match for the same window.");
createTilt({
onTiltOpen: function(instance)
{
is(document.activeElement, instance.presenter.canvas,
"The visualizer canvas should be focused on initialization.");
ok(Tilt.visualizers[id] instanceof TiltVisualizer,
"A new instance of the visualizer wasn't created properly.");
ok(Tilt.visualizers[id].isInitialized(),
"The new instance of the visualizer wasn't initialized properly.");
},
onTiltClose: function()
{
is(document.activeElement, gBrowser.selectedBrowser,
"The focus wasn't correctly given back to the selectedBrowser.");
is(Tilt.visualizers[id], null,
"The current instance of the visualizer wasn't destroyed properly.");
},
onEnd: function()
{
cleanup();
}
}, true, function suddenDeath()
{
ok(false, "Tilt could not be initialized properly.");
cleanup();
});
});
}
function cleanup() {
gBrowser.removeCurrentTab();
finish();
}

View File

@ -1,51 +0,0 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
var tiltOpened = false;
function test() {
if (!isTiltEnabled()) {
aborting();
info("Skipping destruction test because Tilt isn't enabled.");
return;
}
if (!isWebGLSupported()) {
aborting();
info("Skipping destruction test because WebGL isn't supported.");
return;
}
waitForExplicitFinish();
createTab(function() {
createTilt({
onTiltOpen: function()
{
tiltOpened = true;
Services.obs.addObserver(finalize, DESTROYED, false);
EventUtils.sendKey("ESCAPE");
}
}, false, function suddenDeath()
{
ok(false, "Tilt could not be initialized properly.");
cleanup();
});
});
}
function finalize() {
let id = TiltUtils.getWindowId(gBrowser.selectedBrowser.contentWindow);
is(Tilt.visualizers[id], null,
"The current instance of the visualizer wasn't destroyed properly.");
cleanup();
}
function cleanup() {
if (tiltOpened) { Services.obs.removeObserver(finalize, DESTROYED); }
gBrowser.removeCurrentTab();
finish();
}

View File

@ -1,51 +0,0 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
var tiltOpened = false;
function test() {
if (!isTiltEnabled()) {
aborting();
info("Skipping destruction test because Tilt isn't enabled.");
return;
}
if (!isWebGLSupported()) {
aborting();
info("Skipping destruction test because WebGL isn't supported.");
return;
}
waitForExplicitFinish();
createTab(function() {
createTilt({
onTiltOpen: function()
{
tiltOpened = true;
Services.obs.addObserver(finalize, DESTROYED, false);
window.content.location = "about:mozilla";
}
}, false, function suddenDeath()
{
ok(false, "Tilt could not be initialized properly.");
cleanup();
});
});
}
function finalize() {
let id = TiltUtils.getWindowId(gBrowser.selectedBrowser.contentWindow);
is(Tilt.visualizers[id], null,
"The current instance of the visualizer wasn't destroyed properly.");
cleanup();
}
function cleanup() {
if (tiltOpened) { Services.obs.removeObserver(finalize, DESTROYED); }
gBrowser.removeCurrentTab();
finish();
}

View File

@ -1,51 +0,0 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
var tiltOpened = false;
function test() {
if (!isTiltEnabled()) {
aborting();
info("Skipping destruction test because Tilt isn't enabled.");
return;
}
if (!isWebGLSupported()) {
aborting();
info("Skipping destruction test because WebGL isn't supported.");
return;
}
waitForExplicitFinish();
createTab(function() {
createTilt({
onTiltOpen: function()
{
tiltOpened = true;
Services.obs.addObserver(finalize, DESTROYED, false);
Tilt.destroy(Tilt.currentWindowId);
}
}, false, function suddenDeath()
{
ok(false, "Tilt could not be initialized properly.");
cleanup();
});
});
}
function finalize() {
let id = TiltUtils.getWindowId(gBrowser.selectedBrowser.contentWindow);
is(Tilt.visualizers[id], null,
"The current instance of the visualizer wasn't destroyed properly.");
cleanup();
}
function cleanup() {
if (tiltOpened) { Services.obs.removeObserver(finalize, DESTROYED); }
gBrowser.removeCurrentTab();
finish();
}

View File

@ -1,132 +0,0 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
var tiltOpened = false;
function test() {
if (!isTiltEnabled()) {
aborting();
info("Skipping part of the arcball test because Tilt isn't enabled.");
return;
}
if (!isWebGLSupported()) {
aborting();
info("Skipping part of the arcball test because WebGL isn't supported.");
return;
}
requestLongerTimeout(10);
waitForExplicitFinish();
Services.prefs.setBoolPref("accessibility.typeaheadfind", true);
createTab(function() {
createTilt({
onTiltOpen: function(instance)
{
tiltOpened = true;
performTest(instance.presenter.canvas,
instance.controller.arcball, function() {
info("Killing arcball reset test.");
Services.prefs.setBoolPref("accessibility.typeaheadfind", false);
Services.obs.addObserver(cleanup, DESTROYED, false);
Tilt.destroy(Tilt.currentWindowId);
});
}
}, false, function suddenDeath()
{
ok(false, "Tilt could not be initialized properly.");
cleanup();
});
});
}
function performTest(canvas, arcball, callback) {
is(document.activeElement, canvas,
"The visualizer canvas should be focused when performing this test.");
info("Starting arcball reset test.");
// start translating and rotating sometime at random
window.setTimeout(function() {
info("Synthesizing key down events.");
EventUtils.synthesizeKey("VK_S", { type: "keydown" }); // add a little
EventUtils.synthesizeKey("VK_RIGHT", { type: "keydown" }); // diversity
// wait for some arcball translations and rotations to happen
window.setTimeout(function() {
info("Synthesizing key up events.");
EventUtils.synthesizeKey("VK_S", { type: "keyup" });
EventUtils.synthesizeKey("VK_RIGHT", { type: "keyup" });
// ok, transformations finished, we can now try to reset the model view
window.setTimeout(function() {
info("Synthesizing arcball reset key press.");
arcball._onResetStart = function() {
info("Starting arcball reset animation.");
};
arcball._onResetStep = function() {
info("\nlastRot: " + quat4.str(arcball._lastRot) +
"\ndeltaRot: " + quat4.str(arcball._deltaRot) +
"\ncurrentRot: " + quat4.str(arcball._currentRot) +
"\nlastTrans: " + vec3.str(arcball._lastTrans) +
"\ndeltaTrans: " + vec3.str(arcball._deltaTrans) +
"\ncurrentTrans: " + vec3.str(arcball._currentTrans) +
"\nadditionalRot: " + vec3.str(arcball._additionalRot) +
"\nadditionalTrans: " + vec3.str(arcball._additionalTrans) +
"\nzoomAmount: " + arcball._zoomAmount);
};
arcball._onResetFinish = function() {
ok(isApproxVec(arcball._lastRot, [0, 0, 0, 1]),
"The arcball _lastRot field wasn't reset correctly.");
ok(isApproxVec(arcball._deltaRot, [0, 0, 0, 1]),
"The arcball _deltaRot field wasn't reset correctly.");
ok(isApproxVec(arcball._currentRot, [0, 0, 0, 1]),
"The arcball _currentRot field wasn't reset correctly.");
ok(isApproxVec(arcball._lastTrans, [0, 0, 0]),
"The arcball _lastTrans field wasn't reset correctly.");
ok(isApproxVec(arcball._deltaTrans, [0, 0, 0]),
"The arcball _deltaTrans field wasn't reset correctly.");
ok(isApproxVec(arcball._currentTrans, [0, 0, 0]),
"The arcball _currentTrans field wasn't reset correctly.");
ok(isApproxVec(arcball._additionalRot, [0, 0, 0]),
"The arcball _additionalRot field wasn't reset correctly.");
ok(isApproxVec(arcball._additionalTrans, [0, 0, 0]),
"The arcball _additionalTrans field wasn't reset correctly.");
ok(isApproxVec([arcball._zoomAmount], [0]),
"The arcball _zoomAmount field wasn't reset correctly.");
executeSoon(function() {
info("Finishing arcball reset test.");
callback();
});
};
EventUtils.synthesizeKey("VK_R", { type: "keydown" });
}, Math.random() * 1000); // leave enough time for transforms to happen
}, Math.random() * 1000);
}, Math.random() * 1000);
}
function cleanup() {
info("Cleaning up arcball reset test.");
if (tiltOpened) { Services.obs.removeObserver(cleanup, DESTROYED); }
gBrowser.removeCurrentTab();
finish();
}

View File

@ -1,130 +0,0 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
var tiltOpened = false;
function test() {
if (!isTiltEnabled()) {
aborting();
info("Skipping part of the arcball test because Tilt isn't enabled.");
return;
}
if (!isWebGLSupported()) {
aborting();
info("Skipping part of the arcball test because WebGL isn't supported.");
return;
}
requestLongerTimeout(10);
waitForExplicitFinish();
createTab(function() {
createTilt({
onTiltOpen: function(instance)
{
tiltOpened = true;
performTest(instance.presenter.canvas,
instance.controller.arcball, function() {
info("Killing arcball reset test.");
Services.obs.addObserver(cleanup, DESTROYED, false);
Tilt.destroy(Tilt.currentWindowId);
});
}
}, false, function suddenDeath()
{
ok(false, "Tilt could not be initialized properly.");
cleanup();
});
});
}
function performTest(canvas, arcball, callback) {
is(document.activeElement, canvas,
"The visualizer canvas should be focused when performing this test.");
info("Starting arcball reset test.");
// start translating and rotating sometime at random
window.setTimeout(function() {
info("Synthesizing key down events.");
EventUtils.synthesizeKey("VK_W", { type: "keydown" });
EventUtils.synthesizeKey("VK_LEFT", { type: "keydown" });
// wait for some arcball translations and rotations to happen
window.setTimeout(function() {
info("Synthesizing key up events.");
EventUtils.synthesizeKey("VK_W", { type: "keyup" });
EventUtils.synthesizeKey("VK_LEFT", { type: "keyup" });
// ok, transformations finished, we can now try to reset the model view
window.setTimeout(function() {
info("Synthesizing arcball reset key press.");
arcball._onResetStart = function() {
info("Starting arcball reset animation.");
};
arcball._onResetStep = function() {
info("\nlastRot: " + quat4.str(arcball._lastRot) +
"\ndeltaRot: " + quat4.str(arcball._deltaRot) +
"\ncurrentRot: " + quat4.str(arcball._currentRot) +
"\nlastTrans: " + vec3.str(arcball._lastTrans) +
"\ndeltaTrans: " + vec3.str(arcball._deltaTrans) +
"\ncurrentTrans: " + vec3.str(arcball._currentTrans) +
"\nadditionalRot: " + vec3.str(arcball._additionalRot) +
"\nadditionalTrans: " + vec3.str(arcball._additionalTrans) +
"\nzoomAmount: " + arcball._zoomAmount);
};
arcball._onResetFinish = function() {
ok(isApproxVec(arcball._lastRot, [0, 0, 0, 1]),
"The arcball _lastRot field wasn't reset correctly.");
ok(isApproxVec(arcball._deltaRot, [0, 0, 0, 1]),
"The arcball _deltaRot field wasn't reset correctly.");
ok(isApproxVec(arcball._currentRot, [0, 0, 0, 1]),
"The arcball _currentRot field wasn't reset correctly.");
ok(isApproxVec(arcball._lastTrans, [0, 0, 0]),
"The arcball _lastTrans field wasn't reset correctly.");
ok(isApproxVec(arcball._deltaTrans, [0, 0, 0]),
"The arcball _deltaTrans field wasn't reset correctly.");
ok(isApproxVec(arcball._currentTrans, [0, 0, 0]),
"The arcball _currentTrans field wasn't reset correctly.");
ok(isApproxVec(arcball._additionalRot, [0, 0, 0]),
"The arcball _additionalRot field wasn't reset correctly.");
ok(isApproxVec(arcball._additionalTrans, [0, 0, 0]),
"The arcball _additionalTrans field wasn't reset correctly.");
ok(isApproxVec([arcball._zoomAmount], [0]),
"The arcball _zoomAmount field wasn't reset correctly.");
executeSoon(function() {
info("Finishing arcball reset test.");
callback();
});
};
EventUtils.synthesizeKey("VK_R", { type: "keydown" });
}, Math.random() * 1000); // leave enough time for transforms to happen
}, Math.random() * 1000);
}, Math.random() * 1000);
}
function cleanup() {
info("Cleaning up arcball reset test.");
if (tiltOpened) { Services.obs.removeObserver(cleanup, DESTROYED); }
gBrowser.removeCurrentTab();
finish();
}

View File

@ -1,496 +0,0 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
function cloneUpdate(update) {
return {
rotation: quat4.create(update.rotation),
translation: vec3.create(update.translation)
};
}
function isExpectedUpdate(update1, update2) {
if (update1.length !== update2.length) {
return false;
}
for (let i = 0, len = update1.length; i < len; i++) {
if (!isApproxVec(update1[i].rotation, update2[i].rotation) ||
!isApproxVec(update1[i].translation, update2[i].translation)) {
info("isExpectedUpdate expected " + JSON.stringify(update1), ", got " +
JSON.stringify(update2) + " instead.");
return false;
}
}
return true;
}
function test() {
let arcball1 = new TiltVisualizer.Arcball(window, 123, 456);
is(arcball1.width, 123,
"The first arcball width wasn't set correctly.");
is(arcball1.height, 456,
"The first arcball height wasn't set correctly.");
is(arcball1.radius, 123,
"The first arcball radius wasn't implicitly set correctly.");
let arcball2 = new TiltVisualizer.Arcball(window, 987, 654);
is(arcball2.width, 987,
"The second arcball width wasn't set correctly.");
is(arcball2.height, 654,
"The second arcball height wasn't set correctly.");
is(arcball2.radius, 654,
"The second arcball radius wasn't implicitly set correctly.");
let arcball3 = new TiltVisualizer.Arcball(window, 512, 512);
let sphereVec = vec3.create();
arcball3._pointToSphere(123, 456, 256, 512, 512, sphereVec);
ok(isApproxVec(sphereVec, [-0.009765625, 0.390625, 0.9204980731010437]),
"The _pointToSphere() function didn't map the coordinates correctly.");
let stack1 = [];
let expect1 = [
{ rotation: [
-0.08877250552177429, 0.0242881178855896,
-0.04222869873046875, -0.9948599338531494],
translation: [0, 0, 0] },
{ rotation: [
-0.13086390495300293, 0.03413732722401619,
-0.06334304809570312, -0.9887855648994446],
translation: [0, 0, 0] },
{ rotation: [
-0.15138940513134003, 0.03854173421859741,
-0.07390022277832031, -0.9849540591239929],
translation: [0, 0, 0] },
{ rotation: [
-0.1615273654460907, 0.040619146078825,
-0.0791788101196289, -0.9828477501869202],
translation: [0, 0, 0] },
{ rotation: [
-0.16656573116779327, 0.04162723943591118,
-0.0818181037902832, -0.9817478656768799],
translation: [0, 0, 0] },
{ rotation: [
-0.16907735168933868, 0.042123712599277496,
-0.08313775062561035, -0.9811863303184509],
translation: [0, 0, 0] },
{ rotation: [
-0.17033125460147858, 0.042370058596134186,
-0.08379757404327393, -0.9809026718139648],
translation: [0, 0, 0] },
{ rotation: [
-0.17095772922039032, 0.04249274358153343,
-0.08412748575210571, -0.9807600975036621],
translation: [0, 0, 0] },
{ rotation: [
-0.17127084732055664, 0.04255397245287895,
-0.0842924416065216, -0.9806886315345764],
translation: [0, 0, 0] },
{ rotation: [
-0.171427384018898, 0.042584557086229324,
-0.08437491953372955, -0.9806528687477112],
translation: [0, 0, 0] }];
arcball3.mouseDown(10, 10, 1);
arcball3.mouseMove(10, 100);
for (let i1 = 0; i1 < 10; i1++) {
stack1.push(cloneUpdate(arcball3.update()));
}
ok(isExpectedUpdate(stack1, expect1),
"Mouse down & move events didn't create the expected transform. results.");
let stack2 = [];
let expect2 = [
{ rotation: [
-0.1684110015630722, 0.04199237748980522,
-0.0827873945236206, -0.9813361167907715],
translation: [0, 0, 0] },
{ rotation: [
-0.16936375200748444, 0.04218007251620293,
-0.08328840136528015, -0.9811217188835144],
translation: [0, 0, 0] },
{ rotation: [
-0.17003019154071808, 0.04231100529432297,
-0.08363909274339676, -0.9809709787368774],
translation: [0, 0, 0] },
{ rotation: [
-0.17049652338027954, 0.042402446269989014,
-0.0838845893740654, -0.9808651208877563],
translation: [0, 0, 0] },
{ rotation: [
-0.17082282900810242, 0.042466338723897934,
-0.08405643701553345, -0.9807908535003662],
translation: [0, 0, 0] },
{ rotation: [
-0.17105120420455933, 0.04251104220747948,
-0.08417671173810959, -0.9807388186454773],
translation: [0, 0, 0] },
{ rotation: [
-0.17121103405952454, 0.04254228621721268,
-0.08426092565059662, -0.9807023406028748],
translation: [0, 0, 0] },
{ rotation: [
-0.17132291197776794, 0.042564138770103455,
-0.08431987464427948, -0.9806767106056213],
translation: [0, 0, 0] },
{ rotation: [
-0.1714012324810028, 0.04257945716381073,
-0.08436112850904465, -0.9806588888168335],
translation: [0, 0, 0] },
{ rotation: [
-0.17145603895187378, 0.042590171098709106,
-0.08439001441001892, -0.9806463718414307],
translation: [0, 0, 0] }];
arcball3.mouseUp(100, 100);
for (let i2 = 0; i2 < 10; i2++) {
stack2.push(cloneUpdate(arcball3.update()));
}
ok(isExpectedUpdate(stack2, expect2),
"Mouse up events didn't create the expected transformation results.");
let stack3 = [];
let expect3 = [
{ rotation: [
-0.17149439454078674, 0.04259764403104782,
-0.08441022783517838, -0.9806375503540039],
translation: [0, 0, -1] },
{ rotation: [
-0.17152123153209686, 0.04260288551449776,
-0.08442437648773193, -0.980631411075592],
translation: [0, 0, -1.899999976158142] },
{ rotation: [
-0.1715400665998459, 0.04260658100247383,
-0.08443428575992584, -0.9806271195411682],
translation: [0, 0, -2.7100000381469727] },
{ rotation: [
-0.17155319452285767, 0.04260912910103798,
-0.08444121479988098, -0.9806240797042847],
translation: [0, 0, -3.439000129699707] },
{ rotation: [
-0.17156240344047546, 0.042610932141542435,
-0.08444607257843018, -0.9806219935417175],
translation: [0, 0, -4.095099925994873] },
{ rotation: [
-0.1715688556432724, 0.042612191289663315,
-0.08444946259260178, -0.9806205034255981],
translation: [0, 0, -4.685589790344238] },
{ rotation: [
-0.17157337069511414, 0.04261308163404465,
-0.0844518393278122, -0.980619490146637],
translation: [0, 0, -5.217031002044678] },
{ rotation: [
-0.17157652974128723, 0.0426136814057827,
-0.0844535157084465, -0.9806187748908997],
translation: [0, 0, -5.6953277587890625] },
{ rotation: [
-0.17157875001430511, 0.04261413961648941,
-0.08445467799901962, -0.9806182980537415],
translation: [0, 0, -6.125794887542725] },
{ rotation: [
-0.17158031463623047, 0.04261442646384239,
-0.08445550501346588, -0.980617880821228],
translation: [0, 0, -6.5132155418396] }];
arcball3.zoom(10);
for (let i3 = 0; i3 < 10; i3++) {
stack3.push(cloneUpdate(arcball3.update()));
}
ok(isExpectedUpdate(stack3, expect3),
"Mouse zoom events didn't create the expected transformation results.");
let stack4 = [];
let expect4 = [
{ rotation: [
-0.17158135771751404, 0.04261462762951851,
-0.08445606380701065, -0.9806176424026489],
translation: [0, 0, -6.861894130706787] },
{ rotation: [
-0.1715821474790573, 0.04261479899287224,
-0.08445646613836288, -0.9806175231933594],
translation: [0, 0, -7.1757049560546875] },
{ rotation: [
-0.1715826541185379, 0.0426148846745491,
-0.08445674180984497, -0.980617344379425],
translation: [0, 0, -7.458134651184082] },
{ rotation: [
-0.17158304154872894, 0.04261497035622597,
-0.08445693552494049, -0.9806172847747803],
translation: [0, 0, -7.7123212814331055] },
{ rotation: [
-0.17158329486846924, 0.042615000158548355,
-0.08445708453655243, -0.9806172251701355],
translation: [0, 0, -7.941089153289795] },
{ rotation: [
-0.17158347368240356, 0.04261505603790283,
-0.084457166492939, -0.9806172251701355],
translation: [0, 0, -8.146980285644531] },
{ rotation: [
-0.1715836226940155, 0.04261508584022522,
-0.08445724099874496, -0.9806171655654907],
translation: [0, 0, -8.332282066345215] },
{ rotation: [
-0.17158368229866028, 0.04261508584022522,
-0.08445728570222855, -0.980617105960846],
translation: [0, 0, -8.499053955078125] },
{ rotation: [
-0.17158377170562744, 0.04261511191725731,
-0.08445732295513153, -0.980617105960846],
translation: [0, 0, -8.649148941040039] },
{ rotation: [
-0.17158380150794983, 0.04261511191725731,
-0.08445733785629272, -0.980617105960846],
translation: [0, 0, -8.784234046936035] }];
arcball3.keyDown(arcball3.rotateKeys.left);
arcball3.keyDown(arcball3.rotateKeys.right);
arcball3.keyDown(arcball3.rotateKeys.up);
arcball3.keyDown(arcball3.rotateKeys.down);
arcball3.keyDown(arcball3.panKeys.left);
arcball3.keyDown(arcball3.panKeys.right);
arcball3.keyDown(arcball3.panKeys.up);
arcball3.keyDown(arcball3.panKeys.down);
for (let i4 = 0; i4 < 10; i4++) {
stack4.push(cloneUpdate(arcball3.update()));
}
ok(isExpectedUpdate(stack4, expect4),
"Key down events didn't create the expected transformation results.");
let stack5 = [];
let expect5 = [
{ rotation: [
-0.1715838462114334, 0.04261511191725731,
-0.08445736765861511, -0.980617105960846],
translation: [0, 0, -8.905810356140137] },
{ rotation: [
-0.1715838462114334, 0.04261511191725731,
-0.08445736765861511, -0.980617105960846],
translation: [0, 0, -9.015229225158691] },
{ rotation: [
-0.1715838462114334, 0.04261511191725731,
-0.08445736765861511, -0.980617105960846],
translation: [0, 0, -9.113706588745117] },
{ rotation: [
-0.1715838611125946, 0.04261511191725731,
-0.0844573825597763, -0.9806170463562012],
translation: [0, 0, -9.202336311340332] },
{ rotation: [
-0.17158392071723938, 0.0426151417195797,
-0.0844573974609375, -0.980617105960846],
translation: [0, 0, -9.282102584838867] },
{ rotation: [
-0.17158392071723938, 0.0426151417195797,
-0.0844573974609375, -0.980617105960846],
translation: [0, 0, -9.35389232635498] },
{ rotation: [
-0.17158392071723938, 0.0426151417195797,
-0.0844573974609375, -0.980617105960846],
translation: [0, 0, -9.418502807617188] },
{ rotation: [
-0.17158392071723938, 0.0426151417195797,
-0.0844573974609375, -0.980617105960846],
translation: [0, 0, -9.476652145385742] },
{ rotation: [
-0.17158392071723938, 0.0426151417195797,
-0.0844573974609375, -0.980617105960846],
translation: [0, 0, -9.528986930847168] },
{ rotation: [
-0.17158392071723938, 0.0426151417195797,
-0.0844573974609375, -0.980617105960846],
translation: [0, 0, -9.576087951660156] }];
arcball3.keyUp(arcball3.rotateKeys.left);
arcball3.keyUp(arcball3.rotateKeys.right);
arcball3.keyUp(arcball3.rotateKeys.up);
arcball3.keyUp(arcball3.rotateKeys.down);
arcball3.keyUp(arcball3.panKeys.left);
arcball3.keyUp(arcball3.panKeys.right);
arcball3.keyUp(arcball3.panKeys.up);
arcball3.keyUp(arcball3.panKeys.down);
for (let i5 = 0; i5 < 10; i5++) {
stack5.push(cloneUpdate(arcball3.update()));
}
ok(isExpectedUpdate(stack5, expect5),
"Key up events didn't create the expected transformation results.");
let stack6 = [];
let expect6 = [
{ rotation: [
-0.17158392071723938, 0.0426151417195797,
-0.0844573974609375, -0.980617105960846],
translation: [0, 0, -9.618478775024414] },
{ rotation: [
-0.17158392071723938, 0.0426151417195797,
-0.0844573974609375, -0.980617105960846],
translation: [0, 0, -6.156630992889404] },
{ rotation: [
-0.17158392071723938, 0.0426151417195797,
-0.0844573974609375, -0.980617105960846],
translation: [0, 0, 0.4590320587158203] },
{ rotation: [
-0.17158392071723938, 0.0426151417195797,
-0.0844573974609375, -0.980617105960846],
translation: [0, 0, 9.913128852844238] },
{ rotation: [
-0.17158392071723938, 0.0426151417195797,
-0.0844573974609375, -0.980617105960846],
translation: [0, 0, 21.921815872192383] },
{ rotation: [
-0.17158392071723938, 0.0426151417195797,
-0.0844573974609375, -0.980617105960846],
translation: [0, 0, 36.22963333129883] },
{ rotation: [
-0.17158392071723938, 0.0426151417195797,
-0.0844573974609375, -0.980617105960846],
translation: [0, 0, 52.60667037963867] },
{ rotation: [
-0.17158392071723938, 0.0426151417195797,
-0.0844573974609375, -0.980617105960846],
translation: [0, 0, 70.84600067138672] },
{ rotation: [
-0.17158392071723938, 0.0426151417195797,
-0.0844573974609375, -0.980617105960846],
translation: [0, 0, 90.76139831542969] },
{ rotation: [
-0.17158392071723938, 0.0426151417195797,
-0.0844573974609375, -0.980617105960846],
translation: [0, 0, 112.18525695800781] }];
arcball3.keyDown(arcball3.zoomKeys["in"][0]);
arcball3.keyDown(arcball3.zoomKeys["in"][1]);
arcball3.keyDown(arcball3.zoomKeys["in"][2]);
for (let i6 = 0; i6 < 10; i6++) {
stack6.push(cloneUpdate(arcball3.update()));
}
arcball3.keyUp(arcball3.zoomKeys["in"][0]);
arcball3.keyUp(arcball3.zoomKeys["in"][1]);
arcball3.keyUp(arcball3.zoomKeys["in"][2]);
ok(isExpectedUpdate(stack6, expect6),
"Key zoom in events didn't create the expected transformation results.");
let stack7 = [];
let expect7 = [
{ rotation: [
-0.17158392071723938, 0.0426151417195797,
-0.0844573974609375, -0.980617105960846],
translation: [0, 0, 134.96673583984375] },
{ rotation: [
-0.17158392071723938, 0.0426151417195797,
-0.0844573974609375, -0.980617105960846],
translation: [0, 0, 151.97006225585938] },
{ rotation: [
-0.17158392071723938, 0.0426151417195797,
-0.0844573974609375, -0.980617105960846],
translation: [0, 0, 163.77305603027344] },
{ rotation: [
-0.17158392071723938, 0.0426151417195797,
-0.0844573974609375, -0.980617105960846],
translation: [0, 0, 170.895751953125] },
{ rotation: [
-0.17158392071723938, 0.0426151417195797,
-0.0844573974609375, -0.980617105960846],
translation: [0, 0, 173.80618286132812] },
{ rotation: [
-0.17158392071723938, 0.0426151417195797,
-0.0844573974609375, -0.980617105960846],
translation: [0, 0, 172.92556762695312] },
{ rotation: [
-0.17158392071723938, 0.0426151417195797,
-0.0844573974609375, -0.980617105960846],
translation: [0, 0, 168.6330108642578] },
{ rotation: [
-0.17158392071723938, 0.0426151417195797,
-0.0844573974609375, -0.980617105960846],
translation: [0, 0, 161.26971435546875] },
{ rotation: [
-0.17158392071723938, 0.0426151417195797,
-0.0844573974609375, -0.980617105960846],
translation: [0, 0, 151.1427459716797] },
{ rotation: [
-0.17158392071723938, 0.0426151417195797,
-0.0844573974609375, -0.980617105960846],
translation: [0, 0, 138.52847290039062] }];
arcball3.keyDown(arcball3.zoomKeys["out"][0]);
arcball3.keyDown(arcball3.zoomKeys["out"][1]);
for (let i7 = 0; i7 < 10; i7++) {
stack7.push(cloneUpdate(arcball3.update()));
}
arcball3.keyUp(arcball3.zoomKeys["out"][0]);
arcball3.keyUp(arcball3.zoomKeys["out"][1]);
ok(isExpectedUpdate(stack7, expect7),
"Key zoom out events didn't create the expected transformation results.");
let stack8 = [];
let expect8 = [
{ rotation: [
-0.17158392071723938, 0.0426151417195797,
-0.0844573974609375, -0.980617105960846],
translation: [0, 0, 123.67562866210938] },
{ rotation: [
-0.17158392071723938, 0.0426151417195797,
-0.0844573974609375, -0.980617105960846],
translation: [0, 0, 111.30806732177734] },
{ rotation: [
-0.17158392071723938, 0.0426151417195797,
-0.0844573974609375, -0.980617105960846],
translation: [0, 0, 100.17726135253906] },
{ rotation: [
-0.17158392071723938, 0.0426151417195797,
-0.0844573974609375, -0.980617105960846],
translation: [0, 0, 90.15953826904297] },
{ rotation: [
-0.17158392071723938, 0.0426151417195797,
-0.0844573974609375, -0.980617105960846],
translation: [0, 0, 81.14358520507812] },
{ rotation: [
-0.17158392071723938, 0.0426151417195797,
-0.0844573974609375, -0.980617105960846],
translation: [0, 0, 73.02922821044922] },
{ rotation: [
-0.17158392071723938, 0.0426151417195797,
-0.0844573974609375, -0.980617105960846],
translation: [0, 0, 65.72630310058594] },
{ rotation: [
-0.17158392071723938, 0.0426151417195797,
-0.0844573974609375, -0.980617105960846],
translation: [0, 0, 59.15367126464844] },
{ rotation: [
-0.17158392071723938, 0.0426151417195797,
-0.0844573974609375, -0.980617105960846],
translation: [0, 0, 53.238304138183594] },
{ rotation: [
-0.17158392071723938, 0.0426151417195797,
-0.0844573974609375, -0.980617105960846],
translation: [0, 0, 47.91447448730469] }];
arcball3.keyDown(arcball3.zoomKeys["unzoom"]);
for (let i8 = 0; i8 < 10; i8++) {
stack8.push(cloneUpdate(arcball3.update()));
}
arcball3.keyUp(arcball3.zoomKeys["unzoom"]);
ok(isExpectedUpdate(stack8, expect8),
"Key zoom reset events didn't create the expected transformation results.");
arcball3.resize(123, 456);
is(arcball3.width, 123,
"The third arcball width wasn't updated correctly.");
is(arcball3.height, 456,
"The third arcball height wasn't updated correctly.");
is(arcball3.radius, 123,
"The third arcball radius wasn't implicitly updated correctly.");
}

View File

@ -1,138 +0,0 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
function test() {
if (!isTiltEnabled()) {
aborting();
info("Skipping controller test because Tilt isn't enabled.");
return;
}
if (!isWebGLSupported()) {
aborting();
info("Skipping controller test because WebGL isn't supported.");
return;
}
waitForExplicitFinish();
createTab(function() {
createTilt({
onTiltOpen: function(instance)
{
let canvas = instance.presenter.canvas;
let prev_tran = vec3.create([0, 0, 0]);
let prev_rot = quat4.create([0, 0, 0, 1]);
function tran() {
return instance.presenter.transforms.translation;
}
function rot() {
return instance.presenter.transforms.rotation;
}
function save() {
prev_tran = vec3.create(tran());
prev_rot = quat4.create(rot());
}
ok(isEqualVec(tran(), prev_tran),
"At init, the translation should be zero.");
ok(isEqualVec(rot(), prev_rot),
"At init, the rotation should be zero.");
function testEventCancel(cancellingEvent, cancellingDescription) {
let description = "testEventCancel, cancellingEvent is " + cancellingDescription + ": ";
is(document.activeElement, canvas,
description + "The visualizer canvas should be focused when performing this test.");
EventUtils.synthesizeKey("a", { type: "keydown", code: "KeyA", keyCode: KeyboardEvent.DOM_VK_A });
instance.controller._update();
ok(!isEqualVec(rot(), prev_rot),
description + "After a rotation key is pressed, the quaternion should change.");
EventUtils.synthesizeKey("a", { type: "keyup", code: "KeyA", keyCode: KeyboardEvent.DOM_VK_A });
EventUtils.synthesizeKey("ArrowLeft", { type: "keydown", code: "ArrowLeft", keyCode: KeyboardEvent.DOM_VK_LEFT });
instance.controller._update();
ok(!isEqualVec(tran(), prev_tran),
description + "After a translation key is pressed, the vector should change.");
EventUtils.synthesizeKey("ArrowLeft", { type: "keyup", code: "ArrowLeft", keyCode: KeyboardEvent.DOM_VK_LEFT });
save();
cancellingEvent();
instance.controller._update();
ok(!isEqualVec(tran(), prev_tran),
description + "Even if the canvas lost focus, the vector has some inertia.");
ok(!isEqualVec(rot(), prev_rot),
description + "Even if the canvas lost focus, the quaternion has some inertia.");
save();
while (!isEqualVec(tran(), prev_tran) ||
!isEqualVec(rot(), prev_rot)) {
instance.controller._update();
save();
}
ok(isEqualVec(tran(), prev_tran) && isEqualVec(rot(), prev_rot),
"After focus lost, the transforms inertia eventually stops.");
}
info("Setting typeaheadfind to true.");
let typeaheadfindEnabled = true;
Services.prefs.setBoolPref("accessibility.typeaheadfind", typeaheadfindEnabled);
for (var i = 0; i < 2; i++) {
testEventCancel(function() {
// XXX Don't use a character which is registered as a mnemonic in the menubar.
EventUtils.synthesizeKey("A", { altKey: true, code: "KeyA", keyCode: KeyboardEvent.DOM_VK_A });
}, "Alt + A");
testEventCancel(function() {
// XXX Don't use a character which is registered as a shortcut key.
EventUtils.synthesizeKey(";", { ctrlKey: true, code: "Semicolon", keyCode: KeyboardEvent.DOM_VK_SEMICONLON });
}, "Ctrl + ;");
testEventCancel(function() {
// XXX Don't use a character which is registered as a shortcut key.
EventUtils.synthesizeKey("\\", { metaKey: true, code: "Backslash", keyCode: KeyboardEvent.DOM_VK_BACK_SLASH });
}, "Meta + \\");
// If typeahead is enabled, Shift + T causes moving focus to the findbar because it inputs "T".
if (!typeaheadfindEnabled) {
testEventCancel(function() {
EventUtils.synthesizeKey("T", { shiftKey: true, code: "KeyT", keyCode: KeyboardEvent.DOM_VK_T });
}, "Shift + T");
}
// Retry after disabling typeaheadfind.
info("Setting typeaheadfind to false.");
typeaheadfindEnabled = false;
Services.prefs.setBoolPref("accessibility.typeaheadfind", typeaheadfindEnabled);
}
info("Testing if loosing focus halts any stacked arcball animations.");
testEventCancel(function() {
gBrowser.selectedBrowser.contentWindow.focus();
}, "setting focus to the content window");
},
onEnd: function()
{
cleanup();
}
}, true, function suddenDeath()
{
ok(false, "Tilt could not be initialized properly.");
cleanup();
});
});
}
function cleanup() {
gBrowser.removeCurrentTab();
finish();
}

View File

@ -1,157 +0,0 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
var isWebGLAvailable;
function onWebGLFail() {
isWebGLAvailable = false;
}
function onWebGLSuccess() {
isWebGLAvailable = true;
}
function test() {
if (!isWebGLSupported()) {
aborting();
info("Skipping tilt_gl01 because WebGL isn't supported on this hardware.");
return;
}
let canvas = createCanvas();
let renderer = new TiltGL.Renderer(canvas, onWebGLFail, onWebGLSuccess);
let gl = renderer.context;
if (!isWebGLAvailable) {
aborting();
return;
}
ok(renderer,
"The TiltGL.Renderer constructor should have initialized a new object.");
ok(gl instanceof WebGLRenderingContext,
"The renderer context wasn't created correctly from the passed canvas.");
let clearColor = gl.getParameter(gl.COLOR_CLEAR_VALUE),
clearDepth = gl.getParameter(gl.DEPTH_CLEAR_VALUE);
is(clearColor[0], 0,
"The default red clear color wasn't set correctly at initialization.");
is(clearColor[1], 0,
"The default green clear color wasn't set correctly at initialization.");
is(clearColor[2], 0,
"The default blue clear color wasn't set correctly at initialization.");
is(clearColor[3], 0,
"The default alpha clear color wasn't set correctly at initialization.");
is(clearDepth, 1,
"The default clear depth wasn't set correctly at initialization.");
is(renderer.width, canvas.width,
"The renderer width wasn't set correctly from the passed canvas.");
is(renderer.height, canvas.height,
"The renderer height wasn't set correctly from the passed canvas.");
ok(renderer.mvMatrix,
"The model view matrix wasn't initialized properly.");
ok(renderer.projMatrix,
"The model view matrix wasn't initialized properly.");
ok(isApproxVec(renderer._fillColor, [1, 1, 1, 1]),
"The default fill color wasn't set correctly.");
ok(isApproxVec(renderer._strokeColor, [0, 0, 0, 1]),
"The default stroke color wasn't set correctly.");
is(renderer._strokeWeightValue, 1,
"The default stroke weight wasn't set correctly.");
ok(renderer._colorShader,
"A default color shader should have been created.");
ok(typeof renderer.Program, "function",
"At init, the renderer should have created a Program constructor.");
ok(typeof renderer.VertexBuffer, "function",
"At init, the renderer should have created a VertexBuffer constructor.");
ok(typeof renderer.IndexBuffer, "function",
"At init, the renderer should have created a IndexBuffer constructor.");
ok(typeof renderer.Texture, "function",
"At init, the renderer should have created a Texture constructor.");
renderer.depthTest(true);
is(gl.getParameter(gl.DEPTH_TEST), true,
"The depth test wasn't enabled when requested.");
renderer.depthTest(false);
is(gl.getParameter(gl.DEPTH_TEST), false,
"The depth test wasn't disabled when requested.");
renderer.stencilTest(true);
is(gl.getParameter(gl.STENCIL_TEST), true,
"The stencil test wasn't enabled when requested.");
renderer.stencilTest(false);
is(gl.getParameter(gl.STENCIL_TEST), false,
"The stencil test wasn't disabled when requested.");
renderer.cullFace("front");
is(gl.getParameter(gl.CULL_FACE), true,
"The cull face wasn't enabled when requested.");
is(gl.getParameter(gl.CULL_FACE_MODE), gl.FRONT,
"The cull face front mode wasn't set correctly.");
renderer.cullFace("back");
is(gl.getParameter(gl.CULL_FACE), true,
"The cull face wasn't enabled when requested.");
is(gl.getParameter(gl.CULL_FACE_MODE), gl.BACK,
"The cull face back mode wasn't set correctly.");
renderer.cullFace("both");
is(gl.getParameter(gl.CULL_FACE), true,
"The cull face wasn't enabled when requested.");
is(gl.getParameter(gl.CULL_FACE_MODE), gl.FRONT_AND_BACK,
"The cull face back mode wasn't set correctly.");
renderer.cullFace(false);
is(gl.getParameter(gl.CULL_FACE), false,
"The cull face wasn't disabled when requested.");
renderer.frontFace("cw");
is(gl.getParameter(gl.FRONT_FACE), gl.CW,
"The front face cw mode wasn't set correctly.");
renderer.frontFace("ccw");
is(gl.getParameter(gl.FRONT_FACE), gl.CCW,
"The front face ccw mode wasn't set correctly.");
renderer.blendMode("alpha");
is(gl.getParameter(gl.BLEND), true,
"The blend mode wasn't enabled when requested.");
is(gl.getParameter(gl.BLEND_SRC_ALPHA), gl.SRC_ALPHA,
"The source blend func wasn't set correctly.");
is(gl.getParameter(gl.BLEND_DST_ALPHA), gl.ONE_MINUS_SRC_ALPHA,
"The destination blend func wasn't set correctly.");
renderer.blendMode("add");
is(gl.getParameter(gl.BLEND), true,
"The blend mode wasn't enabled when requested.");
is(gl.getParameter(gl.BLEND_SRC_ALPHA), gl.SRC_ALPHA,
"The source blend func wasn't set correctly.");
is(gl.getParameter(gl.BLEND_DST_ALPHA), gl.ONE,
"The destination blend func wasn't set correctly.");
renderer.blendMode(false);
is(gl.getParameter(gl.CULL_FACE), false,
"The blend mode wasn't disabled when requested.");
is(gl.getParameter(gl.CURRENT_PROGRAM), null,
"No program should be initially set in the WebGL context.");
renderer.useColorShader(new renderer.VertexBuffer([1, 2, 3], 3));
ok(gl.getParameter(gl.CURRENT_PROGRAM) instanceof WebGLProgram,
"The correct program hasn't been set in the WebGL context.");
}

View File

@ -1,46 +0,0 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
var isWebGLAvailable;
function onWebGLFail() {
isWebGLAvailable = false;
}
function onWebGLSuccess() {
isWebGLAvailable = true;
}
function test() {
if (!isWebGLSupported()) {
aborting();
info("Skipping tilt_gl02 because WebGL isn't supported on this hardware.");
return;
}
let canvas = createCanvas();
let renderer = new TiltGL.Renderer(canvas, onWebGLFail, onWebGLSuccess);
let gl = renderer.context;
if (!isWebGLAvailable) {
aborting();
return;
}
renderer.fill([1, 0, 0, 1]);
ok(isApproxVec(renderer._fillColor, [1, 0, 0, 1]),
"The fill color wasn't set correctly.");
renderer.stroke([0, 1, 0, 1]);
ok(isApproxVec(renderer._strokeColor, [0, 1, 0, 1]),
"The stroke color wasn't set correctly.");
renderer.strokeWeight(2);
is(renderer._strokeWeightValue, 2,
"The stroke weight wasn't set correctly.");
is(gl.getParameter(gl.LINE_WIDTH), 2,
"The stroke weight wasn't applied correctly.");
}

View File

@ -1,69 +0,0 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
var isWebGLAvailable;
function onWebGLFail() {
isWebGLAvailable = false;
}
function onWebGLSuccess() {
isWebGLAvailable = true;
}
function test() {
if (!isWebGLSupported()) {
aborting();
info("Skipping tilt_gl03 because WebGL isn't supported on this hardware.");
return;
}
let canvas = createCanvas();
let renderer = new TiltGL.Renderer(canvas, onWebGLFail, onWebGLSuccess);
let gl = renderer.context;
if (!isWebGLAvailable) {
aborting();
return;
}
renderer.defaults();
is(gl.getParameter(gl.DEPTH_TEST), true,
"The depth test wasn't set to the correct default value.");
is(gl.getParameter(gl.STENCIL_TEST), false,
"The stencil test wasn't set to the correct default value.");
is(gl.getParameter(gl.CULL_FACE), false,
"The cull face wasn't set to the correct default value.");
is(gl.getParameter(gl.FRONT_FACE), gl.CCW,
"The front face wasn't set to the correct default value.");
is(gl.getParameter(gl.BLEND), true,
"The blend mode wasn't set to the correct default value.");
is(gl.getParameter(gl.BLEND_SRC_ALPHA), gl.SRC_ALPHA,
"The source blend func wasn't set to the correct default value.");
is(gl.getParameter(gl.BLEND_DST_ALPHA), gl.ONE_MINUS_SRC_ALPHA,
"The destination blend func wasn't set to the correct default value.");
ok(isApproxVec(renderer._fillColor, [1, 1, 1, 1]),
"The fill color wasn't set to the correct default value.");
ok(isApproxVec(renderer._strokeColor, [0, 0, 0, 1]),
"The stroke color wasn't set to the correct default value.");
is(renderer._strokeWeightValue, 1,
"The stroke weight wasn't set to the correct default value.");
is(gl.getParameter(gl.LINE_WIDTH), 1,
"The stroke weight wasn't applied with the correct default value.");
ok(isApproxVec(renderer.projMatrix, [
1.2071068286895752, 0, 0, 0, 0, -2.4142136573791504, 0, 0, 0, 0,
-1.0202020406723022, -1, -181.06602478027344, 181.06602478027344,
148.14492797851562, 181.06602478027344
]), "The default perspective projection matrix wasn't set correctly.");
ok(isApproxVec(renderer.mvMatrix, [
1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1
]), "The default model view matrix wasn't set correctly.");
}

View File

@ -1,126 +0,0 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
var isWebGLAvailable;
function onWebGLFail() {
isWebGLAvailable = false;
}
function onWebGLSuccess() {
isWebGLAvailable = true;
}
function test() {
if (!isWebGLSupported()) {
aborting();
info("Skipping tilt_gl04 because WebGL isn't supported on this hardware.");
return;
}
let canvas = createCanvas();
let renderer = new TiltGL.Renderer(canvas, onWebGLFail, onWebGLSuccess);
let gl = renderer.context;
if (!isWebGLAvailable) {
aborting();
return;
}
renderer.perspective();
ok(isApproxVec(renderer.projMatrix, [
1.2071068286895752, 0, 0, 0, 0, -2.4142136573791504, 0, 0, 0, 0,
-1.0202020406723022, -1, -181.06602478027344, 181.06602478027344,
148.14492797851562, 181.06602478027344
]), "The default perspective proj. matrix wasn't calculated correctly.");
ok(isApproxVec(renderer.mvMatrix, [
1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1
]), "Changing the perpective matrix should reset the modelview by default.");
renderer.ortho();
ok(isApproxVec(renderer.projMatrix, [
0.006666666828095913, 0, 0, 0, 0, -0.013333333656191826, 0, 0, 0, 0, -1,
0, -1, 1, 0, 1
]), "The default ortho proj. matrix wasn't calculated correctly.");
ok(isApproxVec(renderer.mvMatrix, [
1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1
]), "Changing the ortho matrix should reset the modelview by default.");
renderer.projection(mat4.perspective(45, 1, 0.1, 100));
ok(isApproxVec(renderer.projMatrix, [
2.4142136573791504, 0, 0, 0, 0, 2.4142136573791504, 0, 0, 0, 0,
-1.0020020008087158, -1, 0, 0, -0.20020020008087158, 0
]), "A custom proj. matrix couldn't be set correctly.");
ok(isApproxVec(renderer.mvMatrix, [
1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1
]), "Setting a custom proj. matrix should reset the model view by default.");
renderer.translate(1, 1, 1);
ok(isApproxVec(renderer.mvMatrix, [
1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1
]), "The translation transformation wasn't applied correctly.");
renderer.rotate(0.5, 1, 1, 1);
ok(isApproxVec(renderer.mvMatrix, [
0.9183883666992188, 0.317602276802063, -0.23599065840244293, 0,
-0.23599065840244293, 0.9183883666992188, 0.317602276802063, 0,
0.317602276802063, -0.23599065840244293, 0.9183883666992188, 0, 1, 1, 1, 1
]), "The rotation transformation wasn't applied correctly.");
renderer.rotateX(0.5);
ok(isApproxVec(renderer.mvMatrix, [
0.9183883666992188, 0.317602276802063, -0.23599065840244293, 0,
-0.05483464524149895, 0.6928216814994812, 0.7190210819244385, 0,
0.391862154006958, -0.6474001407623291, 0.6536949872970581, 0, 1, 1, 1, 1
]), "The X rotation transformation wasn't applied correctly.");
renderer.rotateY(0.5);
ok(isApproxVec(renderer.mvMatrix, [
0.6180928945541382, 0.5891023874282837, -0.5204993486404419, 0,
-0.05483464524149895, 0.6928216814994812, 0.7190210819244385, 0,
0.7841902375221252, -0.4158804416656494, 0.4605313837528229, 0, 1, 1, 1, 1
]), "The Y rotation transformation wasn't applied correctly.");
renderer.rotateZ(0.5);
ok(isApproxVec(renderer.mvMatrix, [
0.5161384344100952, 0.8491423726081848, -0.11206408590078354, 0,
-0.3444514572620392, 0.3255774974822998, 0.8805410265922546, 0,
0.7841902375221252, -0.4158804416656494, 0.4605313837528229, 0, 1, 1, 1, 1
]), "The Z rotation transformation wasn't applied correctly.");
renderer.scale(2, 2, 2);
ok(isApproxVec(renderer.mvMatrix, [
1.0322768688201904, 1.6982847452163696, -0.22412817180156708, 0,
-0.6889029145240784, 0.6511549949645996, 1.7610820531845093, 0,
1.5683804750442505, -0.8317608833312988, 0.9210627675056458, 0, 1, 1, 1, 1
]), "The Z rotation transformation wasn't applied correctly.");
renderer.transform(mat4.create());
ok(isApproxVec(renderer.mvMatrix, [
1.0322768688201904, 1.6982847452163696, -0.22412817180156708, 0,
-0.6889029145240784, 0.6511549949645996, 1.7610820531845093, 0,
1.5683804750442505, -0.8317608833312988, 0.9210627675056458, 0, 1, 1, 1, 1
]), "The identity matrix transformation wasn't applied correctly.");
renderer.origin(1, 1, 1);
ok(isApproxVec(renderer.mvMatrix, [
1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1
]), "The origin wasn't reset to identity correctly.");
renderer.translate(1, 2);
ok(isApproxVec(renderer.mvMatrix, [
1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 2, 0, 1
]), "The second translation transformation wasn't applied correctly.");
renderer.scale(3, 4);
ok(isApproxVec(renderer.mvMatrix, [
3, 0, 0, 0, 0, 4, 0, 0, 0, 0, 1, 0, 1, 2, 0, 1
]), "The second scale transformation wasn't applied correctly.");
}

View File

@ -1,42 +0,0 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
var isWebGLAvailable;
function onWebGLFail() {
isWebGLAvailable = false;
}
function onWebGLSuccess() {
isWebGLAvailable = true;
}
function test() {
if (!isWebGLSupported()) {
aborting();
info("Skipping tilt_gl05 because WebGL isn't supported on this hardware.");
return;
}
let canvas = createCanvas();
let renderer = new TiltGL.Renderer(canvas, onWebGLFail, onWebGLSuccess);
let gl = renderer.context;
if (!isWebGLAvailable) {
aborting();
return;
}
let mesh = {
vertices: new renderer.VertexBuffer([1, 2, 3], 3),
indices: new renderer.IndexBuffer([1]),
};
ok(mesh.vertices instanceof TiltGL.VertexBuffer,
"The mesh vertices weren't saved at initialization.");
ok(mesh.indices instanceof TiltGL.IndexBuffer,
"The mesh indices weren't saved at initialization.");
}

View File

@ -1,59 +0,0 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
var isWebGLAvailable;
function onWebGLFail() {
isWebGLAvailable = false;
}
function onWebGLSuccess() {
isWebGLAvailable = true;
}
function test() {
if (!isWebGLSupported()) {
aborting();
info("Skipping tilt_gl06 because WebGL isn't supported on this hardware.");
return;
}
let canvas = createCanvas();
let renderer = new TiltGL.Renderer(canvas, onWebGLFail, onWebGLSuccess);
let gl = renderer.context;
if (!isWebGLAvailable) {
aborting();
return;
}
let vb = new renderer.VertexBuffer([1, 2, 3, 4, 5, 6], 3);
ok(vb instanceof TiltGL.VertexBuffer,
"The vertex buffer object wasn't instantiated correctly.");
ok(vb._ref,
"The vertex buffer gl element wasn't created at initialization.");
ok(vb.components,
"The vertex buffer components weren't created at initialization.");
is(vb.itemSize, 3,
"The vertex buffer item size isn't set correctly.");
is(vb.numItems, 2,
"The vertex buffer number of items weren't calculated correctly.");
let ib = new renderer.IndexBuffer([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
ok(ib instanceof TiltGL.IndexBuffer,
"The index buffer object wasn't instantiated correctly.");
ok(ib._ref,
"The index buffer gl element wasn't created at initialization.");
ok(ib.components,
"The index buffer components weren't created at initialization.");
is(ib.itemSize, 1,
"The index buffer item size isn't set correctly.");
is(ib.numItems, 10,
"The index buffer number of items weren't calculated correctly.");
}

View File

@ -1,60 +0,0 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
var isWebGLAvailable;
function onWebGLFail() {
isWebGLAvailable = false;
}
function onWebGLSuccess() {
isWebGLAvailable = true;
}
function test() {
if (!isWebGLSupported()) {
aborting();
info("Skipping tilt_gl07 because WebGL isn't supported on this hardware.");
return;
}
let canvas = createCanvas();
let renderer = new TiltGL.Renderer(canvas, onWebGLFail, onWebGLSuccess);
let gl = renderer.context;
if (!isWebGLAvailable) {
aborting();
return;
}
let p = new renderer.Program({
vs: TiltGL.ColorShader.vs,
fs: TiltGL.ColorShader.fs,
attributes: ["vertexPosition"],
uniforms: ["mvMatrix", "projMatrix", "fill"]
});
ok(p instanceof TiltGL.Program,
"The program object wasn't instantiated correctly.");
ok(p._ref,
"The program WebGL object wasn't created properly.");
isnot(p._id, -1,
"The program id wasn't set properly.");
ok(p._attributes,
"The program attributes cache wasn't created properly.");
ok(p._uniforms,
"The program uniforms cache wasn't created properly.");
is(typeof p._attributes.vertexPosition, "number",
"The vertexPosition attribute wasn't cached as it should.");
is(typeof p._uniforms.mvMatrix, "object",
"The mvMatrix uniform wasn't cached as it should.");
is(typeof p._uniforms.projMatrix, "object",
"The projMatrix uniform wasn't cached as it should.");
is(typeof p._uniforms.fill, "object",
"The fill uniform wasn't cached as it should.");
}

View File

@ -1,51 +0,0 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
var isWebGLAvailable;
function onWebGLFail() {
isWebGLAvailable = false;
}
function onWebGLSuccess() {
isWebGLAvailable = true;
}
function test() {
if (!isWebGLSupported()) {
aborting();
info("Skipping tilt_gl08 because WebGL isn't supported on this hardware.");
return;
}
let canvas = createCanvas();
let renderer = new TiltGL.Renderer(canvas, onWebGLFail, onWebGLSuccess);
let gl = renderer.context;
if (!isWebGLAvailable) {
aborting();
return;
}
let t = new renderer.Texture({
source: canvas,
format: "RGB"
});
ok(t instanceof TiltGL.Texture,
"The texture object wasn't instantiated correctly.");
ok(t._ref,
"The texture WebGL object wasn't created properly.");
isnot(t._id, -1,
"The texture id wasn't set properly.");
isnot(t.width, -1,
"The texture width wasn't set properly.");
isnot(t.height, -1,
"The texture height wasn't set properly.");
ok(t.loaded,
"The texture loaded flag wasn't set to true as it should.");
}

View File

@ -1,59 +0,0 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
function test() {
ok(isApprox(TiltMath.radians(30), 0.523598775),
"The radians() function didn't calculate the value correctly.");
ok(isApprox(TiltMath.degrees(0.5), 28.64788975),
"The degrees() function didn't calculate the value correctly.");
ok(isApprox(TiltMath.map(0.5, 0, 1, 0, 100), 50),
"The map() function didn't calculate the value correctly.");
is(TiltMath.isPowerOfTwo(32), true,
"The isPowerOfTwo() function didn't return the expected value.");
is(TiltMath.isPowerOfTwo(33), false,
"The isPowerOfTwo() function didn't return the expected value.");
ok(isApprox(TiltMath.nextPowerOfTwo(31), 32),
"The nextPowerOfTwo() function didn't calculate the 1st value correctly.");
ok(isApprox(TiltMath.nextPowerOfTwo(32), 32),
"The nextPowerOfTwo() function didn't calculate the 2nd value correctly.");
ok(isApprox(TiltMath.nextPowerOfTwo(33), 64),
"The nextPowerOfTwo() function didn't calculate the 3rd value correctly.");
ok(isApprox(TiltMath.clamp(5, 1, 3), 3),
"The clamp() function didn't calculate the 1st value correctly.");
ok(isApprox(TiltMath.clamp(5, 3, 1), 3),
"The clamp() function didn't calculate the 2nd value correctly.");
ok(isApprox(TiltMath.saturate(5), 1),
"The saturate() function didn't calculate the 1st value correctly.");
ok(isApprox(TiltMath.saturate(-5), 0),
"The saturate() function didn't calculate the 2nd value correctly.");
ok(isApproxVec(TiltMath.hex2rgba("#f00"), [1, 0, 0, 1]),
"The hex2rgba() function didn't calculate the 1st rgba values correctly.");
ok(isApproxVec(TiltMath.hex2rgba("#f008"), [1, 0, 0, 0.53]),
"The hex2rgba() function didn't calculate the 2nd rgba values correctly.");
ok(isApproxVec(TiltMath.hex2rgba("#ff0000"), [1, 0, 0, 1]),
"The hex2rgba() function didn't calculate the 3rd rgba values correctly.");
ok(isApproxVec(TiltMath.hex2rgba("#ff0000aa"), [1, 0, 0, 0.66]),
"The hex2rgba() function didn't calculate the 4th rgba values correctly.");
ok(isApproxVec(TiltMath.hex2rgba("rgba(255, 0, 0, 0.5)"), [1, 0, 0, 0.5]),
"The hex2rgba() function didn't calculate the 5th rgba values correctly.");
ok(isApproxVec(TiltMath.hex2rgba("rgb(255, 0, 0)"), [1, 0, 0, 1]),
"The hex2rgba() function didn't calculate the 6th rgba values correctly.");
}

View File

@ -1,104 +0,0 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
function test() {
let v1 = vec3.create();
ok(v1, "Should have created a vector with vec3.create().");
is(v1.length, 3, "A vec3 should have 3 elements.");
ok(isApproxVec(v1, [0, 0, 0]),
"When created, a vec3 should have the values default to 0.");
vec3.set([1, 2, 3], v1);
ok(isApproxVec(v1, [1, 2, 3]),
"The vec3.set() function didn't set the values correctly.");
vec3.zero(v1);
ok(isApproxVec(v1, [0, 0, 0]),
"The vec3.zero() function didn't set the values correctly.");
let v2 = vec3.create([4, 5, 6]);
ok(isApproxVec(v2, [4, 5, 6]),
"When cloning arrays, a vec3 should have the values copied.");
let v3 = vec3.create(v2);
ok(isApproxVec(v3, [4, 5, 6]),
"When cloning vectors, a vec3 should have the values copied.");
vec3.add(v2, v3);
ok(isApproxVec(v2, [8, 10, 12]),
"The vec3.add() function didn't set the x value correctly.");
vec3.subtract(v2, v3);
ok(isApproxVec(v2, [4, 5, 6]),
"The vec3.subtract() function didn't set the values correctly.");
vec3.negate(v2);
ok(isApproxVec(v2, [-4, -5, -6]),
"The vec3.negate() function didn't set the values correctly.");
vec3.scale(v2, -2);
ok(isApproxVec(v2, [8, 10, 12]),
"The vec3.scale() function didn't set the values correctly.");
vec3.normalize(v1);
ok(isApproxVec(v1, [0, 0, 0]),
"Normalizing a vector with zero length should return [0, 0, 0].");
vec3.normalize(v2);
ok(isApproxVec(v2, [
0.4558423161506653, 0.5698028802871704, 0.6837634444236755
]), "The vec3.normalize() function didn't set the values correctly.");
vec3.cross(v2, v3);
ok(isApproxVec(v2, [
5.960464477539063e-8, -1.1920928955078125e-7, 5.960464477539063e-8
]), "The vec3.cross() function didn't set the values correctly.");
vec3.dot(v2, v3);
ok(isApproxVec(v2, [
5.960464477539063e-8, -1.1920928955078125e-7, 5.960464477539063e-8
]), "The vec3.dot() function didn't set the values correctly.");
ok(isApproxVec([vec3.length(v2)], [1.4600096599955427e-7]),
"The vec3.length() function didn't calculate the value correctly.");
vec3.direction(v2, v3);
ok(isApproxVec(v2, [
-0.4558422863483429, -0.5698028802871704, -0.6837634444236755
]), "The vec3.direction() function didn't set the values correctly.");
vec3.lerp(v2, v3, 0.5);
ok(isApproxVec(v2, [
1.7720788717269897, 2.2150986194610596, 2.65811824798584
]), "The vec3.lerp() function didn't set the values correctly.");
vec3.project([100, 100, 10], [0, 0, 100, 100],
mat4.create(), mat4.perspective(45, 1, 0.1, 100), v1);
ok(isApproxVec(v1, [-1157.10693359375, 1257.10693359375, 0]),
"The vec3.project() function didn't set the values correctly.");
vec3.unproject([100, 100, 1], [0, 0, 100, 100],
mat4.create(), mat4.perspective(45, 1, 0.1, 100), v1);
ok(isApproxVec(v1, [
41.420406341552734, -41.420406341552734, -99.99771118164062
]), "The vec3.project() function didn't set the values correctly.");
let ray = vec3.createRay([10, 10, 0], [100, 100, 1], [0, 0, 100, 100],
mat4.create(), mat4.perspective(45, 1, 0.1, 100));
ok(isApproxVec(ray.origin, [
-0.03313708305358887, 0.03313708305358887, -0.1000000014901161
]), "The vec3.createRay() function didn't create the position correctly.");
ok(isApproxVec(ray.direction, [
0.35788586614428364, -0.35788586614428364, -0.862458934459091
]), "The vec3.createRay() function didn't create the direction correctly.");
is(vec3.str([0, 0, 0]), "[0, 0, 0]",
"The vec3.str() function didn't work properly.");
}

View File

@ -1,33 +0,0 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
function test() {
let m1 = mat3.create();
ok(m1, "Should have created a matrix with mat3.create().");
is(m1.length, 9, "A mat3 should have 9 elements.");
ok(isApproxVec(m1, [1, 0, 0, 0, 1, 0, 0, 0, 1]),
"When created, a mat3 should have the values default to identity.");
mat3.set([1, 2, 3, 4, 5, 6, 7, 8, 9], m1);
ok(isApproxVec(m1, [1, 2, 3, 4, 5, 6, 7, 8, 9]),
"The mat3.set() function didn't set the values correctly.");
mat3.transpose(m1);
ok(isApproxVec(m1, [1, 4, 7, 2, 5, 8, 3, 6, 9]),
"The mat3.transpose() function didn't set the values correctly.");
mat3.identity(m1);
ok(isApproxVec(m1, [1, 0, 0, 0, 1, 0, 0, 0, 1]),
"The mat3.identity() function didn't set the values correctly.");
let m2 = mat3.toMat4(m1);
ok(isApproxVec(m2, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]),
"The mat3.toMat4() function didn't set the values correctly.");
is(mat3.str([1, 2, 3, 4, 5, 6, 7, 8, 9]), "[1, 2, 3, 4, 5, 6, 7, 8, 9]",
"The mat3.str() function didn't work properly.");
}

View File

@ -1,49 +0,0 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
function test() {
let m1 = mat4.create();
ok(m1, "Should have created a matrix with mat4.create().");
is(m1.length, 16, "A mat4 should have 16 elements.");
ok(isApproxVec(m1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]),
"When created, a mat4 should have the values default to identity.");
mat4.set([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], m1);
ok(isApproxVec(m1, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]),
"The mat4.set() function didn't set the values correctly.");
mat4.transpose(m1);
ok(isApproxVec(m1, [1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15, 4, 8, 12, 16]),
"The mat4.transpose() function didn't set the values correctly.");
mat4.identity(m1);
ok(isApproxVec(m1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]),
"The mat4.identity() function didn't set the values correctly.");
ok(isApprox(mat4.determinant(m1), 1),
"The mat4.determinant() function didn't calculate the value correctly.");
let m2 = mat4.inverse([1, 3, 1, 1, 1, 1, 2, 1, 2, 3, 4, 1, 1, 1, 1, 1]);
ok(isApproxVec(m2, [
-1, -3, 1, 3, 0.5, 0, 0, -0.5, 0, 1, 0, -1, 0.5, 2, -1, -0.5
]), "The mat4.inverse() function didn't calculate the values correctly.");
let m3 = mat4.toRotationMat([
1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15, 4, 8, 12, 16]);
ok(isApproxVec(m3, [
1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15, 0, 0, 0, 1
]), "The mat4.toRotationMat() func. didn't calculate the values correctly.");
let m4 = mat4.toMat3([
1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15, 4, 8, 12, 16]);
ok(isApproxVec(m4, [1, 5, 9, 2, 6, 10, 3, 7, 11]),
"The mat4.toMat3() function didn't set the values correctly.");
let m5 = mat4.toInverseMat3([
1, 3, 1, 1, 1, 1, 2, 1, 2, 3, 4, 1, 1, 1, 1, 1]);
ok(isApproxVec(m5, [2, 9, -5, 0, -2, 1, -1, -3, 2]),
"The mat4.toInverseMat3() function didn't set the values correctly.");
}

View File

@ -1,101 +0,0 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
function test() {
let m1 = mat4.create([
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]);
let m2 = mat4.create([
0, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15, 4, 8, 12, 16]);
mat4.multiply(m1, m2);
ok(isApproxVec(m1, [
275, 302, 329, 356, 304, 336, 368, 400,
332, 368, 404, 440, 360, 400, 440, 480
]), "The mat4.multiply() function didn't set the values correctly.");
let v1 = mat4.multiplyVec3(m1, [1, 2, 3]);
ok(isApproxVec(v1, [2239, 2478, 2717]),
"The mat4.multiplyVec3() function didn't set the values correctly.");
let v2 = mat4.multiplyVec4(m1, [1, 2, 3, 0]);
ok(isApproxVec(v2, [1879, 2078, 2277, 2476]),
"The mat4.multiplyVec4() function didn't set the values correctly.");
mat4.translate(m1, [1, 2, 3]);
ok(isApproxVec(m1, [
275, 302, 329, 356, 304, 336, 368, 400,
332, 368, 404, 440, 2239, 2478, 2717, 2956
]), "The mat4.translate() function didn't set the values correctly.");
mat4.scale(m1, [1, 2, 3]);
ok(isApproxVec(m1, [
275, 302, 329, 356, 608, 672, 736, 800,
996, 1104, 1212, 1320, 2239, 2478, 2717, 2956
]), "The mat4.scale() function didn't set the values correctly.");
mat4.rotate(m1, 0.5, [1, 1, 1]);
ok(isApproxVec(m1, [
210.6123046875, 230.2483367919922, 249.88438415527344, 269.5204162597656,
809.8145751953125, 896.520751953125, 983.2268676757812,
1069.9329833984375, 858.5731201171875, 951.23095703125,
1043.8887939453125, 1136.5465087890625, 2239, 2478, 2717, 2956
]), "The mat4.rotate() function didn't set the values correctly.");
mat4.rotateX(m1, 0.5);
ok(isApproxVec(m1, [
210.6123046875, 230.2483367919922, 249.88438415527344, 269.5204162597656,
1122.301025390625, 1242.8154296875, 1363.3297119140625,
1483.843994140625, 365.2230224609375, 404.96875, 444.71453857421875,
484.460205078125, 2239, 2478, 2717, 2956
]), "The mat4.rotateX() function didn't set the values correctly.");
mat4.rotateY(m1, 0.5);
ok(isApproxVec(m1, [
9.732441902160645, 7.909564018249512, 6.086670875549316,
4.263822555541992, 1122.301025390625, 1242.8154296875, 1363.3297119140625,
1483.843994140625, 421.48626708984375, 465.78045654296875,
510.0746765136719, 554.3687744140625, 2239, 2478, 2717, 2956
]), "The mat4.rotateY() function didn't set the values correctly.");
mat4.rotateZ(m1, 0.5);
ok(isApproxVec(m1, [
546.6007690429688, 602.7787475585938, 658.9566650390625, 715.1345825195312,
980.245849609375, 1086.881103515625, 1193.5162353515625,
1300.1514892578125, 421.48626708984375, 465.78045654296875,
510.0746765136719, 554.3687744140625, 2239, 2478, 2717, 2956
]), "The mat4.rotateZ() function didn't set the values correctly.");
let m3 = mat4.frustum(0, 100, 200, 0, 0.1, 100);
ok(isApproxVec(m3, [
0.0020000000949949026, 0, 0, 0, 0, -0.0010000000474974513, 0, 0, 1, -1,
-1.0020020008087158, -1, 0, 0, -0.20020020008087158, 0
]), "The mat4.frustum() function didn't compute the values correctly.");
let m4 = mat4.perspective(45, 1.6, 0.1, 100);
ok(isApproxVec(m4, [1.5088834762573242, 0, 0, 0, 0, 2.4142136573791504, 0,
0, 0, 0, -1.0020020008087158, -1, 0, 0, -0.20020020008087158, 0
]), "The mat4.frustum() function didn't compute the values correctly.");
let m5 = mat4.ortho(0, 100, 200, 0, -1, 1);
ok(isApproxVec(m5, [
0.019999999552965164, 0, 0, 0, 0, -0.009999999776482582, 0, 0,
0, 0, -1, 0, -1, 1, 0, 1
]), "The mat4.ortho() function didn't compute the values correctly.");
let m6 = mat4.lookAt([1, 2, 3], [4, 5, 6], [0, 1, 0]);
ok(isApproxVec(m6, [
-0.7071067690849304, -0.40824830532073975, -0.5773502588272095, 0, 0,
0.8164966106414795, -0.5773502588272095, 0, 0.7071067690849304,
-0.40824830532073975, -0.5773502588272095, 0, -1.4142135381698608, 0,
3.464101552963257, 1
]), "The mat4.lookAt() function didn't compute the values correctly.");
is(mat4.str([
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]),
"[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]",
"The mat4.str() function didn't work properly.");
}

View File

@ -1,42 +0,0 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
function test() {
let q1 = quat4.create();
ok(q1, "Should have created a quaternion with quat4.create().");
is(q1.length, 4, "A quat4 should have 4 elements.");
ok(isApproxVec(q1, [0, 0, 0, 1]),
"When created, a vec3 should have the values default to identity.");
quat4.set([1, 2, 3, 4], q1);
ok(isApproxVec(q1, [1, 2, 3, 4]),
"The quat4.set() function didn't set the values correctly.");
quat4.identity(q1);
ok(isApproxVec(q1, [0, 0, 0, 1]),
"The quat4.identity() function didn't set the values correctly.");
quat4.set([5, 6, 7, 8], q1);
ok(isApproxVec(q1, [5, 6, 7, 8]),
"The quat4.set() function didn't set the values correctly.");
quat4.calculateW(q1);
ok(isApproxVec(q1, [5, 6, 7, -10.440306663513184]),
"The quat4.calculateW() function didn't compute the values correctly.");
quat4.inverse(q1);
ok(isApproxVec(q1, [-5, -6, -7, -10.440306663513184]),
"The quat4.inverse() function didn't compute the values correctly.");
quat4.normalize(q1);
ok(isApproxVec(q1, [
-0.33786869049072266, -0.40544241666793823,
-0.4730161726474762, -0.7054905295372009
]), "The quat4.normalize() function didn't compute the values correctly.");
ok(isApprox(quat4.length(q1), 1),
"The mat4.length() function didn't calculate the value correctly.");
}

View File

@ -1,49 +0,0 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
function test() {
let q1 = quat4.create([1, 2, 3, 4]);
let q2 = quat4.create([5, 6, 7, 8]);
quat4.multiply(q1, q2);
ok(isApproxVec(q1, [24, 48, 48, -6]),
"The quat4.multiply() function didn't set the values correctly.");
let v1 = quat4.multiplyVec3(q1, [9, 9, 9]);
ok(isApproxVec(v1, [5508, 54756, 59940]),
"The quat4.multiplyVec3() function didn't set the values correctly.");
let m1 = quat4.toMat3(q1);
ok(isApproxVec(m1, [
-9215, 2880, 1728, 1728, -5759, 4896, 2880, 4320, -5759
]), "The quat4.toMat3() function didn't set the values correctly.");
let m2 = quat4.toMat4(q1);
ok(isApproxVec(m2, [
-9215, 2880, 1728, 0, 1728, -5759, 4896, 0,
2880, 4320, -5759, 0, 0, 0, 0, 1
]), "The quat4.toMat4() function didn't set the values correctly.");
quat4.calculateW(q1);
quat4.calculateW(q2);
quat4.slerp(q1, q2, 0.5);
ok(isApproxVec(q1, [24, 48, 48, -71.99305725097656]),
"The quat4.slerp() function didn't set the values correctly.");
let q3 = quat4.fromAxis([1, 1, 1], 0.5);
ok(isApproxVec(q3, [
0.24740396440029144, 0.24740396440029144, 0.24740396440029144,
0.9689124226570129
]), "The quat4.fromAxis() function didn't compute the values correctly.");
let q4 = quat4.fromEuler(0.5, 0.75, 1.25);
ok(isApproxVec(q4, [
0.15310347080230713, 0.39433568716049194,
0.4540249705314636, 0.7841683626174927
]), "The quat4.fromEuler() function didn't compute the values correctly.");
is(quat4.str([1, 2, 3, 4]), "[1, 2, 3, 4]",
"The quat4.str() function didn't work properly.");
}

View File

@ -1,56 +0,0 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
var pickDone = false;
function test() {
if (!isTiltEnabled()) {
aborting();
info("Skipping picking test because Tilt isn't enabled.");
return;
}
if (!isWebGLSupported()) {
aborting();
info("Skipping picking test because WebGL isn't supported.");
return;
}
waitForExplicitFinish();
createTab(function() {
createTilt({
onTiltOpen: function(instance)
{
let presenter = instance.presenter;
let canvas = presenter.canvas;
presenter._onSetupMesh = function() {
let p = getPickablePoint(presenter);
presenter.pickNode(p[0], p[1], {
onpick: function(data)
{
ok(data.index > 0,
"Simply picking a node didn't work properly.");
pickDone = true;
Services.obs.addObserver(cleanup, DESTROYED, false);
Tilt.destroy(Tilt.currentWindowId);
}
});
};
}
}, false, function suddenDeath()
{
ok(false, "Tilt could not be initialized properly.");
cleanup();
});
});
}
function cleanup() {
if (pickDone) { Services.obs.removeObserver(cleanup, DESTROYED); }
gBrowser.removeCurrentTab();
finish();
}

View File

@ -1,78 +0,0 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
var nodeDeleted = false;
var presenter;
function test() {
if (!isTiltEnabled()) {
aborting();
info("Skipping picking delete test because Tilt isn't enabled.");
return;
}
if (!isWebGLSupported()) {
aborting();
info("Skipping picking delete test because WebGL isn't supported.");
return;
}
waitForExplicitFinish();
createTab(function() {
createTilt({
onTiltOpen: function(instance)
{
presenter = instance.presenter;
Services.obs.addObserver(whenNodeRemoved, NODE_REMOVED, false);
presenter._onSetupMesh = function() {
let p = getPickablePoint(presenter);
presenter.highlightNodeAt(p[0], p[1], {
onpick: function()
{
ok(presenter._currentSelection > 0,
"Highlighting a node didn't work properly.");
ok(!presenter._highlight.disabled,
"After highlighting a node, it should be highlighted. D'oh.");
nodeDeleted = true;
presenter.deleteNode();
}
});
};
}
}, false, function suddenDeath()
{
ok(false, "Tilt could not be initialized properly.");
cleanup();
});
});
}
function whenNodeRemoved() {
ok(presenter._currentSelection > 0,
"Deleting a node shouldn't change the current selection.");
ok(presenter._highlight.disabled,
"After deleting a node, it shouldn't be highlighted.");
let nodeIndex = presenter._currentSelection;
let vertices = presenter._meshStacks[0].vertices.components;
for (let i = 0, k = 36 * nodeIndex; i < 36; i++) {
is(vertices[i + k], 0,
"The stack vertices weren't degenerated properly.");
}
executeSoon(function() {
Services.obs.addObserver(cleanup, DESTROYED, false);
Tilt.destroy(Tilt.currentWindowId);
});
}
function cleanup() {
if (nodeDeleted) { Services.obs.removeObserver(cleanup, DESTROYED); }
gBrowser.removeCurrentTab();
finish();
}

View File

@ -1,77 +0,0 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
var nodeHighlighted = false;
var presenter;
function test() {
if (!isTiltEnabled()) {
aborting();
info("Skipping highlight test because Tilt isn't enabled.");
return;
}
if (!isWebGLSupported()) {
aborting();
info("Skipping highlight test because WebGL isn't supported.");
return;
}
waitForExplicitFinish();
createTab(function() {
createTilt({
onTiltOpen: function(instance)
{
presenter = instance.presenter;
Services.obs.addObserver(whenHighlighting, HIGHLIGHTING, false);
presenter._onInitializationFinished = function() {
let contentDocument = presenter.contentWindow.document;
let div = contentDocument.getElementById("far-far-away");
nodeHighlighted = true;
presenter.highlightNode(div, "moveIntoView");
};
}
}, false, function suddenDeath()
{
ok(false, "Tilt could not be initialized properly.");
cleanup();
});
});
}
function whenHighlighting() {
ok(presenter._currentSelection > 0,
"Highlighting a node didn't work properly.");
ok(!presenter._highlight.disabled,
"After highlighting a node, it should be highlighted. D'oh.");
ok(presenter.controller.arcball._resetInProgress,
"Highlighting a node that's not already visible should trigger a reset!");
executeSoon(function() {
Services.obs.removeObserver(whenHighlighting, HIGHLIGHTING);
Services.obs.addObserver(whenUnhighlighting, UNHIGHLIGHTING, false);
presenter.highlightNode(null);
});
}
function whenUnhighlighting() {
ok(presenter._currentSelection < 0,
"Unhighlighting a should remove the current selection.");
ok(presenter._highlight.disabled,
"After unhighlighting a node, it shouldn't be highlighted anymore. D'oh.");
executeSoon(function() {
Services.obs.removeObserver(whenUnhighlighting, UNHIGHLIGHTING);
Services.obs.addObserver(cleanup, DESTROYED, false);
Tilt.destroy(Tilt.currentWindowId);
});
}
function cleanup() {
if (nodeHighlighted) { Services.obs.removeObserver(cleanup, DESTROYED); }
gBrowser.removeCurrentTab();
finish();
}

View File

@ -1,77 +0,0 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
var nodeHighlighted = false;
var presenter;
function test() {
if (!isTiltEnabled()) {
aborting();
info("Skipping highlight test because Tilt isn't enabled.");
return;
}
if (!isWebGLSupported()) {
aborting();
info("Skipping highlight test because WebGL isn't supported.");
return;
}
waitForExplicitFinish();
createTab(function() {
createTilt({
onTiltOpen: function(instance)
{
presenter = instance.presenter;
Services.obs.addObserver(whenHighlighting, HIGHLIGHTING, false);
presenter._onInitializationFinished = function() {
let contentDocument = presenter.contentWindow.document;
let div = contentDocument.getElementById("first-law");
nodeHighlighted = true;
presenter.highlightNode(div, "moveIntoView");
};
}
}, false, function suddenDeath()
{
ok(false, "Tilt could not be initialized properly.");
cleanup();
});
});
}
function whenHighlighting() {
ok(presenter._currentSelection > 0,
"Highlighting a node didn't work properly.");
ok(!presenter._highlight.disabled,
"After highlighting a node, it should be highlighted. D'oh.");
ok(!presenter.controller.arcball._resetInProgress,
"Highlighting a node that's already visible shouldn't trigger a reset.");
executeSoon(function() {
Services.obs.removeObserver(whenHighlighting, HIGHLIGHTING);
Services.obs.addObserver(whenUnhighlighting, UNHIGHLIGHTING, false);
presenter.highlightNode(null);
});
}
function whenUnhighlighting() {
ok(presenter._currentSelection < 0,
"Unhighlighting a should remove the current selection.");
ok(presenter._highlight.disabled,
"After unhighlighting a node, it shouldn't be highlighted anymore. D'oh.");
executeSoon(function() {
Services.obs.removeObserver(whenUnhighlighting, UNHIGHLIGHTING);
Services.obs.addObserver(cleanup, DESTROYED, false);
Tilt.destroy(Tilt.currentWindowId);
});
}
function cleanup() {
if (nodeHighlighted) { Services.obs.removeObserver(cleanup, DESTROYED); }
gBrowser.removeCurrentTab();
finish();
}

View File

@ -1,72 +0,0 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
var nodeHighlighted = false;
var presenter;
function test() {
if (!isTiltEnabled()) {
aborting();
info("Skipping highlight test because Tilt isn't enabled.");
return;
}
if (!isWebGLSupported()) {
aborting();
info("Skipping highlight test because WebGL isn't supported.");
return;
}
waitForExplicitFinish();
createTab(function() {
createTilt({
onTiltOpen: function(instance)
{
presenter = instance.presenter;
Services.obs.addObserver(whenHighlighting, HIGHLIGHTING, false);
presenter._onInitializationFinished = function() {
nodeHighlighted = true;
presenter.highlightNodeAt.apply(this, getPickablePoint(presenter));
};
}
}, false, function suddenDeath()
{
ok(false, "Tilt could not be initialized properly.");
cleanup();
});
});
}
function whenHighlighting() {
ok(presenter._currentSelection > 0,
"Highlighting a node didn't work properly.");
ok(!presenter._highlight.disabled,
"After highlighting a node, it should be highlighted. D'oh.");
executeSoon(function() {
Services.obs.removeObserver(whenHighlighting, HIGHLIGHTING);
Services.obs.addObserver(whenUnhighlighting, UNHIGHLIGHTING, false);
presenter.highlightNode(null);
});
}
function whenUnhighlighting() {
ok(presenter._currentSelection < 0,
"Unhighlighting a should remove the current selection.");
ok(presenter._highlight.disabled,
"After unhighlighting a node, it shouldn't be highlighted anymore. D'oh.");
executeSoon(function() {
Services.obs.removeObserver(whenUnhighlighting, UNHIGHLIGHTING);
Services.obs.addObserver(cleanup, DESTROYED, false);
Tilt.destroy(Tilt.currentWindowId);
});
}
function cleanup() {
if (nodeHighlighted) { Services.obs.removeObserver(cleanup, DESTROYED); }
gBrowser.removeCurrentTab();
finish();
}

View File

@ -1,72 +0,0 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
var nodeHighlighted = false;
var presenter;
function test() {
if (!isTiltEnabled()) {
aborting();
info("Skipping highlight test because Tilt isn't enabled.");
return;
}
if (!isWebGLSupported()) {
aborting();
info("Skipping highlight test because WebGL isn't supported.");
return;
}
waitForExplicitFinish();
createTab(function() {
createTilt({
onTiltOpen: function(instance)
{
presenter = instance.presenter;
Services.obs.addObserver(whenHighlighting, HIGHLIGHTING, false);
presenter._onInitializationFinished = function() {
nodeHighlighted = true;
presenter.highlightNodeFor(3); // 1 = html, 2 = body, 3 = first div
};
}
}, false, function suddenDeath()
{
ok(false, "Tilt could not be initialized properly.");
cleanup();
});
});
}
function whenHighlighting() {
ok(presenter._currentSelection > 0,
"Highlighting a node didn't work properly.");
ok(!presenter._highlight.disabled,
"After highlighting a node, it should be highlighted. D'oh.");
executeSoon(function() {
Services.obs.removeObserver(whenHighlighting, HIGHLIGHTING);
Services.obs.addObserver(whenUnhighlighting, UNHIGHLIGHTING, false);
presenter.highlightNodeFor(-1);
});
}
function whenUnhighlighting() {
ok(presenter._currentSelection < 0,
"Unhighlighting a should remove the current selection.");
ok(presenter._highlight.disabled,
"After unhighlighting a node, it shouldn't be highlighted anymore. D'oh.");
executeSoon(function() {
Services.obs.removeObserver(whenUnhighlighting, UNHIGHLIGHTING);
Services.obs.addObserver(cleanup, DESTROYED, false);
Tilt.destroy(Tilt.currentWindowId);
});
}
function cleanup() {
if (nodeHighlighted) { Services.obs.removeObserver(cleanup, DESTROYED); }
gBrowser.removeCurrentTab();
finish();
}

View File

@ -1,76 +0,0 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
Components.utils.import("resource://gre/modules/Task.jsm");
var promise = require("promise");
function test() {
if (!isTiltEnabled()) {
aborting();
info("Skipping highlight test because Tilt isn't enabled.");
return;
}
if (!isWebGLSupported()) {
aborting();
info("Skipping highlight test because WebGL isn't supported.");
return;
}
waitForExplicitFinish();
createTab(function() {
let {TargetFactory} = require("devtools/client/framework/target");
let target = TargetFactory.forTab(gBrowser.selectedTab);
gDevTools.showToolbox(target, "inspector")
.then(Task.async(onToolbox));
});
}
function* onToolbox(toolbox) {
let contentDocument = toolbox.target.tab.linkedBrowser.contentDocument;
let div = contentDocument.getElementById("first-law");
let inspector = toolbox.getPanel("inspector");
let onInspectorUpdated = inspector.once("inspector-updated");
inspector.selection.setNode(div);
yield onInspectorUpdated;
let deferred = promise.defer();
onInspectorUpdated = inspector.once("inspector-updated");
createTilt({
onTiltOpen: function(instance)
{
deferred.resolve(instance.presenter);
}
}, false, function suddenDeath()
{
ok(false, "Tilt could not be initialized properly.");
cleanup();
});
let presenter = yield deferred.promise;
yield onInspectorUpdated;
whenOpen(presenter);
}
function whenOpen(presenter) {
ok(presenter._currentSelection > 0,
"Highlighting a node didn't work properly.");
ok(!presenter._highlight.disabled,
"After highlighting a node, it should be highlighted. D'oh.");
ok(!presenter.controller.arcball._resetInProgress,
"Highlighting a node that's already visible shouldn't trigger a reset.");
executeSoon(function() {
Services.obs.addObserver(cleanup, DESTROYED, false);
Tilt.destroy(Tilt.currentWindowId);
});
}
function cleanup() {
Services.obs.removeObserver(cleanup, DESTROYED);
gBrowser.removeCurrentTab();
finish();
}

View File

@ -1,78 +0,0 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
var nodeHighlighted = false;
var presenter;
function test() {
if (!isTiltEnabled()) {
aborting();
info("Skipping highlight test because Tilt isn't enabled.");
return;
}
if (!isWebGLSupported()) {
aborting();
info("Skipping highlight test because WebGL isn't supported.");
return;
}
waitForExplicitFinish();
createTab(function() {
createTilt({
onTiltOpen: function(instance)
{
presenter = instance.presenter;
Services.obs.addObserver(whenHighlighting, HIGHLIGHTING, false);
presenter._onInitializationFinished = function() {
let contentDocument = presenter.contentWindow.document;
let div = contentDocument.getElementById("far-far-away");
nodeHighlighted = true;
presenter.highlightNode(div);
};
}
}, false, function suddenDeath()
{
ok(false, "Tilt could not be initialized properly.");
cleanup();
});
});
}
function whenHighlighting() {
ok(presenter._currentSelection > 0,
"Highlighting a node didn't work properly.");
ok(!presenter._highlight.disabled,
"After highlighting a node, it should be highlighted. D'oh.");
ok(!presenter.controller.arcball._resetInProgress,
"Highlighting a node that's not already visible shouldn't trigger a reset " +
"without this being explicitly requested!");
EventUtils.sendKey("F");
executeSoon(whenBringingIntoView);
}
function whenBringingIntoView() {
ok(presenter._currentSelection > 0,
"The node should still be selected.");
ok(!presenter._highlight.disabled,
"The node should still be highlighted");
ok(presenter.controller.arcball._resetInProgress,
"Highlighting a node that's not already visible should trigger a reset " +
"when this is being explicitly requested!");
executeSoon(function() {
Services.obs.removeObserver(whenHighlighting, HIGHLIGHTING);
Services.obs.addObserver(cleanup, DESTROYED, false);
Tilt.destroy(Tilt.currentWindowId);
});
}
function cleanup() {
if (nodeHighlighted) { Services.obs.removeObserver(cleanup, DESTROYED); }
gBrowser.removeCurrentTab();
finish();
}

View File

@ -1,69 +0,0 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
function test() {
let prefs = TiltUtils.Preferences;
ok(prefs, "The TiltUtils.Preferences wasn't found.");
prefs.create("test-pref-bool", "boolean", true);
prefs.create("test-pref-int", "integer", 42);
prefs.create("test-pref-string", "string", "hello world!");
is(prefs.get("test-pref-bool", "boolean"), true,
"The boolean test preference wasn't initially set correctly.");
is(prefs.get("test-pref-int", "integer"), 42,
"The integer test preference wasn't initially set correctly.");
is(prefs.get("test-pref-string", "string"), "hello world!",
"The string test preference wasn't initially set correctly.");
prefs.set("test-pref-bool", "boolean", false);
prefs.set("test-pref-int", "integer", 24);
prefs.set("test-pref-string", "string", "!dlrow olleh");
is(prefs.get("test-pref-bool", "boolean"), false,
"The boolean test preference wasn't changed correctly.");
is(prefs.get("test-pref-int", "integer"), 24,
"The integer test preference wasn't changed correctly.");
is(prefs.get("test-pref-string", "string"), "!dlrow olleh",
"The string test preference wasn't changed correctly.");
is(typeof prefs.get("unknown-pref", "boolean"), "undefined",
"Inexisted boolean prefs should be handled as undefined.");
is(typeof prefs.get("unknown-pref", "integer"), "undefined",
"Inexisted integer prefs should be handled as undefined.");
is(typeof prefs.get("unknown-pref", "string"), "undefined",
"Inexisted string prefs should be handled as undefined.");
is(prefs.get("test-pref-bool", "integer"), null,
"The get() boolean function didn't handle incorrect types as it should.");
is(prefs.get("test-pref-bool", "string"), null,
"The get() boolean function didn't handle incorrect types as it should.");
is(prefs.get("test-pref-int", "boolean"), null,
"The get() integer function didn't handle incorrect types as it should.");
is(prefs.get("test-pref-int", "string"), null,
"The get() integer function didn't handle incorrect types as it should.");
is(prefs.get("test-pref-string", "boolean"), null,
"The get() string function didn't handle incorrect types as it should.");
is(prefs.get("test-pref-string", "integer"), null,
"The get() string function didn't handle incorrect types as it should.");
is(typeof prefs.get(), "undefined",
"The get() function should not work if not enough params are passed.");
is(typeof prefs.set(), "undefined",
"The set() function should not work if not enough params are passed.");
is(typeof prefs.create(), "undefined",
"The create() function should not work if not enough params are passed.");
is(prefs.get("test-pref-wrong-type", "wrong-type", 1), null,
"The get() function should expect only correct pref types.");
is(prefs.set("test-pref-wrong-type", "wrong-type", 1), false,
"The set() function should expect only correct pref types.");
is(prefs.create("test-pref-wrong-type", "wrong-type", 1), false,
"The create() function should expect only correct pref types.");
}

View File

@ -1,21 +0,0 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
function test() {
let l10 = TiltUtils.L10n;
ok(l10, "The TiltUtils.L10n wasn't found.");
ok(l10.stringBundle,
"The necessary string bundle wasn't found.");
is(l10.get(), null,
"The get() function shouldn't work if no params are passed.");
is(l10.format(), null,
"The format() function shouldn't work if no params are passed.");
is(typeof l10.get("initWebGL.error"), "string",
"No valid string was returned from a correct name in the bundle.");
is(typeof l10.format("linkProgram.error", ["error"]), "string",
"No valid formatted string was returned from a name in the bundle.");
}

View File

@ -1,18 +0,0 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
function test() {
let dom = TiltUtils.DOM;
is(dom.parentNode, null,
"The parent node should not be initially set.");
dom.parentNode = {};
ok(dom.parentNode,
"The parent node should now be set.");
TiltUtils.clearCache();
is(dom.parentNode, null,
"The parent node should not be set after clearing the cache.");
}

View File

@ -1,54 +0,0 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
function test() {
let dom = TiltUtils.DOM;
ok(dom, "The TiltUtils.DOM wasn't found.");
is(dom.initCanvas(), null,
"The initCanvas() function shouldn't work if no parent node is set.");
dom.parentNode = gBrowser.parentNode;
ok(dom.parentNode,
"The necessary parent node wasn't found.");
let canvas = dom.initCanvas(null, {
append: true,
focusable: true,
width: 123,
height: 456,
id: "tilt-test-canvas"
});
is(canvas.width, 123,
"The test canvas doesn't have the correct width set.");
is(canvas.height, 456,
"The test canvas doesn't have the correct height set.");
is(canvas.getAttribute("tabindex"), 1,
"The test canvas tab index wasn't set correctly.");
is(canvas.getAttribute("id"), "tilt-test-canvas",
"The test canvas doesn't have the correct id set.");
ok(dom.parentNode.ownerDocument.getElementById(canvas.id),
"A canvas should be appended to the parent node if specified.");
canvas.parentNode.removeChild(canvas);
let canvas2 = dom.initCanvas(null, { id: "tilt-test-canvas2" });
is(canvas2.width, dom.parentNode.clientWidth,
"The second test canvas doesn't have the implicit width set.");
is(canvas2.height, dom.parentNode.clientHeight,
"The second test canvas doesn't have the implicit height set.");
is(canvas2.id, "tilt-test-canvas2",
"The second test canvas doesn't have the correct id set.");
is(dom.parentNode.ownerDocument.getElementById(canvas2.id), null,
"A canvas shouldn't be appended to the parent node if not specified.");
dom.parentNode = null;
is(dom.parentNode, null,
"The necessary parent node shouldn't be found anymore.");
}

View File

@ -1,101 +0,0 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
const STACK_THICKNESS = 15;
function init(callback) {
let iframe = gBrowser.ownerDocument.createElement("iframe");
iframe.addEventListener("load", function onLoad() {
iframe.removeEventListener("load", onLoad, true);
callback(iframe);
gBrowser.parentNode.removeChild(iframe);
finish();
}, true);
iframe.setAttribute("src", ["data:text/html,",
"<!DOCTYPE html>",
"<html>",
"<head>",
"<style>",
"</style>",
"<script>",
"</script>",
"</head>",
"<body style='margin: 0;'>",
"<div style='margin-top: 98px;" +
"margin-left: 76px;" +
"width: 123px;" +
"height: 456px;' id='test-div'>",
"<span></span>",
"</div>",
"</body>",
"</html>"
].join(""));
gBrowser.parentNode.appendChild(iframe);
}
function test() {
waitForExplicitFinish();
ok(TiltUtils, "The TiltUtils object doesn't exist.");
let dom = TiltUtils.DOM;
ok(dom, "The TiltUtils.DOM wasn't found.");
init(function(iframe) {
let cwDimensions = dom.getContentWindowDimensions(iframe.contentWindow);
is(cwDimensions.width - iframe.contentWindow.scrollMaxX,
iframe.contentWindow.innerWidth,
"The content window width wasn't calculated correctly.");
is(cwDimensions.height - iframe.contentWindow.scrollMaxY,
iframe.contentWindow.innerHeight,
"The content window height wasn't calculated correctly.");
let nodeCoordinates = getRect(
gBrowser.contentWindow,
iframe.contentDocument.getElementById("test-div"), iframe.contentWindow);
let frameOffset = getIframeContentOffset(iframe);
let frameRect = iframe.getBoundingClientRect();
is(nodeCoordinates.top, frameRect.top + frameOffset[0] + 98,
"The node coordinates top value wasn't calculated correctly.");
is(nodeCoordinates.left, frameRect.left + frameOffset[1] + 76,
"The node coordinates left value wasn't calculated correctly.");
is(nodeCoordinates.width, 123,
"The node coordinates width value wasn't calculated correctly.");
is(nodeCoordinates.height, 456,
"The node coordinates height value wasn't calculated correctly.");
let store = dom.traverse(iframe.contentWindow);
let expected = [
{ name: "html", depth: 0 * STACK_THICKNESS, thickness: STACK_THICKNESS },
{ name: "head", depth: 1 * STACK_THICKNESS, thickness: STACK_THICKNESS },
{ name: "body", depth: 1 * STACK_THICKNESS, thickness: STACK_THICKNESS },
{ name: "style", depth: 2 * STACK_THICKNESS, thickness: STACK_THICKNESS },
{ name: "script", depth: 2 * STACK_THICKNESS, thickness: STACK_THICKNESS },
{ name: "div", depth: 2 * STACK_THICKNESS, thickness: STACK_THICKNESS },
{ name: "span", depth: 3 * STACK_THICKNESS, thickness: STACK_THICKNESS },
];
is(store.nodes.length, expected.length,
"The traverse() function didn't walk the correct number of nodes.");
is(store.info.length, expected.length,
"The traverse() function didn't examine the correct number of nodes.");
for (let i = 0; i < expected.length; i++) {
is(store.info[i].name, expected[i].name,
"traversed node " + (i + 1) + " isn't the expected one.");
is(store.info[i].coord.depth, expected[i].depth,
"traversed node " + (i + 1) + " doesn't have the expected depth.");
is(store.info[i].coord.thickness, expected[i].thickness,
"traversed node " + (i + 1) + " doesn't have the expected thickness.");
}
});
}

View File

@ -1,44 +0,0 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
var someObject = {
a: 1,
func: function()
{
this.b = 2;
}
};
var anotherObject = {
_finalize: function()
{
someObject.c = 3;
}
};
function test() {
ok(TiltUtils, "The TiltUtils object doesn't exist.");
TiltUtils.bindObjectFunc(someObject, "", anotherObject);
someObject.func();
is(someObject.a, 1,
"The bindObjectFunc() messed the non-function members of the object.");
isnot(someObject.b, 2,
"The bindObjectFunc() didn't ignore the old scope correctly.");
is(anotherObject.b, 2,
"The bindObjectFunc() didn't set the new scope correctly.");
TiltUtils.destroyObject(anotherObject);
is(someObject.c, 3,
"The finalize function wasn't called when an object was destroyed.");
TiltUtils.destroyObject(someObject);
is(typeof someObject.a, "undefined",
"Not all members of the destroyed object were deleted.");
is(typeof someObject.func, "undefined",
"Not all function members of the destroyed object were deleted.");
}

View File

@ -1,159 +0,0 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
const STACK_THICKNESS = 15;
function init(callback) {
let iframe = gBrowser.ownerDocument.createElement("iframe");
iframe.addEventListener("load", function onLoad() {
iframe.removeEventListener("load", onLoad, true);
callback(iframe);
gBrowser.parentNode.removeChild(iframe);
finish();
}, true);
iframe.setAttribute("src", ["data:text/html,",
"<!DOCTYPE html>",
"<html>",
"<body style='margin: 0;'>",
"<frameset cols='50%,50%'>",
"<frame src='",
["data:text/html,",
"<!DOCTYPE html>",
"<html>",
"<body style='margin: 0;'>",
"<div id='test-div' style='width: 123px; height: 456px;'></div>",
"</body>",
"</html>"
].join(""),
"' />",
"<frame src='",
["data:text/html,",
"<!DOCTYPE html>",
"<html>",
"<body style='margin: 0;'>",
"<span></span>",
"</body>",
"</html>"
].join(""),
"' />",
"</frameset>",
"<iframe src='",
["data:text/html,",
"<!DOCTYPE html>",
"<html>",
"<body>",
"<span></span>",
"</body>",
"</html>"
].join(""),
"'></iframe>",
"<frame src='",
["data:text/html,",
"<!DOCTYPE html>",
"<html>",
"<body style='margin: 0;'>",
"<span></span>",
"</body>",
"</html>"
].join(""),
"' />",
"<frame src='",
["data:text/html,",
"<!DOCTYPE html>",
"<html>",
"<body style='margin: 0;'>",
"<iframe src='",
["data:text/html,",
"<!DOCTYPE html>",
"<html>",
"<body>",
"<div></div>",
"</body>",
"</html>"
].join(""),
"'></iframe>",
"</body>",
"</html>"
].join(""),
"' />",
"</body>",
"</html>"
].join(""));
gBrowser.parentNode.appendChild(iframe);
}
function test() {
waitForExplicitFinish();
ok(TiltUtils, "The TiltUtils object doesn't exist.");
let dom = TiltUtils.DOM;
ok(dom, "The TiltUtils.DOM wasn't found.");
init(function(iframe) {
let cwDimensions = dom.getContentWindowDimensions(iframe.contentWindow);
is(cwDimensions.width - iframe.contentWindow.scrollMaxX,
iframe.contentWindow.innerWidth,
"The content window width wasn't calculated correctly.");
is(cwDimensions.height - iframe.contentWindow.scrollMaxY,
iframe.contentWindow.innerHeight,
"The content window height wasn't calculated correctly.");
let nodeCoordinates = getRect(
gBrowser.contentWindow,
iframe.contentDocument.getElementById("test-div"), iframe.contentWindow);
let frameOffset = getIframeContentOffset(iframe);
let frameRect = iframe.getBoundingClientRect();
is(nodeCoordinates.top, frameRect.top + frameOffset[0],
"The node coordinates top value wasn't calculated correctly.");
is(nodeCoordinates.left, frameRect.left + frameOffset[1],
"The node coordinates left value wasn't calculated correctly.");
is(nodeCoordinates.width, 123,
"The node coordinates width value wasn't calculated correctly.");
is(nodeCoordinates.height, 456,
"The node coordinates height value wasn't calculated correctly.");
let store = dom.traverse(iframe.contentWindow);
let expected = [
{ name: "html", depth: 0 * STACK_THICKNESS, thickness: STACK_THICKNESS },
{ name: "head", depth: 1 * STACK_THICKNESS, thickness: STACK_THICKNESS },
{ name: "body", depth: 1 * STACK_THICKNESS, thickness: STACK_THICKNESS },
{ name: "div", depth: 2 * STACK_THICKNESS, thickness: STACK_THICKNESS },
{ name: "span", depth: 2 * STACK_THICKNESS, thickness: STACK_THICKNESS },
{ name: "iframe", depth: 2 * STACK_THICKNESS, thickness: STACK_THICKNESS },
{ name: "span", depth: 2 * STACK_THICKNESS, thickness: STACK_THICKNESS },
{ name: "iframe", depth: 2 * STACK_THICKNESS, thickness: STACK_THICKNESS },
{ name: "html", depth: 3 * STACK_THICKNESS, thickness: STACK_THICKNESS },
{ name: "html", depth: 3 * STACK_THICKNESS, thickness: STACK_THICKNESS },
{ name: "head", depth: 4 * STACK_THICKNESS, thickness: STACK_THICKNESS },
{ name: "body", depth: 4 * STACK_THICKNESS, thickness: STACK_THICKNESS },
{ name: "head", depth: 4 * STACK_THICKNESS, thickness: STACK_THICKNESS },
{ name: "body", depth: 4 * STACK_THICKNESS, thickness: STACK_THICKNESS },
{ name: "span", depth: 5 * STACK_THICKNESS, thickness: STACK_THICKNESS },
{ name: "div", depth: 5 * STACK_THICKNESS, thickness: STACK_THICKNESS },
];
is(store.nodes.length, expected.length,
"The traverse() function didn't walk the correct number of nodes.");
is(store.info.length, expected.length,
"The traverse() function didn't examine the correct number of nodes.");
for (let i = 0; i < expected.length; i++) {
is(store.info[i].name, expected[i].name,
"traversed node " + (i + 1) + " isn't the expected one.");
is(store.info[i].coord.depth, expected[i].depth,
"traversed node " + (i + 1) + " doesn't have the expected depth.");
is(store.info[i].coord.thickness, expected[i].thickness,
"traversed node " + (i + 1) + " doesn't have the expected thickness.");
}
});
}

View File

@ -1,85 +0,0 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
const STACK_THICKNESS = 15;
function init(callback) {
let iframe = gBrowser.ownerDocument.createElement("iframe");
iframe.addEventListener("load", function onLoad() {
iframe.removeEventListener("load", onLoad, true);
callback(iframe);
gBrowser.parentNode.removeChild(iframe);
finish();
}, true);
iframe.setAttribute("src", ["data:text/html,",
"<!DOCTYPE html>",
"<html>",
"<body style='margin: 0;'>",
"<div>",
"<p>Foo</p>",
"<div>",
"<span>Bar</span>",
"</div>",
"<div></div>",
"</div>",
"</body>",
"</html>"
].join(""));
gBrowser.parentNode.appendChild(iframe);
}
function nodeCallback(aContentWindow, aNode, aParentPosition) {
let coord = TiltUtils.DOM.getNodePosition(aContentWindow, aNode, aParentPosition);
if (aNode.localName != "div")
coord.thickness = 0;
if (aNode.localName == "span")
coord.depth += STACK_THICKNESS;
return coord;
}
function test() {
waitForExplicitFinish();
ok(TiltUtils, "The TiltUtils object doesn't exist.");
let dom = TiltUtils.DOM;
ok(dom, "The TiltUtils.DOM wasn't found.");
init(function(iframe) {
let store = dom.traverse(iframe.contentWindow, {
nodeCallback: nodeCallback
});
let expected = [
{ name: "html", depth: 0 * STACK_THICKNESS, thickness: 0 },
{ name: "head", depth: 0 * STACK_THICKNESS, thickness: 0 },
{ name: "body", depth: 0 * STACK_THICKNESS, thickness: 0 },
{ name: "div", depth: 0 * STACK_THICKNESS, thickness: STACK_THICKNESS },
{ name: "p", depth: 1 * STACK_THICKNESS, thickness: 0 },
{ name: "div", depth: 1 * STACK_THICKNESS, thickness: STACK_THICKNESS },
{ name: "div", depth: 1 * STACK_THICKNESS, thickness: STACK_THICKNESS },
{ name: "span", depth: 3 * STACK_THICKNESS, thickness: 0 },
];
is(store.nodes.length, expected.length,
"The traverse() function didn't walk the correct number of nodes.");
is(store.info.length, expected.length,
"The traverse() function didn't examine the correct number of nodes.");
for (let i = 0; i < expected.length; i++) {
is(store.info[i].name, expected[i].name,
"traversed node " + (i + 1) + " isn't the expected one.");
is(store.info[i].coord.depth, expected[i].depth,
"traversed node " + (i + 1) + " doesn't have the expected depth.");
is(store.info[i].coord.thickness, expected[i].thickness,
"traversed node " + (i + 1) + " doesn't have the expected thickness.");
}
});
}

View File

@ -1,128 +0,0 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
function test() {
if (!isTiltEnabled()) {
aborting();
info("Skipping notifications test because Tilt isn't enabled.");
return;
}
if (!isWebGLSupported()) {
aborting();
info("Skipping visualizer test because WebGL isn't supported.");
return;
}
let webGLError = false;
let webGLLoad = false;
let visualizer = new TiltVisualizer({
chromeWindow: window,
contentWindow: gBrowser.selectedBrowser.contentWindow,
parentNode: gBrowser.selectedBrowser.parentNode,
notifications: Tilt.NOTIFICATIONS,
tab: gBrowser.selectedTab,
onError: function onWebGLError()
{
webGLError = true;
},
onLoad: function onWebGLLoad()
{
webGLLoad = true;
}
});
visualizer.init();
ok(webGLError ^ webGLLoad,
"The WebGL context should either be created or not.");
if (webGLError) {
info("Skipping visualizer test because WebGL couldn't be initialized.");
return;
}
ok(visualizer.canvas,
"Visualizer constructor should have created a child canvas object.");
ok(visualizer.presenter,
"Visualizer constructor should have created a child presenter object.");
ok(visualizer.controller,
"Visualizer constructor should have created a child controller object.");
ok(visualizer.isInitialized(),
"The visualizer should have been initialized properly.");
ok(visualizer.presenter.isInitialized(),
"The visualizer presenter should have been initialized properly.");
ok(visualizer.controller.isInitialized(),
"The visualizer controller should have been initialized properly.");
testPresenter(visualizer.presenter);
testController(visualizer.controller);
visualizer.removeOverlay();
is(visualizer.canvas.parentNode, null,
"The visualizer canvas wasn't removed from the parent node.");
visualizer.cleanup();
is(visualizer.presenter, undefined,
"The visualizer presenter wasn't destroyed.");
is(visualizer.controller, undefined,
"The visualizer controller wasn't destroyed.");
is(visualizer.canvas, undefined,
"The visualizer canvas wasn't destroyed.");
}
function testPresenter(presenter) {
ok(presenter._renderer,
"The presenter renderer wasn't initialized properly.");
ok(presenter._visualizationProgram,
"The presenter visualizationProgram wasn't initialized properly.");
ok(presenter._texture,
"The presenter texture wasn't initialized properly.");
ok(!presenter._meshStacks,
"The presenter meshStacks shouldn't be initialized yet.");
ok(!presenter._meshWireframe,
"The presenter meshWireframe shouldn't be initialized yet.");
ok(presenter._traverseData,
"The presenter nodesInformation wasn't initialized properly.");
ok(presenter._highlight,
"The presenter highlight wasn't initialized properly.");
ok(presenter._highlight.disabled,
"The presenter highlight should be initially disabled.");
ok(isApproxVec(presenter._highlight.v0, [0, 0, 0]),
"The presenter highlight first vertex should be initially zeroed.");
ok(isApproxVec(presenter._highlight.v1, [0, 0, 0]),
"The presenter highlight second vertex should be initially zeroed.");
ok(isApproxVec(presenter._highlight.v2, [0, 0, 0]),
"The presenter highlight third vertex should be initially zeroed.");
ok(isApproxVec(presenter._highlight.v3, [0, 0, 0]),
"The presenter highlight fourth vertex should be initially zeroed.");
ok(presenter.transforms,
"The presenter transforms wasn't initialized properly.");
is(presenter.transforms.zoom, 1,
"The presenter transforms zoom should be initially 1.");
ok(isApproxVec(presenter.transforms.offset, [0, 0, 0]),
"The presenter transforms offset should be initially zeroed.");
ok(isApproxVec(presenter.transforms.translation, [0, 0, 0]),
"The presenter transforms translation should be initially zeroed.");
ok(isApproxVec(presenter.transforms.rotation, [0, 0, 0, 1]),
"The presenter transforms rotation should be initially set to identity.");
presenter.setTranslation([1, 2, 3]);
presenter.setRotation([5, 6, 7, 8]);
ok(isApproxVec(presenter.transforms.translation, [1, 2, 3]),
"The presenter transforms translation wasn't modified as it should");
ok(isApproxVec(presenter.transforms.rotation, [5, 6, 7, 8]),
"The presenter transforms rotation wasn't modified as it should");
ok(presenter._redraw,
"The new transforms should have issued a redraw request.");
}
function testController(controller) {
ok(controller.arcball,
"The controller arcball wasn't initialized properly.");
ok(!controller.coordinates,
"The presenter meshWireframe shouldn't be initialized yet.");
}

View File

@ -1,117 +0,0 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
const ZOOM = 2;
const RESIZE = 50;
var tiltOpened = false;
function test() {
if (!isTiltEnabled()) {
aborting();
info("Skipping controller test because Tilt isn't enabled.");
return;
}
if (!isWebGLSupported()) {
aborting();
info("Skipping controller test because WebGL isn't supported.");
return;
}
waitForExplicitFinish();
if (window.windowState == window.STATE_MAXIMIZED) {
registerCleanupFunction(function () {
window.maximize();
});
window.addEventListener("resize", function onResize(event) {
if (event.target == window) {
window.removeEventListener("resize", onResize, false);
executeSoon(testTilt);
}
}, false);
window.restore();
} else {
testTilt();
}
}
function testTilt() {
createTab(function() {
TiltUtils.setDocumentZoom(window, ZOOM);
createTilt({
onTiltOpen: function(instance)
{
tiltOpened = true;
ok(isApprox(instance.presenter._getPageZoom(), ZOOM),
"The Highlighter zoom doesn't have the expected results.");
ok(isApprox(instance.presenter.transforms.zoom, ZOOM),
"The presenter transforms zoom wasn't initially set correctly.");
let contentWindow = gBrowser.selectedBrowser.contentWindow;
let initialWidth = contentWindow.innerWidth;
let initialHeight = contentWindow.innerHeight;
let renderer = instance.presenter._renderer;
let arcball = instance.controller.arcball;
ok(isApprox(contentWindow.innerWidth * ZOOM, renderer.width, 1),
"The renderer width wasn't set correctly before the resize.");
ok(isApprox(contentWindow.innerHeight * ZOOM, renderer.height, 1),
"The renderer height wasn't set correctly before the resize.");
ok(isApprox(contentWindow.innerWidth * ZOOM, arcball.width, 1),
"The arcball width wasn't set correctly before the resize.");
ok(isApprox(contentWindow.innerHeight * ZOOM, arcball.height, 1),
"The arcball height wasn't set correctly before the resize.");
window.addEventListener("resize", onResize, false);
window.resizeBy(-RESIZE * ZOOM, -RESIZE * ZOOM);
function onResize(event) {
if (event.target == window) {
window.removeEventListener("resize", onResize, false);
executeSoon(afterResize);
}
}
function afterResize() {
ok(isApprox(contentWindow.innerWidth + RESIZE, initialWidth, 1),
"The content window width wasn't set correctly after the resize.");
ok(isApprox(contentWindow.innerHeight + RESIZE, initialHeight, 1),
"The content window height wasn't set correctly after the resize.");
ok(isApprox(contentWindow.innerWidth * ZOOM, renderer.width, 1),
"The renderer width wasn't set correctly after the resize.");
ok(isApprox(contentWindow.innerHeight * ZOOM, renderer.height, 1),
"The renderer height wasn't set correctly after the resize.");
ok(isApprox(contentWindow.innerWidth * ZOOM, arcball.width, 1),
"The arcball width wasn't set correctly after the resize.");
ok(isApprox(contentWindow.innerHeight * ZOOM, arcball.height, 1),
"The arcball height wasn't set correctly after the resize.");
window.resizeBy(RESIZE * ZOOM, RESIZE * ZOOM);
Services.obs.addObserver(cleanup, DESTROYED, false);
Tilt.destroy(Tilt.currentWindowId);
}
}
}, false, function suddenDeath()
{
ok(false, "Tilt could not be initialized properly.");
cleanup();
});
});
}
function cleanup() {
if (tiltOpened) { Services.obs.removeObserver(cleanup, DESTROYED); }
gBrowser.removeCurrentTab();
finish();
}

View File

@ -1,214 +0,0 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
var {require} = Components.utils.import("resource://devtools/shared/Loader.jsm", {});
var TiltManager = require("devtools/client/tilt/tilt").TiltManager;
var TiltGL = require("devtools/client/tilt/tilt-gl");
var {EPSILON, TiltMath, vec3, mat3, mat4, quat4} = require("devtools/client/tilt/tilt-math");
var TiltUtils = require("devtools/client/tilt/tilt-utils");
var {TiltVisualizer} = require("devtools/client/tilt/tilt-visualizer");
var DevToolsUtils = require("devtools/shared/DevToolsUtils");
var {getRect, getIframeContentOffset} = require("devtools/shared/layout/utils");
const DEFAULT_HTML = "data:text/html," +
"<DOCTYPE html>" +
"<html>" +
"<head>" +
"<meta charset='utf-8'/>" +
"<title>Three Laws</title>" +
"</head>" +
"<body>" +
"<div id='first-law'>" +
"A robot may not injure a human being or, through inaction, allow a " +
"human being to come to harm." +
"</div>" +
"<div>" +
"A robot must obey the orders given to it by human beings, except " +
"where such orders would conflict with the First Law." +
"</div>" +
"<div>" +
"A robot must protect its own existence as long as such protection " +
"does not conflict with the First or Second Laws." +
"</div>" +
"<div id='far-far-away' style='position: absolute; top: 250%;'>" +
"I like bacon." +
"</div>" +
"<body>" +
"</html>";
var Tilt = TiltManager.getTiltForBrowser(window);
const STARTUP = Tilt.NOTIFICATIONS.STARTUP;
const INITIALIZING = Tilt.NOTIFICATIONS.INITIALIZING;
const INITIALIZED = Tilt.NOTIFICATIONS.INITIALIZED;
const DESTROYING = Tilt.NOTIFICATIONS.DESTROYING;
const BEFORE_DESTROYED = Tilt.NOTIFICATIONS.BEFORE_DESTROYED;
const DESTROYED = Tilt.NOTIFICATIONS.DESTROYED;
const SHOWN = Tilt.NOTIFICATIONS.SHOWN;
const HIDDEN = Tilt.NOTIFICATIONS.HIDDEN;
const HIGHLIGHTING = Tilt.NOTIFICATIONS.HIGHLIGHTING;
const UNHIGHLIGHTING = Tilt.NOTIFICATIONS.UNHIGHLIGHTING;
const NODE_REMOVED = Tilt.NOTIFICATIONS.NODE_REMOVED;
const TILT_ENABLED = Services.prefs.getBoolPref("devtools.tilt.enabled");
DevToolsUtils.testing = true;
SimpleTest.registerCleanupFunction(() => {
DevToolsUtils.testing = false;
});
function isTiltEnabled() {
info("Apparently, Tilt is" + (TILT_ENABLED ? "" : " not") + " enabled.");
return TILT_ENABLED;
}
function isWebGLSupported() {
let supported = !TiltGL.isWebGLForceEnabled() &&
TiltGL.isWebGLSupported() &&
TiltGL.create3DContext(createCanvas());
info("Apparently, WebGL is" + (supported ? "" : " not") + " supported.");
return supported;
}
function isApprox(num1, num2, delta) {
if (Math.abs(num1 - num2) > (delta || EPSILON)) {
info("isApprox expected " + num1 + ", got " + num2 + " instead.");
return false;
}
return true;
}
function isApproxVec(vec1, vec2, delta) {
vec1 = Array.prototype.slice.call(vec1);
vec2 = Array.prototype.slice.call(vec2);
if (vec1.length !== vec2.length) {
return false;
}
for (let i = 0, len = vec1.length; i < len; i++) {
if (!isApprox(vec1[i], vec2[i], delta)) {
info("isApproxVec expected [" + vec1 + "], got [" + vec2 + "] instead.");
return false;
}
}
return true;
}
function isEqualVec(vec1, vec2) {
vec1 = Array.prototype.slice.call(vec1);
vec2 = Array.prototype.slice.call(vec2);
if (vec1.length !== vec2.length) {
return false;
}
for (let i = 0, len = vec1.length; i < len; i++) {
if (vec1[i] !== vec2[i]) {
info("isEqualVec expected [" + vec1 + "], got [" + vec2 + "] instead.");
return false;
}
}
return true;
}
function createCanvas() {
return document.createElementNS("http://www.w3.org/1999/xhtml", "canvas");
}
function createTab(callback, location) {
info("Creating a tab, with callback " + typeof callback +
", and location " + location + ".");
let tab = gBrowser.selectedTab = gBrowser.addTab();
gBrowser.selectedBrowser.addEventListener("load", function onLoad() {
gBrowser.selectedBrowser.removeEventListener("load", onLoad, true);
callback(tab);
}, true);
gBrowser.selectedBrowser.contentWindow.location = location || DEFAULT_HTML;
return tab;
}
function createTilt(callbacks, close, suddenDeath) {
info("Creating Tilt, with callbacks {" + Object.keys(callbacks) + "}" +
", autoclose param " + close +
", and sudden death handler " + typeof suddenDeath + ".");
handleFailure(suddenDeath);
Services.prefs.setBoolPref("webgl.verbose", true);
TiltUtils.Output.suppressAlerts = true;
info("Attempting to start Tilt.");
Services.obs.addObserver(onTiltOpen, INITIALIZING, false);
Tilt.toggle();
function onTiltOpen() {
info("Tilt was opened.");
Services.obs.removeObserver(onTiltOpen, INITIALIZING);
executeSoon(function() {
if ("function" === typeof callbacks.onTiltOpen) {
info("Calling 'onTiltOpen'.");
callbacks.onTiltOpen(Tilt.visualizers[Tilt.currentWindowId]);
}
if (close) {
executeSoon(function() {
info("Attempting to close Tilt.");
Services.obs.addObserver(onTiltClose, DESTROYED, false);
Tilt.destroy(Tilt.currentWindowId);
});
}
});
}
function onTiltClose() {
info("Tilt was closed.");
Services.obs.removeObserver(onTiltClose, DESTROYED);
executeSoon(function() {
if ("function" === typeof callbacks.onTiltClose) {
info("Calling 'onTiltClose'.");
callbacks.onTiltClose();
}
if ("function" === typeof callbacks.onEnd) {
info("Calling 'onEnd'.");
callbacks.onEnd();
}
});
}
function handleFailure(suddenDeath) {
Tilt.failureCallback = function() {
info("Tilt FAIL.");
Services.obs.removeObserver(onTiltOpen, INITIALIZING);
info("Now relying on sudden death handler " + typeof suddenDeath + ".");
suddenDeath && suddenDeath();
}
}
}
function getPickablePoint(presenter) {
let vertices = presenter._meshStacks[0].vertices.components;
let topLeft = vec3.create([vertices[0], vertices[1], vertices[2]]);
let bottomRight = vec3.create([vertices[6], vertices[7], vertices[8]]);
let center = vec3.lerp(topLeft, bottomRight, 0.5, []);
let renderer = presenter._renderer;
let viewport = [0, 0, renderer.width, renderer.height];
return vec3.project(center, viewport, renderer.mvMatrix, renderer.projMatrix);
}
function aborting() {
// Tilt aborting and we need at least one pass, fail or todo so let's add a
// dummy pass.
ok(true, "Test aborted early.");
}

View File

@ -1,228 +0,0 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
"use strict";
const l10n = require("gcli/l10n");
// Fetch TiltManager using the current loader, but don't save a
// reference to it, because it might change with a tool reload.
// We can clean this up once the command line is loadered.
Object.defineProperty(this, "TiltManager", {
get: function() {
return require("devtools/client/tilt/tilt").TiltManager;
},
enumerable: true
});
exports.items = [
{
name: "tilt",
description: l10n.lookup("tiltDesc"),
manual: l10n.lookup("tiltManual"),
hidden: true
},
{
name: "tilt open",
runAt: "client",
description: l10n.lookup("tiltOpenDesc"),
manual: l10n.lookup("tiltOpenManual"),
hidden: true,
exec: function(args, context) {
if (isMultiProcess(context)) {
return l10n.lookupFormat("notAvailableInE10S", [this.name]);
}
let chromeWindow = context.environment.chromeDocument.defaultView;
let Tilt = TiltManager.getTiltForBrowser(chromeWindow);
if (!Tilt.currentInstance) {
Tilt.toggle();
}
}
},
{
name: "tilt toggle",
runAt: "client",
buttonId: "command-button-tilt",
buttonClass: "command-button command-button-invertable",
tooltipText: l10n.lookup("tiltToggleTooltip"),
hidden: true,
state: {
isChecked: function(aTarget) {
if (!aTarget.tab) {
return false;
}
let browserWindow = aTarget.tab.ownerDocument.defaultView;
return !!TiltManager.getTiltForBrowser(browserWindow).currentInstance;
},
onChange: function(aTarget, aChangeHandler) {
if (!aTarget.tab) {
return;
}
let browserWindow = aTarget.tab.ownerDocument.defaultView;
let tilt = TiltManager.getTiltForBrowser(browserWindow);
tilt.on("change", aChangeHandler);
},
offChange: function(aTarget, aChangeHandler) {
if (!aTarget.tab) {
return;
}
let browserWindow = aTarget.tab.ownerDocument.defaultView;
let tilt = TiltManager.getTiltForBrowser(browserWindow);
tilt.off("change", aChangeHandler);
},
},
exec: function(args, context) {
if (isMultiProcess(context)) {
return l10n.lookupFormat("notAvailableInE10S", [this.name]);
}
let chromeWindow = context.environment.chromeDocument.defaultView;
let Tilt = TiltManager.getTiltForBrowser(chromeWindow);
Tilt.toggle();
}
},
{
name: "tilt translate",
runAt: "client",
description: l10n.lookup("tiltTranslateDesc"),
manual: l10n.lookup("tiltTranslateManual"),
hidden: true,
params: [
{
name: "x",
type: "number",
defaultValue: 0,
description: l10n.lookup("tiltTranslateXDesc"),
manual: l10n.lookup("tiltTranslateXManual")
},
{
name: "y",
type: "number",
defaultValue: 0,
description: l10n.lookup("tiltTranslateYDesc"),
manual: l10n.lookup("tiltTranslateYManual")
}
],
exec: function(args, context) {
if (isMultiProcess(context)) {
return l10n.lookupFormat("notAvailableInE10S", [this.name]);
}
let chromeWindow = context.environment.chromeDocument.defaultView;
let Tilt = TiltManager.getTiltForBrowser(chromeWindow);
if (Tilt.currentInstance) {
Tilt.currentInstance.controller.arcball.translate([args.x, args.y]);
}
}
},
{
name: "tilt rotate",
runAt: "client",
description: l10n.lookup("tiltRotateDesc"),
manual: l10n.lookup("tiltRotateManual"),
hidden: true,
params: [
{
name: "x",
type: { name: 'number', min: -360, max: 360, step: 10 },
defaultValue: 0,
description: l10n.lookup("tiltRotateXDesc"),
manual: l10n.lookup("tiltRotateXManual")
},
{
name: "y",
type: { name: 'number', min: -360, max: 360, step: 10 },
defaultValue: 0,
description: l10n.lookup("tiltRotateYDesc"),
manual: l10n.lookup("tiltRotateYManual")
},
{
name: "z",
type: { name: 'number', min: -360, max: 360, step: 10 },
defaultValue: 0,
description: l10n.lookup("tiltRotateZDesc"),
manual: l10n.lookup("tiltRotateZManual")
}
],
exec: function(args, context) {
if (isMultiProcess(context)) {
return l10n.lookupFormat("notAvailableInE10S", [this.name]);
}
let chromeWindow = context.environment.chromeDocument.defaultView;
let Tilt = TiltManager.getTiltForBrowser(chromeWindow);
if (Tilt.currentInstance) {
Tilt.currentInstance.controller.arcball.rotate([args.x, args.y, args.z]);
}
}
},
{
name: "tilt zoom",
runAt: "client",
description: l10n.lookup("tiltZoomDesc"),
manual: l10n.lookup("tiltZoomManual"),
hidden: true,
params: [
{
name: "zoom",
type: { name: 'number' },
description: l10n.lookup("tiltZoomAmountDesc"),
manual: l10n.lookup("tiltZoomAmountManual")
}
],
exec: function(args, context) {
if (isMultiProcess(context)) {
return l10n.lookupFormat("notAvailableInE10S", [this.name]);
}
let chromeWindow = context.environment.chromeDocument.defaultView;
let Tilt = TiltManager.getTiltForBrowser(chromeWindow);
if (Tilt.currentInstance) {
Tilt.currentInstance.controller.arcball.zoom(-args.zoom);
}
}
},
{
name: "tilt reset",
runAt: "client",
description: l10n.lookup("tiltResetDesc"),
manual: l10n.lookup("tiltResetManual"),
hidden: true,
exec: function(args, context) {
if (isMultiProcess(context)) {
return l10n.lookupFormat("notAvailableInE10S", [this.name]);
}
let chromeWindow = context.environment.chromeDocument.defaultView;
let Tilt = TiltManager.getTiltForBrowser(chromeWindow);
if (Tilt.currentInstance) {
Tilt.currentInstance.controller.arcball.reset();
}
}
},
{
name: "tilt close",
runAt: "client",
description: l10n.lookup("tiltCloseDesc"),
manual: l10n.lookup("tiltCloseManual"),
hidden: true,
exec: function(args, context) {
if (isMultiProcess(context)) {
return l10n.lookupFormat("notAvailableInE10S", [this.name]);
}
let chromeWindow = context.environment.chromeDocument.defaultView;
let Tilt = TiltManager.getTiltForBrowser(chromeWindow);
Tilt.destroy(Tilt.currentWindowId);
}
}
];
function isMultiProcess(context) {
return !context.environment.window;
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,614 +0,0 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set ts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
"use strict";
const {Cc, Ci, Cu} = require("chrome");
const {getRect} = require("devtools/shared/layout/utils");
const Services = require("Services");
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
const STACK_THICKNESS = 15;
/**
* Module containing various helper functions used throughout Tilt.
*/
this.TiltUtils = {};
module.exports = this.TiltUtils;
/**
* Various console/prompt output functions required by the engine.
*/
TiltUtils.Output = {
/**
* Logs a message to the console.
*
* @param {String} aMessage
* the message to be logged
*/
log: function TUO_log(aMessage)
{
if (this.suppressLogs) {
return;
}
// get the console service
let consoleService = Cc["@mozilla.org/consoleservice;1"]
.getService(Ci.nsIConsoleService);
// log the message
consoleService.logStringMessage(aMessage);
},
/**
* Logs an error to the console.
*
* @param {String} aMessage
* the message to be logged
* @param {Object} aProperties
* and object containing script error initialization details
*/
error: function TUO_error(aMessage, aProperties)
{
if (this.suppressErrors) {
return;
}
// make sure the properties parameter is a valid object
aProperties = aProperties || {};
// get the console service
let consoleService = Cc["@mozilla.org/consoleservice;1"]
.getService(Ci.nsIConsoleService);
// get the script error service
let scriptError = Cc["@mozilla.org/scripterror;1"]
.createInstance(Ci.nsIScriptError);
// initialize a script error
scriptError.init(aMessage,
aProperties.sourceName || "",
aProperties.sourceLine || "",
aProperties.lineNumber || 0,
aProperties.columnNumber || 0,
aProperties.flags || 0,
aProperties.category || "");
// log the error
consoleService.logMessage(scriptError);
},
/**
* Shows a modal alert message popup.
*
* @param {String} aTitle
* the title of the popup
* @param {String} aMessage
* the message to be logged
*/
alert: function TUO_alert(aTitle, aMessage)
{
if (this.suppressAlerts) {
return;
}
if (!aMessage) {
aMessage = aTitle;
aTitle = "";
}
// get the prompt service
let prompt = Cc["@mozilla.org/embedcomp/prompt-service;1"]
.getService(Ci.nsIPromptService);
// show the alert message
prompt.alert(null, aTitle, aMessage);
}
};
/**
* Helper functions for managing preferences.
*/
TiltUtils.Preferences = {
/**
* Gets a custom Tilt preference.
* If the preference does not exist, undefined is returned. If it does exist,
* but the type is not correctly specified, null is returned.
*
* @param {String} aPref
* the preference name
* @param {String} aType
* either "boolean", "string" or "integer"
*
* @return {Boolean | String | Number} the requested preference
*/
get: function TUP_get(aPref, aType)
{
if (!aPref || !aType) {
return;
}
try {
let prefs = this._branch;
switch(aType) {
case "boolean":
return prefs.getBoolPref(aPref);
case "string":
return prefs.getCharPref(aPref);
case "integer":
return prefs.getIntPref(aPref);
}
return null;
} catch(e) {
// handle any unexpected exceptions
TiltUtils.Output.error(e.message);
return undefined;
}
},
/**
* Sets a custom Tilt preference.
* If the preference already exists, it is overwritten.
*
* @param {String} aPref
* the preference name
* @param {String} aType
* either "boolean", "string" or "integer"
* @param {String} aValue
* a new preference value
*
* @return {Boolean} true if the preference was set successfully
*/
set: function TUP_set(aPref, aType, aValue)
{
if (!aPref || !aType || aValue === undefined || aValue === null) {
return;
}
try {
let prefs = this._branch;
switch(aType) {
case "boolean":
return prefs.setBoolPref(aPref, aValue);
case "string":
return prefs.setCharPref(aPref, aValue);
case "integer":
return prefs.setIntPref(aPref, aValue);
}
} catch(e) {
// handle any unexpected exceptions
TiltUtils.Output.error(e.message);
}
return false;
},
/**
* Creates a custom Tilt preference.
* If the preference already exists, it is left unchanged.
*
* @param {String} aPref
* the preference name
* @param {String} aType
* either "boolean", "string" or "integer"
* @param {String} aValue
* the initial preference value
*
* @return {Boolean} true if the preference was initialized successfully
*/
create: function TUP_create(aPref, aType, aValue)
{
if (!aPref || !aType || aValue === undefined || aValue === null) {
return;
}
try {
let prefs = this._branch;
if (!prefs.prefHasUserValue(aPref)) {
switch(aType) {
case "boolean":
return prefs.setBoolPref(aPref, aValue);
case "string":
return prefs.setCharPref(aPref, aValue);
case "integer":
return prefs.setIntPref(aPref, aValue);
}
}
} catch(e) {
// handle any unexpected exceptions
TiltUtils.Output.error(e.message);
}
return false;
},
/**
* The preferences branch for this extension.
*/
_branch: (function(aBranch) {
return Cc["@mozilla.org/preferences-service;1"]
.getService(Ci.nsIPrefService)
.getBranch(aBranch);
}("devtools.tilt."))
};
/**
* Easy way to access the string bundle.
*/
TiltUtils.L10n = {
/**
* The string bundle element.
*/
stringBundle: null,
/**
* Returns a string in the string bundle.
* If the string bundle is not found, null is returned.
*
* @param {String} aName
* the string name in the bundle
*
* @return {String} the equivalent string from the bundle
*/
get: function TUL_get(aName)
{
// check to see if the parent string bundle document element is valid
if (!this.stringBundle || !aName) {
return null;
}
return this.stringBundle.GetStringFromName(aName);
},
/**
* Returns a formatted string using the string bundle.
* If the string bundle is not found, null is returned.
*
* @param {String} aName
* the string name in the bundle
* @param {Array} aArgs
* an array of arguments for the formatted string
*
* @return {String} the equivalent formatted string from the bundle
*/
format: function TUL_format(aName, aArgs)
{
// check to see if the parent string bundle document element is valid
if (!this.stringBundle || !aName || !aArgs) {
return null;
}
return this.stringBundle.formatStringFromName(aName, aArgs, aArgs.length);
}
};
/**
* Utilities for accessing and manipulating a document.
*/
TiltUtils.DOM = {
/**
* Current parent node object used when creating canvas elements.
*/
parentNode: null,
/**
* Helper method, allowing to easily create and manage a canvas element.
* If the width and height params are falsy, they default to the parent node
* client width and height.
*
* @param {Document} aParentNode
* the parent node used to create the canvas
* if not specified, it will be reused from the cache
* @param {Object} aProperties
* optional, object containing some of the following props:
* {Boolean} focusable
* optional, true to make the canvas focusable
* {Boolean} append
* optional, true to append the canvas to the parent node
* {Number} width
* optional, specifies the width of the canvas
* {Number} height
* optional, specifies the height of the canvas
* {String} id
* optional, id for the created canvas element
*
* @return {HTMLCanvasElement} the newly created canvas element
*/
initCanvas: function TUD_initCanvas(aParentNode, aProperties)
{
// check to see if the parent node element is valid
if (!(aParentNode = aParentNode || this.parentNode)) {
return null;
}
// make sure the properties parameter is a valid object
aProperties = aProperties || {};
// cache this parent node so that it can be reused
this.parentNode = aParentNode;
// create the canvas element
let canvas = aParentNode.ownerDocument.
createElementNS("http://www.w3.org/1999/xhtml", "canvas");
let width = aProperties.width || aParentNode.clientWidth;
let height = aProperties.height || aParentNode.clientHeight;
let id = aProperties.id || null;
canvas.setAttribute("style", "min-width: 1px; min-height: 1px;");
canvas.setAttribute("width", width);
canvas.setAttribute("height", height);
canvas.setAttribute("id", id);
// the canvas is unfocusable by default, we may require otherwise
if (aProperties.focusable) {
canvas.setAttribute("tabindex", "1");
canvas.style.outline = "none";
}
// append the canvas element to the current parent node, if specified
if (aProperties.append) {
aParentNode.appendChild(canvas);
}
return canvas;
},
/**
* Gets the full webpage dimensions (width and height).
*
* @param {Window} aContentWindow
* the content window holding the document
*
* @return {Object} an object containing the width and height coords
*/
getContentWindowDimensions: function TUD_getContentWindowDimensions(
aContentWindow)
{
return {
width: aContentWindow.innerWidth +
aContentWindow.scrollMaxX - aContentWindow.scrollMinX,
height: aContentWindow.innerHeight +
aContentWindow.scrollMaxY - aContentWindow.scrollMinY
};
},
/**
* Calculates the position and depth to display a node, this can be overriden
* to change the visualization.
*
* @param {Window} aContentWindow
* the window content holding the document
* @param {Node} aNode
* the node to get the position for
* @param {Object} aParentPosition
* the position of the parent node, as returned by this
* function
*
* @return {Object} an object describing the node's position in 3D space
* containing the following properties:
* {Number} top
* distance along the x axis
* {Number} left
* distance along the y axis
* {Number} depth
* distance along the z axis
* {Number} width
* width of the node
* {Number} height
* height of the node
* {Number} thickness
* thickness of the node
*/
getNodePosition: function TUD_getNodePosition(aContentWindow, aNode,
aParentPosition) {
// get the x, y, width and height coordinates of the node
let coord = getRect(aContentWindow, aNode, aContentWindow);
if (!coord) {
return null;
}
coord.depth = aParentPosition ? (aParentPosition.depth + aParentPosition.thickness) : 0;
coord.thickness = STACK_THICKNESS;
return coord;
},
/**
* Traverses a document object model & calculates useful info for each node.
*
* @param {Window} aContentWindow
* the window content holding the document
* @param {Object} aProperties
* optional, an object containing the following properties:
* {Function} nodeCallback
* a function to call instead of TiltUtils.DOM.getNodePosition
* to get the position and depth to display nodes
* {Object} invisibleElements
* elements which should be ignored
* {Number} minSize
* the minimum dimensions needed for a node to be traversed
* {Number} maxX
* the maximum left position of an element
* {Number} maxY
* the maximum top position of an element
*
* @return {Array} list containing nodes positions and local names
*/
traverse: function TUD_traverse(aContentWindow, aProperties)
{
// make sure the properties parameter is a valid object
aProperties = aProperties || {};
let aInvisibleElements = aProperties.invisibleElements || {};
let aMinSize = aProperties.minSize || -1;
let aMaxX = aProperties.maxX || Number.MAX_VALUE;
let aMaxY = aProperties.maxY || Number.MAX_VALUE;
let nodeCallback = aProperties.nodeCallback || this.getNodePosition.bind(this);
let nodes = aContentWindow.document.childNodes;
let store = { info: [], nodes: [] };
let depth = 0;
let queue = [
{ parentPosition: null, nodes: aContentWindow.document.childNodes }
]
while (queue.length) {
let { nodes, parentPosition } = queue.shift();
for (let node of nodes) {
// skip some nodes to avoid visualization meshes that are too bloated
let name = node.localName;
if (!name || aInvisibleElements[name]) {
continue;
}
let coord = nodeCallback(aContentWindow, node, parentPosition);
if (!coord) {
continue;
}
// the maximum size slices the traversal where needed
if (coord.left > aMaxX || coord.top > aMaxY) {
continue;
}
// use this node only if it actually has visible dimensions
if (coord.width > aMinSize && coord.height > aMinSize) {
// save the necessary details into a list to be returned later
store.info.push({ coord: coord, name: name });
store.nodes.push(node);
}
let childNodes = (name === "iframe" || name === "frame") ? node.contentDocument.childNodes : node.childNodes;
if (childNodes.length > 0)
queue.push({ parentPosition: coord, nodes: childNodes });
}
}
return store;
}
};
/**
* Binds a new owner object to the child functions.
* If the new parent is not specified, it will default to the passed scope.
*
* @param {Object} aScope
* the object from which all functions will be rebound
* @param {String} aRegex
* a regular expression to identify certain functions
* @param {Object} aParent
* the new parent for the object's functions
*/
TiltUtils.bindObjectFunc = function TU_bindObjectFunc(aScope, aRegex, aParent)
{
if (!aScope) {
return;
}
for (let i in aScope) {
try {
if ("function" === typeof aScope[i] && (aRegex ? i.match(aRegex) : 1)) {
aScope[i] = aScope[i].bind(aParent || aScope);
}
} catch(e) {
TiltUtils.Output.error(e);
}
}
};
/**
* Destroys an object and deletes all members.
*
* @param {Object} aScope
* the object from which all children will be destroyed
*/
TiltUtils.destroyObject = function TU_destroyObject(aScope)
{
if (!aScope) {
return;
}
// objects in Tilt usually use a function to handle internal destruction
if ("function" === typeof aScope._finalize) {
aScope._finalize();
}
for (let i in aScope) {
if (aScope.hasOwnProperty(i)) {
delete aScope[i];
}
}
};
/**
* Retrieve the unique ID of a window object.
*
* @param {Window} aWindow
* the window to get the ID from
*
* @return {Number} the window ID
*/
TiltUtils.getWindowId = function TU_getWindowId(aWindow)
{
if (!aWindow) {
return;
}
return aWindow.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIDOMWindowUtils)
.currentInnerWindowID;
};
/**
* Sets the markup document viewer zoom for the currently selected browser.
*
* @param {Window} aChromeWindow
* the top-level browser window
*
* @param {Number} the zoom ammount
*/
TiltUtils.setDocumentZoom = function TU_setDocumentZoom(aChromeWindow, aZoom) {
aChromeWindow.gBrowser.selectedBrowser.markupDocumentViewer.fullZoom = aZoom;
};
/**
* Performs a garbage collection.
*
* @param {Window} aChromeWindow
* the top-level browser window
*/
TiltUtils.gc = function TU_gc(aChromeWindow)
{
aChromeWindow.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIDOMWindowUtils)
.garbageCollect();
};
/**
* Clears the cache and sets all the variables to null.
*/
TiltUtils.clearCache = function TU_clearCache()
{
TiltUtils.DOM.parentNode = null;
};
// bind the owner object to the necessary functions
TiltUtils.bindObjectFunc(TiltUtils.Output);
TiltUtils.bindObjectFunc(TiltUtils.Preferences);
TiltUtils.bindObjectFunc(TiltUtils.L10n);
TiltUtils.bindObjectFunc(TiltUtils.DOM);
// set the necessary string bundle
XPCOMUtils.defineLazyGetter(TiltUtils.L10n, "stringBundle", function() {
return Services.strings.createBundle(
"chrome://devtools/locale/tilt.properties");
});

View File

@ -1,46 +0,0 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set ts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
"use strict";
var {TiltMath} = require("devtools/client/tilt/tilt-math");
var rgba = TiltMath.hex2rgba;
/**
* Various colors and style settings used throughout Tilt.
*/
module.exports = {
canvas: {
background: "linear-gradient(#454545 0%, #000 100%)",
},
nodes: {
highlight: {
defaultFill: rgba("#555"),
defaultStroke: rgba("#000"),
defaultStrokeWeight: 1
},
html: rgba("#8880"),
body: rgba("#fff0"),
h1: rgba("#e667af"),
h2: rgba("#c667af"),
h3: rgba("#a667af"),
h4: rgba("#8667af"),
h5: rgba("#8647af"),
h6: rgba("#8627af"),
div: rgba("#5dc8cd"),
span: rgba("#67e46f"),
table: rgba("#ff0700"),
tr: rgba("#ff4540"),
td: rgba("#ff7673"),
ul: rgba("#4671d5"),
li: rgba("#6c8cd5"),
p: rgba("#aaa"),
a: rgba("#123eab"),
img: rgba("#ffb473"),
iframe: rgba("#85004b")
}
};

File diff suppressed because it is too large Load Diff

View File

@ -1,264 +0,0 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set ts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
"use strict";
const {Cu} = require("chrome");
var {TiltVisualizer} = require("devtools/client/tilt/tilt-visualizer");
var TiltGL = require("devtools/client/tilt/tilt-gl");
var TiltUtils = require("devtools/client/tilt/tilt-utils");
var EventEmitter = require("devtools/shared/event-emitter");
var Telemetry = require("devtools/client/shared/telemetry");
var Services = require("Services");
// Tilt notifications dispatched through the nsIObserverService.
const TILT_NOTIFICATIONS = {
// Called early in the startup of a new tilt instance
STARTUP: "tilt-startup",
// Fires when Tilt starts the initialization.
INITIALIZING: "tilt-initializing",
// Fires immediately after initialization is complete.
// (when the canvas overlay is visible and the 3D mesh is completely created)
INITIALIZED: "tilt-initialized",
// Fires immediately before the destruction is started.
DESTROYING: "tilt-destroying",
// Fires immediately before the destruction is finished.
// (just before the canvas overlay is removed from its parent node)
BEFORE_DESTROYED: "tilt-before-destroyed",
// Fires when Tilt is completely destroyed.
DESTROYED: "tilt-destroyed",
// Fires when Tilt is shown (after a tab-switch).
SHOWN: "tilt-shown",
// Fires when Tilt is hidden (after a tab-switch).
HIDDEN: "tilt-hidden",
// Fires once Tilt highlights an element in the page.
HIGHLIGHTING: "tilt-highlighting",
// Fires once Tilt stops highlighting any element.
UNHIGHLIGHTING: "tilt-unhighlighting",
// Fires when a node is removed from the 3D mesh.
NODE_REMOVED: "tilt-node-removed"
};
var TiltManager = {
_instances: new WeakMap(),
getTiltForBrowser: function(aChromeWindow)
{
if (this._instances.has(aChromeWindow)) {
return this._instances.get(aChromeWindow);
} else {
let tilt = new Tilt(aChromeWindow);
this._instances.set(aChromeWindow, tilt);
return tilt;
}
},
}
exports.TiltManager = TiltManager;
/**
* Object managing instances of the visualizer.
*
* @param {Window} aWindow
* the chrome window used by each visualizer instance
*/
function Tilt(aWindow)
{
/**
* Save a reference to the top-level window.
*/
this.chromeWindow = aWindow;
/**
* All the instances of TiltVisualizer.
*/
this.visualizers = {};
/**
* Shortcut for accessing notifications strings.
*/
this.NOTIFICATIONS = TILT_NOTIFICATIONS;
EventEmitter.decorate(this);
this.setup();
this._telemetry = new Telemetry();
}
Tilt.prototype = {
/**
* Initializes a visualizer for the current tab or closes it if already open.
*/
toggle: function T_toggle()
{
let contentWindow = this.chromeWindow.gBrowser.selectedBrowser.contentWindow;
let id = this.currentWindowId;
let self = this;
contentWindow.addEventListener("beforeunload", function onUnload() {
contentWindow.removeEventListener("beforeunload", onUnload, false);
self.destroy(id, true);
}, false);
// if the visualizer for the current tab is already open, destroy it now
if (this.visualizers[id]) {
this.destroy(id, true);
this._telemetry.toolClosed("tilt");
return;
} else {
this._telemetry.toolOpened("tilt");
}
// create a visualizer instance for the current tab
this.visualizers[id] = new TiltVisualizer({
chromeWindow: this.chromeWindow,
contentWindow: contentWindow,
parentNode: this.chromeWindow.gBrowser.selectedBrowser.parentNode,
notifications: this.NOTIFICATIONS,
tab: this.chromeWindow.gBrowser.selectedTab
});
Services.obs.notifyObservers(contentWindow, TILT_NOTIFICATIONS.STARTUP, null);
this.visualizers[id].init();
// make sure the visualizer object was initialized properly
if (!this.visualizers[id].isInitialized()) {
this.destroy(id);
this.failureCallback && this.failureCallback();
return;
}
this.lastInstanceId = id;
// E10S: We should be using target here. See bug 1028234
this.emit("change", { tab: this.chromeWindow.gBrowser.selectedTab });
Services.obs.notifyObservers(contentWindow, TILT_NOTIFICATIONS.INITIALIZING, null);
},
/**
* Starts destroying a specific instance of the visualizer.
*
* @param {String} aId
* the identifier of the instance in the visualizers array
* @param {Boolean} aAnimateFlag
* optional, set to true to display a destruction transition
*/
destroy: function T_destroy(aId, aAnimateFlag)
{
// if the visualizer is destroyed or destroying, don't do anything
if (!this.visualizers[aId] || this._isDestroying) {
return;
}
this._isDestroying = true;
let controller = this.visualizers[aId].controller;
let presenter = this.visualizers[aId].presenter;
let content = presenter.contentWindow;
let pageXOffset = content.pageXOffset * presenter.transforms.zoom;
let pageYOffset = content.pageYOffset * presenter.transforms.zoom;
TiltUtils.setDocumentZoom(this.chromeWindow, presenter.transforms.zoom);
// if we're not doing any outro animation, just finish destruction directly
if (!aAnimateFlag) {
this._finish(aId);
return;
}
// otherwise, trigger the outro animation and notify necessary observers
Services.obs.notifyObservers(content, TILT_NOTIFICATIONS.DESTROYING, null);
controller.removeEventListeners();
controller.arcball.reset([-pageXOffset, -pageYOffset]);
presenter.executeDestruction(this._finish.bind(this, aId));
},
/**
* Finishes detroying a specific instance of the visualizer.
*
* @param {String} aId
* the identifier of the instance in the visualizers array
*/
_finish: function T__finish(aId)
{
let contentWindow = this.visualizers[aId].presenter.contentWindow;
this.visualizers[aId].removeOverlay();
this.visualizers[aId].cleanup();
this.visualizers[aId] = null;
this._isDestroying = false;
this.chromeWindow.gBrowser.selectedBrowser.focus();
// E10S: We should be using target here. See bug 1028234
this.emit("change", { tab: this.chromeWindow.gBrowser.selectedTab });
Services.obs.notifyObservers(contentWindow, TILT_NOTIFICATIONS.DESTROYED, null);
},
/**
* Handles the event fired when a tab is selected.
*/
_onTabSelect: function T__onTabSelect()
{
if (this.visualizers[this.lastInstanceId]) {
let contentWindow = this.visualizers[this.lastInstanceId].presenter.contentWindow;
Services.obs.notifyObservers(contentWindow, TILT_NOTIFICATIONS.HIDDEN, null);
}
if (this.currentInstance) {
let contentWindow = this.currentInstance.presenter.contentWindow;
Services.obs.notifyObservers(contentWindow, TILT_NOTIFICATIONS.SHOWN, null);
}
this.lastInstanceId = this.currentWindowId;
},
/**
* Add the browser event listeners to handle state changes.
*/
setup: function T_setup()
{
// load the preferences from the devtools.tilt branch
TiltVisualizer.Prefs.load();
this.chromeWindow.gBrowser.tabContainer.addEventListener(
"TabSelect", this._onTabSelect.bind(this), false);
},
/**
* Returns true if this tool is enabled.
*/
get enabled()
{
return (TiltVisualizer.Prefs.enabled &&
(TiltGL.isWebGLForceEnabled() || TiltGL.isWebGLSupported()));
},
/**
* Gets the ID of the current window object to identify the visualizer.
*/
get currentWindowId()
{
return TiltUtils.getWindowId(
this.chromeWindow.gBrowser.selectedBrowser.contentWindow);
},
/**
* Gets the visualizer instance for the current tab.
*/
get currentInstance()
{
return this.visualizers[this.currentWindowId];
},
};

View File

@ -335,140 +335,6 @@ eyedropperManual=Open a panel that magnifies an area of page to inspect pixels a
# tooltip of button in devtools toolbox which toggles the Eyedropper tool.
eyedropperTooltip=Grab a color from the page
# LOCALIZATION NOTE (tiltDesc) A very short description of the 'tilt'
# command. See tiltManual for a fuller description of what it does. This
# string is designed to be shown in a menu alongside the command name, which
# is why it should be as short as possible.
tiltDesc=Visualize the webpage in 3D
# LOCALIZATION NOTE (tiltManual) A fuller description of the 'tilt'
# command, displayed when the user asks for help on what it does.
tiltManual=Investigate the relationship between various parts of a webpage and their ancestors in a 3D environment
# LOCALIZATION NOTE (tiltOpenDesc) A very short description of the 'tilt inspect'
# command. See tiltOpenManual for a fuller description of what it does. This
# string is designed to be shown in a menu alongside the command name, which
# is why it should be as short as possible.
tiltOpenDesc=Open the Inspector 3D view
# LOCALIZATION NOTE (tiltOpenManual) A fuller description of the 'tilt translate'
# command, displayed when the user asks for help on what it does.
tiltOpenManual=Initialize the 3D page inspector and optionally highlight a node using a CSS selector
# LOCALIZATION NOTE (tiltToggleTooltip) A string displayed as the
# tooltip of button in devtools toolbox which toggles Tilt 3D View.
tiltToggleTooltip=3D View
# LOCALIZATION NOTE (tiltTranslateDesc) A very short description of the 'tilt translate'
# command. See tiltTranslateManual for a fuller description of what it does. This
# string is designed to be shown in a menu alongside the command name, which
# is why it should be as short as possible.
tiltTranslateDesc=Move the webpage mesh
# LOCALIZATION NOTE (tiltTranslateManual) A fuller description of the 'tilt translate'
# command, displayed when the user asks for help on what it does.
tiltTranslateManual=Incrementally translate the webpage mesh in a certain direction
# LOCALIZATION NOTE (tiltTranslateXDesc) A very short string to describe the
# 'x' parameter to the 'tilt translate' command, which is displayed in a dialog
# when the user is using this command.
tiltTranslateXDesc=X (pixels)
# LOCALIZATION NOTE (tiltTranslateXManual) A fuller description of the 'x'
# parameter to the 'translate' command, displayed when the user asks for help
# on what it does.
tiltTranslateXManual=The amount in pixels to translate the webpage mesh on the X axis
# LOCALIZATION NOTE (tiltTranslateYDesc) A very short string to describe the
# 'y' parameter to the 'tilt translate' command, which is displayed in a dialog
# when the user is using this command.
tiltTranslateYDesc=Y (pixels)
# LOCALIZATION NOTE (tiltTranslateYManual) A fuller description of the 'y'
# parameter to the 'translate' command, displayed when the user asks for help
# on what it does.
tiltTranslateYManual=The amount in pixels to translate the webpage mesh on the Y axis
# LOCALIZATION NOTE (tiltRotateDesc) A very short description of the 'tilt rotate'
# command. See tiltRotateManual for a fuller description of what it does. This
# string is designed to be shown in a menu alongside the command name, which
# is why it should be as short as possible.
tiltRotateDesc=Spin the webpage mesh
# LOCALIZATION NOTE (tiltRotateManual) A fuller description of the 'tilt rotate'
# command, displayed when the user asks for help on what it does.
tiltRotateManual=Incrementally rotate the webpage mesh in a certain direction
# LOCALIZATION NOTE (tiltRotateXDesc) A very short string to describe the
# 'x' parameter to the 'tilt rotate' command, which is displayed in a dialog
# when the user is using this command.
tiltRotateXDesc=X (degrees)
# LOCALIZATION NOTE (tiltRotateXManual) A fuller description of the 'x'
# parameter to the 'rotate' command, displayed when the user asks for help
# on what it does.
tiltRotateXManual=The amount in degrees to rotate the webpage mesh along the X axis
# LOCALIZATION NOTE (tiltRotateYDesc) A very short string to describe the
# 'y' parameter to the 'tilt rotate' command, which is displayed in a dialog
# when the user is using this command.
tiltRotateYDesc=Y (degrees)
# LOCALIZATION NOTE (tiltRotateYManual) A fuller description of the 'y'
# parameter to the 'rotate' command, displayed when the user asks for help
# on what it does.
tiltRotateYManual=The amount in degrees to rotate the webpage mesh along the Y axis
# LOCALIZATION NOTE (tiltRotateZDesc) A very short string to describe the
# 'z' parameter to the 'tilt rotate' command, which is displayed in a dialog
# when the user is using this command.
tiltRotateZDesc=Z (degrees)
# LOCALIZATION NOTE (tiltRotateZManual) A fuller description of the 'z'
# parameter to the 'rotate' command, displayed when the user asks for help
# on what it does.
tiltRotateZManual=The amount in degrees to rotate the webpage mesh along the Z axis
# LOCALIZATION NOTE (tiltZoomDesc) A very short description of the 'tilt zoom'
# command. See tiltZoomManual for a fuller description of what it does. This
# string is designed to be shown in a menu alongside the command name, which
# is why it should be as short as possible.
tiltZoomDesc=Move away or towards the webpage mesh
# LOCALIZATION NOTE (tiltZoomManual) A fuller description of the 'tilt zoom'
# command, displayed when the user asks for help on what it does.
tiltZoomManual=Incrementally move the webpage mesh in a certain direction along the Z axis
# LOCALIZATION NOTE (tiltZoomAmountDesc) A very short string to describe the
# 'zoom' parameter to the 'tilt zoom' command, which is displayed in a dialog
# when the user is using this command.
tiltZoomAmountDesc=Zoom (pixels)
# LOCALIZATION NOTE (tiltZoomAmmuntManual) A fuller description of the 'zoom'
# parameter to the 'zoom' command, displayed when the user asks for help
# on what it does.
tiltZoomAmountManual=The amount in pixels to translate the webpage mesh along the Z axis
# LOCALIZATION NOTE (tiltResetDesc) A very short description of the 'tilt reset'
# command. See tiltResetManual for a fuller description of what it does. This
# string is designed to be shown in a menu alongside the command name, which
# is why it should be as short as possible.
tiltResetDesc=Reset the translation, rotation and zoom
# LOCALIZATION NOTE (tiltResetManual) A fuller description of the 'tilt reset'
# command, displayed when the user asks for help on what it does.
tiltResetManual=Resets any transformations applied to the webpage mesh modelview matrix
# LOCALIZATION NOTE (tiltCloseDesc) A very short description of the 'tilt close'
# command. See tiltCloseManual for a fuller description of what it does. This
# string is designed to be shown in a menu alongside the command name, which
# is why it should be as short as possible.
tiltCloseDesc=Close the visualization if open
# LOCALIZATION NOTE (tiltCloseManual) A fuller description of the 'tilt close'
# command, displayed when the user asks for help on what it does.
tiltCloseManual=Close the visualization and switch back to the Inspector's default highlighter
# LOCALIZATION NOTE (debuggerClosed) Used in the output of several commands
# to explain that the debugger must be opened first.
debuggerClosed=The debugger must be opened before using this command