diff options
Diffstat (limited to 'apps/system/js/wrapper.js')
-rw-r--r-- | apps/system/js/wrapper.js | 198 |
1 files changed, 198 insertions, 0 deletions
diff --git a/apps/system/js/wrapper.js b/apps/system/js/wrapper.js new file mode 100644 index 0000000..160d70b --- /dev/null +++ b/apps/system/js/wrapper.js @@ -0,0 +1,198 @@ +/* -*- Mode: js; js-indent-level: 2; indent-tabs-mode: nil -*- */ +/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ + +'use strict'; + +var Launcher = (function() { + function log(str) { + dump(' -+- Launcher -+-: ' + str + '\n'); + } + + function currentAppFrame() { + return WindowManager.getAppFrame(WindowManager.getDisplayedApp()); + } + + + function currentAppIframe() { + return currentAppFrame().firstChild; + } + + var _ = navigator.mozL10n.get; + + var BUTTONBAR_TIMEOUT = 5000; + var BUTTONBAR_INITIAL_OPEN_TIMEOUT = 1500; + + var footer = document.querySelector('#wrapper-footer'); + window.addEventListener('appopen', function onAppOpen(e) { + if ('wrapper' in currentAppFrame().dataset) { + window.addEventListener('mozbrowserlocationchange', onLocationChange); + onLocationChange(); + onDisplayedApplicationChange(); + } + }); + + window.addEventListener('appwillclose', function onAppClose(e) { + if ('wrapper' in currentAppFrame().dataset) { + window.removeEventListener('mozbrowserlocationchange', onLocationChange); + clearTimeout(buttonBarTimeout); + footer.classList.add('closed'); + isButtonBarDisplayed = false; + } + }); + + window.addEventListener('keyboardchange', function onKeyboardChange(e) { + if ('wrapper' in currentAppFrame().dataset) { + if (footer.classList.contains('visible')) { + footer.classList.remove('visible'); + } + } + }); + + window.addEventListener('keyboardhide', function onKeyboardChange(e) { + if ('wrapper' in currentAppFrame().dataset) { + if (!footer.classList.contains('visible')) { + footer.classList.add('visible'); + } + } + }); + + var buttonBarTimeout; + + var isButtonBarDisplayed = false; + function toggleButtonBar(time) { + clearTimeout(buttonBarTimeout); + footer.classList.toggle('closed'); + isButtonBarDisplayed = !isButtonBarDisplayed; + if (isButtonBarDisplayed) { + buttonBarTimeout = setTimeout(toggleButtonBar, time || BUTTONBAR_TIMEOUT); + } + } + + function clearButtonBarTimeout() { + clearTimeout(buttonBarTimeout); + buttonBarTimeout = setTimeout(toggleButtonBar, BUTTONBAR_TIMEOUT); + } + + document.getElementById('handler'). + addEventListener('mousedown', function open() { toggleButtonBar() }); + + document.getElementById('close-button'). + addEventListener('mousedown', function close() { toggleButtonBar() }); + + var reload = document.getElementById('reload-button'); + reload.addEventListener('click', function doReload(evt) { + clearButtonBarTimeout(); + currentAppIframe().reload(true); + }); + + var back = document.getElementById('back-button'); + back.addEventListener('click', function goBack() { + clearButtonBarTimeout(); + currentAppIframe().goBack(); + }); + + var forward = document.getElementById('forward-button'); + forward.addEventListener('click', function goForward() { + clearButtonBarTimeout(); + currentAppIframe().goForward(); + }); + + function onLocationChange() { + currentAppIframe().getCanGoForward().onsuccess = function forwardSuccess(e) { + if (e.target.result === true) { + delete forward.dataset.disabled; + } else { + forward.dataset.disabled = true; + } + } + + currentAppIframe().getCanGoBack().onsuccess = function backSuccess(e) { + if (e.target.result === true) { + delete back.dataset.disabled; + } else { + back.dataset.disabled = true; + } + } + } + + window.addEventListener('mozbrowserlocationchange', onLocationChange); + + var bookmarkButton = document.getElementById('bookmark-button'); + function onDisplayedApplicationChange() { + toggleButtonBar(BUTTONBAR_INITIAL_OPEN_TIMEOUT); + + var dataset = currentAppIframe().dataset; + if (dataset.originURL || dataset.searchURL) { + delete bookmarkButton.dataset.disabled; + return; + } + + bookmarkButton.dataset.disabled = true; + } + + bookmarkButton.addEventListener('click', function doBookmark(evt) { + if (bookmarkButton.dataset.disabled) + return; + + clearButtonBarTimeout(); + var dataset = currentAppIframe().dataset; + + function selected(value) { + if (!value) + return; + + var name, url; + if (value === 'origin') { + name = dataset.originName; + url = dataset.originURL; + } + + if (value === 'search') { + name = dataset.searchName; + url = dataset.searchURL; + } + + var activity = new MozActivity({ + name: 'save-bookmark', + data: { + type: 'url', + url: url, + name: name, + icon: dataset.icon, + useAsyncPanZoom: dataset.useAsyncPanZoom, + iconable: false + } + }); + + activity.onsuccess = function onsuccess() { + if (value === 'origin') { + delete currentAppIframe().dataset.originURL; + } + + if (value === 'search') { + delete currentAppIframe().dataset.searchURL; + } + + if (!currentAppIframe().dataset.originURL && + !currentAppIframe().dataset.searchURL) { + bookmarkButton.dataset.disabled = true; + } + } + } + + var data = { + title: _('add-to-home-screen'), + options: [] + }; + + if (dataset.originURL) { + data.options.push({ id: 'origin', text: dataset.originName }); + } + + if (dataset.searchURL) { + data.options.push({ id: 'search', text: dataset.searchName }); + } + + ModalDialog.selectOne(data, selected); + }); +}()); |