mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-29 07:42:04 +00:00
merge fx-team to mozilla-central a=merge
This commit is contained in:
commit
fd935ddfec
@ -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/**
|
||||
|
@ -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"/>
|
||||
|
@ -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"/>
|
||||
|
@ -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>
|
||||
|
@ -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);
|
||||
|
@ -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]
|
||||
|
@ -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");
|
||||
});
|
||||
|
@ -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");
|
||||
|
@ -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() {
|
||||
|
@ -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()
|
||||
|
@ -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) {
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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();
|
||||
});
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
615
browser/extensions/pdfjs/content/build/pdf.worker.js
vendored
615
browser/extensions/pdfjs/content/build/pdf.worker.js
vendored
@ -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
@ -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">
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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"/>
|
||||
|
@ -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) => {
|
||||
|
@ -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]
|
||||
|
@ -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);
|
||||
});
|
@ -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);
|
||||
},
|
||||
|
@ -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.");
|
||||
|
@ -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);
|
||||
}
|
||||
},
|
||||
]);
|
||||
|
@ -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
|
||||
|
@ -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 };
|
||||
|
@ -337,6 +337,10 @@ var DebuggerView = {
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
this.editor.on("cursorActivity", () => {
|
||||
this.clickedLine = null;
|
||||
});
|
||||
},
|
||||
|
||||
updateEditorBreakpoints: function(source) {
|
||||
|
@ -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
|
||||
*/
|
||||
|
@ -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",
|
||||
|
||||
|
@ -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");
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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");
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
|
@ -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"
|
||||
|
@ -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) {
|
||||
|
@ -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) {
|
||||
|
@ -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",
|
||||
|
@ -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)
|
||||
|
@ -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">
|
||||
|
@ -4,6 +4,7 @@
|
||||
|
||||
debug = Debug
|
||||
push = Push
|
||||
start = Start
|
||||
|
||||
addons = Add-ons
|
||||
addonDebugging.label = Enable add-on debugging
|
||||
|
@ -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).
|
@ -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;
|
||||
});
|
||||
|
||||
/**
|
||||
|
@ -33,7 +33,6 @@ DIRS += [
|
||||
'storage',
|
||||
'styleeditor',
|
||||
'themes',
|
||||
'tilt',
|
||||
'webaudioeditor',
|
||||
'webconsole',
|
||||
'webide',
|
||||
|
@ -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
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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 + ".");
|
||||
|
||||
|
@ -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();
|
||||
},
|
||||
|
@ -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.
|
||||
|
||||
|
@ -43,4 +43,5 @@ DevToolsModules(
|
||||
'theme.js',
|
||||
'undo.js',
|
||||
'view-source.js',
|
||||
'webgl-utils.js',
|
||||
)
|
||||
|
@ -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",
|
||||
|
@ -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]
|
||||
|
@ -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");
|
||||
}
|
||||
}
|
||||
}
|
58
devtools/client/shared/webgl-utils.js
Normal file
58
devtools/client/shared/webgl-utils.js
Normal 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;
|
@ -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();
|
||||
|
||||
|
@ -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"/>
|
||||
|
@ -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");
|
||||
},
|
||||
|
||||
/**
|
||||
|
@ -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;
|
||||
|
@ -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 |
@ -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;
|
||||
}
|
||||
|
@ -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,
|
||||
|
@ -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,
|
||||
|
@ -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");
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
};
|
@ -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;
|
||||
};
|
||||
}());
|
@ -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']
|
@ -1,4 +0,0 @@
|
||||
{
|
||||
// Extend from the shared list of defined globals for mochitests.
|
||||
"extends": "../../../.eslintrc.mochitests"
|
||||
}
|
@ -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]
|
@ -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.");
|
||||
}
|
@ -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();
|
||||
}
|
@ -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();
|
||||
}
|
@ -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++;
|
||||
}
|
||||
}
|
@ -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++;
|
||||
}
|
||||
}
|
@ -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();
|
||||
}
|
@ -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();
|
||||
}
|
@ -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();
|
||||
}
|
@ -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();
|
||||
}
|
@ -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();
|
||||
}
|
@ -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();
|
||||
}
|
@ -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.");
|
||||
}
|
@ -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();
|
||||
}
|
@ -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.");
|
||||
}
|
@ -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.");
|
||||
}
|
@ -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.");
|
||||
}
|
@ -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.");
|
||||
}
|
@ -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.");
|
||||
}
|
@ -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.");
|
||||
}
|
@ -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.");
|
||||
}
|
@ -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.");
|
||||
}
|
@ -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.");
|
||||
}
|
@ -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.");
|
||||
}
|
@ -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.");
|
||||
}
|
@ -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.");
|
||||
}
|
@ -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.");
|
||||
}
|
@ -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
Loading…
Reference in New Issue
Block a user