/*
* This file is part of Adblock Plus ,
* Copyright (C) 2006-2017 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 .
*/
/* globals Components */
"use strict";
function E(id)
{
return document.getElementById(id);
}
function getDocLink(link, callback)
{
ext.backgroundPage.sendMessage({
type: "app.get",
what: "doclink",
link
}, callback);
}
function checkShareResource(url, callback)
{
ext.backgroundPage.sendMessage({
type: "filters.blocked",
url,
requestType: "SCRIPT",
docDomain: "adblockplus.org",
thirdParty: true
}, callback);
}
function openSharePopup(url)
{
let glassPane = E("glass-pane");
if (!glassPane)
{
glassPane = document.createElement("div");
glassPane.setAttribute("id", "glass-pane");
document.body.appendChild(glassPane);
}
let iframe = E("share-popup");
if (!iframe)
{
iframe = document.createElement("iframe");
iframe.setAttribute("id", "share-popup");
iframe.setAttribute("scrolling", "no");
glassPane.appendChild(iframe);
}
// Firefox 38+ no longer allows messaging using postMessage so we need
// to have a fake top level frame to avoid problems with scripts that try to
// communicate with the first-run page
let isGecko = ("Components" in window);
if (isGecko)
{
try
{
let Ci = Components.interfaces;
let docShell = iframe.contentWindow
.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIDocShell);
if (typeof docShell.frameType != "undefined")
{
// Gecko 47+
docShell.frameType = docShell.FRAME_TYPE_BROWSER;
}
else
{
// Legacy branch
docShell.setIsBrowserInsideApp(
Ci.nsIScriptSecurityManager.UNKNOWN_APP_ID
);
}
}
catch (ex)
{
console.error(ex);
}
}
let popupMessageReceived = false;
function resizePopup(width, height)
{
iframe.width = width;
iframe.height = height;
iframe.style.marginTop = -height / 2 + "px";
iframe.style.marginLeft = -width / 2 + "px";
popupMessageReceived = true;
window.removeEventListener("message", popupMessageListener);
}
let popupMessageListener = function(event)
{
if (!/[./]adblockplus\.org$/.test(event.origin) ||
!("width" in event.data) || !("height" in event.data))
return;
resizePopup(event.data.width, event.data.height);
};
// Firefox requires last parameter to be true to be triggered by
// unprivileged pages
window.addEventListener("message", popupMessageListener, false, true);
let popupLoadListener = function()
{
if (!popupMessageReceived && isGecko)
{
let rootElement = iframe.contentDocument.documentElement;
let {width, height} = rootElement.dataset;
if (width && height)
resizePopup(width, height);
}
if (popupMessageReceived)
{
iframe.className = "visible";
let popupCloseListener = function()
{
iframe.className = glassPane.className = "";
document.removeEventListener("click", popupCloseListener);
};
document.addEventListener("click", popupCloseListener, false);
}
else
{
glassPane.className = "";
window.removeEventListener("message", popupMessageListener);
}
iframe.removeEventListener("load", popupLoadListener);
};
iframe.addEventListener("load", popupLoadListener, false);
iframe.src = url;
glassPane.className = "visible";
}