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
23 from gettext
import gettext
as _
27 from inspector
import Inspector
30 <html><head><title>PyWebKitGtk - About</title></head><body>
31 <h1>Welcome to <code>webbrowser.py</code></h1>
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/>
40 if __name__
== "__main__":
41 webbrowser
= WebBrowser()
44 class BrowserPage(webkit
.WebView
):
47 webkit
.WebView
.__init
__(self
)
48 settings
= self
.get_settings()
49 settings
.set_property("enable-developer-extras",
52 self
.connect("populate-popup", self
.populate_popup
)
54 def populate_popup(self
, view
, menu
):
56 zoom_in
= gtk
.ImageMenuItem(gtk
.STOCK_ZOOM_IN
)
57 zoom_in
.connect('activate', zoom_in_cb
, self
)
60 zoom_out
= gtk
.ImageMenuItem(gtk
.STOCK_ZOOM_OUT
)
61 zoom_out
.connect('activate', zoom_out_cb
, self
)
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
)
76 class WebBrowser(gtk
.Window
):
79 gtk
.Window
.__init
__(self
)
81 logging
.debug("initializing web browser window")
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)
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:")
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(),
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()
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
):
163 self
._statusbar
.display(url
)
165 self
._statusbar
.display('')
167 def _statusbar_text_changed_cb(self
, view
, text
):
168 self
._statusbar
.display(text
)
170 def _icon_loaded_cb(self
):
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"
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"
192 def _javascript_script_confirm_cb(self
, view
, frame
, message
, isConfirmed
):
193 print "javascript: confirm callback"
196 def _javascript_script_prompt_cb(self
, view
, frame
,
197 message
, default
, text
):
198 print "javascript: script prompt callback"
202 def destroy_cb (window
, browser
, inspector
):
203 """destroy window resources"""
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"""
217 def zoom_out_cb(menu_item
, web_view
):
218 """Zoom out of the page"""
221 def zoom_hundred_cb(menu_item
, web_view
):
223 if not (web_view
.get_zoom_level() == 1.0):
224 web_view
.set_zoom_level(1.0)
226 class WebStatusBar(gtk
.Statusbar
):
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)
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)
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
)
276 self
.insert(entry_item
, -1)
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
288 self
._show
_stop
_icon
()
289 self
._stop
_and
_reload
.set_tooltip(gtk
.Tooltips(), _('Stop'))
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
):
323 self
._browser
.stop_loading()
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
)