home *** CD-ROM | disk | FTP | other *** search
- # Source Generated with Decompyle++
- # File: in.pyo (Python 2.5)
-
- from __future__ import with_statement
- import wx
- import sys
- from collections import defaultdict
- from logging import getLogger
- log = getLogger('webkitwindow')
- from util import traceguard
- from threading import currentThread
- from gui.browser import jsconsole
-
- try:
- import webview
- WebView = webview.WebView
- except ImportError:
- from traceback import print_exc
- print_exc()
-
- class WebKitWindow(wx.Panel):
- pass
-
-
-
- class WebKitWindow(WebView):
-
- def __init__(self, parent, initialContents = '', contentPath = 'file:///c:/', url = None, **opts):
- WebView.__init__(self, parent, size = wx.Size(200, 200), **opts)
- self.jsqueue = []
- self.ExternalLinks = True
- Bind = self.Bind
- Bind(webview.EVT_WEBVIEW_LOAD, self.OnStateChanged)
- Bind(webview.EVT_WEBVIEW_BEFORE_LOAD, self.OnBeforeLoad)
- Bind(webview.EVT_WEBVIEW_CONSOLE_MESSAGE, self.OnConsoleMessage)
- self.urltriggers = defaultdict(list)
- if initialContents and url is not None:
- raise ValueError('please specify initialContents or url, but not both')
-
- if url is not None:
- self.LoadURL(url)
- else:
- self.SetPageSource(initialContents, 'file:///')
-
-
- def OnConsoleMessage(self, e):
- jsconsole.on_message(e.GetMessage(), e.GetLineNumber(), e.GetSourceID())
-
-
- def SetPageSource(self, source, baseUrl):
- del self.jsqueue[:]
- self._js_paused = True
- WebView.SetPageSource(self, source, baseUrl)
-
-
- def RunScript(self, s):
- if self._js_paused:
- log.debug('delaying execution of JS')
- self.jsqueue.append(s)
- else:
- return self._runscript(s)
-
-
- def AppendToPage(self, content):
- escaped = content.replace('\n', '\\\n').replace('"', '\\"')
- self.RunScript('appendMessage("%s");' % escaped)
-
-
- def ScrollToBottom(self):
- self.RunScript('window.scroll(0, 10000000);')
-
-
- def OnStateChanged(self, e):
- e.Skip()
- state = e.GetState()
- if state == webview.WEBVIEW_LOAD_NEGOTIATING:
- log.debug('WEBVIEW_LOAD_NEGOTIATING')
- self._pause_javascript()
- elif state == webview.WEBVIEW_LOAD_DOC_COMPLETED:
- log.debug('WEBVIEW_LOAD_DOC_COMPLETED, calling _execute_delayed_javascript')
- self._execute_delayed_javascript()
-
-
-
- def _pause_javascript(self):
- self._js_paused = True
-
-
- def _execute_delayed_javascript(self):
- self._js_paused = False
- if self.jsqueue:
- log.info('done loading, executing %d JS calls', len(self.jsqueue))
-
- for n, script in enumerate(self.jsqueue):
- val = self._runscript(script)
- if val != 'undefined':
- log.info('result %d: %r' % (n, val))
- continue
-
- del self.jsqueue[:]
-
-
- def _runscript(self, s):
- log.debug_s('running script:')
- log.debug_s(repr(s))
- return WebView.RunScript(self, s)
-
-
- def OnBeforeLoad(self, e):
- type = e.GetNavigationType()
- e.Skip()
- if type == webview.WEBVIEW_NAV_LINK_CLICKED:
- url = e.GetURL()
- callback = self.urltriggers.get(url, None)
- if callback is not None:
- traceguard.__enter__()
-
- try:
- callback()
- finally:
- pass
-
- e.Cancel()
-
- if self.ExternalLinks and not url.startswith('javascript'):
- wx.LaunchDefaultBrowser(url)
- e.Cancel()
-
-
-
-
- def OnURL(self, url, callback):
- if not hasattr(callback, '__call__'):
- raise TypeError('OnURL takes a callable')
-
- self.urltriggers[url].append(callback)
-
-
- def SetHTML(self, contents, baseUrl = 'file:///'):
- self.SetPageSource(contents, baseUrl)
-
- HTML = property(webview.WebView.GetPageSource, SetHTML)
- Title = property(webview.WebView.GetPageTitle, webview.WebView.SetPageTitle)
-
- def EditSource(self):
- EditSource = EditSource
- import gui.browser.webkit.webkiteditsource
- return EditSource(self)
-
-
-