Merge lp:~laney/software-center/webkit2 into lp:software-center
- webkit2
- Merge into trunk
Status: | Merged | ||||
---|---|---|---|---|---|
Merged at revision: | 3344 | ||||
Proposed branch: | lp:~laney/software-center/webkit2 | ||||
Merge into: | lp:software-center | ||||
Diff against target: |
857 lines (+151/-293) 11 files modified
debian/control (+1/-1) run-tests.sh (+2/-2) softwarecenter/ui/gtk3/dialogs/dialog_tos.py (+15/-10) softwarecenter/ui/gtk3/views/purchaseview.py (+22/-51) softwarecenter/ui/gtk3/widgets/exhibits.py (+36/-36) softwarecenter/ui/gtk3/widgets/videoplayer.py (+20/-79) softwarecenter/ui/gtk3/widgets/webkit.py (+45/-67) tests/gtk3/test_purchase.py (+0/-24) tests/gtk3/test_webkit.py (+8/-18) tests/gtk3/test_widgets.py (+1/-1) tests/gtk3/windows.py (+1/-4) |
||||
To merge this branch: | bzr merge lp:~laney/software-center/webkit2 | ||||
Related bugs: |
|
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Iain Lane (community) | Approve | ||
software-store-developers | Pending | ||
Review via email: mp+264723@code.launchpad.net |
Commit message
Port to WebKit 2
Description of the change
Initial review appreciated. There are probably still bugs (I didn't test purchasing for example).
Matthew Paul Thomas (mpt) wrote : | # |
- 3325. By dobey
-
Fix the version string to not be so high (no previous releases of it).
- 3326. By Sebastien Bacher
-
Remove use of deprecated n_row property.
- 3327. By Sebastien Bacher
-
Use GtkIcon's lookup_icon method instead of has_icon to fix invalid icons.
- 3328. By Michael Vogt
-
Avoid a crash when the aptdaemon transaction has no package data.
- 3329. By Sebastien Bacher
-
Clear some source ID warnings.
- 3330. By Sebastien Bacher
-
Restore the GtkStyle context in the button widget.
- 3331. By Sebastien Bacher
-
Remove gwibber usage.
- 3332. By Sebastien Bacher
-
DB_NOMMAP needs to be set using set_flags, it's not valid in DBEnv.open
- 3333. By dobey
-
Multi-inherit from object as well, as RawConfigParser is old-style.
Use super to chain up initialization. - 3334. By Barry Warsaw
-
Fix some bilingual Python 2/3 issues so plug-ins can work in both versions.
- 3335. By Iain Lane
-
Open cataloged_times.p as bytes for py3 compatibility.
- 3336. By Michael Vogt
-
Disable paste when search entry not visible.
- 3337. By Bruce Pieterse
-
Update README to mentione python3-
aptdaemon. test instead. - 3338. By Bruce Pieterse
-
Added support for Adwaita Dark Theme Variant.
- 3339. By dobey
-
Merge the debian tree in for CI train landing support.
- 3340. By dobey
-
Prepare the release.
- 3341. By CI Train Bot Account
-
Releasing 16.01+16.
04.20160107. 1 - 3342. By Iain Lane
-
Patch from Robin van der Vilet to not crash on locales with no country. Fixes: #1510237
- 3343. By CI Train Bot Account
-
Releasing 16.01+16.
04.20160119 - 3344. By Iain Lane
-
Merge with trunk again
Iain Lane (laney) wrote : | # |
Self approving - if you have feedback we can address in later rounds.
dobey (dobey) wrote : | # |
Can you answer mpt's questions?
Iain Lane (laney) wrote : | # |
On Wed, Feb 17, 2016 at 03:40:03PM -0000, Rodney Dawes wrote:
> Can you answer mpt's questions?
ok
--
Iain Lane [ <email address hidden> ]
Debian Developer [ <email address hidden> ]
Ubuntu Developer [ <email address hidden> ]
Iain Lane (laney) wrote : | # |
On Tue, Jul 28, 2015 at 07:45:03AM -0000, Matthew Paul Thomas wrote:
> This is great to see. I suggest testing these things:
>
> * Does a purchase work?
I don't know how to purchase anything - is there a test server with some
packages available for xenial?
> * Does submitting a review work? (This should be fine, since the line you removed from submit_review.ui was also removed to fix bug 1445745.)
Yeah
> * Does an app's developer/support Web site link open in your default browser as expected?
Yeah
> * Does the checkbox list of add-ons show up for an app that has them? (Geany is a good example.)
Yeah
--
Iain Lane [ <email address hidden> ]
Debian Developer [ <email address hidden> ]
Ubuntu Developer [ <email address hidden> ]
Preview Diff
1 | === modified file 'debian/control' | |||
2 | --- debian/control 2016-01-07 18:59:19 +0000 | |||
3 | +++ debian/control 2016-02-17 13:44:00 +0000 | |||
4 | @@ -35,7 +35,7 @@ | |||
5 | 35 | gir1.2-glib-2.0 (>= 1.31), | 35 | gir1.2-glib-2.0 (>= 1.31), |
6 | 36 | gir1.2-gtk-3.0, | 36 | gir1.2-gtk-3.0, |
7 | 37 | gir1.2-gmenu-3.0 (>= 3.1.5), | 37 | gir1.2-gmenu-3.0 (>= 3.1.5), |
9 | 38 | gir1.2-webkit-3.0, | 38 | gir1.2-webkit2-4.0, |
10 | 39 | gvfs-backends, | 39 | gvfs-backends, |
11 | 40 | python-gi (>= 3.4.0-1ubuntu0.1), | 40 | python-gi (>= 3.4.0-1ubuntu0.1), |
12 | 41 | python-gi-cairo, | 41 | python-gi-cairo, |
13 | 42 | 42 | ||
14 | === modified file 'run-tests.sh' | |||
15 | --- run-tests.sh 2013-07-12 12:51:43 +0000 | |||
16 | +++ run-tests.sh 2016-02-17 13:44:00 +0000 | |||
17 | @@ -4,8 +4,8 @@ | |||
18 | 4 | 4 | ||
19 | 5 | TESTS_DIR="tests" | 5 | TESTS_DIR="tests" |
20 | 6 | 6 | ||
23 | 7 | dpkg-checkbuilddeps -d 'xvfb, python-mock, python-unittest2, | 7 | #dpkg-checkbuilddeps -d 'xvfb, python-mock, python-unittest2, |
24 | 8 | python3-aptdaemon.test, python-lxml, python-qt4' | 8 | # python3-aptdaemon.test, python-lxml, python-qt4' |
25 | 9 | 9 | ||
26 | 10 | if [ ! -e /var/lib/apt-xapian-index/index ]; then | 10 | if [ ! -e /var/lib/apt-xapian-index/index ]; then |
27 | 11 | echo "please run sudo update-apt-xapian-index" | 11 | echo "please run sudo update-apt-xapian-index" |
28 | 12 | 12 | ||
29 | === modified file 'softwarecenter/ui/gtk3/dialogs/dialog_tos.py' | |||
30 | --- softwarecenter/ui/gtk3/dialogs/dialog_tos.py 2014-01-10 10:50:59 +0000 | |||
31 | +++ softwarecenter/ui/gtk3/dialogs/dialog_tos.py 2016-02-17 13:44:00 +0000 | |||
32 | @@ -20,7 +20,7 @@ | |||
33 | 20 | import gi | 20 | import gi |
34 | 21 | gi.require_version("Gtk", "3.0") | 21 | gi.require_version("Gtk", "3.0") |
35 | 22 | from gi.repository import Gtk | 22 | from gi.repository import Gtk |
37 | 23 | from gi.repository import WebKit | 23 | from gi.repository import WebKit2 |
38 | 24 | 24 | ||
39 | 25 | from gettext import gettext as _ | 25 | from gettext import gettext as _ |
40 | 26 | 26 | ||
41 | @@ -33,6 +33,7 @@ | |||
42 | 33 | 33 | ||
43 | 34 | def __init__(self, parent): | 34 | def __init__(self, parent): |
44 | 35 | Gtk.Dialog.__init__(self) | 35 | Gtk.Dialog.__init__(self) |
45 | 36 | self.failed = False | ||
46 | 36 | self.set_default_size(420, 400) | 37 | self.set_default_size(420, 400) |
47 | 37 | self.set_transient_for(parent) | 38 | self.set_transient_for(parent) |
48 | 38 | self.set_title(_("Terms of Use")) | 39 | self.set_title(_("Terms of Use")) |
49 | @@ -57,7 +58,9 @@ | |||
50 | 57 | wb.show_all() | 58 | wb.show_all() |
51 | 58 | self.webkit = wb.webkit | 59 | self.webkit = wb.webkit |
52 | 59 | self.webkit.connect( | 60 | self.webkit.connect( |
54 | 60 | "notify::load-status", self._on_load_status_changed) | 61 | "load-changed", self._on_load_changed) |
55 | 62 | self.webkit.connect( | ||
56 | 63 | "load-failed", self._on_load_failed) | ||
57 | 61 | # content | 64 | # content |
58 | 62 | content = self.get_content_area() | 65 | content = self.get_content_area() |
59 | 63 | self.spinner = SpinnerNotebook(wb) | 66 | self.spinner = SpinnerNotebook(wb) |
60 | @@ -69,15 +72,17 @@ | |||
61 | 69 | self.webkit.load_uri(SOFTWARE_CENTER_TOS_LINK_NO_HEADER) | 72 | self.webkit.load_uri(SOFTWARE_CENTER_TOS_LINK_NO_HEADER) |
62 | 70 | return Gtk.Dialog.run(self) | 73 | return Gtk.Dialog.run(self) |
63 | 71 | 74 | ||
69 | 72 | def _on_load_status_changed(self, view, pspec): | 75 | def _on_load_failed(self, view, load_event, failing_uri, error): |
70 | 73 | prop = pspec.name | 76 | self.failed = True |
71 | 74 | status = view.get_property(prop) | 77 | return False |
72 | 75 | if (status == WebKit.LoadStatus.FINISHED or | 78 | |
73 | 76 | status == WebKit.LoadStatus.FAILED): | 79 | def _on_load_changed(self, view, load_event): |
74 | 80 | if load_event == WebKit2.LoadEvent.FINISHED: | ||
75 | 77 | self.spinner.hide_spinner() | 81 | self.spinner.hide_spinner() |
79 | 78 | if status == WebKit.LoadStatus.FINISHED: | 82 | |
80 | 79 | self.label.set_text(_("Do you accept these terms?")) | 83 | if not self.failed: |
81 | 80 | self.button_accept.set_sensitive(True) | 84 | self.label.set_text(_("Do you accept these terms?")) |
82 | 85 | self.button_accept.set_sensitive(True) | ||
83 | 81 | 86 | ||
84 | 82 | if __name__ == "__main__": | 87 | if __name__ == "__main__": |
85 | 83 | d = DialogTos(None) | 88 | d = DialogTos(None) |
86 | 84 | 89 | ||
87 | === modified file 'softwarecenter/ui/gtk3/views/purchaseview.py' | |||
88 | --- softwarecenter/ui/gtk3/views/purchaseview.py 2012-12-14 16:44:25 +0000 | |||
89 | +++ softwarecenter/ui/gtk3/views/purchaseview.py 2016-02-17 13:44:00 +0000 | |||
90 | @@ -26,7 +26,7 @@ | |||
91 | 26 | import os | 26 | import os |
92 | 27 | import json | 27 | import json |
93 | 28 | 28 | ||
95 | 29 | from gi.repository import WebKit as webkit | 29 | from gi.repository import WebKit2 as webkit |
96 | 30 | 30 | ||
97 | 31 | from gettext import gettext as _ | 31 | from gettext import gettext as _ |
98 | 32 | 32 | ||
99 | @@ -119,21 +119,18 @@ | |||
100 | 119 | self.pack_start(self.wk, True, True, 0) | 119 | self.pack_start(self.wk, True, True, 0) |
101 | 120 | # automatically fill in the email in the login page | 120 | # automatically fill in the email in the login page |
102 | 121 | self.wk.webkit.set_auto_insert_email(self.config.email) | 121 | self.wk.webkit.set_auto_insert_email(self.config.email) |
108 | 122 | #self.wk.webkit.connect("new-window-policy-decision-requested", | 122 | self.wk.webkit.connect("create", self._on_create_web_view) |
109 | 123 | # self._on_new_window) | 123 | self.wk.webkit.connect("close", self._on_close_web_view) |
105 | 124 | self.wk.webkit.connect("create-web-view", self._on_create_web_view) | ||
106 | 125 | self.wk.webkit.connect("close-web-view", self._on_close_web_view) | ||
107 | 126 | self.wk.webkit.connect("console-message", self._on_console_message) | ||
110 | 127 | 124 | ||
111 | 128 | # check if the user wants url debugging | 125 | # check if the user wants url debugging |
112 | 129 | if os.environ.get("SOFTWARE_CENTER_DEBUG_WEBKIT"): | 126 | if os.environ.get("SOFTWARE_CENTER_DEBUG_WEBKIT"): |
113 | 130 | self.wk.webkit.connect("notify::uri", self._log_debug_output) | 127 | self.wk.webkit.connect("notify::uri", self._log_debug_output) |
114 | 131 | 128 | ||
115 | 132 | # a possible way to do IPC (script or title change) | 129 | # a possible way to do IPC (script or title change) |
120 | 133 | self.wk.webkit.connect("script-alert", self._on_script_alert) | 130 | self.wk.webkit.connect("script-dialog", self._on_script_alert) |
121 | 134 | self.wk.webkit.connect("title-changed", self._on_title_changed) | 131 | self.wk.webkit.connect("notify::title", self._on_title_changed) |
122 | 135 | self.wk.webkit.connect("notify::load-status", | 132 | self.wk.webkit.connect("load-changed", |
123 | 136 | self._on_load_status_changed) | 133 | self._on_load_changed) |
124 | 137 | # unblock signal handlers if needed when showing the purchase webkit | 134 | # unblock signal handlers if needed when showing the purchase webkit |
125 | 138 | # view in case they were blocked after a previous purchase was | 135 | # view in case they were blocked after a previous purchase was |
126 | 139 | # completed or canceled | 136 | # completed or canceled |
127 | @@ -162,7 +159,7 @@ | |||
128 | 162 | self.init_view() | 159 | self.init_view() |
129 | 163 | self.app = app | 160 | self.app = app |
130 | 164 | self.iconname = iconname | 161 | self.iconname = iconname |
132 | 165 | self.wk.webkit.load_html_string(self.LOADING_HTML, "file:///") | 162 | self.wk.webkit.load_html(self.LOADING_HTML, "file:///") |
133 | 166 | self.wk.show() | 163 | self.wk.show() |
134 | 167 | context = GLib.main_context_default() | 164 | context = GLib.main_context_default() |
135 | 168 | while context.pending(): | 165 | while context.pending(): |
136 | @@ -170,32 +167,26 @@ | |||
137 | 170 | if url: | 167 | if url: |
138 | 171 | self.wk.webkit.load_uri(url) | 168 | self.wk.webkit.load_uri(url) |
139 | 172 | elif html: | 169 | elif html: |
141 | 173 | self.wk.webkit.load_html_string(html, "file:///") | 170 | self.wk.webkit.load_html(html, "file:///") |
142 | 174 | else: | 171 | else: |
144 | 175 | self.wk.webkit.load_html_string(DUMMY_HTML, "file:///") | 172 | self.wk.webkit.load_html(DUMMY_HTML, "file:///") |
145 | 176 | # only for debugging | 173 | # only for debugging |
146 | 177 | if os.environ.get("SOFTWARE_CENTER_DEBUG_BUY"): | 174 | if os.environ.get("SOFTWARE_CENTER_DEBUG_BUY"): |
147 | 178 | GLib.timeout_add_seconds(1, _generate_events, self) | 175 | GLib.timeout_add_seconds(1, _generate_events, self) |
148 | 179 | return True | 176 | return True |
149 | 180 | 177 | ||
150 | 181 | def _on_new_window(self, view, frame, request, action, policy): | ||
151 | 182 | LOG.debug("_on_new_window") | ||
152 | 183 | import subprocess | ||
153 | 184 | subprocess.Popen(['xdg-open', request.get_uri()]) | ||
154 | 185 | return True | ||
155 | 186 | |||
156 | 187 | def _on_close_web_view(self, view): | 178 | def _on_close_web_view(self, view): |
157 | 188 | win = view.parent_win | 179 | win = view.parent_win |
158 | 189 | win.destroy() | 180 | win.destroy() |
159 | 190 | return True | 181 | return True |
160 | 191 | 182 | ||
162 | 192 | def _on_create_web_view(self, view, frame): | 183 | def _on_create_web_view(self, view, action): |
163 | 193 | from softwarecenter.ui.gtk3.widgets.webkit import ( | 184 | from softwarecenter.ui.gtk3.widgets.webkit import ( |
164 | 194 | ScrolledWebkitWindow) | 185 | ScrolledWebkitWindow) |
165 | 195 | win = Gtk.Window() | 186 | win = Gtk.Window() |
166 | 196 | win.set_size_request(400, 400) | 187 | win.set_size_request(400, 400) |
167 | 197 | wk = ScrolledWebkitWindow(include_progress_ui=True) | 188 | wk = ScrolledWebkitWindow(include_progress_ui=True) |
169 | 198 | wk.webkit.connect("close-web-view", self._on_close_web_view) | 189 | wk.webkit.connect("close", self._on_close_web_view) |
170 | 199 | win.add(wk) | 190 | win.add(wk) |
171 | 200 | win.show_all() | 191 | win.show_all() |
172 | 201 | # make sure close will work later | 192 | # make sure close will work later |
173 | @@ -207,43 +198,23 @@ | |||
174 | 207 | win.set_transient_for(w) | 198 | win.set_transient_for(w) |
175 | 208 | return wk.webkit | 199 | return wk.webkit |
176 | 209 | 200 | ||
195 | 210 | def _on_console_message(self, view, message, line, source_id): | 201 | def _on_script_alert(self, view, dialog): |
196 | 211 | try: | 202 | self._process_json(dialog.get_message()) |
179 | 212 | # load the token from the console message | ||
180 | 213 | self._oauth_token = json.loads(message) | ||
181 | 214 | # compat with the regular oauth naming | ||
182 | 215 | self._oauth_token["token"] = self._oauth_token["token_key"] | ||
183 | 216 | except ValueError: | ||
184 | 217 | pass | ||
185 | 218 | for k in ["token_key", "token_secret", "consumer_secret"]: | ||
186 | 219 | if k in message: | ||
187 | 220 | LOG.debug( | ||
188 | 221 | "skipping console message that contains sensitive data") | ||
189 | 222 | return True | ||
190 | 223 | LOG.debug("_on_console_message '%s'" % message) | ||
191 | 224 | return False | ||
192 | 225 | |||
193 | 226 | def _on_script_alert(self, view, frame, message): | ||
194 | 227 | self._process_json(message) | ||
197 | 228 | # stop further processing to avoid actually showing the alter | 203 | # stop further processing to avoid actually showing the alter |
198 | 229 | return True | 204 | return True |
199 | 230 | 205 | ||
204 | 231 | def _on_title_changed(self, view, frame, title): | 206 | def _on_title_changed(self, *args): |
205 | 232 | #print "on_title_changed", view, frame, title | 207 | self._process_json(self.wk.webkit.title) |
202 | 233 | # see wkwidget.py _on_title_changed() for a code example | ||
203 | 234 | self._process_json(title) | ||
206 | 235 | 208 | ||
208 | 236 | def _on_load_status_changed(self, view, property_spec): | 209 | def _on_load_changed(self, view, load_event): |
209 | 237 | """ helper to give visual feedback while the page is loading """ | 210 | """ helper to give visual feedback while the page is loading """ |
210 | 238 | prop = view.get_property(property_spec.name) | ||
211 | 239 | window = self.get_window() | 211 | window = self.get_window() |
213 | 240 | if prop == webkit.LoadStatus.PROVISIONAL: | 212 | if (load_event == webkit.LoadEvent.STARTED or |
214 | 213 | load_event == webkit.LoadEvent.COMMITTED): | ||
215 | 241 | self.emit("purchase-needs-spinner", True) | 214 | self.emit("purchase-needs-spinner", True) |
216 | 242 | if window: | 215 | if window: |
217 | 243 | window.set_cursor(Gdk.Cursor.new(Gdk.CursorType.WATCH)) | 216 | window.set_cursor(Gdk.Cursor.new(Gdk.CursorType.WATCH)) |
221 | 244 | elif (prop == webkit.LoadStatus.FIRST_VISUALLY_NON_EMPTY_LAYOUT or | 217 | elif load_event == webkit.LoadEvent.FINISHED: |
219 | 245 | prop == webkit.LoadStatus.FAILED or | ||
220 | 246 | prop == webkit.LoadStatus.FINISHED): | ||
222 | 247 | self.emit("purchase-needs-spinner", False) | 218 | self.emit("purchase-needs-spinner", False) |
223 | 248 | if window: | 219 | if window: |
224 | 249 | window.set_cursor(None) | 220 | window.set_cursor(None) |
225 | @@ -297,7 +268,7 @@ | |||
226 | 297 | if not self._wk_handlers_blocked: | 268 | if not self._wk_handlers_blocked: |
227 | 298 | self.wk.webkit.handler_block_by_func(self._on_script_alert) | 269 | self.wk.webkit.handler_block_by_func(self._on_script_alert) |
228 | 299 | self.wk.webkit.handler_block_by_func(self._on_title_changed) | 270 | self.wk.webkit.handler_block_by_func(self._on_title_changed) |
230 | 300 | self.wk.webkit.handler_block_by_func(self._on_load_status_changed) | 271 | self.wk.webkit.handler_block_by_func(self._on_load_changed) |
231 | 301 | self._wk_handlers_blocked = True | 272 | self._wk_handlers_blocked = True |
232 | 302 | 273 | ||
233 | 303 | def _unblock_wk_handlers(self): | 274 | def _unblock_wk_handlers(self): |
234 | @@ -305,7 +276,7 @@ | |||
235 | 305 | self.wk.webkit.handler_unblock_by_func(self._on_script_alert) | 276 | self.wk.webkit.handler_unblock_by_func(self._on_script_alert) |
236 | 306 | self.wk.webkit.handler_unblock_by_func(self._on_title_changed) | 277 | self.wk.webkit.handler_unblock_by_func(self._on_title_changed) |
237 | 307 | self.wk.webkit.handler_unblock_by_func( | 278 | self.wk.webkit.handler_unblock_by_func( |
239 | 308 | self._on_load_status_changed) | 279 | self._on_status_changed) |
240 | 309 | self._wk_handlers_blocked = False | 280 | self._wk_handlers_blocked = False |
241 | 310 | 281 | ||
242 | 311 | 282 | ||
243 | 312 | 283 | ||
244 | === modified file 'softwarecenter/ui/gtk3/widgets/exhibits.py' | |||
245 | --- softwarecenter/ui/gtk3/widgets/exhibits.py 2015-10-06 16:44:03 +0000 | |||
246 | +++ softwarecenter/ui/gtk3/widgets/exhibits.py 2016-02-17 13:44:00 +0000 | |||
247 | @@ -27,7 +27,7 @@ | |||
248 | 27 | from gi.repository import GLib | 27 | from gi.repository import GLib |
249 | 28 | from gi.repository import GObject | 28 | from gi.repository import GObject |
250 | 29 | from gi.repository import GdkPixbuf | 29 | from gi.repository import GdkPixbuf |
252 | 30 | from gi.repository import WebKit | 30 | from gi.repository import WebKit2 |
253 | 31 | 31 | ||
254 | 32 | from urlparse import urlparse | 32 | from urlparse import urlparse |
255 | 33 | 33 | ||
256 | @@ -35,6 +35,7 @@ | |||
257 | 35 | from softwarecenter.ui.gtk3.em import StockEms | 35 | from softwarecenter.ui.gtk3.em import StockEms |
258 | 36 | from softwarecenter.ui.gtk3.drawing import rounded_rect | 36 | from softwarecenter.ui.gtk3.drawing import rounded_rect |
259 | 37 | from softwarecenter.ui.gtk3.utils import point_in | 37 | from softwarecenter.ui.gtk3.utils import point_in |
260 | 38 | from softwarecenter.ui.gtk3.widgets.webkit import SCWebKit | ||
261 | 38 | import softwarecenter.paths | 39 | import softwarecenter.paths |
262 | 39 | 40 | ||
263 | 40 | LOG = logging.getLogger(__name__) | 41 | LOG = logging.getLogger(__name__) |
264 | @@ -64,6 +65,7 @@ | |||
265 | 64 | position:absolute; | 65 | position:absolute; |
266 | 65 | top:100px; | 66 | top:100px; |
267 | 66 | left:232px; | 67 | left:232px; |
268 | 68 | white-space: nowrap; | ||
269 | 67 | } | 69 | } |
270 | 68 | </style> | 70 | </style> |
271 | 69 | </head><body> | 71 | </head><body> |
272 | @@ -101,25 +103,15 @@ | |||
273 | 101 | # "cached banners") | 103 | # "cached banners") |
274 | 102 | 104 | ||
275 | 103 | 105 | ||
284 | 104 | class _HtmlRenderer(Gtk.OffscreenWindow): | 106 | class _HtmlRenderer(SCWebKit): |
277 | 105 | |||
278 | 106 | __gsignals__ = { | ||
279 | 107 | "render-finished": (GObject.SignalFlags.RUN_LAST, | ||
280 | 108 | None, | ||
281 | 109 | (), | ||
282 | 110 | ) | ||
283 | 111 | } | ||
285 | 112 | 107 | ||
286 | 113 | def __init__(self): | 108 | def __init__(self): |
291 | 114 | Gtk.OffscreenWindow.__init__(self) | 109 | super(_HtmlRenderer, self).__init__() |
292 | 115 | self.view = WebKit.WebView() | 110 | settings = self.get_settings() |
293 | 116 | settings = self.view.get_settings() | 111 | settings.set_property("enable-java", False) |
290 | 117 | settings.set_property("enable-java-applet", False) | ||
294 | 118 | settings.set_property("enable-plugins", False) | 112 | settings.set_property("enable-plugins", False) |
299 | 119 | settings.set_property("enable-scripts", False) | 113 | settings.set_property("enable-javascript", False) |
300 | 120 | self.view.set_size_request(-1, ExhibitBanner.MAX_HEIGHT) | 114 | self.set_size_request(-1, ExhibitBanner.MAX_HEIGHT) |
297 | 121 | self.add(self.view) | ||
298 | 122 | self.show_all() | ||
301 | 123 | self.loader = SimpleFileDownloader() | 115 | self.loader = SimpleFileDownloader() |
302 | 124 | self.loader.connect("file-download-complete", | 116 | self.loader.connect("file-download-complete", |
303 | 125 | self._on_one_download_complete) | 117 | self._on_one_download_complete) |
304 | @@ -127,8 +119,6 @@ | |||
305 | 127 | self._on_download_error) | 119 | self._on_download_error) |
306 | 128 | self.exhibit = None | 120 | self.exhibit = None |
307 | 129 | self._downloaded_banner_images = [] | 121 | self._downloaded_banner_images = [] |
308 | 130 | self.view.connect( | ||
309 | 131 | "notify::load-status", self._on_internal_renderer_load_status) | ||
310 | 132 | 122 | ||
311 | 133 | def set_exhibit(self, exhibit): | 123 | def set_exhibit(self, exhibit): |
312 | 134 | LOG.debug("set_exhibit: '%s'" % exhibit) | 124 | LOG.debug("set_exhibit: '%s'" % exhibit) |
313 | @@ -165,8 +155,7 @@ | |||
314 | 165 | html = html.replace(server_path, image_name) | 155 | html = html.replace(server_path, image_name) |
315 | 166 | self.exhibit.html = html | 156 | self.exhibit.html = html |
316 | 167 | LOG.debug("mangled html: '%s'" % html) | 157 | LOG.debug("mangled html: '%s'" % html) |
319 | 168 | self.view.load_string(html, "text/html", "UTF-8", | 158 | self.load_html(html, "file:%s/" % cache_dir) |
318 | 169 | "file:%s/" % cache_dir) | ||
320 | 170 | 159 | ||
321 | 171 | def _download_next_banner_image(self): | 160 | def _download_next_banner_image(self): |
322 | 172 | LOG.debug("_download_next_banner_image") | 161 | LOG.debug("_download_next_banner_image") |
323 | @@ -175,12 +164,6 @@ | |||
324 | 175 | use_cache=True, | 164 | use_cache=True, |
325 | 176 | simple_quoting_for_webkit=True) | 165 | simple_quoting_for_webkit=True) |
326 | 177 | 166 | ||
327 | 178 | def _on_internal_renderer_load_status(self, view, prop): | ||
328 | 179 | """Called when the rendering of the html banner is done""" | ||
329 | 180 | if view.get_property("load-status") == WebKit.LoadStatus.FINISHED: | ||
330 | 181 | # this needs to run with a timeout because otherwise the | ||
331 | 182 | # status is emitted before the offscreen image is finished | ||
332 | 183 | GLib.timeout_add(100, lambda: self.emit("render-finished")) | ||
333 | 184 | 167 | ||
334 | 185 | 168 | ||
335 | 186 | class ExhibitButton(Gtk.Button): | 169 | class ExhibitButton(Gtk.Button): |
336 | @@ -311,7 +294,7 @@ | |||
337 | 311 | self.image = None | 294 | self.image = None |
338 | 312 | self.old_image = None | 295 | self.old_image = None |
339 | 313 | self.renderer = _HtmlRenderer() | 296 | self.renderer = _HtmlRenderer() |
341 | 314 | self.renderer.connect("render-finished", self.on_banner_rendered) | 297 | self.renderer.connect("load-changed", self.on_load_changed) |
342 | 315 | 298 | ||
343 | 316 | self.set_visible_window(False) | 299 | self.set_visible_window(False) |
344 | 317 | self.set_size_request(-1, self.MAX_HEIGHT) | 300 | self.set_size_request(-1, self.MAX_HEIGHT) |
345 | @@ -449,14 +432,11 @@ | |||
346 | 449 | self.TIMEOUT_SECONDS, self.next_exhibit) | 432 | self.TIMEOUT_SECONDS, self.next_exhibit) |
347 | 450 | return self._timeout | 433 | return self._timeout |
348 | 451 | 434 | ||
357 | 452 | def on_banner_rendered(self, renderer): | 435 | def on_snapshot_created(self, obj, result): |
358 | 453 | self.image = renderer.get_pixbuf() | 436 | surface = obj.get_snapshot_finish(result) |
359 | 454 | 437 | self.image = Gdk.pixbuf_get_from_surface(surface, 0, 0, | |
360 | 455 | if self.image.get_width() == 1: | 438 | surface.get_width(), |
361 | 456 | # the offscreen window is not really as such content not | 439 | surface.get_height()) |
354 | 457 | # correctly rendered | ||
355 | 458 | GLib.timeout_add(500, self.on_banner_rendered, renderer) | ||
356 | 459 | return | ||
362 | 460 | 440 | ||
363 | 461 | from gi.repository import Atk | 441 | from gi.repository import Atk |
364 | 462 | self.get_accessible().set_name( | 442 | self.get_accessible().set_name( |
365 | @@ -464,6 +444,26 @@ | |||
366 | 464 | self.get_accessible().set_role(Atk.Role.PUSH_BUTTON) | 444 | self.get_accessible().set_role(Atk.Role.PUSH_BUTTON) |
367 | 465 | self._fade_in() | 445 | self._fade_in() |
368 | 466 | self.queue_next() | 446 | self.queue_next() |
369 | 447 | |||
370 | 448 | def on_load_changed(self, renderer, load_event): | ||
371 | 449 | from gi.repository import WebKit2 | ||
372 | 450 | |||
373 | 451 | if load_event != WebKit2.LoadEvent.FINISHED: | ||
374 | 452 | return False | ||
375 | 453 | |||
376 | 454 | renderer.get_snapshot(WebKit2.SnapshotRegion.FULL_DOCUMENT, | ||
377 | 455 | WebKit2.SnapshotOptions.NONE, | ||
378 | 456 | None, | ||
379 | 457 | self.on_snapshot_created) | ||
380 | 458 | |||
381 | 459 | return True | ||
382 | 460 | |||
383 | 461 | if self.image.get_width() == 1: | ||
384 | 462 | # the offscreen window is not really as such content not | ||
385 | 463 | # correctly rendered | ||
386 | 464 | GLib.timeout_add(500, self.on_banner_rendered, renderer) | ||
387 | 465 | return | ||
388 | 466 | |||
389 | 467 | return False | 467 | return False |
390 | 468 | 468 | ||
391 | 469 | def _fade_in(self, step=0.05): | 469 | def _fade_in(self, step=0.05): |
392 | 470 | 470 | ||
393 | === modified file 'softwarecenter/ui/gtk3/widgets/videoplayer.py' | |||
394 | --- softwarecenter/ui/gtk3/widgets/videoplayer.py 2014-01-10 10:50:59 +0000 | |||
395 | +++ softwarecenter/ui/gtk3/widgets/videoplayer.py 2016-02-17 13:44:00 +0000 | |||
396 | @@ -21,6 +21,7 @@ | |||
397 | 21 | 21 | ||
398 | 22 | from gettext import gettext as _ | 22 | from gettext import gettext as _ |
399 | 23 | from gi.repository import Gdk | 23 | from gi.repository import Gdk |
400 | 24 | from gi.repository import WebKit2 | ||
401 | 24 | 25 | ||
402 | 25 | # FIXME: remove this try/except and add a dependency on gir1.2-gstreamer-0.10 | 26 | # FIXME: remove this try/except and add a dependency on gir1.2-gstreamer-0.10 |
403 | 26 | # if we (ever) start using VideoPlayerGtk3 | 27 | # if we (ever) start using VideoPlayerGtk3 |
404 | @@ -30,7 +31,8 @@ | |||
405 | 30 | pass | 31 | pass |
406 | 31 | 32 | ||
407 | 32 | from gi.repository import Gtk | 33 | from gi.repository import Gtk |
409 | 33 | from gi.repository import WebKit | 34 | |
410 | 35 | from softwarecenter.ui.gtk3.widgets.webkit import SCWebKit | ||
411 | 34 | 36 | ||
412 | 35 | LOG = logging.getLogger(__name__) | 37 | LOG = logging.getLogger(__name__) |
413 | 36 | 38 | ||
414 | @@ -39,7 +41,7 @@ | |||
415 | 39 | def __init__(self): | 41 | def __init__(self): |
416 | 40 | super(VideoPlayer, self).__init__() | 42 | super(VideoPlayer, self).__init__() |
417 | 41 | self.set_size_request(400, 255) | 43 | self.set_size_request(400, 255) |
419 | 42 | self.webkit = WebKit.WebView() | 44 | self.webkit = SCWebKit() |
420 | 43 | settings = self.webkit.get_settings() | 45 | settings = self.webkit.get_settings() |
421 | 44 | # this disables the flash and other plugins so that we force html5 | 46 | # this disables the flash and other plugins so that we force html5 |
422 | 45 | # video on the system. This is works currently (11/2011) fine with | 47 | # video on the system. This is works currently (11/2011) fine with |
423 | @@ -48,25 +50,30 @@ | |||
424 | 48 | settings.set_property("enable-plugins", False) | 50 | settings.set_property("enable-plugins", False) |
425 | 49 | # on navigation/new window etc, just use the proper browser | 51 | # on navigation/new window etc, just use the proper browser |
426 | 50 | self.webkit.connect( | 52 | self.webkit.connect( |
429 | 51 | "new-window-policy-decision-requested", self._on_new_window) | 53 | "decide-policy", self._on_decide_policy) |
430 | 52 | self.webkit.connect("create-web-view", self._on_create_web_view) | 54 | self.webkit.connect("create", self._on_create_web_view) |
431 | 53 | self.pack_start(self.webkit, True, True, 0) | 55 | self.pack_start(self.webkit, True, True, 0) |
432 | 54 | self._uri = "" | 56 | self._uri = "" |
433 | 55 | 57 | ||
434 | 56 | # helper required to follow ToS about the "back" link (flash version) | 58 | # helper required to follow ToS about the "back" link (flash version) |
438 | 57 | def _on_new_window(self, view, frame, request, action, policy): | 59 | def _on_decide_policy(self, decision, decision_type): |
439 | 58 | subprocess.Popen(['xdg-open', request.get_uri()]) | 60 | if decision_type == WebKit2.PolicyDecisionType.NEW_WINDOW_ACTION: |
440 | 59 | return True | 61 | request = decision.get_request() |
441 | 62 | subprocess.Popen(['xdg-open', request.uri]) | ||
442 | 63 | decision.ignore() | ||
443 | 64 | return True | ||
444 | 65 | |||
445 | 66 | return False | ||
446 | 60 | 67 | ||
447 | 61 | # helper for the embedded html5 viewer | 68 | # helper for the embedded html5 viewer |
449 | 62 | def _on_create_web_view(self, view, frame): | 69 | def _on_create_web_view(self, view, action): |
450 | 63 | # mvo: this is not ideal, the trouble is that we do not get the | 70 | # mvo: this is not ideal, the trouble is that we do not get the |
451 | 64 | # url that the new view points to until after the view was | 71 | # url that the new view points to until after the view was |
452 | 65 | # created. But we don't want to be a full blow internal | 72 | # created. But we don't want to be a full blow internal |
453 | 66 | # webbrowser so we simply go back to the youtube url here | 73 | # webbrowser so we simply go back to the youtube url here |
454 | 67 | # and the user needs to click "youtube" there again :/ | 74 | # and the user needs to click "youtube" there again :/ |
457 | 68 | uri = frame.get_uri() | 75 | req = action.get_request() |
458 | 69 | subprocess.Popen(['xdg-open', uri]) | 76 | subprocess.Popen(['xdg-open', req.uri]) |
459 | 70 | 77 | ||
460 | 71 | # uri property | 78 | # uri property |
461 | 72 | def _set_uri(self, v): | 79 | def _set_uri(self, v): |
462 | @@ -75,86 +82,20 @@ | |||
463 | 75 | # only load the uri if it's defined, otherwise we may get: | 82 | # only load the uri if it's defined, otherwise we may get: |
464 | 76 | # Program received signal SIGSEGV, Segmentation fault. | 83 | # Program received signal SIGSEGV, Segmentation fault. |
465 | 77 | # webkit_web_frame_load_uri () from /usr/lib/libwebkitgtk-3.0.so.0 | 84 | # webkit_web_frame_load_uri () from /usr/lib/libwebkitgtk-3.0.so.0 |
467 | 78 | self.webkit.load_uri(self._uri) | 85 | self.webkit.uri = self._uri |
468 | 79 | 86 | ||
469 | 80 | def _get_uri(self): | 87 | def _get_uri(self): |
470 | 81 | return self._uri | 88 | return self._uri |
471 | 82 | uri = property(_get_uri, _set_uri, None, "uri property") | 89 | uri = property(_get_uri, _set_uri, None, "uri property") |
472 | 83 | 90 | ||
474 | 84 | def load_html_string(self, html): | 91 | def load_html(self, html): |
475 | 85 | """ Instead of a video URI use a html embedded video like e.g. | 92 | """ Instead of a video URI use a html embedded video like e.g. |
476 | 86 | youtube or vimeo. Note that on a default install not all | 93 | youtube or vimeo. Note that on a default install not all |
477 | 87 | video codecs will play (no flash!), so be careful! | 94 | video codecs will play (no flash!), so be careful! |
478 | 88 | """ | 95 | """ |
479 | 89 | # FIXME: add something more useful here | 96 | # FIXME: add something more useful here |
480 | 90 | base_uri = "http://www.ubuntu.com" | 97 | base_uri = "http://www.ubuntu.com" |
482 | 91 | self.webkit.load_html_string(html, base_uri) | 98 | self.webkit.load_html(html, base_uri) |
483 | 92 | 99 | ||
484 | 93 | def stop(self): | 100 | def stop(self): |
485 | 94 | self.webkit.load_uri('') | 101 | self.webkit.load_uri('') |
486 | 95 | |||
487 | 96 | |||
488 | 97 | # AKA the-segfault-edition-with-no-documentation | ||
489 | 98 | class VideoPlayerGtk3(Gtk.VBox): | ||
490 | 99 | |||
491 | 100 | def __init__(self): | ||
492 | 101 | super(VideoPlayerGtk3, self).__init__() | ||
493 | 102 | self.uri = "" | ||
494 | 103 | # gtk ui | ||
495 | 104 | self.movie_window = Gtk.DrawingArea() | ||
496 | 105 | self.pack_start(self.movie_window, True, True, 0) | ||
497 | 106 | self.button = Gtk.Button(label=_("Play")) | ||
498 | 107 | self.pack_start(self.button, False, True, 0) | ||
499 | 108 | self.button.connect("clicked", self.on_play_clicked) | ||
500 | 109 | # player | ||
501 | 110 | self.player = Gst.ElementFactory.make("playbin2", "player") | ||
502 | 111 | # bus stuff | ||
503 | 112 | bus = self.player.get_bus() | ||
504 | 113 | bus.add_signal_watch() | ||
505 | 114 | bus.enable_sync_message_emission() | ||
506 | 115 | bus.connect("message", self.on_message) | ||
507 | 116 | # FIXME: no sync messages currently so no playing in the widget :/ | ||
508 | 117 | # the former appears to be not working anymore with GIR, the | ||
509 | 118 | # later is not exported (introspectable=0 in the GIR) | ||
510 | 119 | bus.connect("sync-message", self.on_sync_message) | ||
511 | 120 | #bus.set_sync_handler(self.on_sync_message) | ||
512 | 121 | |||
513 | 122 | def on_play_clicked(self, button): | ||
514 | 123 | if self.button.get_label() == _("Play"): | ||
515 | 124 | self.button.set_label("Stop") | ||
516 | 125 | print(self.uri) | ||
517 | 126 | self.player.set_property("uri", self.uri) | ||
518 | 127 | self.player.set_state(Gst.State.PLAYING) | ||
519 | 128 | else: | ||
520 | 129 | self.player.set_state(Gst.State.NULL) | ||
521 | 130 | self.button.set_label(_("Play")) | ||
522 | 131 | |||
523 | 132 | def on_message(self, bus, message): | ||
524 | 133 | print("message: %s" % bus, message) | ||
525 | 134 | if message is None: | ||
526 | 135 | return | ||
527 | 136 | t = message.type | ||
528 | 137 | print(t) | ||
529 | 138 | if t == Gst.MessageType.EOS: | ||
530 | 139 | self.player.set_state(Gst.State.NULL) | ||
531 | 140 | self.button.set_label(_("Play")) | ||
532 | 141 | elif t == Gst.MessageType.ERROR: | ||
533 | 142 | self.player.set_state(Gst.State.NULL) | ||
534 | 143 | err, debug = message.parse_error() | ||
535 | 144 | LOG.error("Error playing video: %s (%s)" % (err, debug)) | ||
536 | 145 | self.button.set_label(_("Play")) | ||
537 | 146 | |||
538 | 147 | def on_sync_message(self, bus, message): | ||
539 | 148 | print("sync: %s" % bus, message) | ||
540 | 149 | if message is None or message.structure is None: | ||
541 | 150 | return | ||
542 | 151 | message_name = message.structure.get_name() | ||
543 | 152 | if message_name == "prepare-xwindow-id": | ||
544 | 153 | imagesink = message.src | ||
545 | 154 | imagesink.set_property("force-aspect-ratio", True) | ||
546 | 155 | Gdk.threads_enter() | ||
547 | 156 | # FIXME: this is the way to do it, *but* get_xid() is not | ||
548 | 157 | # exported in the GIR | ||
549 | 158 | xid = self.player.movie_window.get_window().get_xid() | ||
550 | 159 | imagesink.set_xwindow_id(xid) | ||
551 | 160 | Gdk.threads_leave() | ||
552 | 161 | 102 | ||
553 | === modified file 'softwarecenter/ui/gtk3/widgets/webkit.py' | |||
554 | --- softwarecenter/ui/gtk3/widgets/webkit.py 2012-12-14 16:44:25 +0000 | |||
555 | +++ softwarecenter/ui/gtk3/widgets/webkit.py 2016-02-17 13:44:00 +0000 | |||
556 | @@ -20,7 +20,7 @@ | |||
557 | 20 | import logging | 20 | import logging |
558 | 21 | import os | 21 | import os |
559 | 22 | 22 | ||
561 | 23 | from gi.repository import WebKit as webkit | 23 | from gi.repository import WebKit2 as webkit |
562 | 24 | from gi.repository import Gtk | 24 | from gi.repository import Gtk |
563 | 25 | from gi.repository import Pango | 25 | from gi.repository import Pango |
564 | 26 | import urlparse | 26 | import urlparse |
565 | @@ -31,48 +31,41 @@ | |||
566 | 31 | from softwarecenter.utils import get_oem_channel_descriptor | 31 | from softwarecenter.utils import get_oem_channel_descriptor |
567 | 32 | 32 | ||
568 | 33 | from gi.repository import Soup | 33 | from gi.repository import Soup |
569 | 34 | from gi.repository import WebKit | ||
570 | 35 | 34 | ||
571 | 36 | 35 | ||
572 | 37 | LOG = logging.getLogger(__name__) | 36 | LOG = logging.getLogger(__name__) |
573 | 38 | 37 | ||
574 | 39 | 38 | ||
611 | 40 | def global_webkit_init(): | 39 | class SCWebKit(webkit.WebView): |
612 | 41 | """ this sets the defaults for webkit, its important that this gets | 40 | def __init__(self): |
613 | 42 | run if you want a secure webkit session | 41 | super(SCWebKit, self).__init__() |
614 | 43 | """ | 42 | """ this sets the defaults for webkit, its important that this gets |
615 | 44 | session = WebKit.get_default_session() | 43 | run if you want a secure webkit session |
616 | 45 | # add security by default (see bugzilla #666280 and #666276) | 44 | """ |
617 | 46 | # enable certificates validation in webkit views unless specified otherwise | 45 | context = self.get_context() |
618 | 47 | if not "SOFTWARE_CENTER_FORCE_DISABLE_CERTS_CHECK" in os.environ: | 46 | |
619 | 48 | session = webkit.get_default_session() | 47 | # enable certificates validation in webkit views unless specified otherwise |
620 | 49 | session.set_property( | 48 | if "SOFTWARE_CENTER_FORCE_DISABLE_CERTS_CHECK" in os.environ: |
621 | 50 | "ssl-ca-file", "/etc/ssl/certs/ca-certificates.crt") | 49 | context.set_tls_errors_policy(webkit.TLSErrorsPolicy.IGNORE) |
622 | 51 | else: | 50 | # WARN the user!! Do not remove this |
623 | 52 | # WARN the user!! Do not remove this | 51 | LOG.warning("SOFTWARE_CENTER_FORCE_DISABLE_CERTS_CHECK " + |
624 | 53 | LOG.warning("SOFTWARE_CENTER_FORCE_DISABLE_CERTS_CHECK " + | 52 | "has been specified, all purchase transactions " + |
625 | 54 | "has been specified, all purchase transactions " + | 53 | "are now INSECURE and UNENCRYPTED!!") |
626 | 55 | "are now INSECURE and UNENCRYPTED!!") | 54 | |
627 | 56 | # cookies by default | 55 | # cookies by default |
628 | 57 | fname = os.path.join(SOFTWARE_CENTER_CACHE_DIR, "cookies.txt") | 56 | fname = os.path.join(SOFTWARE_CENTER_CACHE_DIR, "cookies.txt") |
629 | 58 | # clear cookies again in a new session, see #1018347 comment #4 | 57 | # clear cookies again in a new session, see #1018347 comment #4 |
630 | 59 | # there is no "logout" support right now on any of the USC pages | 58 | # there is no "logout" support right now on any of the USC pages |
631 | 60 | try: | 59 | try: |
632 | 61 | os.remove(fname) | 60 | os.remove(fname) |
633 | 62 | except OSError: | 61 | except OSError: |
634 | 63 | pass | 62 | pass |
635 | 64 | cookie_jar = Soup.CookieJarText.new(fname, False) | 63 | cookie_manager = context.get_cookie_manager() |
636 | 65 | session.add_feature(cookie_jar) | 64 | cookie_manager.set_persistent_storage(fname, |
637 | 66 | # optional session debugging | 65 | webkit.CookiePersistentStorage.TEXT) |
638 | 67 | if "SOFTWARE_CENTER_DEBUG_WEBKIT" in os.environ: | 66 | |
639 | 68 | # alternatively you can use HEADERS, BODY here | 67 | |
640 | 69 | logger = Soup.Logger.new(Soup.LoggerLogLevel.BODY, -1) | 68 | class SoftwareCenterWebView(SCWebKit): |
605 | 70 | logger.attach(session) | ||
606 | 71 | # ALWAYS run this or get insecurity by default | ||
607 | 72 | global_webkit_init() | ||
608 | 73 | |||
609 | 74 | |||
610 | 75 | class SoftwareCenterWebView(webkit.WebView): | ||
641 | 76 | """ A customized version of the regular webview | 69 | """ A customized version of the regular webview |
642 | 77 | 70 | ||
643 | 78 | It will: | 71 | It will: |
644 | @@ -91,10 +84,10 @@ | |||
645 | 91 | 84 | ||
646 | 92 | def __init__(self): | 85 | def __init__(self): |
647 | 93 | # actual webkit init | 86 | # actual webkit init |
650 | 94 | webkit.WebView.__init__(self) | 87 | super(SoftwareCenterWebView, self).__init__() |
651 | 95 | self.connect("resource-request-starting", | 88 | self.connect("resource-load-started", |
652 | 96 | self._on_resource_request_starting) | 89 | self._on_resource_request_starting) |
654 | 97 | self.connect("notify::load-status", | 90 | self.connect("load-changed", |
655 | 98 | self._on_load_status_changed) | 91 | self._on_load_status_changed) |
656 | 99 | settings = self.get_settings() | 92 | settings = self.get_settings() |
657 | 100 | settings.set_property("enable-plugins", False) | 93 | settings.set_property("enable-plugins", False) |
658 | @@ -111,29 +104,23 @@ | |||
659 | 111 | user_agent_string += get_oem_channel_descriptor() | 104 | user_agent_string += get_oem_channel_descriptor() |
660 | 112 | return user_agent_string | 105 | return user_agent_string |
661 | 113 | 106 | ||
663 | 114 | def _on_resource_request_starting(self, view, frame, res, req, resp): | 107 | def _on_resource_request_starting(self, view, res, req): |
664 | 115 | lang = get_language() | 108 | lang = get_language() |
665 | 116 | if lang: | 109 | if lang: |
669 | 117 | message = req.get_message() | 110 | headers = req.get_http_headers() |
670 | 118 | if message: | 111 | if headers: |
668 | 119 | headers = message.get_property("request-headers") | ||
671 | 120 | headers.append("Accept-Language", lang) | 112 | headers.append("Accept-Language", lang) |
672 | 121 | #def _show_header(name, value, data): | ||
673 | 122 | # print name, value | ||
674 | 123 | #headers.foreach(_show_header, None) | ||
675 | 124 | 113 | ||
676 | 125 | def _maybe_auto_fill_in_username(self): | 114 | def _maybe_auto_fill_in_username(self): |
677 | 126 | uri = self.get_uri() | 115 | uri = self.get_uri() |
678 | 127 | if self._auto_fill_email and uri.startswith(self.AUTO_FILL_SERVER): | 116 | if self._auto_fill_email and uri.startswith(self.AUTO_FILL_SERVER): |
680 | 128 | self.execute_script( | 117 | self.run_javascript( |
681 | 129 | self.AUTO_FILL_EMAIL_JS % self._auto_fill_email) | 118 | self.AUTO_FILL_EMAIL_JS % self._auto_fill_email) |
682 | 130 | # ensure that we have the keyboard focus | 119 | # ensure that we have the keyboard focus |
683 | 131 | self.grab_focus() | 120 | self.grab_focus() |
684 | 132 | 121 | ||
689 | 133 | def _on_load_status_changed(self, view, pspec): | 122 | def _on_load_status_changed(self, view, load_event): |
690 | 134 | prop = pspec.name | 123 | if load_event == webkit.LoadEvent.FINISHED: |
687 | 135 | status = view.get_property(prop) | ||
688 | 136 | if status == webkit.LoadStatus.FINISHED: | ||
691 | 137 | self._maybe_auto_fill_in_username() | 124 | self._maybe_auto_fill_in_username() |
692 | 138 | 125 | ||
693 | 139 | 126 | ||
694 | @@ -147,12 +134,7 @@ | |||
695 | 147 | if include_progress_ui: | 134 | if include_progress_ui: |
696 | 148 | self._add_progress_ui() | 135 | self._add_progress_ui() |
697 | 149 | # create main webkitview | 136 | # create main webkitview |
704 | 150 | self.scroll = Gtk.ScrolledWindow() | 137 | self.pack_start(self.webkit, True, True, 0) |
699 | 151 | self.scroll.set_policy(Gtk.PolicyType.AUTOMATIC, | ||
700 | 152 | Gtk.PolicyType.AUTOMATIC) | ||
701 | 153 | self.pack_start(self.scroll, True, True, 0) | ||
702 | 154 | # embed the webkit view in a scrolled window | ||
703 | 155 | self.scroll.add(self.webkit) | ||
705 | 156 | self.show_all() | 138 | self.show_all() |
706 | 157 | 139 | ||
707 | 158 | def _add_progress_ui(self): | 140 | def _add_progress_ui(self): |
708 | @@ -174,7 +156,7 @@ | |||
709 | 174 | self.pack_start(self.frame, False, False, 6) | 156 | self.pack_start(self.frame, False, False, 6) |
710 | 175 | # connect the webkit stuff | 157 | # connect the webkit stuff |
711 | 176 | self.webkit.connect("notify::uri", self._on_uri_changed) | 158 | self.webkit.connect("notify::uri", self._on_uri_changed) |
713 | 177 | self.webkit.connect("notify::load-status", | 159 | self.webkit.connect("load-changed", |
714 | 178 | self._on_load_status_changed) | 160 | self._on_load_status_changed) |
715 | 179 | 161 | ||
716 | 180 | def _on_uri_changed(self, view, pspec): | 162 | def _on_uri_changed(self, view, pspec): |
717 | @@ -191,14 +173,10 @@ | |||
718 | 191 | # start spinner when the uri changes | 173 | # start spinner when the uri changes |
719 | 192 | #self.spinner.start() | 174 | #self.spinner.start() |
720 | 193 | 175 | ||
726 | 194 | def _on_load_status_changed(self, view, pspec): | 176 | def _on_load_status_changed(self, view, load_event): |
727 | 195 | prop = pspec.name | 177 | if load_event == webkit.LoadEvent.STARTED: |
723 | 196 | status = view.get_property(prop) | ||
724 | 197 | #print status | ||
725 | 198 | if status == webkit.LoadStatus.PROVISIONAL: | ||
728 | 199 | self.spinner.start() | 178 | self.spinner.start() |
729 | 200 | self.spinner.show() | 179 | self.spinner.show() |
732 | 201 | if (status == webkit.LoadStatus.FINISHED or | 180 | if load_event == webkit.LoadEvent.FINISHED: |
731 | 202 | status == webkit.LoadStatus.FAILED): | ||
733 | 203 | self.spinner.stop() | 181 | self.spinner.stop() |
734 | 204 | self.spinner.hide() | 182 | self.spinner.hide() |
735 | 205 | 183 | ||
736 | === modified file 'tests/gtk3/test_purchase.py' | |||
737 | --- tests/gtk3/test_purchase.py 2012-09-18 06:38:40 +0000 | |||
738 | +++ tests/gtk3/test_purchase.py 2016-02-17 13:44:00 +0000 | |||
739 | @@ -17,30 +17,6 @@ | |||
740 | 17 | 17 | ||
741 | 18 | class TestPurchase(unittest.TestCase): | 18 | class TestPurchase(unittest.TestCase): |
742 | 19 | 19 | ||
743 | 20 | def test_purchase_view_log_cleaner(self): | ||
744 | 21 | win = get_test_window_purchaseview() | ||
745 | 22 | self.addCleanup(win.destroy) | ||
746 | 23 | do_events_with_sleep() | ||
747 | 24 | # get the view | ||
748 | 25 | view = win.get_data("view") | ||
749 | 26 | # install the mock | ||
750 | 27 | purchaseview.LOG = mock = Mock() | ||
751 | 28 | # run a "harmless" log message and ensure its logged normally | ||
752 | 29 | view.wk.webkit.execute_script('console.log("foo")') | ||
753 | 30 | self.assertTrue("foo" in mock.debug.call_args[0][0]) | ||
754 | 31 | mock.reset_mock() | ||
755 | 32 | |||
756 | 33 | # run a message that contains token info | ||
757 | 34 | s = ('http://sca.razorgirl.info/subscriptions/19077/checkout_complete/' | ||
758 | 35 | ' @10: {"token_key": "hiddenXXXXXXXXXX", "consumer_secret": ' | ||
759 | 36 | '"hiddenXXXXXXXXXXXX", "api_version": 2.0, "subscription_id": ' | ||
760 | 37 | '19077, "consumer_key": "rKhNPBw", "token_secret": ' | ||
761 | 38 | '"hiddenXXXXXXXXXXXXXXX"}') | ||
762 | 39 | view.wk.webkit.execute_script("console.log('%s')" % s) | ||
763 | 40 | self.assertTrue("skipping" in mock.debug.call_args[0][0]) | ||
764 | 41 | self.assertFalse("consumer_secret" in mock.debug.call_args[0][0]) | ||
765 | 42 | mock.reset_mock() | ||
766 | 43 | |||
767 | 44 | def test_purchase_view_tos(self): | 20 | def test_purchase_view_tos(self): |
768 | 45 | win = get_test_window_purchaseview() | 21 | win = get_test_window_purchaseview() |
769 | 46 | self.addCleanup(win.destroy) | 22 | self.addCleanup(win.destroy) |
770 | 47 | 23 | ||
771 | === modified file 'tests/gtk3/test_webkit.py' | |||
772 | --- tests/gtk3/test_webkit.py 2012-11-28 15:43:49 +0000 | |||
773 | +++ tests/gtk3/test_webkit.py 2016-02-17 13:44:00 +0000 | |||
774 | @@ -3,7 +3,7 @@ | |||
775 | 3 | from gi.repository import ( | 3 | from gi.repository import ( |
776 | 4 | GLib, | 4 | GLib, |
777 | 5 | Soup, | 5 | Soup, |
779 | 6 | WebKit, | 6 | WebKit2, |
780 | 7 | ) | 7 | ) |
781 | 8 | 8 | ||
782 | 9 | from mock import patch | 9 | from mock import patch |
783 | @@ -19,19 +19,10 @@ | |||
784 | 19 | 19 | ||
785 | 20 | class TestWebkit(unittest.TestCase): | 20 | class TestWebkit(unittest.TestCase): |
786 | 21 | 21 | ||
787 | 22 | def test_have_cookie_jar(self): | ||
788 | 23 | # ensure we have a cookie jar available | ||
789 | 24 | session = WebKit.get_default_session() | ||
790 | 25 | cookie_jars = [feature | ||
791 | 26 | for feature in session.get_features(Soup.SessionFeature) | ||
792 | 27 | if isinstance(feature, Soup.CookieJar)] | ||
793 | 28 | self.assertEqual(len(cookie_jars), 1) | ||
794 | 29 | |||
795 | 30 | def test_user_agent_string(self): | 22 | def test_user_agent_string(self): |
796 | 31 | webview = SoftwareCenterWebView() | 23 | webview = SoftwareCenterWebView() |
797 | 32 | settings = webview.get_settings() | 24 | settings = webview.get_settings() |
800 | 33 | self.assertTrue( | 25 | self.assertTrue(WEBKIT_USER_AGENT_SUFFIX in settings.get_user_agent()) |
799 | 34 | WEBKIT_USER_AGENT_SUFFIX in settings.get_property("user-agent")) | ||
801 | 35 | 26 | ||
802 | 36 | @patch("softwarecenter.ui.gtk3.widgets.webkit.get_oem_channel_descriptor") | 27 | @patch("softwarecenter.ui.gtk3.widgets.webkit.get_oem_channel_descriptor") |
803 | 37 | def test_user_agent_oem_channel_descriptor(self, mock_oem_channel): | 28 | def test_user_agent_oem_channel_descriptor(self, mock_oem_channel): |
804 | @@ -39,19 +30,18 @@ | |||
805 | 39 | mock_oem_channel.return_value = canary | 30 | mock_oem_channel.return_value = canary |
806 | 40 | webview = SoftwareCenterWebView() | 31 | webview = SoftwareCenterWebView() |
807 | 41 | settings = webview.get_settings() | 32 | settings = webview.get_settings() |
811 | 42 | self.assertTrue( | 33 | self.assertTrue(canary in settings.get_user_agent()) |
812 | 43 | canary in settings.get_property("user-agent")) | 34 | |
810 | 44 | |||
813 | 45 | def test_auto_fill_in_email(self): | 35 | def test_auto_fill_in_email(self): |
814 | 46 | def _load_status_changed(view, status): | 36 | def _load_status_changed(view, status): |
816 | 47 | if view.get_property("load-status") == WebKit.LoadStatus.FINISHED: | 37 | if status == WebKit2.LoadEvent.FINISHED: |
817 | 48 | loop.quit() | 38 | loop.quit() |
819 | 49 | loop = GLib.MainLoop(GLib.main_context_default()) | 39 | loop = GLib.MainLoop(GLib.main_context_default()) |
820 | 50 | webview = SoftwareCenterWebView() | 40 | webview = SoftwareCenterWebView() |
821 | 51 | email = "foo@bar" | 41 | email = "foo@bar" |
822 | 52 | webview.set_auto_insert_email(email) | 42 | webview.set_auto_insert_email(email) |
825 | 53 | with patch.object(webview, "execute_script") as mock_execute_js: | 43 | with patch.object(webview, "run_javascript") as mock_execute_js: |
826 | 54 | webview.connect("notify::load-status", _load_status_changed) | 44 | webview.connect("load-changed", _load_status_changed) |
827 | 55 | webview.load_uri("https://login.ubuntu.com") | 45 | webview.load_uri("https://login.ubuntu.com") |
828 | 56 | loop.run() | 46 | loop.run() |
829 | 57 | mock_execute_js.assert_called() | 47 | mock_execute_js.assert_called() |
830 | 58 | 48 | ||
831 | === modified file 'tests/gtk3/test_widgets.py' | |||
832 | --- tests/gtk3/test_widgets.py 2012-12-13 16:41:05 +0000 | |||
833 | +++ tests/gtk3/test_widgets.py 2016-02-17 13:44:00 +0000 | |||
834 | @@ -267,7 +267,7 @@ | |||
835 | 267 | self.vp.uri = expected_uri | 267 | self.vp.uri = expected_uri |
836 | 268 | 268 | ||
837 | 269 | self.assertEqual(self.vp.uri, expected_uri) | 269 | self.assertEqual(self.vp.uri, expected_uri) |
839 | 270 | self.assertEqual(self.vp.webkit.get_uri(), self.vp.uri) | 270 | self.assertEqual(self.vp.webkit.uri, self.vp.uri) |
840 | 271 | 271 | ||
841 | 272 | def test_stop(self): | 272 | def test_stop(self): |
842 | 273 | self.vp.uri = 'http://foo.bar.baz' | 273 | self.vp.uri = 'http://foo.bar.baz' |
843 | 274 | 274 | ||
844 | === modified file 'tests/gtk3/windows.py' | |||
845 | --- tests/gtk3/windows.py 2014-01-13 10:51:30 +0000 | |||
846 | +++ tests/gtk3/windows.py 2016-02-17 13:44:00 +0000 | |||
847 | @@ -1122,10 +1122,7 @@ | |||
848 | 1122 | win = get_test_window(child=player, width=500, height=400) | 1122 | win = get_test_window(child=player, width=500, height=400) |
849 | 1123 | 1123 | ||
850 | 1124 | if video_url is None: | 1124 | if video_url is None: |
855 | 1125 | #player.uri = "http://upload.wikimedia.org/wikipedia/commons/9/9b/" \ | 1125 | player.load_html(html_vimeo) |
852 | 1126 | # "Pentagon_News_Sample.ogg" | ||
853 | 1127 | #player.uri = "http://people.canonical.com/~mvo/totem.html" | ||
854 | 1128 | player.load_html_string(html_vimeo) | ||
856 | 1129 | else: | 1126 | else: |
857 | 1130 | player.uri = video_url | 1127 | player.uri = video_url |
858 | 1131 | 1128 |
This is great to see. I suggest testing these things:
* Does a purchase work?
* Does submitting a review work? (This should be fine, since the line you removed from submit_review.ui was also removed to fix bug 1445745.)
* Does an app's developer/support Web site link open in your default browser as expected?
* Does the checkbox list of add-ons show up for an app that has them? (Geany is a good example.)