Remove set_window_features from the WebView API. This was made internal in
[pywebkitgtk.git] / demos / webbrowser.py
blobc4c1f790da924be548784c3c96a174620f28f303
1 #!/usr/bin/env python
2 # Copyright (C) 2006, Red Hat, Inc.
3 # Copyright (C) 2007, One Laptop Per Child
4 # Copyright (C) 2007-2008 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 webkit
27 from inspector import Inspector
29 ABOUT_PAGE = """
30 <html><head><title>PyWebKitGtk - About</title></head><body>
31 <h1>Welcome to <code>webbrowser.py</code></h1>
32 <p>
33 <strong>Home:</strong><a
34 href="http://code.google.com/p/pywebkitgtk/">http://code.google.com/p/pywebkitgtk/</a><br/>
35 <strong>Wiki:</strong><a
36 href="http://live.gnome.org/PyWebKitGtk">http://live.gnome.org/PyWebKitGtk</a><br/>
37 </p>
38 </body></html>
39 """
40 if __name__ == "__main__":
41 webbrowser = WebBrowser()
42 gtk.main()
44 class BrowserPage(webkit.WebView):
46 def __init__(self):
47 webkit.WebView.__init__(self)
48 settings = self.get_settings()
49 settings.set_property("enable-developer-extras",
50 True)
52 self.connect("populate-popup", self.populate_popup)
54 def populate_popup(self, view, menu):
55 # zoom buttons
56 zoom_in = gtk.ImageMenuItem(gtk.STOCK_ZOOM_IN)
57 zoom_in.connect('activate', zoom_in_cb, self)
58 menu.append(zoom_in)
60 zoom_out = gtk.ImageMenuItem(gtk.STOCK_ZOOM_OUT)
61 zoom_out.connect('activate', zoom_out_cb, self)
62 menu.append(zoom_out)
64 zoom_hundred = gtk.ImageMenuItem(gtk.STOCK_ZOOM_100)
65 zoom_hundred.connect('activate', zoom_hundred_cb, self)
66 menu.append(zoom_hundred)
68 menu.append(gtk.SeparatorMenuItem())
70 aboutitem = gtk.ImageMenuItem(gtk.STOCK_ABOUT)
71 menu.append(aboutitem)
72 aboutitem.connect('activate', about_pywebkitgtk_cb, self)
74 menu.show_all()
76 class WebBrowser(gtk.Window):
78 def __init__(self):
79 gtk.Window.__init__(self)
81 logging.debug("initializing web browser window")
83 self._loading = False
84 self._browser= BrowserPage()
85 self._browser.connect('load-started', self._loading_start_cb)
86 self._browser.connect('load-progress-changed',
87 self._loading_progress_cb)
88 self._browser.connect('load-finished', self._loading_stop_cb)
89 self._browser.connect('load-committed', self._loading_committed_cb)
90 self._browser.connect("title-changed", self._title_changed_cb)
91 self._browser.connect("hovering-over-link", self._hover_link_cb)
92 self._browser.connect("status-bar-text-changed",
93 self._statusbar_text_changed_cb)
94 self._browser.connect("icon-loaded", self._icon_loaded_cb)
95 self._browser.connect("selection-changed", self._selection_changed_cb)
96 self._browser.connect("set-scroll-adjustments",
97 self._set_scroll_adjustments_cb)
99 self._browser.connect("console-message",
100 self._javascript_console_message_cb)
101 self._browser.connect("script-alert",
102 self._javascript_script_alert_cb)
103 self._browser.connect("script-confirm",
104 self._javascript_script_confirm_cb)
105 self._browser.connect("script-prompt",
106 self._javascript_script_prompt_cb)
108 self._scrolled_window = gtk.ScrolledWindow()
109 self._scrolled_window.props.hscrollbar_policy = gtk.POLICY_AUTOMATIC
110 self._scrolled_window.props.vscrollbar_policy = gtk.POLICY_AUTOMATIC
111 self._scrolled_window.add(self._browser)
112 self._scrolled_window.show_all()
114 self._toolbar = WebToolbar(self._browser)
115 self._statusbar = WebStatusBar()
116 self._inspector = Inspector(self._browser.get_web_inspector())
118 vbox = gtk.VBox(spacing=4)
119 vbox.pack_start(self._toolbar, expand=False, fill=False)
120 vbox.pack_start(self._scrolled_window)
121 vbox.pack_end(self._statusbar, expand=False, fill=False)
123 self.add(vbox)
124 self.set_default_size(800, 600)
126 self.connect('destroy', destroy_cb, self._browser, self._inspector)
128 self._browser.load_string(ABOUT_PAGE, "text/html", "iso-8859-15", "about:")
130 self.show_all()
132 def _set_title(self, title):
133 self.props.title = title
135 def _loading_start_cb(self, view, frame):
136 main_frame = self._browser.get_main_frame()
137 if frame is main_frame:
138 self._set_title(_("Loading %s - %s") % (frame.get_title(),
139 frame.get_uri()))
140 self._toolbar.set_loading(True)
142 def _loading_stop_cb(self, view, frame):
143 # FIXME: another frame may still be loading?
144 self._toolbar.set_loading(False)
145 self._statusbar.display('')
147 def _loading_progress_cb(self, view, progress):
148 self._set_progress(_("%s%s loaded") % (progress, '%'))
150 def _loading_committed_cb(self, view, frame):
151 uri = frame.get_uri()
152 if uri:
153 self._toolbar.location_set_text(uri)
155 def _set_progress(self, progress):
156 self._statusbar.display(progress)
158 def _title_changed_cb(self, widget, frame, title):
159 self._set_title(_("%s") % title)
161 def _hover_link_cb(self, view, title, url):
162 if view and url:
163 self._statusbar.display(url)
164 else:
165 self._statusbar.display('')
167 def _statusbar_text_changed_cb(self, view, text):
168 self._statusbar.display(text)
170 def _icon_loaded_cb(self):
171 print "icon loaded"
173 def _selection_changed_cb(self):
174 print "selection changed"
176 def _set_scroll_adjustments_cb(self, view, hadjustment, vadjustment):
177 if hadjustment and vadjustment:
178 print "horizontal adjustment: %d", hadjustment.props.value
179 print "vertical adjustmnet: %d", vadjustment.props.value
181 def _navigation_requested_cb(self, view, frame, networkRequest):
182 print "webkit: navigation requested callback"
183 return 1
185 def _javascript_console_message_cb(self, view, message, line, sourceid):
186 print "javascript: console message callback"
188 def _javascript_script_alert_cb(self, view, frame, message):
189 print "javascript: script alert callback"
190 pass
192 def _javascript_script_confirm_cb(self, view, frame, message, isConfirmed):
193 print "javascript: confirm callback"
194 pass
196 def _javascript_script_prompt_cb(self, view, frame,
197 message, default, text):
198 print "javascript: script prompt callback"
199 pass
202 def destroy_cb (window, browser, inspector):
203 """destroy window resources"""
204 browser.destroy()
205 inspector.destroy()
206 window.destroy()
207 gtk.main_quit()
209 # context menu item callbacks
210 def about_pywebkitgtk_cb(menu_item, web_view):
211 web_view.open("http://live.gnome.org/PyWebKitGtk")
213 def zoom_in_cb(menu_item, web_view):
214 """Zoom into the page"""
215 web_view.zoom_in()
217 def zoom_out_cb(menu_item, web_view):
218 """Zoom out of the page"""
219 web_view.zoom_out()
221 def zoom_hundred_cb(menu_item, web_view):
222 """Zoom 100%"""
223 if not (web_view.get_zoom_level() == 1.0):
224 web_view.set_zoom_level(1.0)
226 class WebStatusBar(gtk.Statusbar):
228 def __init__(self):
229 gtk.Statusbar.__init__(self)
231 def display(self, text, context=None):
232 cid = self.get_context_id("pywebkitgtk")
233 self.push(cid, str(text))
235 class WebToolbar(gtk.Toolbar):
237 def __init__(self, browser):
238 gtk.Toolbar.__init__(self)
240 self._browser = browser
242 # navigational buttons
243 self._back = gtk.ToolButton(gtk.STOCK_GO_BACK)
244 self._back.set_tooltip(gtk.Tooltips(), _('Back'))
245 self._back.props.sensitive = False
246 self._back.connect('clicked', self._go_back_cb)
247 self.insert(self._back, -1)
249 self._forward = gtk.ToolButton(gtk.STOCK_GO_FORWARD)
250 self._forward.set_tooltip(gtk.Tooltips(), _('Forward'))
251 self._forward.props.sensitive = False
252 self._forward.connect('clicked', self._go_forward_cb)
253 self.insert(self._forward, -1)
254 self._forward.show()
256 self._stop_and_reload = gtk.ToolButton(gtk.STOCK_REFRESH)
257 self._stop_and_reload.set_tooltip(gtk.Tooltips(),
258 _('Stop and reload current page'))
259 self._stop_and_reload.connect('clicked', self._stop_and_reload_cb)
260 self.insert(self._stop_and_reload, -1)
261 self._stop_and_reload.show()
262 self._loading = False
264 self.insert(gtk.SeparatorToolItem(), -1)
266 # location entry
267 self._entry = gtk.Entry()
268 self._entry.connect('activate', self._entry_activate_cb)
269 self._current_uri = None
271 entry_item = gtk.ToolItem()
272 entry_item.set_expand(True)
273 entry_item.add(self._entry)
274 self._entry.show()
276 self.insert(entry_item, -1)
277 entry_item.show()
279 # scale other content besides from text as well
280 self._browser.set_full_content_zoom(True)
282 self._browser.connect("title-changed", self._title_changed_cb)
284 def set_loading(self, loading):
285 self._loading = loading
287 if self._loading:
288 self._show_stop_icon()
289 self._stop_and_reload.set_tooltip(gtk.Tooltips(), _('Stop'))
290 else:
291 self._show_reload_icon()
292 self._stop_and_reload.set_tooltip(gtk.Tooltips(), _('Reload'))
293 self._update_navigation_buttons()
295 def location_set_text (self, text):
296 self._entry.set_text(text)
298 def _set_address(self, address):
299 self._entry.props.text = address
300 self._current_uri = address
302 def _update_navigation_buttons(self):
303 can_go_back = self._browser.can_go_back()
304 self._back.props.sensitive = can_go_back
306 can_go_forward = self._browser.can_go_forward()
307 self._forward.props.sensitive = can_go_forward
309 def _entry_activate_cb(self, entry):
310 self._browser.open(entry.props.text)
312 def _go_back_cb(self, button):
313 self._browser.go_back()
315 def _go_forward_cb(self, button):
316 self._browser.go_forward()
318 def _title_changed_cb(self, widget, frame, title):
319 self._set_address(frame.get_uri())
321 def _stop_and_reload_cb(self, button):
322 if self._loading:
323 self._browser.stop_loading()
324 else:
325 self._browser.reload()
327 def _show_stop_icon(self):
328 self._stop_and_reload.set_stock_id(gtk.STOCK_CANCEL)
330 def _show_reload_icon(self):
331 self._stop_and_reload.set_stock_id(gtk.STOCK_REFRESH)