From a779d014f9a1bf6d911cf822167048239248c1b4 Mon Sep 17 00:00:00 2001 From: Simon Schampijer Date: Sun, 09 Sep 2007 22:39:48 +0000 Subject: View source for Browse #3261 and reset key for visibility toggle for frame --- 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 -- cgit v0.9.1