Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Unified Diff: include.postload.js

Issue 29336084: Issue 2426 - Open block.html as a popup window (Closed)
Patch Set: Open block.html as a popup window Created Feb. 8, 2016, 12:32 p.m.
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: include.postload.js
diff --git a/include.postload.js b/include.postload.js
deleted file mode 100644
index 5b87979fb91612f1b4ab9b13eed2c2ac2e4019f4..0000000000000000000000000000000000000000
--- a/include.postload.js
+++ /dev/null
@@ -1,674 +0,0 @@
-/*
- * This file is part of Adblock Plus <https://adblockplus.org/>,
- * Copyright (C) 2006-2016 Eyeo GmbH
- *
- * Adblock Plus is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 3 as
- * published by the Free Software Foundation.
- *
- * Adblock Plus is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
- */
-
-// Click-to-hide stuff
-var clickHide_activated = false;
-var clickHide_filters = null;
-var currentElement = null;
-var highlightedElementsSelector = null;
-var highlightedElementsInterval = null;
-var clickHideFiltersDialog = null;
-var lastRightClickEvent = null;
-var lastRightClickEventValid = false;
-var lastMouseOverEvent = null;
-
-function highlightElement(element, shadowColor, backgroundColor)
-{
- unhighlightElement(element);
-
- var highlightWithOverlay = function()
- {
- var overlay = addElementOverlay(element);
-
- // If the element isn't displayed no overlay will be added.
- // Moreover, we don't need to highlight anything then.
- if (!overlay)
- return;
-
- highlightElement(overlay, shadowColor, backgroundColor);
- overlay.style.pointerEvents = "none";
-
- element._unhighlight = function()
- {
- overlay.parentNode.removeChild(overlay);
- };
- };
-
- var highlightWithStyleAttribute = function()
- {
- var originalBoxShadow = element.style.getPropertyValue("box-shadow");
- var originalBoxShadowPriority = element.style.getPropertyPriority("box-shadow");
- var originalBackgroundColor = element.style.getPropertyValue("background-color");
- var originalBackgroundColorPriority = element.style.getPropertyPriority("background-color");
-
- element.style.setProperty("box-shadow", "inset 0px 0px 5px " + shadowColor, "important");
- element.style.setProperty("background-color", backgroundColor, "important");
-
- element._unhighlight = function()
- {
- this.style.removeProperty("box-shadow");
- this.style.setProperty(
- "box-shadow",
- originalBoxShadow,
- originalBoxShadowPriority
- );
-
- this.style.removeProperty("background-color");
- this.style.setProperty(
- "background-color",
- originalBackgroundColor,
- originalBackgroundColorPriority
- );
- };
- };
-
- if ("prisoner" in element)
- highlightWithStyleAttribute();
- else
- highlightWithOverlay();
-}
-
-
-function unhighlightElement(element)
-{
- if ("_unhighlight" in element)
- {
- element._unhighlight();
- delete element._unhighlight;
- }
-}
-
-// Highlight elements according to selector string. This would include
-// all elements that would be affected by proposed filters.
-function highlightElements(selectorString) {
- unhighlightElements();
-
- var elements = Array.prototype.slice.call(document.querySelectorAll(selectorString));
- highlightedElementsSelector = selectorString;
-
- // Highlight elements progressively. Otherwise the page freezes
- // when a lot of elements get highlighted at the same time.
- highlightedElementsInterval = setInterval(function()
- {
- if (elements.length > 0)
- {
- var element = elements.shift();
- if (element != currentElement)
- highlightElement(element, "#fd6738", "#f6e1e5");
- }
- else
- {
- clearInterval(highlightedElementsInterval);
- highlightedElementsInterval = null;
- }
- }, 0);
-}
-
-// Unhighlight all elements, including those that would be affected by
-// the proposed filters
-function unhighlightElements() {
- if (highlightedElementsInterval)
- {
- clearInterval(highlightedElementsInterval)
- highlightedElementsInterval = null;
- }
-
- if (highlightedElementsSelector)
- {
- Array.prototype.forEach.call(
- document.querySelectorAll(highlightedElementsSelector),
- unhighlightElement
- );
-
- highlightedElementsSelector = null;
- }
-}
-
-// Adds an overlay to an element, which is probably a Flash object
-function addElementOverlay(elt) {
- var position = "absolute";
- var offsetX = window.scrollX;
- var offsetY = window.scrollY;
-
- for (var e = elt; e; e = e.parentElement)
- {
- var style = getComputedStyle(e);
-
- // If the element isn't rendered (since its or one of its ancestor's
- // "display" property is "none"), the overlay wouldn't match the element.
- if (style.display == "none")
- return null;
-
- // If the element or one of its ancestors uses fixed postioning, the overlay
- // has to use fixed postioning too. Otherwise it might not match the element.
- if (style.position == "fixed")
- {
- position = "fixed";
- offsetX = offsetY = 0;
- }
- }
-
- var overlay = document.createElement('div');
- overlay.prisoner = elt;
- overlay.className = "__adblockplus__overlay";
- overlay.setAttribute('style', 'opacity:0.4; display:inline-box; overflow:hidden; box-sizing:border-box;');
- var rect = elt.getBoundingClientRect();
- overlay.style.width = rect.width + "px";
- overlay.style.height = rect.height + "px";
- overlay.style.left = (rect.left + offsetX) + "px";
- overlay.style.top = (rect.top + offsetY) + "px";
- overlay.style.position = position;
- overlay.style.zIndex = 0x7FFFFFFE;
-
- // elt.parentNode.appendChild(overlay, elt);
- document.documentElement.appendChild(overlay);
- return overlay;
-}
-
-// Show dialog asking user whether she wants to add the proposed filters derived
-// from selected page element
-function clickHide_showDialog(filters)
-{
- clickHide_filters = filters;
-
- clickHideFiltersDialog = document.createElement("iframe");
- clickHideFiltersDialog.src = ext.getURL("block.html");
- clickHideFiltersDialog.setAttribute("style", "position: fixed !important; visibility: hidden; display: block !important; border: 0px !important;");
- clickHideFiltersDialog.style.WebkitBoxShadow = "5px 5px 20px rgba(0,0,0,0.5)";
- clickHideFiltersDialog.style.zIndex = 0x7FFFFFFF;
-
- // Position in upper-left all the time
- clickHideFiltersDialog.style.left = "50px";
- clickHideFiltersDialog.style.top = "50px";
-
- // Make dialog partly transparent when mouse isn't over it so user has a better
- // view of what's going to be blocked
- clickHideFiltersDialog.onmouseout = function()
- {
- if (clickHideFiltersDialog)
- clickHideFiltersDialog.style.setProperty("opacity", "0.7");
- };
- clickHideFiltersDialog.onmouseover = function()
- {
- if (clickHideFiltersDialog)
- clickHideFiltersDialog.style.setProperty("opacity", "1.0");
- };
-
- document.documentElement.appendChild(clickHideFiltersDialog);
-}
-
-// Turn on the choose element to create filter thing
-function clickHide_activate() {
- if(document == null)
- return;
-
- // If we are already selecting, abort now
- if (clickHide_activated || clickHideFiltersDialog)
- clickHide_deactivate();
-
- // Add overlays for blockable elements that don't emit mouse events,
- // so that they can still be selected.
- [].forEach.call(
- document.querySelectorAll('object,embed,iframe,frame'),
- function(element)
- {
- getFiltersForElement(element, function(filters)
- {
- if (filters.length > 0)
- addElementOverlay(element);
- });
- }
- );
-
- clickHide_activated = true;
- document.addEventListener("mousedown", clickHide_stopPropagation, true);
- document.addEventListener("mouseup", clickHide_stopPropagation, true);
- document.addEventListener("mouseenter", clickHide_stopPropagation, true);
- document.addEventListener("mouseleave", clickHide_stopPropagation, true);
- document.addEventListener("mouseover", clickHide_mouseOver, true);
- document.addEventListener("mouseout", clickHide_mouseOut, true);
- document.addEventListener("click", clickHide_mouseClick, true);
- document.addEventListener("keydown", clickHide_keyDown, true);
-
- ext.onExtensionUnloaded.addListener(clickHide_deactivate);
-}
-
-// Called when user has clicked on something and we are waiting for confirmation
-// on whether the user actually wants these filters
-function clickHide_rulesPending() {
- clickHide_activated = false;
-
- if (clickHideFiltersDialog)
- {
- document.documentElement.removeChild(clickHideFiltersDialog);
- clickHideFiltersDialog = null;
- }
-
- document.removeEventListener("mousedown", clickHide_stopPropagation, true);
- document.removeEventListener("mouseup", clickHide_stopPropagation, true);
- document.removeEventListener("mouseenter", clickHide_stopPropagation, true);
- document.removeEventListener("mouseleave", clickHide_stopPropagation, true);
- document.removeEventListener("mouseover", clickHide_mouseOver, true);
- document.removeEventListener("mouseout", clickHide_mouseOut, true);
- document.removeEventListener("click", clickHide_mouseClick, true);
- document.removeEventListener("keydown", clickHide_keyDown, true);
-}
-
-function clickHide_deactivate()
-{
- clickHide_rulesPending();
-
- clickHide_filters = null;
- lastRightClickEvent = null;
-
- if (currentElement)
- {
- currentElement.removeEventListener("contextmenu", clickHide_elementClickHandler, true);
- unhighlightElement(currentElement);
- currentElement = null;
- }
- unhighlightElements();
-
- var overlays = document.getElementsByClassName("__adblockplus__overlay");
- while (overlays.length > 0)
- overlays[0].parentNode.removeChild(overlays[0]);
-
- ext.onExtensionUnloaded.removeListener(clickHide_deactivate);
-}
-
-function clickHide_stopPropagation(e)
-{
- e.stopPropagation();
-}
-
-function clickHide_elementClickHandler(e) {
- e.preventDefault();
- e.stopPropagation();
- clickHide_mouseClick(e);
-}
-
-function getBlockableElementOrAncestor(element, callback)
-{
- // We assume that the user doesn't want to block the whole page.
- // So we never consider the <html> or <body> element.
- while (element && element != document.documentElement
- && element != document.body)
- {
- // We can't handle non-HTML (like SVG) elements, as well as
- // <area> elements (see below). So fall back to the parent element.
- if (!(element instanceof HTMLElement) || element.localName == "area")
- element = element.parentElement;
-
- // If image maps are used mouse events occur for the <area> element.
- // But we have to block the image associated with the <map> element.
- else if (element.localName == "map")
- {
- var images = document.querySelectorAll("img[usemap]");
- var image = null;
-
- for (var i = 0; i < images.length; i++)
- {
- var usemap = images[i].getAttribute("usemap");
- var index = usemap.indexOf("#");
-
- if (index != -1 && usemap.substr(index + 1) == element.name)
- {
- image = images[i];
- break;
- }
- }
-
- element = image;
- }
-
- // Finally, if none of the above is true, check whether we can generate
- // any filters for this element. Otherwise fall back to its parent element.
- else
- {
- getFiltersForElement(element, function(filters)
- {
- if (filters.length > 0)
- callback(element);
- else
- getBlockableElementOrAncestor(element.parentElement, callback);
- });
-
- return;
- }
- }
-
- // We reached the document root without finding a blockable element.
- callback(null);
-}
-
-// Hovering over an element so highlight it
-function clickHide_mouseOver(e)
-{
- lastMouseOverEvent = e;
-
- getBlockableElementOrAncestor(e.target, function(element)
- {
- if (e == lastMouseOverEvent)
- {
- lastMouseOverEvent = null;
-
- if (clickHide_activated)
- {
- if (currentElement)
- unhighlightElement(currentElement);
-
- if (element)
- {
- highlightElement(element, "#d6d84b", "#f8fa47");
- element.addEventListener("contextmenu", clickHide_elementClickHandler, true);
- }
-
- currentElement = element;
- }
- }
- });
-
- e.stopPropagation();
-}
-
-// No longer hovering over this element so unhighlight it
-function clickHide_mouseOut(e)
-{
- if (!clickHide_activated || currentElement != e.target)
- return;
-
- unhighlightElement(currentElement);
- currentElement.removeEventListener("contextmenu", clickHide_elementClickHandler, true);
- e.stopPropagation();
-}
-
-// Selects the currently hovered-over filter or cancels selection
-function clickHide_keyDown(e)
-{
- if (!e.ctrlKey && !e.altKey && !e.shiftKey && e.keyCode == 13 /*DOM_VK_RETURN*/)
- clickHide_mouseClick(e);
- else if (!e.ctrlKey && !e.altKey && !e.shiftKey && e.keyCode == 27 /*DOM_VK_ESCAPE*/)
- {
- ext.backgroundPage.sendMessage(
- {
- type: "forward",
- payload:
- {
- type: "clickhide-deactivate"
- }
- });
- e.preventDefault();
- e.stopPropagation();
- }
-}
-
-function getFiltersForElement(element, callback)
-{
- ext.backgroundPage.sendMessage(
- {
- type: "compose-filters",
- tagName: element.localName,
- id: element.id,
- src: element.getAttribute("src"),
- style: element.getAttribute("style"),
- classes: [].slice.call(element.classList),
- urls: getURLsFromElement(element),
- mediatype: typeMap[element.localName],
- baseURL: document.location.href
- },
- function(response)
- {
- callback(response.filters, response.selectors);
- }
- );
-}
-
-// When the user clicks, the currentElement is the one we want.
-// We should have ABP rules ready for when the
-// popup asks for them.
-function clickHide_mouseClick(e)
-{
- if (!currentElement || !clickHide_activated)
- return;
-
- var elt = currentElement;
- if (currentElement.classList.contains("__adblockplus__overlay"))
- elt = currentElement.prisoner;
-
- getFiltersForElement(elt, function(filters, selectors)
- {
- ext.backgroundPage.sendMessage(
- {
- type: "forward",
- payload:
- {
- type: "clickhide-show-dialog",
- clickHideFilters: filters
- }
- });
-
- if (selectors.length > 0)
- highlightElements(selectors.join(","));
-
- highlightElement(currentElement, "#fd1708", "#f6a1b5");
- });
-
- // Make sure the browser doesn't handle this click
- e.preventDefault();
- e.stopPropagation();
-}
-
-// This function Copyright (c) 2008 Jeni Tennison, from jquery.uri.js
-// and licensed under the MIT license. See jquery-*.min.js for details.
-function removeDotSegments(u) {
- var r = '', m = [];
- if (/\./.test(u)) {
- while (u !== undefined && u !== '') {
- if (u === '.' || u === '..') {
- u = '';
- } else if (/^\.\.\//.test(u)) { // starts with ../
- u = u.substring(3);
- } else if (/^\.\//.test(u)) { // starts with ./
- u = u.substring(2);
- } else if (/^\/\.(\/|$)/.test(u)) { // starts with /./ or consists of /.
- u = '/' + u.substring(3);
- } else if (/^\/\.\.(\/|$)/.test(u)) { // starts with /../ or consists of /..
- u = '/' + u.substring(4);
- r = r.replace(/\/?[^\/]+$/, '');
- } else {
- m = u.match(/^(\/?[^\/]*)(\/.*)?$/);
- u = m[2];
- r = r + m[1];
- }
- }
- return r;
- } else {
- return u;
- }
-}
-
-// In Chrome 37-40, the document_end content script (this one) runs properly, while the
-// document_start content scripts (that defines ext) might not. Check whether variable ext
-// exists before continuing to avoid "Uncaught ReferenceError: ext is not defined".
-// See https://crbug.com/416907
-if ("ext" in window && document instanceof HTMLDocument)
-{
- // Use a contextmenu handler to save the last element the user right-clicked on.
- // To make things easier, we actually save the DOM event.
- // We have to do this because the contextMenu API only provides a URL, not the actual
- // DOM element.
- document.addEventListener('contextmenu', function(e)
- {
- lastRightClickEvent = e;
- // We also need to ensure any old lastRightClickEvent variables in other
- // frames are cleared.
- lastRightClickEventValid = true;
- ext.backgroundPage.sendMessage(
- {
- type: "forward",
- payload:
- {
- type: "clickhide-clear-last-right-click-event"
- }
- });
- }, true);
-
- document.addEventListener("click", function(event)
- {
- // Ignore right-clicks
- if (event.button == 2)
- return;
-
- // Search the link associated with the click
- var link = event.target;
- while (!(link instanceof HTMLAnchorElement))
- {
- link = link.parentNode;
-
- if (!link)
- return;
- }
-
- if (link.protocol == "http:" || link.protocol == "https:")
- {
- if (link.host != "subscribe.adblockplus.org" || link.pathname != "/")
- return;
- }
- else if (!/^abp:\/*subscribe\/*\?/i.test(link.href))
- return;
-
- // This is our link - make sure the browser doesn't handle it
- event.preventDefault();
- event.stopPropagation();
-
- // Decode URL parameters
- var params = link.search.substr(1).split("&");
- var title = null;
- var url = null;
- for (var i = 0; i < params.length; i++)
- {
- var parts = params[i].split("=", 2);
- if (parts.length != 2 || !/\S/.test(parts[1]))
- continue;
- switch (parts[0])
- {
- case "title":
- title = decodeURIComponent(parts[1]);
- break;
- case "location":
- url = decodeURIComponent(parts[1]);
- break;
- }
- }
- if (!url)
- return;
-
- // Default title to the URL
- if (!title)
- title = url;
-
- // Trim spaces in title and URL
- title = title.trim();
- url = url.trim();
- if (!/^(https?|ftp):/.test(url))
- return;
-
- ext.backgroundPage.sendMessage({
- type: "add-subscription",
- title: title,
- url: url
- });
- }, true);
-
- ext.onMessage.addListener(function(msg, sender, sendResponse)
- {
- switch (msg.type)
- {
- case "get-clickhide-state":
- sendResponse({active: clickHide_activated});
- break;
- case "clickhide-activate":
- clickHide_activate();
- break;
- case "clickhide-deactivate":
- clickHide_deactivate();
- break;
- case "clickhide-new-filter":
- if(lastRightClickEvent)
- {
- var event = lastRightClickEvent;
- getBlockableElementOrAncestor(event.target, function(element)
- {
- clickHide_activate();
- currentElement = element;
- clickHide_mouseClick(event);
- });
- }
- break;
- case "clickhide-init":
- if (clickHideFiltersDialog)
- {
- sendResponse({filters: clickHide_filters});
-
- clickHideFiltersDialog.style.width = msg.width + "px";
- clickHideFiltersDialog.style.height = msg.height + "px";
- clickHideFiltersDialog.style.visibility = "visible";
- }
- break;
- case "clickhide-move":
- if (clickHideFiltersDialog)
- {
- var rect = clickHideFiltersDialog.getBoundingClientRect();
- var x = Math.max(0, Math.min(rect.left + msg.x, window.innerWidth - rect.width));
- var y = Math.max(0, Math.min(rect.top + msg.y, window.innerHeight - rect.height));
-
- clickHideFiltersDialog.style.left = x + "px";
- clickHideFiltersDialog.style.top = y + "px";
- }
- break;
- case "clickhide-close":
- if (currentElement && msg.remove)
- {
- // Hide the selected element itself if an added blocking
- // filter is causing it to collapse. Note that this
- // behavior is incomplete, but the best we can do here,
- // e.g. if an added blocking filter matches other elements,
- // the effect won't be visible until the page is is reloaded.
- checkCollapse(currentElement.prisoner || currentElement);
-
- // Apply added element hiding filters.
- updateStylesheet();
- }
- clickHide_deactivate();
- break;
- case "clickhide-show-dialog":
- clickHide_rulesPending();
- if (window.self == window.top)
- clickHide_showDialog(msg.clickHideFilters);
- break;
- case "clickhide-clear-last-right-click-event":
- if (lastRightClickEventValid)
- lastRightClickEventValid = false;
- else
- lastRightClickEvent = null;
- break;
- }
- });
-
- if (window == window.top)
- ext.backgroundPage.sendMessage({type: "report-html-page"});
-}

Powered by Google App Engine
This is Rietveld