Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--browser.py96
-rwxr-xr-xwebactivity.py11
2 files changed, 105 insertions, 2 deletions
diff --git a/browser.py b/browser.py
index 828e783..c8e9af5 100644
--- a/browser.py
+++ b/browser.py
@@ -16,18 +16,56 @@
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
import logging
+from gettext import gettext as _
import gobject
import gtk
+import tempfile
+import os
+import time
import xpcom
from xpcom.nsError import *
from xpcom import components
from xpcom.components import interfaces
from hulahop.webview import WebView
+from sugar.datastore import datastore
+from sugar import profile
+from sugar.activity import activityfactory
+
import sessionstore
from dnd import DragDropHooks
+class GetSourceListener(gobject.GObject):
+ _com_interfaces_ = interfaces.nsIWebProgressListener
+
+ __gsignals__ = {
+ 'finished': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE,
+ ([]))
+ }
+
+ def __init__(self, persist):
+ gobject.GObject.__init__(self)
+ self._persist = persist
+
+ def onStateChange(self, progress, request, flags, status):
+ finished = interfaces.nsIWebBrowserPersist.PERSIST_STATE_FINISHED
+ if self._persist.currentState == finished:
+ self.emit('finished')
+
+ def onProgressChange(self, progress, request, curSelfProgress,
+ maxSelfProgress, curTotalProgress, maxTotalProgress):
+ pass
+
+ def onLocationChange(self, progress, request, location):
+ pass
+
+ def onStatusChange(self, progress, request, status, message):
+ pass
+
+ def onSecurityChange(progress, request, state):
+ pass
+
class Browser(WebView):
def __init__(self):
WebView.__init__(self)
@@ -56,6 +94,64 @@ class Browser(WebView):
def set_session(self, data):
return sessionstore.set_session(self, data)
+ def get_source(self):
+ cls = components.classes['@mozilla.org/embedding/browser/nsWebBrowserPersist;1']
+ persist = cls.createInstance(interfaces.nsIWebBrowserPersist)
+ # get the source from the cache
+ persist.persistFlags = interfaces.nsIWebBrowserPersist.PERSIST_FLAGS_FROM_CACHE
+
+ progresslistener = GetSourceListener(persist)
+ persist.progressListener = xpcom.server.WrapObject(
+ progresslistener, interfaces.nsIWebProgressListener)
+ progresslistener.connect('finished', self._have_source_cb)
+
+ file_path = os.path.join(tempfile.gettempdir(), '%i' % time.time())
+ cls = components.classes["@mozilla.org/file/local;1"]
+ local_file = cls.createInstance(interfaces.nsILocalFile)
+ local_file.initWithPath(file_path)
+
+ uri = self.web_navigation.currentURI
+ persist.saveURI(uri, self.doc_shell, None, None, None, local_file)
+ self._create_journal_object(file_path)
+ self._jobject.file_path = file_path
+
+ def _have_source_cb(self, progress_listener):
+ logging.debug("Finished getting source - writing to datastore")
+ datastore.write(self._jobject,
+ reply_handler=self._internal_save_cb,
+ error_handler=self._internal_save_error_cb)
+
+ def _create_journal_object(self, file_path):
+ self._jobject = datastore.create()
+ title = _('Source') + ': ' + self.props.title
+ self._jobject.metadata['title'] = title
+ self._jobject.metadata['keep'] = '0'
+ self._jobject.metadata['buddies'] = ''
+ self._jobject.metadata['preview'] = ''
+ self._jobject.metadata['icon-color'] = profile.get_color().to_string()
+ self._jobject.metadata['mime_type'] = 'text/plain'
+ self._jobject.file_path = ''
+ datastore.write(self._jobject)
+
+ def _internal_save_cb(self):
+ logging.debug("Saved source object to datastore.")
+ id = self._jobject.object_id
+ service_name = 'org.laptop.AbiWordActivity'
+ self._cleanup_jobject()
+ activityfactory.create_with_object_id(service_name, id)
+
+ def _internal_save_error_cb(self, err):
+ logging.debug("Error saving source object to datastore: %s" % err)
+ self._cleanup_jobject()
+
+ def _cleanup_jobject(self):
+ if self._jobject:
+ if os.path.isfile(self._jobject.file_path):
+ logging.debug('_cleanup_jobject: removing %r' % self._jobject.file_path)
+ os.remove(self._jobject.file_path)
+ self._jobject.destroy()
+ self._jobject = None
+
class WindowCreator:
_com_interfaces_ = interfaces.nsIWindowCreator
diff --git a/webactivity.py b/webactivity.py
index 1cdf90c..4736d44 100755
--- a/webactivity.py
+++ b/webactivity.py
@@ -311,10 +311,14 @@ class WebActivity(activity.Activity):
_logger.debug('keyboard: Add link: %s.' % self.current)
self._add_link()
return True
- elif gtk.gdk.keyval_name(event.keyval) == "s":
+ elif gtk.gdk.keyval_name(event.keyval) == "v":
_logger.debug('keyboard: Toggle visibility of tray')
self._toggle_visibility_tray()
return True
+ elif gtk.gdk.keyval_name(event.keyval) == "u":
+ _logger.debug('keyboard: Show source of the current page')
+ self._show_source()
+ return True
return False
def _add_link(self):
@@ -367,7 +371,10 @@ class WebActivity(activity.Activity):
else:
self.tray_isvisible = True
self._tray.show()
-
+
+ def _show_source(self):
+ self._browser.get_source()
+
def _pixbuf_save_cb(self, buf, data):
data[0] += buf
return True