webkitgtk.override: add webkit_web_settings_get_type; webbrowser.py: add populate...
[pywebkitgtk.git] / webbrowser.py
blob4a9b9fd17d40f0d352629920b59c599c408de4f3
1 #!/usr/bin/env python
2 # Copyright (C) 2006, Red Hat, Inc.
3 # Copyright (C) 2007, One Laptop Per Child
4 # Copyright (C) 2007 Jan Alonzo <jmalonzo@unpluggable.com>
6 # This program is free software; you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation; either version 2 of the License, or
9 # (at your option) any later version.
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
16 # You should have received a copy of the GNU General Public License
17 # along with this program; if not, write to the Free Software
18 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20 import os
21 import logging
22 import time
23 from gettext import gettext as _
25 import gtk
26 import webkitgtk
29 class WebToolbar(gtk.Toolbar):
30 def __init__(self, browser):
31 gtk.Toolbar.__init__(self)
33 self._browser = browser
34 self._back_forward_list = self._browser.get_back_forward_list()
36 self._back = gtk.ToolButton(gtk.STOCK_GO_BACK)
37 self._back.set_tooltip(gtk.Tooltips(),_('Back'))
38 self._back.props.sensitive = False
39 self._back.connect('clicked', self._go_back_cb)
40 self.insert(self._back, -1)
42 self._forward = gtk.ToolButton(gtk.STOCK_GO_FORWARD)
43 self._forward.set_tooltip(gtk.Tooltips(),_('Forward'))
44 self._forward.props.sensitive = False
45 self._forward.connect('clicked', self._go_forward_cb)
46 self.insert(self._forward, -1)
47 self._forward.show()
49 self._stop_and_reload = gtk.ToolButton(gtk.STOCK_REFRESH)
50 self._stop_and_reload.connect('clicked', self._stop_and_reload_cb)
51 self.insert(self._stop_and_reload, -1)
52 self._stop_and_reload.show()
53 self._loading = False
55 self.insert(gtk.SeparatorToolItem(), -1)
57 # back list
58 self._back_list_menu_item = gtk.ToolButton(gtk.STOCK_JUSTIFY_LEFT)
59 self._back_list_menu_item.connect('clicked', self._back_list_cb)
60 self._back_list_menu_item.props.sensitive = False
61 self.insert(self._back_list_menu_item, -1)
62 self._back_list_menu_item.show()
64 self._back_menu = gtk.Menu()
66 # forward list
67 self._forward_list_menu_item = gtk.ToolButton(gtk.STOCK_JUSTIFY_RIGHT)
68 self._forward_list_menu_item.connect('clicked', self._forward_list_cb)
69 self._forward_list_menu_item.sensitive = False
70 self.insert(self._forward_list_menu_item, -1)
71 self._forward_list_menu_item.show()
73 self._forward_menu = gtk.Menu()
75 # location entry
76 self._entry = gtk.Entry()
77 self._entry.connect('activate', self._entry_activate_cb)
78 self._current_uri = None
80 entry_item = gtk.ToolItem()
81 entry_item.set_expand(True)
82 entry_item.add(self._entry)
83 self._entry.show()
85 self.insert(entry_item, -1)
86 entry_item.show()
88 self._browser.connect("title-changed", self._title_changed_cb)
89 self._entry.grab_focus()
91 def set_loading(self, loading):
92 self._loading = loading
94 if self._loading:
95 self._show_stop_icon()
96 self._stop_and_reload.set_tooltip(gtk.Tooltips(),_('Stop'))
97 else:
98 self._show_reload_icon()
99 self._stop_and_reload.set_tooltip(gtk.Tooltips(),_('Reload'))
100 self._update_navigation_buttons()
102 def _set_address(self, address):
103 self._entry.props.text = address
104 self._current_uri = address
106 def _update_navigation_buttons(self):
107 can_go_back = self._browser.can_go_back()
108 self._back.props.sensitive = can_go_back
109 self._back_list_menu_item.props.sensitive = can_go_back
111 can_go_forward = self._browser.can_go_forward()
112 self._forward.props.sensitive = can_go_forward
113 self._forward_list_menu_item.props.sensitive = can_go_forward
115 def _entry_activate_cb(self, entry):
116 self._browser.open(entry.props.text)
118 def _go_back_cb(self, button):
119 self._browser.go_back()
121 def _go_forward_cb(self, button):
122 self._browser.go_forward()
124 def _title_changed_cb(self, widget, frame, title):
125 self._set_address(frame.get_uri())
127 def _stop_and_reload_cb(self, button):
128 if self._loading:
129 self._browser.stop_loading()
130 else:
131 self._browser.reload()
133 def _back_list_cb(self, button):
134 #print self._back_forward_list.get_back_length()
135 l = self._back_forward_list.get_back_list_with_limit(10)
136 for i in l:
137 item = gtk.MenuItem(i.get_title())
138 self._back_menu.append(item)
139 self._back_menu.popup(self, self._back_list_menu_item, None, 1, int(time.time()))
141 def _forward_list_cb(self, button):
142 print self._back_forward_list.get_forward_length()
143 l = self._back_forward_list.get_forward_list_with_limit(10)
144 for i in l:
145 item = gtk.MenuItem(i.get_title())
146 self._back_menu.append(item)
147 self._back_menu.popup(self, self._back_list_menu_item, None, 1, int(time.time()))
150 def _show_stop_icon(self):
151 self._stop_and_reload.set_stock_id(gtk.STOCK_CANCEL)
153 def _show_reload_icon(self):
154 self._stop_and_reload.set_stock_id(gtk.STOCK_REFRESH)
157 class BrowserPage(webkitgtk.WebView):
158 def __init__(self):
159 webkitgtk.WebView.__init__(self)
161 class WebStatusBar(gtk.Statusbar):
162 def __init__(self):
163 gtk.Statusbar.__init__(self)
164 self.iconbox = gtk.EventBox()
165 self.iconbox.add(gtk.image_new_from_stock(gtk.STOCK_INFO, 16))
166 self.pack_start(self.iconbox, False, False, 6)
167 self.iconbox.hide_all()
169 def display(self, text, context=None):
170 cid = self.get_context_id("pywebkitgtk")
171 self.push(cid, str(text))
173 def show_javascript_info(self):
174 self.iconbox.show()
176 def hide_javascript_info(self):
177 self.iconbox.hide()
180 class WebBrowser(gtk.Window):
181 def __init__(self):
182 gtk.Window.__init__(self)
184 logging.debug("initializing web browser window")
186 self._loading = False
187 self._browser= BrowserPage()
188 self._browser.connect('load-started', self._loading_start_cb)
189 self._browser.connect('load-progress-changed', self._loading_progress_cb)
190 self._browser.connect('load-finished', self._loading_stop_cb)
191 self._browser.connect("title-changed", self._title_changed_cb)
192 self._browser.connect("hovering-over-link", self._hover_link_cb)
193 self._browser.connect("status-bar-text-changed", self._statusbar_text_changed_cb)
194 self._browser.connect("icon-loaded", self._icon_loaded_cb)
195 self._browser.connect("selection-changed", self._selection_changed_cb)
196 self._browser.connect("set-scroll-adjustments", self._set_scroll_adjustments_cb)
197 self._browser.connect("populate-popup", self._populate_popup)
198 # self._browser.connect("navigation-requested", self._navigation_requested_cb)
200 self._browser.connect("console-message",
201 self._javascript_console_message_cb)
202 self._browser.connect("script-alert",
203 self._javascript_script_alert_cb)
204 self._browser.connect("script-confirm",
205 self._javascript_script_confirm_cb)
206 self._browser.connect("script-prompt",
207 self._javascript_script_prompt_cb)
209 self._scrolled_window = gtk.ScrolledWindow()
210 self._scrolled_window.props.hscrollbar_policy = gtk.POLICY_AUTOMATIC
211 self._scrolled_window.props.vscrollbar_policy = gtk.POLICY_AUTOMATIC
212 self._scrolled_window.add(self._browser)
213 self._scrolled_window.show_all()
215 self._toolbar = WebToolbar(self._browser)
217 self._statusbar = WebStatusBar()
219 vbox = gtk.VBox(spacing=4)
220 vbox.pack_start(self._toolbar, expand=False, fill=False)
221 vbox.pack_start(self._scrolled_window)
222 vbox.pack_end(self._statusbar, expand=False, fill=False)
224 self.add(vbox)
225 self.set_default_size(600, 480)
227 self.connect('destroy', gtk.main_quit)
229 about = """
230 <html><head><title>About</title></head><body>
231 <h1>Welcome to <code>webbrowser.py</code></h1>
232 <p><a href="http://live.gnome.org/PyWebKitGtk">Homepage</a></p>
233 </body></html>
235 self._browser.load_string(about, "text/html", "iso-8859-15", "about:")
237 self.show_all()
239 def _set_title(self, title):
240 self.props.title = title
242 def _loading_start_cb(self, page, frame):
243 main_frame = self._browser.get_main_frame()
244 if frame is main_frame:
245 self._set_title(_("Loading %s - %s") % (frame.get_title(),frame.get_uri()))
246 self._toolbar.set_loading(True)
248 def _loading_stop_cb(self, page, frame):
249 # FIXME: another frame may still be loading?
250 self._toolbar.set_loading(False)
252 def _loading_progress_cb(self, page, progress):
253 self._set_progress(_("%s%s loaded") % (progress, '%'))
255 def _set_progress(self, progress):
256 self._statusbar.display(progress)
258 def _title_changed_cb(self, widget, frame, title):
259 self._set_title(_("%s") % title)
261 def _hover_link_cb(self, page, title, url):
262 if page and url:
263 self._statusbar.display(url)
264 else:
265 self._statusbar.display('')
267 def _statusbar_text_changed_cb(self, page, text):
268 if text:
269 self._statusbar.display(text)
271 def _icon_loaded_cb(self):
272 print "icon loaded"
274 def _selection_changed_cb(self):
275 print "selection changed"
277 def _set_scroll_adjustments_cb(self, page, hadjustment, vadjustment):
278 self._scrolled_window.props.hadjustment = hadjustment
279 self._scrolled_window.props.vadjustment = vadjustment
281 def _navigation_requested_cb(self, page, frame, networkRequest):
282 print "navigation requested cb"
283 return 1 # fixme
285 def _javascript_console_message_cb(self, page, message, line, sourceid):
286 self._statusbar.show_javascript_info()
288 def _javascript_script_alert_cb(self, page, frame, message):
289 pass
291 def _javascript_script_confirm_cb(self, page, frame, message, isConfirmed):
292 pass
294 def _javascript_script_prompt_cb(self, page, frame, message, default, text):
295 pass
297 def _populate_popup(self, view, menu):
298 iampywebkitgtk = gtk.MenuItem(label="PyWebKitGtk!")
299 menu.append(iampywebkitgtk)
300 menu.show_all()
304 if __name__ == "__main__":
305 webbrowser = WebBrowser()
306 gtk.main()