[Sugar-devel] [PATCH] Store and restore session for each tab
Simon Schampijer
simon at schampijer.de
Tue Jan 3 12:52:47 EST 2012
On 20/12/11 14:54, Manuel Quiñones wrote:
> For going to a specific item in the history, it uses go_back() method
> of WebKit.WebView. I tried also with WebKit.WebHistoryItem go_back(),
> seemed the proper solution, but the page wouldn't update.
Using webkit_web_view_go_back [1] is the right thing to do here.
Epiphany is doing the same. Tbh, I am not sure I understand what
WebKit.WebHistoryItem go_back() is doing, I was trying to dig into the
Webkit code but stopped after a while of poking around...
I have a counter proposal for your patch (applies on top of your patch)
which does the following things:
* the sessionstore code is moved into Browser, we do have
set_history_index/get_history_index already there, the TabbedView does
use that path for their requests about the history
* I did rename a few bits s/session/history and the return value from
self.get_back_forward_list() I use back_forward_list as variable
* I folded _get_history and _set_history into their appropriate 'mother'
methods
* I tried to make set_history_index a bit cleaner, the API provided by
webkitgtk does not seem to cleanly allow our usage like:
get_current_item_index and go_to_back_forward_item(index) also the API
does seem to miss a back_forward_list.get_length() (see the code we have
to do in _items_history_as_list) there only exist a
back_forward_list.get_back_length() and
back_forward_list.get_forward_length().
That should be pretty much it, let me know what you think,
Simon
> Signed-off-by: Manuel Quiñones<manuq at laptop.org>
> ---
> browser.py | 12 ++++----
> sessionstore.py | 91
++++++++++++++++++++++++++++++++-----------------------
> webactivity.py | 17 ++++------
> 3 files changed, 66 insertions(+), 54 deletions(-)
>
> diff --git a/browser.py b/browser.py
> index 2c3b4f8..69713ca 100644
> --- a/browser.py
> +++ b/browser.py
> @@ -31,8 +31,9 @@ from sugar3.activity import activity
> from sugar3.graphics import style
> from sugar3.graphics.icon import Icon
>
> +import sessionstore
> +
> # FIXME
> -# import sessionstore
> # from palettes import ContentInvoker
> # from sessionhistory import HistoryListener
> # from progresslistener import ProgressListener
> @@ -291,7 +292,8 @@ class TabbedView(BrowserNotebook):
> def get_session(self):
> tab_sessions = []
> for index in xrange(0, self.get_n_pages()):
> - browser = self.get_nth_page(index)
> + scrolled_window = self.get_nth_page(index)
> + browser = scrolled_window.get_child()
> tab_sessions.append(sessionstore.get_session(browser))
> return tab_sessions
>
> @@ -463,12 +465,10 @@ class Browser(WebKit.WebView):
> markupDocumentViewer.fullZoom -= _ZOOM_AMOUNT
>
> def get_history_index(self):
> - return self.web_navigation.sessionHistory.index
> + return sessionstore.get_history_index(self)
>
> def set_history_index(self, index):
> - if index == -1:
> - return
> - self.web_navigation.gotoIndex(index)
> + return sessionstore.set_history_index(self, index)
>
> def open_new_tab(self, url):
> self.emit('new-tab', url)
> diff --git a/sessionstore.py b/sessionstore.py
> index 73edb24..589b44d 100644
> --- a/sessionstore.py
> +++ b/sessionstore.py
> @@ -14,61 +14,76 @@
> # along with this program; if not, write to the Free Software
> # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
02110-1301 USA
>
> -# Based on
> -#
http://lxr.mozilla.org/seamonkey/source/browser/components/sessionstore
> -
> import logging
>
> -from xpcom import components
> -from xpcom.components import interfaces
> +from gi.repository import WebKit
>
>
> def get_session(browser):
> - session_history = browser.web_navigation.sessionHistory
> -
> - if session_history.count == 0:
> + session_history = browser.get_back_forward_list()
> + if session_history.get_back_length() == 0:
> return ''
> return _get_history(session_history)
>
>
> def set_session(browser, data):
> - _set_history(browser.web_navigation.sessionHistory, data)
> -
> - if data:
> - browser.web_navigation.gotoIndex(len(data) - 1)
> - else:
> - browser.load_uri('about:blank')
> + session_history = browser.get_back_forward_list()
> + _set_history(session_history, data)
>
>
> def _get_history(history):
> - logging.debug('%r', history.count)
> + items_list = _items_history_as_list(history)
> + logging.debug('history count: %r', len(items_list))
> entries_dest = []
> - for i in range(0, history.count):
> - entry_orig = history.getEntryAtIndex(i, False)
> - entry_dest = {'url': entry_orig.URI.spec,
> - 'title': entry_orig.title}
> -
> + for item in items_list:
> + entry_dest = {'url': item.get_uri(),
> + 'title': item.get_title()}
> entries_dest.append(entry_dest)
>
> return entries_dest
>
>
> def _set_history(history, history_data):
> - history_internal =
history.queryInterface(interfaces.nsISHistoryInternal)
> -
> - if history_internal.count> 0:
> - history_internal.purgeHistory(history_internal.count)
> -
> - for entry_dict in history_data:
> - logging.debug('entry_dict: %r', entry_dict)
> - entry_class = components.classes[ \
> - "@mozilla.org/browser/session-history-entry;1"]
> - entry = entry_class.createInstance(interfaces.nsISHEntry)
> -
> - io_service_class = components.classes[ \
> - "@mozilla.org/network/io-service;1"]
> - io_service =
io_service_class.getService(interfaces.nsIIOService)
> - entry.setURI(io_service.newURI(entry_dict['url'], None, None))
> - entry.setTitle(entry_dict['title'])
> -
> - history_internal.addEntry(entry, True)
> + history.clear()
> + for entry in history_data:
> + uri, title = entry['url'], entry['title']
> + history_item = WebKit.WebHistoryItem.new_with_data(uri, title)
> + history.add_item(history_item)
> +
> +
> +def get_history_index(browser):
> + """Return the index of the current item in the history."""
> + history = browser.get_back_forward_list()
> + history_list = _items_history_as_list(history)
> + current_item = history.get_current_item()
> + return history_list.index(current_item)
> +
> +
> +def set_history_index(browser, index):
> + """Go to the item in the history specified by the index."""
> + history = browser.get_back_forward_list()
> + history_list = _items_history_as_list(history)
> + last_index = len(history_list) - 1
> + for i in range(last_index - index):
> + browser.go_back()
> + if index == last_index:
> + browser.go_back()
> + browser.go_forward()
> +
> +
> +def _items_history_as_list(history):
> + """Return a list with the items of a WebKit.WebBackForwardList."""
> + back_items = []
> + for n in reversed(range(1, history.get_back_length() + 1)):
> + item = history.get_nth_item(n * -1)
> + back_items.append(item)
> +
> + current_item = [history.get_current_item()]
> +
> + forward_items = []
> + for n in range(1, history.get_forward_length() + 1):
> + item = history.get_nth_item(n)
> + forward_items.append(item)
> +
> + all_items = back_items + current_item + forward_items
> + return all_items
> diff --git a/webactivity.py b/webactivity.py
> index 0e03fb2..9ccbe4c 100644
> --- a/webactivity.py
> +++ b/webactivity.py
> @@ -401,7 +401,8 @@ class WebActivity(activity.Activity):
> logging.debug('########## reading %s', data)
> self._tabbed_view.set_session(self.model.data['history'])
> for number, tab in enumerate(self.model.data['currents']):
> - browser = self._tabbed_view.get_nth_page(number)
> + scrolled_window = self._tabbed_view.get_nth_page(number)
> + browser = scrolled_window.get_child()
> browser.set_history_index(tab['history_index'])
>
>
self._tabbed_view.set_current_page(self.model.data['current_tab'])
> @@ -430,22 +431,18 @@ class WebActivity(activity.Activity):
> else:
> self.metadata['title'] = browser.props.title
>
> - # FIXME
> - # self.model.data['history'] =
self._tabbed_view.get_session()
> - self.model.data['history'] = []
> + self.model.data['history'] = self._tabbed_view.get_session()
> current_tab = self._tabbed_view.get_current_page()
> self.model.data['current_tab'] = current_tab
>
> self.model.data['currents'] = []
> for n in range(0, self._tabbed_view.get_n_pages()):
> - # FIXME
> - continue
> - n_browser = self._tabbed_view.get_nth_page(n)
> + scrolled_window = self._tabbed_view.get_nth_page(n)
> + n_browser = scrolled_window.get_child()
> if n_browser != None:
> - nsiuri = n_browser.progress.location
> - ui_uri = n_browser.get_url_from_nsiuri(nsiuri)
> + uri = n_browser.get_uri()
> history_index = n_browser.get_history_index()
> - info = {'title': n_browser.props.title, 'url':
ui_uri,
> + info = {'title': n_browser.props.title, 'url': uri,
> 'history_index': history_index}
>
> self.model.data['currents'].append(info)
[1]
http://webkitgtk.org/reference/webkitgtk-webkitwebview.html#webkit-web-view-go-back
-------------- next part --------------
A non-text attachment was scrubbed...
Name: store_restore.patch
Type: text/x-patch
Size: 9027 bytes
Desc: not available
URL: <http://lists.sugarlabs.org/archive/sugar-devel/attachments/20120103/95c8126d/attachment.bin>
More information about the Sugar-devel
mailing list