/pjkit/gtk_webkit_bridge.py

https://github.com/gfxmonk/pjkit
Python | 42 lines | 34 code | 5 blank | 3 comment | 1 complexity | 905661ae762505d30e1aa8d22bc2b14b MD5 | raw file
  1. import gtk
  2. import gobject
  3. import threading
  4. import logging
  5. from json_bridge import JsonBridge
  6. from gtk_helpers import asynchronous_gtk_message
  7. class GtkWebkitBridge(JsonBridge):
  8. def __init__(self, *a):
  9. super(type(self), self).__init__(*a)
  10. self.__ready = False
  11. self.__readycond = threading.Condition()
  12. self.web.connect('title-changed', self.__on_title_changed)
  13. self.web.connect('load-finished', self.__on_ready)
  14. def __on_ready(self, widget, frame):
  15. logging.debug("webkit view is ready!")
  16. self.__readycond.acquire()
  17. self.__ready = True
  18. self.__readycond.notifyAll()
  19. self.__readycond.release()
  20. def __on_title_changed(self, widget, frame, title):
  21. self.recv(title)
  22. def perform(self, callable):
  23. # this should be called from a webkit-title-change, which
  24. # is alway in the main thread. so we can just run it immediately
  25. callable()
  26. def do_send(self, msg):
  27. self.__readycond.acquire()
  28. if self.__ready is False:
  29. logging.debug("waiting for webkit readyness")
  30. self.__readycond.wait()
  31. self.__readycond.release()
  32. logging.debug("sending webkit message: %s" % (msg,))
  33. def doit():
  34. self.web.execute_script(msg)
  35. logging.debug("message SENT! (%s)" % (msg,))
  36. #asynchronous_gtk_message(lambda: self.web.execute_script(msg))
  37. asynchronous_gtk_message(doit)