From a07dcc0c503cc081b7fc4e877a148258b45af583 Mon Sep 17 00:00:00 2001 From: Tomeu Vizoso Date: Mon, 28 May 2007 14:48:41 +0000 Subject: First try at popup support. --- (limited to 'python') diff --git a/python/webview.py b/python/webview.py index 443131a..93de5bf 100644 --- a/python/webview.py +++ b/python/webview.py @@ -14,6 +14,7 @@ # License along with this library; if not, write to the # Free Software Foundation, Inc., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. +import logging import gobject @@ -22,58 +23,115 @@ from hulahop import _hulahop import xpcom from xpcom import components from xpcom.components import interfaces +from xpcom.nsError import * class _Chrome: - _com_interfaces_ = interfaces.nsIWebBrowserChrome, \ - interfaces.nsIEmbeddingSiteWindow + _com_interfaces_ = interfaces.nsIWebBrowserChrome, \ + interfaces.nsIEmbeddingSiteWindow, \ + interfaces.nsIInterfaceRequestor def __init__(self, web_view): self.web_view = web_view self.title = '' - + self._visibility = False + # nsIWebBrowserChrome def destroyBrowserWindow(self): - pass + logging.debug("nsIWebBrowserChrome.destroyBrowserWindow") def exitModalEventLoop(self, status): - pass + logging.debug("nsIWebBrowserChrome.exitModalEventLoop") def isWindowModal(self): + logging.debug("nsIWebBrowserChrome.isWindowModal") return False def setStatus(self, statusType, status): + #logging.debug("nsIWebBrowserChrome.setStatus") pass def showAsModal(self): - pass + logging.debug("nsIWebBrowserChrome.showAsModal") def sizeBrowserTo(self, cx, cy): - pass + logging.debug("nsIWebBrowserChrome.sizeBrowserTo: %r %r" % (cx, cy)) + self.web_view.get_toplevel().resize(cx, cy) + self.web_view.type = WebView.TYPE_POPUP # nsIEmbeddingSiteWindow def getDimensions(self, flags): - pass + logging.debug("nsIEmbeddingSiteWindow.getDimensions: %r" % flags) + base_window = self.web_view.browser.queryInterface(interfaces.nsIBaseWindow) + if (flags & interfaces.nsIEmbeddingSiteWindow.DIM_FLAGS_POSITION) and \ + ((flags & interfaces.nsIEmbeddingSiteWindow.DIM_FLAGS_SIZE_INNER) or \ + (flags & interfaces.nsIEmbeddingSiteWindow.DIM_FLAGS_SIZE_OUTER)): + return base_window.getPositionAndSize() + elif flags & interfaces.nsIEmbeddingSiteWindow.DIM_FLAGS_POSITION: + x, y = base_window.getPosition() + return (x, y, 0, 0) + elif (flags & interfaces.nsIEmbeddingSiteWindow.DIM_FLAGS_SIZE_INNER) or \ + (flags & interfaces.nsIEmbeddingSiteWindow.DIM_FLAGS_SIZE_OUTER): + width, height = base_window.getSize() + return (0, 0, width, height) + else: + raise xpcom.Exception('Invalid flags: %r' % flags) def setDimensions(self, flags, x, y, cx, cy): - pass + logging.debug("nsIEmbeddingSiteWindow.setDimensions: %r" % flags) def setFocus(self): - pass + logging.debug("nsIEmbeddingSiteWindow.setFocus") + base_window = self.web_view.browser.queryInterface(interfaces.nsIBaseWindow) + base_window.setFocus() def get_title(self): + logging.debug("nsIEmbeddingSiteWindow.get_title: %r" % self.title) return self.title def set_title(self, title): + logging.debug("nsIEmbeddingSiteWindow.set_title: %r" % title) self.title = title self.web_view._notify_title_changed() def get_visibility(self): - return True + logging.debug("nsIEmbeddingSiteWindow.get_visibility: %r" % self._visibility) + return self._visibility def set_visibility(self, visibility): - pass + logging.debug("nsIEmbeddingSiteWindow.set_visibility: %r" % visibility) + if self._visibility != visibility: + self._visibility = visibility + if self._visibility: + self.web_view.get_toplevel().show() + else: + self.web_view.get_toplevel().hide() + + def queryInterface(self, uuid): + if not uuid in self._com_interfaces_: + # Components.returnCode = Cr.NS_ERROR_NO_INTERFACE; + logging.error('Interface %s not implemented by this instance: %r' % (uuid, self)) + return None + return xpcom.server.WrapObject(self, uuid) + + def getInterface(self, uuid): + result = self.queryInterface(uuid) + + if not result: + # delegate to the nsIWebBrowser + requestor = self.web_view.browser.queryInterface(interfaces.nsIInterfaceRequestor) + try: + result = requestor.getInterface(uuid) + except xpcom.Exception: + logging.error('Interface %s not implemented by this instance: %r' % (uuid, self.web_view.browser)) + result = None + + return result class WebView(_hulahop.WebView): + + TYPE_WINDOW = 0 + TYPE_POPUP = 1 + __gproperties__ = { 'title' : (str, None, None, None, gobject.PARAM_READABLE) @@ -81,11 +139,16 @@ class WebView(_hulahop.WebView): def __init__(self): _hulahop.WebView.__init__(self) + self.type = WebView.TYPE_WINDOW + self._chrome = xpcom.server.WrapObject( _Chrome(self), interfaces.nsIEmbeddingSiteWindow) weak_ref = xpcom.client.WeakReference(self._chrome) self.browser.containerWindow = self._chrome + item = self.browser.queryInterface(interfaces.nsIDocShellTreeItem) + item.itemType = interfaces.nsIDocShellTreeItem.typeContentWrapper + self.create_window() def _notify_title_changed(self): @@ -124,3 +187,4 @@ class WebView(_hulahop.WebView): doc_shell = property(get_doc_shell) web_progress = property(get_web_progress) web_navigation = property(get_web_navigation) + -- cgit v0.9.1