merge fx-team to mozilla-central a=merge

This commit is contained in:
Carsten "Tomcat" Book 2016-03-04 11:48:51 +01:00
commit fd935ddfec
210 changed files with 5489 additions and 14257 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

@ -554,6 +554,9 @@
<menuitem id="javascriptConsole"
observes="devtoolsMenuBroadcaster_ErrorConsole"
accesskey="&errorConsoleCmd.accesskey;"/>
<menuitem id="menu_devtools_serviceworkers"
observes="devtoolsMenuBroadcaster_ServiceWorkers"
accesskey="&devtoolsServiceWorkers.accesskey;"/>
<menuitem id="menu_devtools_connect"
observes="devtoolsMenuBroadcaster_connect"/>
<menuseparator id="devToolsEndSeparator"/>

View File

@ -107,6 +107,7 @@
<command id="Tools:Eyedropper" oncommand="openEyedropper();"/>
<command id="Tools:Addons" oncommand="BrowserOpenAddonsMgr();"/>
<command id="Tools:ErrorConsole" oncommand="toJavaScriptConsole()" disabled="true" hidden="true"/>
<command id="Tools:ServiceWorkers" oncommand="gDevToolsBrowser.openAboutDebugging(gBrowser, 'workers')"/>
<command id="Tools:DevToolsConnect" oncommand="gDevToolsBrowser.openConnectScreen(gBrowser)" disabled="true" hidden="true"/>
<command id="Tools:Sanitize"
oncommand="Cc['@mozilla.org/browser/browserglue;1'].getService(Ci.nsIBrowserGlue).sanitize(window);"/>
@ -246,6 +247,9 @@
<broadcaster id="devtoolsMenuBroadcaster_GetMoreTools"
label="&getMoreDevtoolsCmd.label;"
oncommand="openUILinkIn('https://addons.mozilla.org/firefox/collections/mozilla/webdeveloper/', 'tab');"/>
<broadcaster id="devtoolsMenuBroadcaster_ServiceWorkers"
label="&devtoolsServiceWorkers.label;"
command="Tools:ServiceWorkers"/>
<broadcaster id="devtoolsMenuBroadcaster_connect"
label="&devtoolsConnect.label;"
command="Tools:DevToolsConnect"/>

View File

@ -468,8 +468,8 @@
accesskey="&syncedTabs.context.bookmarkSingleTab.accesskey;"
id="syncedTabsBookmarkSelected"/>
<menuseparator/>
<menuitem label="&syncedTabs.context.refreshList.label;"
accesskey="&syncedTabs.context.refreshList.accesskey;"
<menuitem label="&syncSyncNowItem.label;"
accesskey="&syncSyncNowItem.accesskey;"
id="syncedTabsRefresh"/>
</menupopup>
</popupset>

View File

@ -149,12 +149,6 @@ var AboutHomeListener = {
},
onPageLoad: function() {
let doc = content.document;
if (doc.documentElement.hasAttribute("hasBrowserHandlers")) {
return;
}
doc.documentElement.setAttribute("hasBrowserHandlers", "true");
addMessageListener("AboutHome:Update", this);
addEventListener("click", this, true);
addEventListener("pagehide", this, true);
@ -216,9 +210,6 @@ var AboutHomeListener = {
removeMessageListener("AboutHome:Update", this);
removeEventListener("click", this, true);
removeEventListener("pagehide", this, true);
if (aEvent.target.documentElement) {
aEvent.target.documentElement.removeAttribute("hasBrowserHandlers");
}
},
};
AboutHomeListener.init(this);

View File

@ -184,13 +184,13 @@ skip-if = true # bug 428712
[browser_bug432599.js]
[browser_bug435035.js]
[browser_bug435325.js]
skip-if = buildapp == 'mulet' || e10s # Bug 1099156 - test directly manipulates content
skip-if = buildapp == 'mulet'
[browser_bug441778.js]
skip-if = buildapp == 'mulet'
[browser_bug455852.js]
[browser_bug460146.js]
[browser_bug462289.js]
skip-if = toolkit == "cocoa" || e10s # Bug 1102017 - middle-button mousedown on selected tab2 does not activate tab - Didn't expect [object XULElement], but got it
skip-if = toolkit == "cocoa"
[browser_bug462673.js]
[browser_bug477014.js]
[browser_bug479408.js]
@ -285,7 +285,7 @@ tags = mcb
tags = mcb
[browser_bug970746.js]
[browser_bug1015721.js]
skip-if = os == 'win' || e10s # Bug 1159268 - Need a content-process safe version of synthesizeWheel
skip-if = os == 'win'
[browser_bug1064280_changeUrlInPinnedTab.js]
[browser_bug1070778.js]
[browser_accesskeys.js]
@ -314,7 +314,7 @@ skip-if = true # browser_drag.js is disabled, as it needs to be updated for the
[browser_findbarClose.js]
[browser_focusonkeydown.js]
[browser_fullscreen-window-open.js]
skip-if = buildapp == 'mulet' || e10s || os == "linux" # Bug 933103 - mochitest's EventUtils.synthesizeMouse functions not e10s friendly. Linux: Intermittent failures - bug 941575.
skip-if = buildapp == 'mulet' || os == "linux" # Linux: Intermittent failures - bug 941575.
[browser_fxaccounts.js]
support-files = fxa_profile_handler.sjs
[browser_fxa_migrate.js]

View File

@ -68,8 +68,8 @@ add_task(function*() {
info("Normal click on result");
let tabPromise = promiseTabLoadEvent(tab);
EventUtils.synthesizeMouseAtCenter(result, {});
let loadEvent = yield tabPromise;
is(loadEvent.target.location.href, "http://example.com/?q=something", "Tab should have loaded from clicking on result");
yield tabPromise;
is(tab.linkedBrowser.currentURI.spec, "http://example.com/?q=something", "Tab should have loaded from clicking on result");
// Middle-click on the result
info("Middle-click on result");
@ -85,6 +85,6 @@ add_task(function*() {
let tabOpenEvent = yield tabPromise;
let newTab = tabOpenEvent.target;
tabs.push(newTab);
loadEvent = yield promiseTabLoadEvent(newTab);
is(loadEvent.target.location.href, "http://example.com/?q=somethingmore", "Tab should have loaded from middle-clicking on result");
yield promiseTabLoadEvent(newTab);
is(newTab.linkedBrowser.currentURI.spec, "http://example.com/?q=somethingmore", "Tab should have loaded from middle-clicking on result");
});

View File

@ -20,12 +20,6 @@ function test() {
}).then(zoomTab1, FullZoomHelper.failAndContinue(finish));
}
function dispatchZoomEventToBrowser(browser) {
EventUtils.synthesizeWheel(browser.contentDocument.documentElement, 10, 10, {
ctrlKey: true, deltaY: -1, deltaMode: WheelEvent.DOM_DELTA_LINE
}, browser.contentWindow);
}
function zoomTab1() {
Task.spawn(function () {
is(gBrowser.selectedTab, gTab1, "Tab 1 is selected");
@ -33,10 +27,15 @@ function zoomTab1() {
FullZoomHelper.zoomTest(gTab2, 1, "Initial zoom of tab 2 should be 1");
let browser1 = gBrowser.getBrowserForTab(gTab1);
dispatchZoomEventToBrowser(browser1);
yield BrowserTestUtils.synthesizeMouse(null, 10, 10, {
wheel: true, ctrlKey: true, deltaY: -1, deltaMode: WheelEvent.DOM_DELTA_LINE
}, browser1);
gLevel1 = ZoomManager.getZoomForBrowser(browser1);
ok(gLevel1 > 1, "New zoom for tab 1 should be greater than 1");
info("Waiting for tab 1 to be zoomed");
yield promiseWaitForCondition(() => {
gLevel1 = ZoomManager.getZoomForBrowser(browser1);
return gLevel1 > 1;
});
yield FullZoomHelper.selectTabAndWaitForLocationChange(gTab2);
FullZoomHelper.zoomTest(gTab2, gLevel1, "Tab 2 should have zoomed along with tab 1");

View File

@ -8,8 +8,6 @@ var proxyPrefValue;
function test() {
waitForExplicitFinish();
let tab = gBrowser.selectedTab = gBrowser.addTab();
// Go offline and disable the proxy and cache, then try to load the test URL.
Services.io.offline = true;
@ -20,37 +18,32 @@ function test() {
Services.prefs.setBoolPref("browser.cache.disk.enable", false);
Services.prefs.setBoolPref("browser.cache.memory.enable", false);
content.location = "http://example.com/";
window.addEventListener("DOMContentLoaded", function load() {
if (content.location == "about:blank") {
info("got about:blank, which is expected once, so return");
return;
}
window.removeEventListener("DOMContentLoaded", load, false);
gBrowser.selectedTab = gBrowser.addTab("http://example.com/");
let observer = new MutationObserver(function (mutations) {
for (let mutation of mutations) {
if (mutation.attributeName == "hasBrowserHandlers") {
observer.disconnect();
checkPage();
return;
}
}
});
let docElt = tab.linkedBrowser.contentDocument.documentElement;
observer.observe(docElt, { attributes: true });
}, false);
let contentScript = `
let listener = function () {
removeEventListener("DOMContentLoaded", listener);
sendAsyncMessage("Test:DOMContentLoaded", { uri: content.document.documentURI });
};
addEventListener("DOMContentLoaded", listener);
`;
function pageloaded({ data }) {
mm.removeMessageListener("Test:DOMContentLoaded", pageloaded);
checkPage(data);
}
let mm = gBrowser.selectedBrowser.messageManager;
mm.addMessageListener("Test:DOMContentLoaded", pageloaded);
mm.loadFrameScript("data:," + contentScript, true);
}
function checkPage() {
function checkPage(data) {
ok(Services.io.offline, "Setting Services.io.offline to true.");
is(gBrowser.contentDocument.documentURI.substring(0,27),
"about:neterror?e=netOffline", "Loading the Offline mode neterror page.");
// Now press the "Try Again" button
ok(gBrowser.contentDocument.getElementById("errorTryAgain"),
"The error page has got a #errorTryAgain element");
is(data.uri.substring(0, 27),
"about:neterror?e=netOffline", "Loading the Offline mode neterror page.");
// Re-enable the proxy so example.com is resolved to localhost, rather than
// the actual example.com.
@ -62,7 +55,10 @@ function checkPage() {
Services.obs.removeObserver(observer, "network:offline-status-changed", false);
finish();
}, "network:offline-status-changed", false);
gBrowser.contentDocument.getElementById("errorTryAgain").click();
ContentTask.spawn(gBrowser.selectedBrowser, null, function* () {
content.document.getElementById("errorTryAgain").click();
});
}
registerCleanupFunction(function() {

View File

@ -17,7 +17,7 @@ function test()
tab2 = gBrowser.addTab("about:blank", {skipAnimation: true});
EventUtils.synthesizeMouseAtCenter(tab1, {});
setTimeout(step2, 0);
executeSoon(step2);
}
function step2()
@ -26,7 +26,7 @@ function step2()
isnot(document.activeElement, tab1, "1st click on tab1 does not activate tab");
EventUtils.synthesizeMouseAtCenter(tab1, {});
setTimeout(step3, 0);
executeSoon(step3);
}
function step3()
@ -41,7 +41,7 @@ function step3()
is(document.activeElement, tab1, "tab key to selected tab1 activates tab");
EventUtils.synthesizeMouseAtCenter(tab1, {});
setTimeout(step4, 0);
executeSoon(step4);
}
function step4()
@ -49,21 +49,24 @@ function step4()
is(gBrowser.selectedTab, tab1, "3rd click on activated tab1 keeps tab selected");
is(document.activeElement, tab1, "3rd click on activated tab1 keeps tab activated");
gBrowser.addEventListener("TabSwitchDone", step5);
EventUtils.synthesizeMouseAtCenter(tab2, {});
setTimeout(step5, 0);
}
function step5()
{
gBrowser.removeEventListener("TabSwitchDone", step5);
// The tabbox selects a tab within a setTimeout in a bubbling mousedown event
// listener, and focuses the current tab if another tab previously had focus.
is(gBrowser.selectedTab, tab2, "click on tab2 while tab1 is activated selects tab");
is(document.activeElement, tab2, "click on tab2 while tab1 is activated activates tab");
ok(true, "focusing content then sending middle-button mousedown to tab2.");
info("focusing content then sending middle-button mousedown to tab2.");
gBrowser.selectedBrowser.focus();
EventUtils.synthesizeMouseAtCenter(tab2, {button: 1, type: "mousedown"});
setTimeout(step6, 0);
executeSoon(step6);
}
function step6()

View File

@ -16,19 +16,15 @@ function test () {
Services.prefs.setBoolPref(PREF_DISABLE_OPEN_NEW_WINDOW, true);
let newTab = gBrowser.addTab();
let newTab = gBrowser.addTab(gHttpTestRoot + TEST_FILE);
gBrowser.selectedTab = newTab;
let gTestBrowser = gBrowser.selectedBrowser;
gTestBrowser.addEventListener("load", function onLoad(){
gTestBrowser.removeEventListener("load", onLoad, true, true);
whenTabLoaded(newTab, function () {
// Enter browser fullscreen mode.
BrowserFullScreen();
runNextTest();
}, true, true);
gTestBrowser.contentWindow.location.href = gHttpTestRoot + TEST_FILE;
});
}
registerCleanupFunction(function(){
@ -202,11 +198,8 @@ function waitForTabOpen(aOptions) {
gBrowser.tabContainer.removeEventListener("TabOpen", onTabOpen, true);
let tab = aEvent.target;
tab.linkedBrowser.addEventListener("load", function onLoad(ev){
let browser = ev.currentTarget;
browser.removeEventListener("load", onLoad, true, true);
is(browser.contentWindow.document.title, message.title,
whenTabLoaded(tab, function () {
is(tab.linkedBrowser.contentTitle, message.title,
"Opened Tab is expected: " + message.title);
if (aOptions.successFn) {
@ -215,7 +208,7 @@ function waitForTabOpen(aOptions) {
gBrowser.removeTab(tab);
finalize();
}, true, true);
});
}
gBrowser.tabContainer.addEventListener("TabOpen", onTabOpen, true);
@ -240,7 +233,7 @@ function waitForTabOpen(aOptions) {
function waitForWindowOpen(aOptions) {
let start = Date.now();
let message = aOptions.message;
let url = aOptions.url || getBrowserURL();
let url = aOptions.url || "about:blank";
if (!message.title) {
ok(false, "Can't get message.title");
@ -258,33 +251,31 @@ function waitForWindowOpen(aOptions) {
runNextTest();
};
let listener = new WindowListener(message.title, url, {
let listener = new WindowListener(message.title, getBrowserURL(), {
onSuccess: aOptions.successFn,
onFinalize: onFinalize,
});
Services.wm.addListener(listener);
const URI = aOptions.url || "about:blank";
executeWindowOpenInContent({
uri: URI,
uri: url,
title: message.title,
option: message.param,
});
}
function executeWindowOpenInContent(aParam) {
var testWindow = gBrowser.selectedBrowser.contentWindow;
var testElm = testWindow.document.getElementById("test");
testElm.setAttribute("data-test-param", JSON.stringify(aParam));
EventUtils.synthesizeMouseAtCenter(testElm, {}, testWindow);
ContentTask.spawn(gBrowser.selectedBrowser, JSON.stringify(aParam), function* (dataTestParam) {
let testElm = content.document.getElementById("test");
testElm.setAttribute("data-test-param", dataTestParam);
testElm.click();
});
}
function waitForWindowOpenFromChrome(aOptions) {
let start = Date.now();
let message = aOptions.message;
let url = aOptions.url || getBrowserURL();
let url = aOptions.url || "about:blank";
if (!message.title) {
ok(false, "Can't get message.title");
@ -302,16 +293,13 @@ function waitForWindowOpenFromChrome(aOptions) {
runNextTest();
};
let listener = new WindowListener(message.title, url, {
let listener = new WindowListener(message.title, getBrowserURL(), {
onSuccess: aOptions.successFn,
onFinalize: onFinalize,
});
Services.wm.addListener(listener);
const URI = aOptions.url || "about:blank";
let testWindow = window.open(URI, message.title, message.option);
let testWindow = window.open(url, message.title, message.option);
}
function WindowListener(aTitle, aUrl, aCallBackObj) {

View File

@ -840,15 +840,15 @@ this.UITour = {
return false;
}
if (campaignParams) {
// The regex that both the name and value of each param must match.
// The regex that the name of each param must match - there's no
// character restriction on the value - they will be escaped as necessary.
let reSimpleString = /^[-_a-zA-Z0-9]*$/;
for (let name in campaignParams) {
let value = campaignParams[name];
if (typeof name != "string" || typeof value != "string" ||
!name.startsWith("utm_") ||
value.length == 0 ||
!reSimpleString.test(name) ||
!reSimpleString.test(value)) {
!reSimpleString.test(name)) {
log.warn("_populateCampaignParams: invalid campaign param specified");
return false;
}

View File

@ -34,6 +34,18 @@ add_UITour_task(function* test_firefoxAccountsValidParams() {
"about:accounts?action=signup&entrypoint=uitour&utm_foo=foo&utm_bar=bar");
});
add_UITour_task(function* test_firefoxAccountsNonAlphaValue() {
// All characters in the value are allowed, but they must be automatically escaped.
// (we throw a unicode character in there too - it's not auto-utf8 encoded,
// but that's ok, so long as it is escaped correctly.)
let value = "foo& /=?:\\\xa9";
// encodeURIComponent encodes spaces to %20 but we want "+"
let expected = encodeURIComponent(value).replace(/%20/g, "+");
yield gContentAPI.showFirefoxAccounts({ utm_foo: value });
yield BrowserTestUtils.browserLoaded(gTestTab.linkedBrowser, false,
"about:accounts?action=signup&entrypoint=uitour&utm_foo=" + expected);
});
// A helper to check the request was ignored due to invalid params.
function* checkAboutAccountsNotLoaded() {
try {
@ -63,9 +75,3 @@ add_UITour_task(function* test_firefoxAccountsNonAlphaName() {
yield gContentAPI.showFirefoxAccounts({ utm_foo: "foo", "utm_bar=": "bar" });
yield checkAboutAccountsNotLoaded();
});
add_UITour_task(function* test_firefoxAccountsNonAlphaValue() {
// Any non-alpha value should be rejected.
yield gContentAPI.showFirefoxAccounts({ utm_foo: "foo&" });
yield checkAboutAccountsNotLoaded();
});

View File

@ -1,3 +1,3 @@
This is the pdf.js project output, https://github.com/mozilla/pdf.js
Current extension version is: 1.4.95
Current extension version is: 1.4.121

View File

@ -28,8 +28,8 @@ factory((root.pdfjsDistBuildPdf = {}));
// Use strict in our context only - users might not want it
'use strict';
var pdfjsVersion = '1.4.95';
var pdfjsBuild = '2b813c0';
var pdfjsVersion = '1.4.121';
var pdfjsBuild = '51f6aba';
var pdfjsFilePath =
typeof document !== 'undefined' && document.currentScript ?
@ -690,6 +690,55 @@ function stringToBytes(str) {
return bytes;
}
/**
* Gets length of the array (Array, Uint8Array, or string) in bytes.
* @param {Array|Uint8Array|string} arr
* @returns {number}
*/
function arrayByteLength(arr) {
if (arr.length !== undefined) {
return arr.length;
}
assert(arr.byteLength !== undefined);
return arr.byteLength;
}
/**
* Combines array items (arrays) into single Uint8Array object.
* @param {Array} arr - the array of the arrays (Array, Uint8Array, or string).
* @returns {Uint8Array}
*/
function arraysToBytes(arr) {
// Shortcut: if first and only item is Uint8Array, return it.
if (arr.length === 1 && (arr[0] instanceof Uint8Array)) {
return arr[0];
}
var resultLength = 0;
var i, ii = arr.length;
var item, itemLength ;
for (i = 0; i < ii; i++) {
item = arr[i];
itemLength = arrayByteLength(item);
resultLength += itemLength;
}
var pos = 0;
var data = new Uint8Array(resultLength);
for (i = 0; i < ii; i++) {
item = arr[i];
if (!(item instanceof Uint8Array)) {
if (typeof item === 'string') {
item = stringToBytes(item);
} else {
item = new Uint8Array(item);
}
}
itemLength = item.byteLength;
data.set(item, pos);
pos += itemLength;
}
return data;
}
function string32(value) {
return String.fromCharCode((value >> 24) & 0xff, (value >> 16) & 0xff,
(value >> 8) & 0xff, value & 0xff);
@ -1542,6 +1591,8 @@ exports.UnexpectedResponseException = UnexpectedResponseException;
exports.UnknownErrorException = UnknownErrorException;
exports.Util = Util;
exports.XRefParseException = XRefParseException;
exports.arrayByteLength = arrayByteLength;
exports.arraysToBytes = arraysToBytes;
exports.assert = assert;
exports.bytesToString = bytesToString;
exports.combineUrl = combineUrl;
@ -5281,15 +5332,19 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
}
}
if (simpleFillText && !accent) {
// common case
ctx.fillText(character, scaledX, scaledY);
} else {
this.paintChar(character, scaledX, scaledY);
if (accent) {
scaledAccentX = scaledX + accent.offset.x / fontSizeScale;
scaledAccentY = scaledY - accent.offset.y / fontSizeScale;
this.paintChar(accent.fontChar, scaledAccentX, scaledAccentY);
// Only attempt to draw the glyph if it is actually in the embedded font
// file or if there isn't a font file so the fallback font is shown.
if (glyph.isInFont || font.missingFile) {
if (simpleFillText && !accent) {
// common case
ctx.fillText(character, scaledX, scaledY);
} else {
this.paintChar(character, scaledX, scaledY);
if (accent) {
scaledAccentX = scaledX + accent.offset.x / fontSizeScale;
scaledAccentY = scaledY - accent.offset.y / fontSizeScale;
this.paintChar(accent.fontChar, scaledAccentX, scaledAccentY);
}
}
}

View File

@ -28,8 +28,8 @@ factory((root.pdfjsDistBuildPdfWorker = {}));
// Use strict in our context only - users might not want it
'use strict';
var pdfjsVersion = '1.4.95';
var pdfjsBuild = '2b813c0';
var pdfjsVersion = '1.4.121';
var pdfjsBuild = '51f6aba';
var pdfjsFilePath =
typeof document !== 'undefined' && document.currentScript ?
@ -2649,6 +2649,55 @@ function stringToBytes(str) {
return bytes;
}
/**
* Gets length of the array (Array, Uint8Array, or string) in bytes.
* @param {Array|Uint8Array|string} arr
* @returns {number}
*/
function arrayByteLength(arr) {
if (arr.length !== undefined) {
return arr.length;
}
assert(arr.byteLength !== undefined);
return arr.byteLength;
}
/**
* Combines array items (arrays) into single Uint8Array object.
* @param {Array} arr - the array of the arrays (Array, Uint8Array, or string).
* @returns {Uint8Array}
*/
function arraysToBytes(arr) {
// Shortcut: if first and only item is Uint8Array, return it.
if (arr.length === 1 && (arr[0] instanceof Uint8Array)) {
return arr[0];
}
var resultLength = 0;
var i, ii = arr.length;
var item, itemLength ;
for (i = 0; i < ii; i++) {
item = arr[i];
itemLength = arrayByteLength(item);
resultLength += itemLength;
}
var pos = 0;
var data = new Uint8Array(resultLength);
for (i = 0; i < ii; i++) {
item = arr[i];
if (!(item instanceof Uint8Array)) {
if (typeof item === 'string') {
item = stringToBytes(item);
} else {
item = new Uint8Array(item);
}
}
itemLength = item.byteLength;
data.set(item, pos);
pos += itemLength;
}
return data;
}
function string32(value) {
return String.fromCharCode((value >> 24) & 0xff, (value >> 16) & 0xff,
(value >> 8) & 0xff, value & 0xff);
@ -3501,6 +3550,8 @@ exports.UnexpectedResponseException = UnexpectedResponseException;
exports.UnknownErrorException = UnknownErrorException;
exports.Util = Util;
exports.XRefParseException = XRefParseException;
exports.arrayByteLength = arrayByteLength;
exports.arraysToBytes = arraysToBytes;
exports.assert = assert;
exports.bytesToString = bytesToString;
exports.combineUrl = combineUrl;
@ -3544,6 +3595,8 @@ exports.warn = warn;
}(this, function (exports, sharedUtil) {
var MissingDataException = sharedUtil.MissingDataException;
var arrayByteLength = sharedUtil.arrayByteLength;
var arraysToBytes = sharedUtil.arraysToBytes;
var assert = sharedUtil.assert;
var createPromiseCapability = sharedUtil.createPromiseCapability;
var isInt = sharedUtil.isInt;
@ -3795,37 +3848,16 @@ var ChunkedStream = (function ChunkedStreamClosure() {
var ChunkedStreamManager = (function ChunkedStreamManagerClosure() {
function ChunkedStreamManager(length, chunkSize, url, args) {
function ChunkedStreamManager(pdfNetworkStream, args) {
var chunkSize = args.rangeChunkSize;
var length = args.length;
this.stream = new ChunkedStream(length, chunkSize, this);
this.length = length;
this.chunkSize = chunkSize;
this.url = url;
this.pdfNetworkStream = pdfNetworkStream;
this.url = args.url;
this.disableAutoFetch = args.disableAutoFetch;
var msgHandler = this.msgHandler = args.msgHandler;
if (args.chunkedViewerLoading) {
msgHandler.on('OnDataRange', this.onReceiveData.bind(this));
msgHandler.on('OnDataProgress', this.onProgress.bind(this));
this.sendRequest = function ChunkedStreamManager_sendRequest(begin, end) {
msgHandler.send('RequestDataRange', { begin: begin, end: end });
};
} else {
var getXhr = function getXhr() {
return new XMLHttpRequest();
};
this.networkManager = new NetworkManager(this.url, {
getXhr: getXhr,
httpHeaders: args.httpHeaders,
withCredentials: args.withCredentials
});
this.sendRequest = function ChunkedStreamManager_sendRequest(begin, end) {
this.networkManager.requestRange(begin, end, {
onDone: this.onReceiveData.bind(this),
onProgress: this.onProgress.bind(this)
});
};
}
this.msgHandler = args.msgHandler;
this.currRequestId = 0;
@ -3833,12 +3865,9 @@ var ChunkedStreamManager = (function ChunkedStreamManagerClosure() {
this.requestsByChunk = Object.create(null);
this.promisesByRequest = Object.create(null);
this.progressiveDataLength = 0;
this.aborted = false;
this._loadedStreamCapability = createPromiseCapability();
if (args.initialData) {
this.onReceiveData({chunk: args.initialData});
}
}
ChunkedStreamManager.prototype = {
@ -3846,6 +3875,44 @@ var ChunkedStreamManager = (function ChunkedStreamManagerClosure() {
return this._loadedStreamCapability.promise;
},
sendRequest: function ChunkedStreamManager_sendRequest(begin, end) {
var rangeReader = this.pdfNetworkStream.getRangeReader(begin, end);
if (!rangeReader.isStreamingSupported) {
rangeReader.onProgress = this.onProgress.bind(this);
}
var chunks = [], loaded = 0;
var manager = this;
var promise = new Promise(function (resolve, reject) {
var readChunk = function (chunk) {
try {
if (!chunk.done) {
var data = chunk.value;
chunks.push(data);
loaded += arrayByteLength(data);
if (rangeReader.isStreamingSupported) {
manager.onProgress({loaded: loaded});
}
rangeReader.read().then(readChunk, reject);
return;
}
var chunkData = arraysToBytes(chunks);
chunks = null;
resolve(chunkData);
} catch (e) {
reject(e);
}
};
rangeReader.read().then(readChunk, reject);
});
promise.then(function (data) {
if (this.aborted) {
return; // ignoring any data after abort
}
this.onReceiveData({chunk: data, begin: begin});
}.bind(this));
// TODO check errors
},
// Get all the chunks that are not yet loaded and groups them into
// contiguous ranges to load in as few requests as possible
requestAllChunks: function ChunkedStreamManager_requestAllChunks() {
@ -4065,8 +4132,9 @@ var ChunkedStreamManager = (function ChunkedStreamManagerClosure() {
},
abort: function ChunkedStreamManager_abort() {
if (this.networkManager) {
this.networkManager.abortAllRequests();
this.aborted = true;
if (this.pdfNetworkStream) {
this.pdfNetworkStream.cancelAllRequests('abort');
}
for(var requestId in this.promisesByRequest) {
var capability = this.promisesByRequest[requestId];
@ -24938,7 +25006,7 @@ function getFontType(type, subtype) {
var Glyph = (function GlyphClosure() {
function Glyph(fontChar, unicode, accent, width, vmetric, operatorListId,
isSpace) {
isSpace, isInFont) {
this.fontChar = fontChar;
this.unicode = unicode;
this.accent = accent;
@ -24946,17 +25014,20 @@ var Glyph = (function GlyphClosure() {
this.vmetric = vmetric;
this.operatorListId = operatorListId;
this.isSpace = isSpace;
this.isInFont = isInFont;
}
Glyph.prototype.matchesForCache = function(fontChar, unicode, accent, width,
vmetric, operatorListId, isSpace) {
vmetric, operatorListId, isSpace,
isInFont) {
return this.fontChar === fontChar &&
this.unicode === unicode &&
this.accent === accent &&
this.width === width &&
this.vmetric === vmetric &&
this.operatorListId === operatorListId &&
this.isSpace === isSpace;
this.isSpace === isSpace &&
this.isInFont === isInFont;
};
return Glyph;
@ -25215,6 +25286,7 @@ var Font = (function FontClosure() {
this.loadedName = properties.loadedName;
this.isType3Font = properties.isType3Font;
this.sizes = [];
this.missingFile = false;
this.glyphCache = Object.create(null);
@ -26579,6 +26651,9 @@ var Font = (function FontClosure() {
}
for (i = 0, ii = records.length; i < ii; i++) {
var record = records[i];
if (record.length <= 0) {
continue; // Nothing to process, ignoring.
}
var pos = start + stringsStart + record.offset;
if (pos + record.length > end) {
continue; // outside of name table, ignoring
@ -27026,7 +27101,7 @@ var Font = (function FontClosure() {
assert(cid <= 0xffff, 'Max size of CID is 65,535');
var glyphId = -1;
if (isCidToGidMapEmpty) {
glyphId = charCode;
glyphId = cid;
} else if (cidToGidMap[cid] !== undefined) {
glyphId = cidToGidMap[cid];
}
@ -27554,6 +27629,7 @@ var Font = (function FontClosure() {
unicode = String.fromCharCode(unicode);
}
var isInFont = charcode in this.toFontChar;
// First try the toFontChar map, if it's not there then try falling
// back to the char code.
fontCharCode = this.toFontChar[charcode] || charcode;
@ -27568,6 +27644,7 @@ var Font = (function FontClosure() {
var accent = null;
if (this.seacMap && this.seacMap[charcode]) {
isInFont = true;
var seac = this.seacMap[charcode];
fontCharCode = seac.baseFontCharCode;
accent = {
@ -27581,9 +27658,9 @@ var Font = (function FontClosure() {
var glyph = this.glyphCache[charcode];
if (!glyph ||
!glyph.matchesForCache(fontChar, unicode, accent, width, vmetric,
operatorListId, isSpace)) {
operatorListId, isSpace, isInFont)) {
glyph = new Glyph(fontChar, unicode, accent, width, vmetric,
operatorListId, isSpace);
operatorListId, isSpace, isInFont);
this.glyphCache[charcode] = glyph;
}
return glyph;
@ -40362,21 +40439,18 @@ var LocalPdfManager = (function LocalPdfManagerClosure() {
})();
var NetworkPdfManager = (function NetworkPdfManagerClosure() {
function NetworkPdfManager(docId, args, msgHandler) {
function NetworkPdfManager(docId, pdfNetworkStream, args) {
this._docId = docId;
this.msgHandler = msgHandler;
this.msgHandler = args.msgHandler;
var params = {
msgHandler: msgHandler,
httpHeaders: args.httpHeaders,
withCredentials: args.withCredentials,
chunkedViewerLoading: args.chunkedViewerLoading,
msgHandler: args.msgHandler,
url: args.url,
length: args.length,
disableAutoFetch: args.disableAutoFetch,
initialData: args.initialData
rangeChunkSize: args.rangeChunkSize
};
this.streamManager = new ChunkedStreamManager(args.length,
args.rangeChunkSize,
args.url, params);
this.streamManager = new ChunkedStreamManager(pdfNetworkStream, params);
this.pdfDocument = new PDFDocument(this, this.streamManager.getStream(),
args.password);
}
@ -40458,10 +40532,12 @@ var PasswordException = sharedUtil.PasswordException;
var PasswordResponses = sharedUtil.PasswordResponses;
var UnknownErrorException = sharedUtil.UnknownErrorException;
var XRefParseException = sharedUtil.XRefParseException;
var arrayByteLength = sharedUtil.arrayByteLength;
var arraysToBytes = sharedUtil.arraysToBytes;
var assert = sharedUtil.assert;
var createPromiseCapability = sharedUtil.createPromiseCapability;
var error = sharedUtil.error;
var info = sharedUtil.info;
var isInt = sharedUtil.isInt;
var warn = sharedUtil.warn;
var Ref = corePrimitives.Ref;
var LocalPdfManager = corePdfManager.LocalPdfManager;
@ -40499,6 +40575,221 @@ var WorkerTask = (function WorkerTaskClosure() {
return WorkerTask;
})();
/** @implements {IPDFStream} */
var PDFWorkerStream = (function PDFWorkerStreamClosure() {
function PDFWorkerStream(params, msgHandler) {
this._queuedChunks = [];
var initialData = params.initialData;
if (initialData && initialData.length > 0) {
this._queuedChunks.push(initialData);
}
this._msgHandler = msgHandler;
this._isRangeSupported = !(params.disableRange);
this._isStreamingSupported = !(params.disableStream);
this._contentLength = params.length;
this._fullRequestReader = null;
this._rangeReaders = [];
msgHandler.on('OnDataRange', this._onReceiveData.bind(this));
msgHandler.on('OnDataProgress', this._onProgress.bind(this));
}
PDFWorkerStream.prototype = {
_onReceiveData: function PDFWorkerStream_onReceiveData(args) {
if (args.begin === undefined) {
if (this._fullRequestReader) {
this._fullRequestReader._enqueue(args.chunk);
} else {
this._queuedChunks.push(args.chunk);
}
} else {
var found = this._rangeReaders.some(function (rangeReader) {
if (rangeReader._begin !== args.begin) {
return false;
}
rangeReader._enqueue(args.chunk);
return true;
});
assert(found);
}
},
_onProgress: function PDFWorkerStream_onProgress(evt) {
if (this._rangeReaders.length > 0) {
// Reporting to first range reader.
var firstReader = this._rangeReaders[0];
if (firstReader.onProgress) {
firstReader.onProgress({loaded: evt.loaded});
}
}
},
_removeRangeReader: function PDFWorkerStream_removeRangeReader(reader) {
var i = this._rangeReaders.indexOf(reader);
if (i >= 0) {
this._rangeReaders.splice(i, 1);
}
},
getFullReader: function PDFWorkerStream_getFullReader() {
assert(!this._fullRequestReader);
var queuedChunks = this._queuedChunks;
this._queuedChunks = null;
return new PDFWorkerStreamReader(this, queuedChunks);
},
getRangeReader: function PDFWorkerStream_getRangeReader(begin, end) {
var reader = new PDFWorkerStreamRangeReader(this, begin, end);
this._msgHandler.send('RequestDataRange', { begin: begin, end: end });
this._rangeReaders.push(reader);
return reader;
},
cancelAllRequests: function PDFWorkerStream_cancelAllRequests(reason) {
if (this._fullRequestReader) {
this._fullRequestReader.cancel(reason);
}
var readers = this._rangeReaders.slice(0);
readers.forEach(function (rangeReader) {
rangeReader.cancel(reason);
});
}
};
/** @implements {IPDFStreamReader} */
function PDFWorkerStreamReader(stream, queuedChunks) {
this._stream = stream;
this._done = false;
this._queuedChunks = queuedChunks || [];
this._requests = [];
this._headersReady = Promise.resolve();
stream._fullRequestReader = this;
this.onProgress = null; // not used
}
PDFWorkerStreamReader.prototype = {
_enqueue: function PDFWorkerStreamReader_enqueue(chunk) {
if (this._done) {
return; // ignore new data
}
if (this._requests.length > 0) {
var requestCapability = this._requests.shift();
requestCapability.resolve({value: chunk, done: false});
return;
}
this._queuedChunks.push(chunk);
},
get headersReady() {
return this._headersReady;
},
get isRangeSupported() {
return this._stream._isRangeSupported;
},
get isStreamingSupported() {
return this._stream._isStreamingSupported;
},
get contentLength() {
return this._stream._contentLength;
},
read: function PDFWorkerStreamReader_read() {
if (this._queuedChunks.length > 0) {
var chunk = this._queuedChunks.shift();
return Promise.resolve({value: chunk, done: false});
}
if (this._done) {
return Promise.resolve({value: undefined, done: true});
}
var requestCapability = createPromiseCapability();
this._requests.push(requestCapability);
return requestCapability.promise;
},
cancel: function PDFWorkerStreamReader_cancel(reason) {
this._done = true;
this._requests.forEach(function (requestCapability) {
requestCapability.resolve({value: undefined, done: true});
});
this._requests = [];
}
};
/** @implements {IPDFStreamRangeReader} */
function PDFWorkerStreamRangeReader(stream, begin, end) {
this._stream = stream;
this._begin = begin;
this._end = end;
this._queuedChunk = null;
this._requests = [];
this._done = false;
this.onProgress = null;
}
PDFWorkerStreamRangeReader.prototype = {
_enqueue: function PDFWorkerStreamRangeReader_enqueue(chunk) {
if (this._done) {
return; // ignore new data
}
if (this._requests.length === 0) {
this._queuedChunk = chunk;
} else {
var requestsCapability = this._requests.shift();
requestsCapability.resolve({value: chunk, done: false});
this._requests.forEach(function (requestCapability) {
requestCapability.resolve({value: undefined, done: true});
});
this._requests = [];
}
this._done = true;
this._stream._removeRangeReader(this);
},
get isStreamingSupported() {
return false;
},
read: function PDFWorkerStreamRangeReader_read() {
if (this._queuedChunk) {
return Promise.resolve({value: this._queuedChunk, done: false});
}
if (this._done) {
return Promise.resolve({value: undefined, done: true});
}
var requestCapability = createPromiseCapability();
this._requests.push(requestCapability);
return requestCapability.promise;
},
cancel: function PDFWorkerStreamRangeReader_cancel(reason) {
this._done = true;
this._requests.forEach(function (requestCapability) {
requestCapability.resolve({value: undefined, done: true});
});
this._requests = [];
this._stream._removeRangeReader(this);
}
};
return PDFWorkerStream;
})();
/** @type IPDFStream */
var PDFNetworkStream;
/**
* Sets PDFNetworkStream class to be used as alternative PDF data transport.
* @param {IPDFStream} cls - the PDF data transport.
*/
function setPDFNetworkStreamClass(cls) {
PDFNetworkStream = cls;
}
var WorkerMessageHandler = PDFJS.WorkerMessageHandler = {
setup: function wphSetup(handler, port) {
var testMessageProcessed = false;
@ -40605,7 +40896,6 @@ var WorkerMessageHandler = PDFJS.WorkerMessageHandler = {
var pdfManager;
var source = data.source;
var disableRange = data.disableRange;
if (source.data) {
try {
pdfManager = new LocalPdfManager(docId, source.data, source.password);
@ -40614,143 +40904,113 @@ var WorkerMessageHandler = PDFJS.WorkerMessageHandler = {
pdfManagerCapability.reject(ex);
}
return pdfManagerCapability.promise;
} else if (source.chunkedViewerLoading) {
}
var pdfStream;
try {
if (source.chunkedViewerLoading) {
pdfStream = new PDFWorkerStream(source, handler);
} else {
assert(PDFNetworkStream, 'pdfjs/core/network module is not loaded');
pdfStream = new PDFNetworkStream(data);
}
} catch (ex) {
pdfManagerCapability.reject(ex);
return pdfManagerCapability.promise;
}
var fullRequest = pdfStream.getFullReader();
fullRequest.headersReady.then(function () {
if (!fullRequest.isStreamingSupported ||
!fullRequest.isRangeSupported) {
// If stream or range are disabled, it's our only way to report
// loading progress.
fullRequest.onProgress = function (evt) {
handler.send('DocProgress', {
loaded: evt.loaded,
total: evt.total
});
};
}
if (!fullRequest.isRangeSupported) {
return;
}
// We don't need auto-fetch when streaming is enabled.
var disableAutoFetch = source.disableAutoFetch ||
fullRequest.isStreamingSupported;
pdfManager = new NetworkPdfManager(docId, pdfStream, {
msgHandler: handler,
url: source.url,
password: source.password,
length: fullRequest.contentLength,
disableAutoFetch: disableAutoFetch,
rangeChunkSize: source.rangeChunkSize
});
pdfManagerCapability.resolve(pdfManager);
cancelXHRs = null;
}).catch(function (reason) {
pdfManagerCapability.reject(reason);
cancelXHRs = null;
});
var cachedChunks = [], loaded = 0;
var flushChunks = function () {
var pdfFile = arraysToBytes(cachedChunks);
if (source.length && pdfFile.length !== source.length) {
warn('reported HTTP length is different from actual');
}
// the data is array, instantiating directly from it
try {
pdfManager = new NetworkPdfManager(docId, source, handler);
pdfManager = new LocalPdfManager(docId, pdfFile, source.password);
pdfManagerCapability.resolve(pdfManager);
} catch (ex) {
pdfManagerCapability.reject(ex);
}
return pdfManagerCapability.promise;
}
var networkManager = new NetworkManager(source.url, {
httpHeaders: source.httpHeaders,
withCredentials: source.withCredentials
});
var cachedChunks = [];
var fullRequestXhrId = networkManager.requestFull({
onHeadersReceived: function onHeadersReceived() {
if (disableRange) {
return;
}
var fullRequestXhr = networkManager.getRequestXhr(fullRequestXhrId);
if (fullRequestXhr.getResponseHeader('Accept-Ranges') !== 'bytes') {
return;
}
var contentEncoding =
fullRequestXhr.getResponseHeader('Content-Encoding') || 'identity';
if (contentEncoding !== 'identity') {
return;
}
var length = fullRequestXhr.getResponseHeader('Content-Length');
length = parseInt(length, 10);
if (!isInt(length)) {
return;
}
source.length = length;
if (length <= 2 * source.rangeChunkSize) {
// The file size is smaller than the size of two chunks, so it does
// not make any sense to abort the request and retry with a range
// request.
return;
}
if (networkManager.isStreamingRequest(fullRequestXhrId)) {
// We can continue fetching when progressive loading is enabled,
// and we don't need the autoFetch feature.
source.disableAutoFetch = true;
} else {
// NOTE: by cancelling the full request, and then issuing range
// requests, there will be an issue for sites where you can only
// request the pdf once. However, if this is the case, then the
// server should not be returning that it can support range
// requests.
networkManager.abortRequest(fullRequestXhrId);
}
cachedChunks = [];
};
var readPromise = new Promise(function (resolve, reject) {
var readChunk = function (chunk) {
try {
pdfManager = new NetworkPdfManager(docId, source, handler);
pdfManagerCapability.resolve(pdfManager);
} catch (ex) {
pdfManagerCapability.reject(ex);
}
cancelXHRs = null;
},
onProgressiveData: source.disableStream ? null :
function onProgressiveData(chunk) {
if (!pdfManager) {
cachedChunks.push(chunk);
return;
}
pdfManager.sendProgressiveData(chunk);
},
onDone: function onDone(args) {
if (pdfManager) {
return; // already processed
}
var pdfFile;
if (args === null) {
// TODO add some streaming manager, e.g. for unknown length files.
// The data was returned in the onProgressiveData, combining...
var pdfFileLength = 0, pos = 0;
cachedChunks.forEach(function (chunk) {
pdfFileLength += chunk.byteLength;
});
if (source.length && pdfFileLength !== source.length) {
warn('reported HTTP length is different from actual');
ensureNotTerminated();
if (chunk.done) {
if (!pdfManager) {
flushChunks();
}
cancelXHRs = null;
return;
}
var pdfFileArray = new Uint8Array(pdfFileLength);
cachedChunks.forEach(function (chunk) {
pdfFileArray.set(new Uint8Array(chunk), pos);
pos += chunk.byteLength;
});
pdfFile = pdfFileArray.buffer;
} else {
pdfFile = args.chunk;
}
// the data is array, instantiating directly from it
try {
pdfManager = new LocalPdfManager(docId, pdfFile, source.password);
pdfManagerCapability.resolve(pdfManager);
} catch (ex) {
pdfManagerCapability.reject(ex);
}
cancelXHRs = null;
},
var data = chunk.value;
loaded += arrayByteLength(data);
if (!fullRequest.isStreamingSupported) {
handler.send('DocProgress', {
loaded: loaded,
total: Math.max(loaded, fullRequest.contentLength || 0)
});
}
onError: function onError(status) {
var exception;
if (status === 404 || status === 0 && /^file:/.test(source.url)) {
exception = new MissingPDFException('Missing PDF "' +
source.url + '".');
handler.send('MissingPDF', exception);
} else {
exception = new UnexpectedResponseException(
'Unexpected server response (' + status +
') while retrieving PDF "' + source.url + '".', status);
handler.send('UnexpectedResponse', exception);
}
cancelXHRs = null;
},
if (pdfManager) {
pdfManager.sendProgressiveData(data);
} else {
cachedChunks.push(data);
}
onProgress: function onProgress(evt) {
handler.send('DocProgress', {
loaded: evt.loaded,
total: evt.lengthComputable ? evt.total : source.length
});
}
fullRequest.read().then(readChunk, reject);
} catch (e) {
reject(e);
}
};
fullRequest.read().then(readChunk, reject);
});
readPromise.catch(function (e) {
pdfManagerCapability.reject(e);
cancelXHRs = null;
});
cancelXHRs = function () {
networkManager.abortRequest(fullRequestXhrId);
pdfStream.cancelAllRequests('abort');
};
return pdfManagerCapability.promise;
@ -41053,6 +41313,7 @@ if (typeof window === 'undefined' &&
initializeWorker();
}
exports.setPDFNetworkStreamClass = setPDFNetworkStreamClass;
exports.WorkerTask = WorkerTask;
exports.WorkerMessageHandler = WorkerMessageHandler;
}));

File diff suppressed because it is too large Load Diff

View File

@ -258,6 +258,9 @@ These should match what Safari and other Apple applications use on OS X Lion. --
<!ENTITY devToolsCmd.keycode "VK_F12">
<!ENTITY devToolsCmd.keytext "F12">
<!ENTITY devtoolsServiceWorkers.label "Service Workers">
<!ENTITY devtoolsServiceWorkers.accesskey "k">
<!ENTITY devtoolsConnect.label "Connect…">
<!ENTITY devtoolsConnect.accesskey "e">
@ -806,8 +809,6 @@ you can use these alternative items. Otherwise, their values should be empty. -
<!ENTITY syncedTabs.context.openTab.accesskey "O">
<!ENTITY syncedTabs.context.bookmarkSingleTab.label "Bookmark This Tab…">
<!ENTITY syncedTabs.context.bookmarkSingleTab.accesskey "B">
<!ENTITY syncedTabs.context.refreshList.label "Refresh List">
<!ENTITY syncedTabs.context.refreshList.accesskey "R">
<!ENTITY syncBrand.shortName.label "Sync">

View File

@ -198,7 +198,6 @@ panelmultiview[nosubviews=true] > .panel-viewcontainer > .panel-viewstack > .pan
overflow: visible;
}
.cui-widget-panel > .panel-arrowcontainer > .panel-arrowcontent,
#PanelUI-popup > .panel-arrowcontainer > .panel-arrowcontent {
overflow: hidden;
}

View File

@ -166,7 +166,6 @@
}
#urlbar[pageproxystate="valid"] > #identity-box.weakCipher > #connection-icon,
#urlbar[pageproxystate="valid"] > #identity-box.certUserOverridden > #connection-icon,
#urlbar[pageproxystate="valid"] > #identity-box.mixedDisplayContent > #connection-icon,
#urlbar[pageproxystate="valid"] > #identity-box.mixedDisplayContentLoadedActiveBlocked > #connection-icon {
list-style-image: url(chrome://browser/skin/identity-mixed-passive-loaded.svg);
@ -177,3 +176,8 @@
list-style-image: url(chrome://browser/skin/identity-mixed-active-blocked.svg);
visibility: visible;
}
#urlbar[pageproxystate="valid"] > #identity-box.certUserOverridden > #connection-icon {
list-style-image: url(chrome://browser/skin/identity-mixed-passive-loaded.svg);
visibility: visible;
}

View File

@ -14,6 +14,7 @@ h2, h3, h4 {
button {
padding-left: 20px;
padding-right: 20px;
min-width: 100px;
}
/* Category tabs */
@ -86,4 +87,4 @@ button {
.addons-debugging-label {
display: inline-block;
margin: 0 5px 5px 0;
}
}

View File

@ -11,7 +11,7 @@
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>&aboutDebugging.title;</title>
<title>&aboutDebugging.fullTitle;</title>
<link rel="stylesheet" href="chrome://global/skin/global.css" type="text/css"/>
<link rel="stylesheet" href="chrome://global/skin/in-content/common.css" type="text/css"/>
<link rel="stylesheet" href="chrome://devtools/content/aboutdebugging/aboutdebugging.css" type="text/css"/>

View File

@ -51,7 +51,10 @@ module.exports = createClass({
onClick: this.debug,
disabled: debugDisabled,
}, Strings.GetStringFromName("debug")) :
null
dom.button({
className: "start-button",
onClick: this.start
}, Strings.GetStringFromName("start"))
)
);
},
@ -89,6 +92,16 @@ module.exports = createClass({
}
},
start() {
let { client, target } = this.props;
if (target.type === "serviceworker" && !target.workerActor) {
client.request({
to: target.registrationActor,
type: "start"
});
}
},
openWorkerToolbox(workerActor) {
let { client } = this.props;
client.attachWorker(workerActor, (response, workerClient) => {

View File

@ -15,4 +15,5 @@ support-files =
[browser_addons_toggle_debug.js]
[browser_service_workers.js]
[browser_service_workers_push.js]
[browser_service_workers_start.js]
[browser_service_workers_timeout.js]

View File

@ -0,0 +1,85 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
// Test that clicking on the Start button next to a Service Worker works as
// intended in about:debugging.
// It should cause a worker to start running in a child process.
// Service workers can't be loaded from chrome://, but http:// is ok with
// dom.serviceWorkers.testing.enabled turned on.
const HTTP_ROOT = CHROME_ROOT.replace(
"chrome://mochitests/content/", "http://mochi.test:8888/");
const SERVICE_WORKER = HTTP_ROOT + "service-workers/empty-sw.js";
const TAB_URL = HTTP_ROOT + "service-workers/empty-sw.html";
const SW_TIMEOUT = 1000;
add_task(function* () {
info("Turn on workers via mochitest http.");
yield new Promise(done => {
let options = { "set": [
// Accept workers from mochitest's http.
["dom.serviceWorkers.testing.enabled", true],
// Reduce the timeout to accelerate service worker freezing
["dom.serviceWorkers.idle_timeout", SW_TIMEOUT],
["dom.serviceWorkers.idle_extended_timeout", SW_TIMEOUT],
]};
SpecialPowers.pushPrefEnv(options, done);
});
let { tab, document } = yield openAboutDebugging("workers");
// Listen for mutations in the service-workers list.
let serviceWorkersElement = document.getElementById("service-workers");
let onMutation = waitForMutation(serviceWorkersElement, { childList: true });
// Open a tab that registers an empty service worker.
let swTab = yield addTab(TAB_URL);
// Wait for the service-workers list to update.
yield onMutation;
// Check that the service worker appears in the UI.
assertHasTarget(true, document, "service-workers", SERVICE_WORKER);
info("Ensure that the registration resolved before trying to interact with " +
"the service worker.");
yield waitForServiceWorkerRegistered(swTab);
ok(true, "Service worker registration resolved");
// Retrieve the Target element corresponding to the service worker.
let names = [...document.querySelectorAll("#service-workers .target-name")];
let name = names.filter(element => element.textContent === SERVICE_WORKER)[0];
ok(name, "Found the service worker in the list");
let targetElement = name.parentNode.parentNode;
// Check that there is a Debug button but not a Start button.
ok(targetElement.querySelector(".debug-button"), "Found its debug button");
ok(!targetElement.querySelector(".start-button"), "No start button");
// Wait for the service worker to be killed due to inactivity.
yield waitForMutation(targetElement, { childList: true });
// We should now have a Start button but no Debug button.
let startBtn = targetElement.querySelector(".start-button");
ok(startBtn, "Found its start button");
ok(!targetElement.querySelector(".debug-button"), "No debug button");
// Click on the Start button and wait for the service worker to be back.
let onStarted = waitForMutation(targetElement, { childList: true });
startBtn.click();
yield onStarted;
// Check that we have a Debug button but not a Start button again.
ok(targetElement.querySelector(".debug-button"), "Found its debug button");
ok(!targetElement.querySelector(".start-button"), "No start button");
// Finally, unregister the service worker itself.
yield unregisterServiceWorker(swTab);
ok(true, "Service worker registration unregistered");
yield removeTab(swTab);
yield closeAboutDebugging(tab);
});

View File

@ -18,9 +18,6 @@ const { CallWatcherFront } = require("devtools/server/actors/call-watcher");
const { CanvasFront } = require("devtools/server/actors/canvas");
const DevToolsUtils = require("devtools/shared/DevToolsUtils");
const Telemetry = require("devtools/client/shared/telemetry");
const telemetry = new Telemetry();
const CANVAS_ACTOR_RECORDING_ATTEMPT = DevToolsUtils.testing ? 500 : 5000;
XPCOMUtils.defineLazyModuleGetter(this, "Task",
@ -132,7 +129,6 @@ var EventsHandler = {
* Listen for events emitted by the current tab target.
*/
initialize: function() {
telemetry.toolOpened("canvasdebugger");
this._onTabNavigated = this._onTabNavigated.bind(this);
gTarget.on("will-navigate", this._onTabNavigated);
gTarget.on("navigate", this._onTabNavigated);
@ -142,7 +138,6 @@ var EventsHandler = {
* Remove events emitted by the current tab target.
*/
destroy: function() {
telemetry.toolClosed("canvasdebugger");
gTarget.off("will-navigate", this._onTabNavigated);
gTarget.off("navigate", this._onTabNavigated);
},

View File

@ -17,9 +17,9 @@ var { CallWatcherFront } = require("devtools/server/actors/call-watcher");
var { CanvasFront } = require("devtools/server/actors/canvas");
var { setTimeout } = require("sdk/timers");
var DevToolsUtils = require("devtools/shared/DevToolsUtils");
var TiltGL = require("devtools/client/tilt/tilt-gl");
var { TargetFactory } = require("devtools/client/framework/target");
var { Toolbox } = require("devtools/client/framework/toolbox");
var { isWebGLSupported } = require("devtools/client/shared/webgl-utils");
var mm = null
const FRAME_SCRIPT_UTILS_URL = "chrome://devtools/content/shared/frame-script-utils.js";
@ -140,10 +140,7 @@ function isTestingSupported() {
return true;
}
let supported =
!TiltGL.isWebGLForceEnabled() &&
TiltGL.isWebGLSupported() &&
TiltGL.create3DContext(createCanvas());
let supported = isWebGLSupported(document);
info("This test requires WebGL support.");
info("Apparently, WebGL is" + (supported ? "" : " not") + " supported.");

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

@ -66,7 +66,9 @@ function addBreakpoint(location, condition) {
setBreakpointClient(bpClient.actor, bpClient);
return {
text: DebuggerView.editor.getText(bp.location.line - 1).trim(),
text: DebuggerView.editor.getText(
(actualLocation ? actualLocation.line : bp.location.line) - 1
).trim(),
// If the breakpoint response has an "actualLocation" attached, then
// the original requested placement for the breakpoint wasn't

View File

@ -1147,7 +1147,7 @@ SourcesView.prototype = Heritage.extend(WidgetMethods, {
*/
_onCmdAddBreakpoint: function(e) {
let actor = this.selectedValue;
let line = (e && e.sourceEvent.target.tagName == 'menuitem' ?
let line = (this.DebuggerView.clickedLine ?
this.DebuggerView.clickedLine + 1 :
this.DebuggerView.editor.getCursor().line + 1);
let location = { actor, line };

View File

@ -337,6 +337,10 @@ var DebuggerView = {
}
}
});
this.editor.on("cursorActivity", () => {
this.clickedLine = null;
});
},
updateEditorBreakpoints: function(source) {

View File

@ -192,6 +192,15 @@ var gDevToolsBrowser = exports.gDevToolsBrowser = {
}
},
/**
* Open a tab on "about:debugging", optionally pre-select a given tab.
*/
// Used by browser-sets.inc, command
openAboutDebugging: function(gBrowser, hash) {
let url = "about:debugging" + (hash ? "#" + hash : "");
gBrowser.selectedTab = gBrowser.addTab(url);
},
/**
* Open a tab to allow connects to a remote browser
*/

View File

@ -120,6 +120,9 @@ let gDevToolsBrowserMethods = [
// Used by browser.js itself, by setting a oncommand string...
"selectToolCommand",
// Used by browser-sets.inc, command
"openAboutDebugging",
// Used by browser-sets.inc, command
"openConnectScreen",

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

@ -193,21 +193,25 @@
</tabs>
<tabpanels flex="1">
<tabpanel id="sidebar-panel-ruleview" class="devtools-monospace theme-sidebar inspector-tabpanel">
<html:div id="ruleview-toolbar" class="devtools-toolbar devtools-sidebar-toolbar">
<html:div class="devtools-searchbox">
<html:input id="ruleview-searchbox"
class="devtools-searchinput devtools-rule-searchbox"
type="search"
placeholder="&filterStylesPlaceholder;"/>
<html:button id="ruleview-searchinput-clear" class="devtools-searchinput-clear"></html:button>
<html:div id="ruleview-toolbar-container" class="devtools-toolbar">
<html:div id="ruleview-toolbar">
<html:div class="devtools-searchbox">
<html:input id="ruleview-searchbox"
class="devtools-searchinput devtools-rule-searchbox"
type="search"
placeholder="&filterStylesPlaceholder;"/>
<html:button id="ruleview-searchinput-clear" class="devtools-searchinput-clear"></html:button>
</html:div>
<html:div id="ruleview-command-toolbar">
<html:button id="ruleview-add-rule-button" title="&addRuleButtonTooltip;" class="devtools-button"></html:button>
<html:button id="pseudo-class-panel-toggle" title="&togglePseudoClassPanel;" class="devtools-button"></html:button>
</html:div>
</html:div>
<html:button id="ruleview-add-rule-button" title="&addRuleButtonTooltip;" class="devtools-button"></html:button>
<html:button id="pseudo-class-panel-toggle" title="&togglePseudoClassPanel;" class="devtools-button"></html:button>
<html:div id="pseudo-class-panel" hidden="true">
<html:label><html:input id="pseudo-hover-toggle" type="checkbox" value=":hover" tabindex="-1" />:hover</html:label>
<html:label><html:input id="pseudo-active-toggle" type="checkbox" value=":active" tabindex="-1" />:active</html:label>
<html:label><html:input id="pseudo-focus-toggle" type="checkbox" value=":focus" tabindex="-1" />:focus</html:label>
</html:div>
<html:div id="pseudo-class-panel" class="devtools-toolbar devtools-sidebar-toolbar" hidden="true" tabindex="-1">
<html:label><html:input id="pseudo-hover-toggle" type="checkbox" value=":hover" tabindex="-1" />:hover</html:label>
<html:label><html:input id="pseudo-active-toggle" type="checkbox" value=":active" tabindex="-1" />:active</html:label>
<html:label><html:input id="pseudo-focus-toggle" type="checkbox" value=":focus" tabindex="-1" />:focus</html:label>
</html:div>
<html:div id="ruleview-container" class="ruleview">
@ -215,7 +219,7 @@
</tabpanel>
<tabpanel id="sidebar-panel-computedview" class="devtools-monospace theme-sidebar inspector-tabpanel">
<html:div class="devtools-toolbar devtools-sidebar-toolbar">
<html:div class="devtools-toolbar">
<html:div class="devtools-searchbox">
<html:input id="computedview-searchbox"
class="devtools-searchinput devtools-rule-searchbox"
@ -238,7 +242,7 @@
</tabpanel>
<tabpanel id="sidebar-panel-fontinspector" class="devtools-monospace theme-sidebar inspector-tabpanel">
<html:div class="devtools-toolbar devtools-sidebar-toolbar">
<html:div class="devtools-toolbar">
<html:div class="devtools-searchbox">
<html:input id="font-preview-text-input"
class="devtools-textinput"

View File

@ -1059,7 +1059,6 @@ CssRuleView.prototype = {
createExpandableContainer: function(label, isPseudo = false) {
let header = this.styleDocument.createElementNS(HTML_NS, "div");
header.className = this._getRuleViewHeaderClassName(true);
header.classList.add("show-expandable-container");
header.textContent = label;
let twisty = this.styleDocument.createElementNS(HTML_NS, "span");
@ -1071,20 +1070,21 @@ CssRuleView.prototype = {
let container = this.styleDocument.createElementNS(HTML_NS, "div");
container.classList.add("ruleview-expandable-container");
container.hidden = false;
this.element.appendChild(container);
header.addEventListener("dblclick", () => {
this._toggleContainerVisibility(twisty, header, isPseudo,
this._toggleContainerVisibility(twisty, container, isPseudo,
!this.showPseudoElements);
}, false);
twisty.addEventListener("click", () => {
this._toggleContainerVisibility(twisty, header, isPseudo,
this._toggleContainerVisibility(twisty, container, isPseudo,
!this.showPseudoElements);
}, false);
if (isPseudo) {
this._toggleContainerVisibility(twisty, header, isPseudo,
this._toggleContainerVisibility(twisty, container, isPseudo,
this.showPseudoElements);
}
@ -1095,15 +1095,16 @@ CssRuleView.prototype = {
* Toggle the visibility of an expandable container
*
* @param {DOMNode} twisty
* clickable toggle DOM Node
* @param {DOMNode} header
* expandable container header DOM Node
* Clickable toggle DOM Node
* @param {DOMNode} container
* Expandable container DOM Node
* @param {Boolean} isPseudo
* whether or not the container will hold pseudo element rules
* Whether or not the container will hold pseudo element rules
* @param {Boolean} showPseudo
* whether or not pseudo element rules should be displayed
* Whether or not pseudo element rules should be displayed
*/
_toggleContainerVisibility: function(twisty, header, isPseudo, showPseudo) {
_toggleContainerVisibility: function(twisty, container, isPseudo,
showPseudo) {
let isOpen = twisty.getAttribute("open");
if (isPseudo) {
@ -1112,12 +1113,10 @@ CssRuleView.prototype = {
Services.prefs.setBoolPref("devtools.inspector.show_pseudo_elements",
this.showPseudoElements);
header.classList.toggle("show-expandable-container",
this.showPseudoElements);
container.hidden = !this.showPseudoElements;
isOpen = !this.showPseudoElements;
} else {
header.classList.toggle("show-expandable-container");
container.hidden = !container.hidden;
}
if (isOpen) {

View File

@ -40,23 +40,21 @@ function* testTopLeft(inspector, view) {
info("Make sure that clicking on the twisty hides pseudo elements");
let expander = gutters[0].querySelector(".ruleview-expander");
ok(view.element.firstChild.classList.contains("show-expandable-container"),
"Pseudo Elements are expanded");
ok(!view.element.children[1].hidden, "Pseudo Elements are expanded");
expander.click();
ok(!view.element.firstChild.classList.contains("show-expandable-container"),
"Pseudo Elements are collapsed by twisty");
ok(view.element.children[1].hidden,
"Pseudo Elements are collapsed by twisty");
expander.click();
ok(view.element.firstChild.classList.contains("show-expandable-container"),
"Pseudo Elements are expanded again");
ok(!view.element.children[1].hidden, "Pseudo Elements are expanded again");
info("Make sure that dblclicking on the header container also toggles " +
"the pseudo elements");
EventUtils.synthesizeMouseAtCenter(gutters[0], {clickCount: 2},
view.styleWindow);
ok(!view.element.firstChild.classList.contains("show-expandable-container"),
"Pseudo Elements are collapsed by dblclicking");
ok(view.element.children[1].hidden,
"Pseudo Elements are collapsed by dblclicking");
let elementRuleView = getRuleViewRuleEditor(view, 3);
@ -135,8 +133,8 @@ function* testTopRight(inspector, view) {
expander.scrollIntoView();
expander.click();
ok(view.element.firstChild.classList.contains("show-expandable-container"),
"Pseudo Elements are shown again after clicking twisty");
ok(!view.element.children[1].hidden,
"Pseudo Elements are shown again after clicking twisty");
}
function* testBottomRight(inspector, view) {

View File

@ -109,8 +109,6 @@ function* assertPseudoPanelOpened(view) {
ok(!view.activeCheckbox.disabled, ":active checkbox is not disabled");
ok(!view.focusCheckbox.disabled, ":focus checkbox is not disabled");
is(view.pseudoClassPanel.getAttribute("tabindex"), "-1",
"Pseudo Class Panel has a tabindex of -1");
is(view.hoverCheckbox.getAttribute("tabindex"), "0",
":hover checkbox has a tabindex of 0");
is(view.activeCheckbox.getAttribute("tabindex"), "0",
@ -124,8 +122,6 @@ function* assertPseudoPanelClosed(view) {
ok(view.pseudoClassPanel.hidden, "Pseudo Class Panel Hidden");
is(view.pseudoClassPanel.getAttribute("tabindex"), "-1",
"Pseudo Class Panel has a tabindex of -1");
is(view.hoverCheckbox.getAttribute("tabindex"), "-1",
":hover checkbox has a tabindex of -1");
is(view.activeCheckbox.getAttribute("tabindex"), "-1",

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

@ -2,4 +2,4 @@
- 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/. -->
<!ENTITY aboutDebugging.title "about:debugging">
<!ENTITY aboutDebugging.fullTitle "Debugging with Firefox Developer Tools">

View File

@ -4,6 +4,7 @@
debug = Debug
push = Push
start = Start
addons = Add-ons
addonDebugging.label = Enable add-on debugging

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

@ -15,7 +15,6 @@ const { Provider } = require("devtools/client/shared/vendor/react-redux");
const App = createFactory(require("devtools/client/memory/app"));
const Store = require("devtools/client/memory/store");
const { assert } = require("devtools/shared/DevToolsUtils");
const Telemetry = require("devtools/client/shared/telemetry");
/**
* The current target, toolbox, MemoryFront, and HeapAnalysesClient, set by this tool's host.
@ -28,8 +27,6 @@ var gToolbox, gTarget, gFront, gHeapAnalysesClient;
var gStore, gRoot, gApp, gProvider, unsubscribe, isHighlighted, telemetry;
var initialize = Task.async(function*() {
telemetry = new Telemetry();
telemetry.toolOpened("memory");
gRoot = document.querySelector("#app");
gStore = Store();
gApp = createElement(App, { toolbox: gToolbox, front: gFront, heapWorker: gHeapAnalysesClient });
@ -42,10 +39,9 @@ var destroy = Task.async(function*() {
const ok = ReactDOM.unmountComponentAtNode(gRoot);
assert(ok, "Should successfully unmount the memory tool's top level React component");
telemetry.toolClosed("memory");
unsubscribe();
gStore, gRoot, gApp, gProvider, unsubscribe, isHighlighted, telemetry = null;
gStore, gRoot, gApp, gProvider, unsubscribe, isHighlighted;
});
/**

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

@ -45,7 +45,6 @@ const VARIABLES_VIEW_URL = "chrome://devtools/content/shared/widgets/VariablesVi
const {require, loader} = Cu.import("resource://devtools/shared/Loader.jsm", {});
const Telemetry = require("devtools/client/shared/telemetry");
const Editor = require("devtools/client/sourceeditor/editor");
const TargetFactory = require("devtools/client/framework/target").TargetFactory;
const EventEmitter = require("devtools/shared/event-emitter");
@ -92,11 +91,6 @@ XPCOMUtils.defineLazyModuleGetter(this, "ShortcutUtils",
XPCOMUtils.defineLazyModuleGetter(this, "Reflect",
"resource://gre/modules/reflect.jsm");
// Because we have no constructor / destructor where we can log metrics we need
// to do so here.
var telemetry = new Telemetry();
telemetry.toolOpened("scratchpad");
var WebConsoleUtils = require("devtools/shared/webconsole/utils").Utils;
/**
@ -1923,7 +1917,6 @@ var Scratchpad = {
}
if (shouldClose) {
telemetry.toolClosed("scratchpad");
window.close();
}

View File

@ -17,8 +17,6 @@ const Services = require("Services");
const EventEmitter = require("devtools/shared/event-emitter");
const {Tooltip} = require("devtools/client/shared/widgets/Tooltip");
const Editor = require("devtools/client/sourceeditor/editor");
const Telemetry = require("devtools/client/shared/telemetry");
const telemetry = new Telemetry();
// The panel's window global is an EventEmitter firing the following events:
const EVENTS = {
@ -87,7 +85,6 @@ var EventsHandler = {
* Listen for events emitted by the current tab target.
*/
initialize: function() {
telemetry.toolOpened("shadereditor");
this._onHostChanged = this._onHostChanged.bind(this);
this._onTabNavigated = this._onTabNavigated.bind(this);
this._onProgramLinked = this._onProgramLinked.bind(this);
@ -104,7 +101,6 @@ var EventsHandler = {
* Remove events emitted by the current tab target.
*/
destroy: function() {
telemetry.toolClosed("shadereditor");
gToolbox.off("host-changed", this._onHostChanged);
gTarget.off("will-navigate", this._onTabNavigated);
gTarget.off("navigate", this._onTabNavigated);

View File

@ -14,9 +14,9 @@ var { DebuggerClient } = require("devtools/shared/client/main");
var { DebuggerServer } = require("devtools/server/main");
var { WebGLFront } = require("devtools/server/actors/webgl");
var DevToolsUtils = require("devtools/shared/DevToolsUtils");
var TiltGL = require("devtools/client/tilt/tilt-gl");
var {TargetFactory} = require("devtools/client/framework/target");
var {Toolbox} = require("devtools/client/framework/toolbox");
var { TargetFactory } = require("devtools/client/framework/target");
var { Toolbox } = require("devtools/client/framework/toolbox");
var { isWebGLSupported } = require("devtools/client/shared/webgl-utils");
var mm = null;
const FRAME_SCRIPT_UTILS_URL = "chrome://devtools/content/shared/frame-script-utils.js"
@ -118,7 +118,7 @@ function ifWebGLUnsupported() {
}
function test() {
let generator = isWebGLSupported() ? ifWebGLSupported : ifWebGLUnsupported;
let generator = isWebGLSupported(document) ? ifWebGLSupported : ifWebGLUnsupported;
Task.spawn(generator).then(null, handleError);
}
@ -126,16 +126,6 @@ function createCanvas() {
return document.createElementNS("http://www.w3.org/1999/xhtml", "canvas");
}
function isWebGLSupported() {
let supported =
!TiltGL.isWebGLForceEnabled() &&
TiltGL.isWebGLSupported() &&
TiltGL.create3DContext(createCanvas());
info("Apparently, WebGL is" + (supported ? "" : " not") + " supported.");
return supported;
}
function once(aTarget, aEventName, aUseCapture = false) {
info("Waiting for event: '" + aEventName + "' on " + aTarget + ".");

View File

@ -69,11 +69,19 @@ module.exports = createClass({
},
_onMouseDown(event) {
if (event.button !== 0) {
return;
}
this.setState({ mouseDown: true });
event.preventDefault();
},
_onMouseUp(event) {
if (event.button !== 0 || !this.state.mouseDown) {
return;
}
this.setState({ mouseDown: false });
event.preventDefault();
},

View File

@ -80,7 +80,7 @@ window.onload = Task.async(function* () {
const splitter = document.querySelector(".h-split-box-splitter");
ok(splitter, "Should get our splitter");
synthesizeMouseAtCenter(splitter, { button: 1, type: "mousedown" }, window);
synthesizeMouseAtCenter(splitter, { button: 0, type: "mousedown" }, window);
function mouseMove(clientX) {
const event = new MouseEvent("mousemove", { clientX });
@ -103,7 +103,7 @@ window.onload = Task.async(function* () {
is(newSizes.length, 4, "Should get 4 resizes");
ok(aboutEq(newSizes[3], .75), "New size should be ~.75");
synthesizeMouseAtCenter(splitter, { button: 1, type: "mouseup" }, window);
synthesizeMouseAtCenter(splitter, { button: 0, type: "mouseup" }, window);
// Now that we have let go of the splitter, mouse moves should not result in resizes.

View File

@ -43,4 +43,5 @@ DevToolsModules(
'theme.js',
'undo.js',
'view-source.js',
'webgl-utils.js',
)

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");
}
}
}

View File

@ -0,0 +1,58 @@
/* 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 } = require("chrome");
const Services = require("Services");
const WEBGL_CONTEXT_NAME = "experimental-webgl";
function isWebGLForceEnabled()
{
return Services.prefs.getBoolPref("webgl.force-enabled");
}
function isWebGLSupportedByGFX()
{
let supported = false;
try {
let gfxInfo = Cc["@mozilla.org/gfx/info;1"].getService(Ci.nsIGfxInfo);
let angle = gfxInfo.FEATURE_WEBGL_ANGLE;
let opengl = gfxInfo.FEATURE_WEBGL_OPENGL;
// if either the Angle or OpenGL renderers are available, WebGL should work
supported = gfxInfo.getFeatureStatus(angle) === gfxInfo.FEATURE_STATUS_OK ||
gfxInfo.getFeatureStatus(opengl) === gfxInfo.FEATURE_STATUS_OK;
} catch(e) {
return false;
}
return supported;
}
function create3DContext(aCanvas)
{
// try to get a valid context from an existing canvas
let context = null;
try {
context = aCanvas.getContext(WEBGL_CONTEXT_NAME, aFlags);
} catch(e) {
return null;
}
return context;
}
function createCanvas(doc) {
return doc.createElementNS("http://www.w3.org/1999/xhtml", "canvas");
}
function isWebGLSupported(doc) {
let supported =
!isWebGLForceEnabled() &&
isWebGLSupportedByGFX() &&
create3DContext(createCanvas(doc));
return supported;
}
exports.isWebGLSupported = isWebGLSupported;

View File

@ -452,11 +452,11 @@ TableWidget.prototype = {
if (this.filteredValue == value) {
return;
}
this.filteredValue = value;
if (!value) {
this.emit(EVENTS.TABLE_FILTERED, []);
return;
}
this.filteredValue = value;
// Shouldn't be case-sensitive
value = value.toLowerCase();

View File

@ -30,6 +30,7 @@
<textbox id="storage-searchbox"
class="devtools-searchinput"
type="search"
timeout="200"
placeholder="&searchBox.placeholder;"/>
</hbox>
<vbox id="storage-table" class="theme-sidebar" flex="1"/>

View File

@ -17,8 +17,6 @@ loader.lazyImporter(this, "ViewHelpers",
loader.lazyImporter(this, "VariablesView",
"resource://devtools/client/shared/widgets/VariablesView.jsm");
const Telemetry = require("devtools/client/shared/telemetry");
/**
* Localization convenience methods.
*/
@ -83,7 +81,7 @@ var StorageUI = this.StorageUI = function StorageUI(front, target, panelWin) {
this.searchBox = this._panelDoc.getElementById("storage-searchbox");
this.filterItems = this.filterItems.bind(this);
this.searchBox.addEventListener("input", this.filterItems);
this.searchBox.addEventListener("command", this.filterItems);
this.front.listStores().then(storageTypes => {
this.populateStorageTree(storageTypes);
@ -96,9 +94,6 @@ var StorageUI = this.StorageUI = function StorageUI(front, target, panelWin) {
this.handleKeypress = this.handleKeypress.bind(this);
this._panelDoc.addEventListener("keypress", this.handleKeypress);
this._telemetry = new Telemetry();
this._telemetry.toolOpened("storage");
};
exports.StorageUI = StorageUI;
@ -119,7 +114,6 @@ StorageUI.prototype = {
this._panelDoc.removeEventListener("keypress", this.handleKeypress);
this.searchBox.removeEventListener("input", this.filterItems);
this.searchBox = null;
this._telemetry.toolClosed("storage");
},
/**

View File

@ -14,6 +14,10 @@
position: absolute;
}
#sidebar-panel-computedview > .devtools-toolbar {
display: flex;
}
#browser-style-checkbox {
/* Bug 1200073 - extra space before the browser styles checkbox so
they aren't squished together in a small window. */
@ -142,11 +146,6 @@
margin: 0 5px;
}
#root .devtools-toolbar {
width: 100%;
display: flex;
}
.link {
padding: 0 3px;
cursor: pointer;

View File

@ -14,6 +14,10 @@
position: absolute;
}
#sidebar-panel-fontinspector > .devtools-toolbar {
display: flex;
}
#font-container {
overflow: auto;
flex: auto;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 311 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 449 B

View File

@ -4,6 +4,7 @@
#sidebar-panel-layoutview {
display: block;
overflow: auto;
}
#layout-container {
@ -41,7 +42,7 @@
-moz-box-pack: end;
}
@media (max-height: 228px) {
@media (max-height: 250px) {
#layout-header {
padding-top: 0;
padding-bottom: 0;
@ -91,7 +92,7 @@
/* Respond to window size change by changing the size of the regions */
@media (max-height: 228px) {
@media (max-height: 250px) {
#layout-content {
height: 18px;
}
@ -227,7 +228,7 @@
/* Coordinates should be different when the window is small, because we make
the regions smaller then */
@media (max-height: 228px) {
@media (max-height: 250px) {
.layout-padding.layout-top {
top: 37px;
}
@ -300,7 +301,7 @@
color: var(--theme-highlight-blue);
}
@media (max-height: 228px) {
@media (max-height: 250px) {
.layout-legend {
margin: 2px 6px;
}

View File

@ -181,6 +181,7 @@ html, body, #app, #memory-tool {
color: var(--theme-body-color);
border-bottom: 1px solid rgba(128,128,128,0.15);
padding: 8px;
cursor: default;
}
.snapshot-list-item.selected {
@ -188,6 +189,11 @@ html, body, #app, #memory-tool {
color: var(--theme-selection-color);
}
.snapshot-list-item.selected ::-moz-selection {
background-color: var(--theme-selection-color);
color: var(--theme-selection-background);
}
.snapshot-list-item .snapshot-info {
display: flex;
justify-content: space-between;
@ -365,6 +371,7 @@ html, body, #app, #memory-tool {
.tree-node {
height: var(--heap-tree-row-height);
line-height: var(--heap-tree-row-height);
cursor: default;
}
.children-pointer {
@ -397,6 +404,11 @@ html, body, #app, #memory-tool {
color: var(--theme-selection-color);
}
.heap-tree-item.focused ::-moz-selection {
background-color: var(--theme-selection-color);
color: var(--theme-selection-background);
}
.heap-tree-item-bytes,
.heap-tree-item-count,
.heap-tree-item-total-bytes,

View File

@ -13,6 +13,8 @@
--rule-filter-icon: url(images/magnifying-glass.png);
}
/* Rule View Tabpanel */
#sidebar-panel-ruleview {
margin: 0;
display: flex;
@ -24,6 +26,47 @@
position: absolute;
}
/* Rule View Toolbar */
#ruleview-toolbar-container {
display: flex;
flex-direction: column;
height: auto;
}
#ruleview-toolbar {
display: flex;
height: 23px;
}
#ruleview-toolbar > .devtools-searchbox:first-child {
-moz-padding-start: 0px;
}
#ruleview-command-toolbar {
display: flex;
}
#pseudo-class-panel {
display: flex;
height: 24px;
overflow: hidden;
transition: height 150ms ease;
}
#pseudo-class-panel[hidden] {
height: 0px;
}
#pseudo-class-panel > label {
-moz-user-select: none;
flex-grow: 1;
display: flex;
align-items: center;
}
/* Rule View Container */
#ruleview-container {
-moz-user-select: text;
overflow: auto;
@ -36,33 +79,6 @@
transition: visibility 0.25s;
}
.devtools-sidebar-toolbar {
display: flex;
}
#pseudo-class-panel {
position: relative;
margin-top: -1px;
margin-bottom: -1px;
overflow-y: hidden;
max-height: 24px;
outline: 0 !important;
transition-property: max-height;
transition-duration: 150ms;
transition-timing-function: ease;
}
#pseudo-class-panel[hidden] {
max-height: 0px;
}
#pseudo-class-panel > label {
-moz-user-select: none;
flex-grow: 1;
display: flex;
align-items: center;
}
.ruleview-code {
direction: ltr;
}
@ -71,11 +87,11 @@
pointer-events: none;
}
.ruleview-expandable-container {
.ruleview-expandable-container[hidden] {
display: none;
}
.show-expandable-container + .ruleview-expandable-container {
.ruleview-expandable-container {
display: block;
}
@ -135,6 +151,7 @@
vertical-align: middle;
min-height: 1.5em;
line-height: 1.5em;
margin-top: -1px;
}
:root[platform="win"] .ruleview-header,

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.");
}

Some files were not shown because too many files have changed in this diff Show More