OLD | NEW |
1 /* | 1 /* |
2 * This file is part of Adblock Plus <https://adblockplus.org/>, | 2 * This file is part of Adblock Plus <https://adblockplus.org/>, |
3 * Copyright (C) 2006-2015 Eyeo GmbH | 3 * Copyright (C) 2006-2015 Eyeo GmbH |
4 * | 4 * |
5 * Adblock Plus is free software: you can redistribute it and/or modify | 5 * Adblock Plus is free software: you can redistribute it and/or modify |
6 * it under the terms of the GNU General Public License version 3 as | 6 * it under the terms of the GNU General Public License version 3 as |
7 * published by the Free Software Foundation. | 7 * published by the Free Software Foundation. |
8 * | 8 * |
9 * Adblock Plus is distributed in the hope that it will be useful, | 9 * Adblock Plus is distributed in the hope that it will be useful, |
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
(...skipping 1581 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1592 | 1592 |
1593 hideElement(prefix + "contributebutton", Prefs.hideContributeButton); | 1593 hideElement(prefix + "contributebutton", Prefs.hideContributeButton); |
1594 }, | 1594 }, |
1595 | 1595 |
1596 /** | 1596 /** |
1597 * Adds Adblock Plus menu items to the content area context menu when it shows | 1597 * Adds Adblock Plus menu items to the content area context menu when it shows |
1598 * up. | 1598 * up. |
1599 */ | 1599 */ |
1600 fillContentContextMenu: function(/**Element*/ popup) | 1600 fillContentContextMenu: function(/**Element*/ popup) |
1601 { | 1601 { |
1602 let target = popup.triggerNode; | 1602 let window = popup.ownerDocument.defaultView; |
1603 if (target instanceof Ci.nsIDOMHTMLMapElement || target instanceof Ci.nsIDOM
HTMLAreaElement) | 1603 if (!window.gContextMenuContentData || |
| 1604 typeof window.gContextMenuContentData.addonInfo != "object" || |
| 1605 typeof window.gContextMenuContentData.addonInfo.adblockplus != "object") |
1604 { | 1606 { |
1605 // HTML image maps will usually receive events when the mouse pointer is | 1607 return; |
1606 // over a different element, get the real event target. | |
1607 let rect = target.getClientRects()[0]; | |
1608 target = target.ownerDocument.elementFromPoint(Math.max(rect.left, 0), Mat
h.max(rect.top, 0)); | |
1609 } | 1608 } |
1610 | 1609 |
1611 if (!target) | 1610 let items = window.gContextMenuContentData.addonInfo.adblockplus; |
1612 return; | 1611 let clicked = null; |
| 1612 let menuItems = []; |
1613 | 1613 |
1614 let window = popup.ownerDocument.defaultView; | 1614 function menuItemTriggered(id, nodeData) |
1615 let menuItems = []; | 1615 { |
1616 let addMenuItem = function([node, nodeData]) | 1616 clicked = id; |
| 1617 this.blockItem(window, id, nodeData); |
| 1618 } |
| 1619 |
| 1620 for (let [id, nodeData] of items) |
1617 { | 1621 { |
1618 let type = nodeData.type.toLowerCase(); | 1622 let type = nodeData.type.toLowerCase(); |
1619 if (type == "background") | |
1620 { | |
1621 type = "image"; | |
1622 node = null; | |
1623 } | |
1624 | |
1625 let label = this.overlay.attributes[type + "contextlabel"]; | 1623 let label = this.overlay.attributes[type + "contextlabel"]; |
1626 if (!label) | 1624 if (!label) |
1627 return; | 1625 return; |
1628 | 1626 |
1629 let item = popup.ownerDocument.createElement("menuitem"); | 1627 let item = popup.ownerDocument.createElement("menuitem"); |
1630 item.setAttribute("label", label); | 1628 item.setAttribute("label", label); |
1631 item.setAttribute("class", "abp-contextmenuitem"); | 1629 item.setAttribute("class", "abp-contextmenuitem"); |
1632 item.addEventListener("command", this.blockItem.bind(this, window, node, n
odeData), false); | 1630 item.addEventListener("command", menuItemTriggered.bind(this, id, nodeData
), false); |
1633 popup.appendChild(item); | 1631 popup.appendChild(item); |
1634 | 1632 |
1635 menuItems.push(item); | 1633 menuItems.push(item); |
1636 }.bind(this); | |
1637 | |
1638 // Look up data that we have for the node | |
1639 let data = RequestNotifier.getDataForNode(target); | |
1640 let hadImage = false; | |
1641 if (data && !data[1].filter) | |
1642 { | |
1643 addMenuItem(data); | |
1644 hadImage = (data[1].type == "IMAGE"); | |
1645 } | |
1646 | |
1647 // Look for frame data | |
1648 let wnd = Utils.getWindow(target); | |
1649 if (wnd.frameElement) | |
1650 { | |
1651 let data = RequestNotifier.getDataForNode(wnd.frameElement, true); | |
1652 if (data && !data[1].filter) | |
1653 addMenuItem(data); | |
1654 } | |
1655 | |
1656 // Look for a background image | |
1657 if (!hadImage) | |
1658 { | |
1659 let extractImageURL = function(computedStyle, property) | |
1660 { | |
1661 let value = computedStyle.getPropertyCSSValue(property); | |
1662 // CSSValueList | |
1663 if ("length" in value && value.length >= 1) | |
1664 value = value[0]; | |
1665 // CSSValuePrimitiveType | |
1666 if ("primitiveType" in value && value.primitiveType == value.CSS_URI) | |
1667 return Utils.unwrapURL(value.getStringValue()).spec; | |
1668 | |
1669 return null; | |
1670 }; | |
1671 | |
1672 let node = target; | |
1673 while (node) | |
1674 { | |
1675 if (node.nodeType == Ci.nsIDOMNode.ELEMENT_NODE) | |
1676 { | |
1677 let style = wnd.getComputedStyle(node, ""); | |
1678 let bgImage = extractImageURL(style, "background-image") || extractIma
geURL(style, "list-style-image"); | |
1679 if (bgImage) | |
1680 { | |
1681 let data = RequestNotifier.getDataForNode(wnd.document, true, "IMAGE
", bgImage); | |
1682 if (data && !data[1].filter) | |
1683 { | |
1684 addMenuItem(data); | |
1685 break; | |
1686 } | |
1687 } | |
1688 } | |
1689 | |
1690 node = node.parentNode; | |
1691 } | |
1692 } | 1634 } |
1693 | 1635 |
1694 // Add "Remove exception" menu item if necessary | 1636 // Add "Remove exception" menu item if necessary |
1695 let location = this.getCurrentLocation(window); | 1637 let location = this.getCurrentLocation(window); |
1696 let filter = (location ? Policy.isWhitelisted(location.spec) : null); | 1638 let filter = (location ? Policy.isWhitelisted(location.spec) : null); |
1697 if (filter && filter.subscriptions.length && !filter.disabled) | 1639 if (filter && filter.subscriptions.length && !filter.disabled) |
1698 { | 1640 { |
1699 let label = this.overlay.attributes.whitelistcontextlabel; | 1641 let label = this.overlay.attributes.whitelistcontextlabel; |
1700 if (!label) | 1642 if (!label) |
1701 return; | 1643 return; |
1702 | 1644 |
1703 let item = popup.ownerDocument.createElement("menuitem"); | 1645 let item = popup.ownerDocument.createElement("menuitem"); |
1704 item.setAttribute("label", label); | 1646 item.setAttribute("label", label); |
1705 item.setAttribute("class", "abp-contextmenuitem"); | 1647 item.setAttribute("class", "abp-contextmenuitem"); |
1706 item.addEventListener("command", this.toggleFilter.bind(this, filter), fal
se); | 1648 item.addEventListener("command", this.toggleFilter.bind(this, filter), fal
se); |
1707 popup.appendChild(item); | 1649 popup.appendChild(item); |
1708 | 1650 |
1709 menuItems.push(item); | 1651 menuItems.push(item); |
1710 } | 1652 } |
1711 | 1653 |
1712 // Make sure to clean up everything once the context menu is closed | 1654 // Make sure to clean up everything once the context menu is closed |
1713 if (menuItems.length) | 1655 let cleanUp = function(event) |
1714 { | 1656 { |
1715 let cleanUp = function(event) | 1657 if (event.eventPhase != event.AT_TARGET) |
1716 { | 1658 return; |
1717 if (event.eventPhase != event.AT_TARGET) | |
1718 return; | |
1719 | 1659 |
1720 popup.removeEventListener("popuphidden", cleanUp, false); | 1660 popup.removeEventListener("popuphidden", cleanUp, false); |
1721 for (let i = 0; i < menuItems.length; i++) | 1661 for (let menuItem of menuItems) |
1722 if (menuItems[i].parentNode) | 1662 if (menuItem.parentNode) |
1723 menuItems[i].parentNode.removeChild(menuItems[i]); | 1663 menuItem.parentNode.removeChild(menuItem); |
1724 }.bind(this); | 1664 |
1725 popup.addEventListener("popuphidden", cleanUp, false); | 1665 for (let [id, nodeData] of items) |
1726 } | 1666 if (id && id != clicked) |
| 1667 Policy.deleteNodes(id); |
| 1668 }.bind(this); |
| 1669 popup.addEventListener("popuphidden", cleanUp, false); |
1727 }, | 1670 }, |
1728 | 1671 |
1729 /** | 1672 /** |
1730 * Called when the user presses a key in the application window, reacts to our | 1673 * Called when the user presses a key in the application window, reacts to our |
1731 * shortcut keys. | 1674 * shortcut keys. |
1732 */ | 1675 */ |
1733 onKeyPress: function(/**Event*/ event) | 1676 onKeyPress: function(/**Event*/ event) |
1734 { | 1677 { |
1735 if (!this.hotkeys) | 1678 if (!this.hotkeys) |
1736 this.configureKeys(event.currentTarget); | 1679 this.configureKeys(event.currentTarget); |
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1944 ["abp-command-contribute-hide", "command", UI.hideContributeButton.bind(UI)], | 1887 ["abp-command-contribute-hide", "command", UI.hideContributeButton.bind(UI)], |
1945 ["abp-command-toggleshownotifications", "command", Notification.toggleIgnoreCa
tegory.bind(Notification, "*", null)] | 1888 ["abp-command-toggleshownotifications", "command", Notification.toggleIgnoreCa
tegory.bind(Notification, "*", null)] |
1946 ]; | 1889 ]; |
1947 | 1890 |
1948 onShutdown.add(function() | 1891 onShutdown.add(function() |
1949 { | 1892 { |
1950 for (let window of UI.applicationWindows) | 1893 for (let window of UI.applicationWindows) |
1951 if (UI.isBottombarOpen(window)) | 1894 if (UI.isBottombarOpen(window)) |
1952 UI.toggleBottombar(window); | 1895 UI.toggleBottombar(window); |
1953 }); | 1896 }); |
OLD | NEW |