diff options
-rw-r--r-- | NEWS | 5 | ||||
-rw-r--r-- | agent-stylesheet.css | 8 | ||||
-rw-r--r-- | browser.py | 24 | ||||
-rw-r--r-- | clickToView.xml | 239 |
4 files changed, 276 insertions, 0 deletions
@@ -1,4 +1,9 @@ +<<<<<<< HEAD:NEWS * #2910 Open popups in the current window (marco) +======= +* Add agent-stylesheet.css and support for blocking flash. (tomeu) +* Add support for agent and user stylesheets. (tomeu) +>>>>>>> d800b328ebea44310d6bb475c72f6a9e1557f13c:NEWS 61 diff --git a/agent-stylesheet.css b/agent-stylesheet.css new file mode 100644 index 0000000..6c94d0e --- /dev/null +++ b/agent-stylesheet.css @@ -0,0 +1,8 @@ +/* Prevent flash animations from playing until you click on them. */ +object[classid$=":D27CDB6E-AE6D-11cf-96B8-444553540000"], +object[codebase*="swflash.cab"], +object[type="application/x-shockwave-flash"], +embed[type="application/x-shockwave-flash"], +embed[src$=".swf"] +{ -moz-binding: url("clickToView.xml#flash"); } + @@ -31,7 +31,9 @@ from hulahop.webview import WebView from sugar.datastore import datastore from sugar import profile +from sugar import env from sugar.activity import activityfactory +from sugar.activity import activity import sessionstore @@ -66,9 +68,31 @@ class GetSourceListener(gobject.GObject): pass class Browser(WebView): + + AGENT_SHEET = os.path.join(activity.get_bundle_path(), 'agent-stylesheet.css') + USER_SHEET = os.path.join(env.get_profile_path(), 'gecko', 'user-stylesheet.css') + def __init__(self): WebView.__init__(self) + io_service_class = components.classes["@mozilla.org/network/io-service;1"] + io_service = io_service_class.getService(interfaces.nsIIOService) + + cls = components.classes['@mozilla.org/content/style-sheet-service;1'] + style_sheet_service = cls.getService(interfaces.nsIStyleSheetService) + + if os.path.exists(Browser.AGENT_SHEET): + agent_sheet_uri = io_service.newURI('file:///' + Browser.AGENT_SHEET, + None, None) + style_sheet_service.loadAndRegisterSheet(agent_sheet_uri, + interfaces.nsIStyleSheetService.AGENT_SHEET) + + if os.path.exists(Browser.USER_SHEET): + user_sheet_uri = io_service.newURI('file:///' + Browser.USER_SHEET, + None, None) + style_sheet_service.loadAndRegisterSheet(user_sheet_uri, + interfaces.nsIStyleSheetService.USER_SHEET) + def get_session(self): return sessionstore.get_session(self) diff --git a/clickToView.xml b/clickToView.xml new file mode 100644 index 0000000..6164c73 --- /dev/null +++ b/clickToView.xml @@ -0,0 +1,239 @@ +<?xml version="1.0"?> +<!-- This provides a click-to-view capability to block flash + and java content in Firefox. Derived from: + http://www.squarefree.com/userstyles/xbl.html + and modified to allow different messages for flash and java + by Steve Zobell. This can be placed in the rez directory in + the Firefox install (e.g. C:\Program Files\Mozilla Firefox\res). + + The blocking capabilities are derived from this description: + http://www.wlug.org.nz/MozillaNotes + + Add the following to userContent.css (in the chrome directory + in the user profile): + +/* Prevent flash animations from playing until you click on them. */ +object[classid$=":D27CDB6E-AE6D-11cf-96B8-444553540000"], +object[codebase*="swflash.cab"], +object[type="application/x-shockwave-flash"], +embed[type="application/x-shockwave-flash"], +embed[src$=".swf"] +{ -moz-binding: url("resource:///res/clickToView.xml#flash"); } + +/* Block java, with a click to load feature. */ +object[codebase*="java"], +object[type="application/java"], +embed[type="application/java"], +applet[code$=".class"] +{ -moz-binding: url("resource:///res/clickToView.xml#java"); } + +--> +<bindings xmlns="http://www.mozilla.org/xbl" xmlns:html="http://www.w3.org/1999/xhtml"> + +<binding id="flash"> + <implementation> + <constructor> + <![CDATA[ + + +var doomed = this; + +// Check parent too (case of working EMBED inside broken OBJECT) +if (doomed.overrideCTV || doomed.parentNode.overrideCTV) + return; +doomed.overrideCTV = true; + +var placeholder = document.createElement("div"); + + +// === Styling === + +var w = parseInt(doomed.width || doomed.style.width); +var h = parseInt(doomed.height || doomed.style.height); + +if (!w || w < 32) w = 32; // !w catches e.g. NaN +if (!h || h < 32) h = 32; + +placeholder.style.width = w + "px"; +placeholder.style.height = h + "px"; +placeholder.style.backgroundColor = "yellow"; +placeholder.style.MozOutline = "1px solid red"; +placeholder.style.textAlign = "center"; +placeholder.style.color = "black"; +placeholder.style.background = "white"; +placeholder.style.opacity = 0.4; +placeholder.style.cursor = "pointer"; +placeholder.style.overflow = "hidden"; + +var red = document.createElement("span"); +red.style.fontWeight = "bold"; +red.style.fontStyle = "italic"; +red.style.color = "red"; +red.appendChild(document.createTextNode("Flash")); + +var text = document.createTextNode(" [[Click to play]] "); + + +// A button to dismiss the placeholder (instead of playing) +// Useful for those wonderful flash animations that cover +// the text on the page at the start. +var bye = document.createElement("bye"); +bye.style.backgroundColor = "white"; +bye.style.MozOutline = "2px solid red"; +bye.style.textAlign = "center"; +bye.style.color = "red"; +bye.style.background = "white"; +bye.style.cursor = "pointer"; +bye.style.overflow = "hidden"; +bye.appendChild(document.createTextNode("X")); + +placeholder.appendChild(red); +placeholder.appendChild(text); +placeholder.appendChild(bye); + +placeholder.onmouseover = function() +{ + this.style.MozOutline='3px outset white'; + this.style.opacity = 1.0; + this.style.background='lightgrey' +} +placeholder.onmouseout = function() +{ + this.style.background='white'; + this.style.opacity = 0.4; + this.style.MozOutline='1px solid red'; +} + + +// === Replacement === + +var p = doomed.parentNode; + +// Do in a timeout to avoid bugginess +setTimeout ( function () +{ + p.insertBefore(placeholder, doomed); + p.removeChild(doomed); +}, 0); + +// I love closures +placeholder.onclick = function() +{ + p.insertBefore(doomed, placeholder); + p.removeChild(placeholder); +} + + +bye.onclick = function() +{ + p.removeChild(placeholder); +} + + ]]> + </constructor> + </implementation> +</binding> + + +<binding id="java"> + <implementation> + <constructor> + <![CDATA[ + + +var doomed = this; + +// Check parent too (case of working EMBED inside broken OBJECT) +if (doomed.overrideCTV || doomed.parentNode.overrideCTV) + return; +doomed.overrideCTV = true; + +var placeholder = document.createElement("div"); + + +// === Styling === + +var w = parseInt(doomed.width || doomed.style.width); +var h = parseInt(doomed.height || doomed.style.height); + +if (!w || w < 32) w = 32; // !w catches e.g. NaN +if (!h || h < 32) h = 32; + +placeholder.style.width = w + "px"; +placeholder.style.height = h + "px"; +placeholder.style.backgroundColor = "yellow"; +placeholder.style.MozOutline = "1px solid red"; +placeholder.style.textAlign = "center"; +placeholder.style.color = "black"; +placeholder.style.background = "white"; +placeholder.style.opacity = 0.4; +placeholder.style.cursor = "pointer"; +placeholder.style.overflow = "hidden"; + +var red = document.createElement("span"); +red.style.fontWeight = "bold"; +red.style.fontStyle = "italic"; +red.style.color = "red"; +red.appendChild(document.createTextNode("Java")) + +var text = document.createTextNode(" [[Click to play]] "); + +placeholder.appendChild(red); +placeholder.appendChild(text); + +// A button to dismiss the placeholder (instead of playing) +var bye = document.createElement("span"); +bye.style.backgroundColor = "white"; +bye.style.MozOutline = "2px solid red"; +bye.style.textAlign = "center"; +bye.style.color = "red"; +bye.style.background = "white"; +bye.style.cursor = "pointer"; +bye.style.overflow = "hidden"; +bye.appendChild(document.createTextNode("X")) +placeholder.appendChild(bye); + +placeholder.onmouseover = function() +{ + this.style.MozOutline='3px outset white'; + this.style.opacity = 1.0; + this.style.background='lightgrey' +} +placeholder.onmouseout = function() +{ + this.style.background='white'; + this.style.opacity = 0.4; + this.style.MozOutline='1px solid red'; +} + + +// === Replacement === + +var p = doomed.parentNode; + +// Do in a timeout to avoid bugginess +setTimeout ( function () +{ + p.insertBefore(placeholder, doomed); + p.removeChild(doomed); +}, 0); + +// I love closures +placeholder.onclick = function() +{ + p.insertBefore(doomed, placeholder); + p.removeChild(placeholder); +} + + +bye.onclick = function() +{ + p.removeChild(placeholder); +} + + ]]> + </constructor> + </implementation> +</binding> + +</bindings> |