From c188e91aa27388e21fb42ceb92d0009e03505c8d Mon Sep 17 00:00:00 2001
From: Manuel Kaufmann <humitos@gmail.com>
Date: Thu, 22 Nov 2012 11:41:12 -0300
Subject: [PATCH Browse] Handle 'create-web-view' signal and open a new tab SL
#4236
There are some cases that WebKit.WebView needs to create a new
WebKit.WebView (e.g. to open a pop up window) and it emits this
signal. Handling this signal we are able to insert a new tab (instead
of creating a new window) and attach it next to the current one with
the desired url to be load.
The signal 'new-window-policy-decision-requested' was removed because
it is not more needed because 'create-web-view' will work for all kind
of popups.
Signed-off-by: Manuel Kaufmann <humitos@gmail.com>
---
browser.py | 48 +++++++++++++++++++++++++++++++-----------------
1 file changed, 31 insertions(+), 17 deletions(-)
diff --git a/browser.py b/browser.py
index 8af7a4a..e6df46f 100644
a
|
b
|
class TabbedView(BrowserNotebook): |
195 | 195 | new_browser.load_uri(url) |
196 | 196 | new_browser.grab_focus() |
197 | 197 | |
| 198 | def __create_web_view_cb(self, web_view, frame): |
| 199 | new_web_view = Browser() |
| 200 | new_web_view.connect('web-view-ready', self.__web_view_ready_cb) |
| 201 | return new_web_view |
| 202 | |
| 203 | def __web_view_ready_cb(self, web_view): |
| 204 | """ |
| 205 | Handle new window requested and open it in a new tab. |
| 206 | |
| 207 | This callback is called when the WebKit.WebView request for a |
| 208 | new window to open (for example a call to the Javascript |
| 209 | function 'window.open()' or target="_blank") |
| 210 | |
| 211 | web_view -- the new browser there the url of the |
| 212 | window.open() call will be loaded. |
| 213 | |
| 214 | This object is created in the signal callback |
| 215 | 'create-web-view'. |
| 216 | """ |
| 217 | |
| 218 | web_view.connect('new-tab', self.__new_tab_cb) |
| 219 | web_view.connect('open-pdf', self.__open_pdf_in_new_tab_cb) |
| 220 | web_view.connect('create-web-view', self.__create_web_view_cb) |
| 221 | web_view.grab_focus() |
| 222 | |
| 223 | self._insert_tab_next(web_view) |
| 224 | |
198 | 225 | def __open_pdf_in_new_tab_cb(self, browser, url): |
199 | 226 | tab_page = PDFTabPage() |
200 | 227 | tab_page.browser.connect('new-tab', self.__new_tab_cb) |
… |
… |
class TabbedView(BrowserNotebook): |
227 | 254 | browser = Browser() |
228 | 255 | browser.connect('new-tab', self.__new_tab_cb) |
229 | 256 | browser.connect('open-pdf', self.__open_pdf_in_new_tab_cb) |
| 257 | browser.connect('web-view-ready', self.__web_view_ready_cb) |
| 258 | browser.connect('create-web-view', self.__create_web_view_cb) |
230 | 259 | |
231 | 260 | if next_to_current: |
232 | 261 | self._insert_tab_next(browser) |
… |
… |
class TabbedView(BrowserNotebook): |
352 | 381 | browser = Browser() |
353 | 382 | browser.connect('new-tab', self.__new_tab_cb) |
354 | 383 | browser.connect('open-pdf', self.__open_pdf_in_new_tab_cb) |
| 384 | browser.connect('web-view-ready', self.__web_view_ready_cb) |
| 385 | browser.connect('create-web-view', self.__create_web_view_cb) |
355 | 386 | self._append_tab(browser) |
356 | 387 | browser.set_history(tab_history) |
357 | 388 | |
… |
… |
class Browser(WebKit.WebView): |
504 | 535 | self.connect('download-requested', self.__download_requested_cb) |
505 | 536 | self.connect('mime-type-policy-decision-requested', |
506 | 537 | self.__mime_type_policy_cb) |
507 | | self.connect('new-window-policy-decision-requested', |
508 | | self.__new_window_policy_cb) |
509 | 538 | self.connect('load-error', self.__load_error_cb) |
510 | 539 | |
511 | 540 | ContentInvoker(self) |
… |
… |
class Browser(WebKit.WebView): |
631 | 660 | |
632 | 661 | return False |
633 | 662 | |
634 | | def __new_window_policy_cb(self, webview, webframe, request, |
635 | | navigation_action, policy_decision): |
636 | | """Open new tab instead of a new window. |
637 | | |
638 | | Browse doesn't support many windows, as any Sugar activity. |
639 | | So we will handle the request, ignoring it and returning True |
640 | | to inform WebKit that a decision was made. And we will open a |
641 | | new tab instead. |
642 | | |
643 | | """ |
644 | | policy_decision.ignore() |
645 | | uri = request.get_uri() |
646 | | self.open_new_tab(uri) |
647 | | return True |
648 | | |
649 | 663 | def __download_requested_cb(self, browser, download): |
650 | 664 | downloadmanager.add_download(download, browser) |
651 | 665 | return True |