Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--NEWS5
-rw-r--r--agent-stylesheet.css8
-rw-r--r--browser.py24
-rw-r--r--clickToView.xml239
4 files changed, 276 insertions, 0 deletions
diff --git a/NEWS b/NEWS
index 0f1efd1..0e8bbbf 100644
--- a/NEWS
+++ b/NEWS
@@ -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"); }
+
diff --git a/browser.py b/browser.py
index e9e6d00..ec6a69f 100644
--- a/browser.py
+++ b/browser.py
@@ -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>