1
# Copyright (C) 2006, Red Hat, Inc.
2
# Copyright (C) 2007, One Laptop Per Child
4
# This program is free software; you can redistribute it and/or modify
5
# it under the terms of the GNU General Public License as published by
6
# the Free Software Foundation; either version 2 of the License, or
7
# (at your option) any later version.
9
# This program is distributed in the hope that it will be useful,
10
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
# GNU General Public License for more details.
14
# You should have received a copy of the GNU General Public License
15
# along with this program; if not, write to the Free Software
16
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21
from gettext import gettext as _
26
from xpcom.nsError import *
27
from xpcom import components
28
from xpcom.components import interfaces
29
from hulahop.webview import WebView
31
from sugar.datastore import datastore
32
from sugar import profile
34
from sugar.activity import activity
40
class GetSourceListener(gobject.GObject):
41
_com_interfaces_ = interfaces.nsIWebProgressListener
44
'finished': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE,
48
def __init__(self, persist):
49
gobject.GObject.__init__(self)
50
self._persist = persist
52
def onStateChange(self, progress, request, flags, status):
53
finished = interfaces.nsIWebBrowserPersist.PERSIST_STATE_FINISHED
54
if self._persist.currentState == finished:
57
def onProgressChange(self, progress, request, curSelfProgress,
58
maxSelfProgress, curTotalProgress, maxTotalProgress):
61
def onLocationChange(self, progress, request, location):
64
def onStatusChange(self, progress, request, status, message):
67
def onSecurityChange(self, progress, request, state):
70
class Browser(WebView):
72
AGENT_SHEET = os.path.join(activity.get_bundle_path(), 'agent-stylesheet.css')
73
USER_SHEET = os.path.join(env.get_profile_path(), 'gecko', 'user-stylesheet.css')
76
WebView.__init__(self)
78
io_service_class = components.classes["@mozilla.org/network/io-service;1"]
79
io_service = io_service_class.getService(interfaces.nsIIOService)
81
cls = components.classes['@mozilla.org/content/style-sheet-service;1']
82
style_sheet_service = cls.getService(interfaces.nsIStyleSheetService)
84
if os.path.exists(Browser.AGENT_SHEET):
85
agent_sheet_uri = io_service.newURI('file:///' + Browser.AGENT_SHEET,
87
style_sheet_service.loadAndRegisterSheet(agent_sheet_uri,
88
interfaces.nsIStyleSheetService.AGENT_SHEET)
90
if os.path.exists(Browser.USER_SHEET):
91
user_sheet_uri = io_service.newURI('file:///' + Browser.USER_SHEET,
93
style_sheet_service.loadAndRegisterSheet(user_sheet_uri,
94
interfaces.nsIStyleSheetService.USER_SHEET)
96
def get_session(self):
97
return sessionstore.get_session(self)
99
def set_session(self, data):
100
return sessionstore.set_session(self, data)
102
def get_source(self):
103
cls = components.classes['@mozilla.org/embedding/browser/nsWebBrowserPersist;1']
104
persist = cls.createInstance(interfaces.nsIWebBrowserPersist)
105
# get the source from the cache
106
persist.persistFlags = interfaces.nsIWebBrowserPersist.PERSIST_FLAGS_FROM_CACHE
108
progresslistener = GetSourceListener(persist)
109
persist.progressListener = xpcom.server.WrapObject(
110
progresslistener, interfaces.nsIWebProgressListener)
111
progresslistener.connect('finished', self._have_source_cb)
113
temp_path = os.path.join(activity.get_activity_root(), 'instance')
114
file_path = os.path.join(temp_path, '%i' % time.time())
115
cls = components.classes["@mozilla.org/file/local;1"]
116
local_file = cls.createInstance(interfaces.nsILocalFile)
117
local_file.initWithPath(file_path)
119
uri = self.web_navigation.currentURI
120
persist.saveURI(uri, self.doc_shell, None, None, None, local_file)
121
self._create_journal_object(file_path)
122
self._jobject.file_path = file_path
124
def _have_source_cb(self, progress_listener):
125
logging.debug("Finished getting source - writing to datastore")
126
datastore.write(self._jobject,
127
reply_handler=self._internal_save_cb,
128
error_handler=self._internal_save_error_cb)
130
def _create_journal_object(self, file_path):
131
self._jobject = datastore.create()
132
title = _('Source') + ': ' + self.props.title
133
self._jobject.metadata['title'] = title
134
self._jobject.metadata['keep'] = '0'
135
self._jobject.metadata['buddies'] = ''
136
self._jobject.metadata['preview'] = ''
137
self._jobject.metadata['icon-color'] = profile.get_color().to_string()
138
self._jobject.metadata['mime_type'] = 'text/html'
139
self._jobject.metadata['source'] = '1'
140
self._jobject.file_path = ''
141
datastore.write(self._jobject)
143
def _internal_save_cb(self):
144
logging.debug("Saved source object to datastore.")
145
activity.show_object_in_journal(self._jobject.object_id)
146
self._cleanup_jobject()
148
def _internal_save_error_cb(self, err):
149
logging.debug("Error saving source object to datastore: %s" % err)
150
self._cleanup_jobject()
152
def _cleanup_jobject(self):
154
if os.path.isfile(self._jobject.file_path):
155
logging.debug('_cleanup_jobject: removing %r' % self._jobject.file_path)
156
os.remove(self._jobject.file_path)
157
self._jobject.destroy()
161
contentViewer = self.doc_shell.queryInterface(interfaces.nsIDocShell).contentViewer
162
if contentViewer is not None:
163
markupDocumentViewer = contentViewer.queryInterface(interfaces.nsIMarkupDocumentViewer)
164
markupDocumentViewer.fullZoom += _ZOOM_AMOUNT
167
contentViewer = self.doc_shell.queryInterface(interfaces.nsIDocShell).contentViewer
168
if contentViewer is not None:
169
markupDocumentViewer = contentViewer.queryInterface(interfaces.nsIMarkupDocumentViewer)
170
markupDocumentViewer.fullZoom -= _ZOOM_AMOUNT
172
class XULDialog(gtk.Window):
174
gtk.Window.__init__(self)
176
self.view = WebView()
179
self.connect('realize', self.__realize_cb)
181
def __realize_cb(self, window):
182
self.window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DIALOG)
185
_com_interfaces_ = interfaces.nsIWindowCreator
187
def createChromeWindow(self, parent, chrome_flags):
189
browser = dialog.view.browser
191
dialog.view.is_chrome = True
192
item = browser.queryInterface(interfaces.nsIDocShellTreeItem)
193
item.itemType = interfaces.nsIDocShellTreeItem.typeChromeWrapper
195
return browser.containerWindow
197
window_creator = WindowCreator()
198
cls = components.classes['@mozilla.org/embedcomp/window-watcher;1']
199
window_watcher = cls.getService(interfaces.nsIWindowWatcher)
200
window_watcher.setWindowCreator(window_creator)