Index: lib/child/commands.js |
=================================================================== |
new file mode 100644 |
--- /dev/null |
+++ b/lib/child/commands.js |
@@ -0,0 +1,147 @@ |
+/* |
+ * This Source Code is subject to the terms of the Mozilla Public License |
+ * version 2.0 (the "License"). You can obtain a copy of the License at |
+ * http://mozilla.org/MPL/2.0/. |
+ */ |
+ |
+"use strict"; |
+ |
+let messageManager = require("messageManager"); |
+let {getNodeInfo} = require("./nodeInfo"); |
+let { |
+ state, selectElement, setAnchorElement, stopSelection |
+} = require("./selection"); |
+let {getParentElement} = require("./utils"); |
+ |
+messageManager.addMessageListener("ElemHideHelper:Command", onCommand); |
+ |
+onShutdown.add(() => |
+{ |
+ messageManager.removeMessageListener("ElemHideHelper:Command", onCommand); |
+}); |
+ |
+function onCommand(message) |
+{ |
+ let command = message.data; |
+ if (typeof exports[command] == "function") |
+ exports[command](); |
+} |
+ |
+function quit() |
+{ |
+ stopSelection(); |
+} |
+exports.quit = quit; |
+ |
+function select() |
+{ |
+ if (!state.selectedElement) |
+ return; |
+ |
+ messageManager.sendAsyncMessage( |
+ "ElemHideHelper:SelectionSucceeded", |
+ getNodeInfo(state.selectedElement) |
+ ); |
+ stopSelection(); |
+} |
+exports.select = select; |
+ |
+function wider() |
+{ |
+ if (!state.selectedElement) |
+ return; |
+ |
+ let newElement = getParentElement(state.selectedElement); |
+ if (!newElement) |
+ return; |
+ |
+ state.isUserSelected = true; |
+ selectElement(newElement); |
+} |
+exports.wider = wider; |
+ |
+function narrower() |
+{ |
+ if (!state.selectedElement) |
+ return; |
+ |
+ // Search selected element in the parent chain, starting with the ancho |
+ // element. We need to select the element just before the selected one. |
+ let e = state.anchorElement; |
+ let newElement = null; |
+ while (e && e != state.selectedElement) |
+ { |
+ newElement = e; |
+ e = getParentElement(e); |
+ } |
+ |
+ if (!e || !newElement) |
+ return; |
+ |
+ state.isUserSelected = true; |
+ selectElement(newElement); |
+} |
+exports.narrower = narrower; |
+ |
+function lock() |
+{ |
+ if (!state.selectedElement) |
+ return; |
+ |
+ if (state.lockedAnchor) |
+ { |
+ setAnchorElement(state.lockedAnchor); |
+ state.lockedAnchor = null; |
+ } |
+ else |
+ state.lockedAnchor = state.anchorElement; |
+} |
+exports.lock = lock; |
+ |
+let blinkState = null; |
+ |
+function stopBlinking() |
+{ |
+ blinkState.timer.cancel(); |
+ if (!Cu.isDeadWrapper(blinkState.element)) |
+ blinkState.element.style.visibility = blinkState.origVisibility; |
+ blinkState = null; |
+} |
+ |
+function doBlink() |
+{ |
+ if (Cu.isDeadWrapper(blinkState.element)) |
+ { |
+ stopBlinking(); |
+ return; |
+ } |
+ |
+ blinkState.counter++; |
+ blinkState.element.style.setProperty( |
+ "visibility", |
+ (blinkState.counter % 2 == 0 ? "visible" : "hidden"), |
+ "important" |
+ ); |
+ if (blinkState.counter == 6) |
+ stopBlinking(); |
+} |
+ |
+function blinkElement() |
+{ |
+ if (!state.selectedElement) |
+ return; |
+ |
+ if (blinkState) |
+ stopBlinking(); |
+ |
+ blinkState = { |
+ counter: 0, |
+ element: state.selectedElement, |
+ origVisibility: state.selectedElement.style.visibility, |
+ timer: Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer) |
+ }; |
+ |
+ blinkState.timer.initWithCallback(doBlink, 250, |
+ Ci.nsITimer.TYPE_REPEATING_SLACK); |
+} |
+exports.blinkElement = blinkElement; |