diff options
-rw-r--r-- | python/hulahop.defs | 13 | ||||
-rw-r--r-- | python/webview.py | 78 | ||||
-rw-r--r-- | src/Makefile.am | 2 | ||||
-rw-r--r-- | src/hulahop-web-view.cpp | 19 | ||||
-rw-r--r-- | src/hulahop-web-view.h | 3 |
5 files changed, 95 insertions, 20 deletions
diff --git a/python/hulahop.defs b/python/hulahop.defs index 4f18c2d..403208c 100644 --- a/python/hulahop.defs +++ b/python/hulahop.defs @@ -54,3 +54,16 @@ ) (return-type "none") ) + +(define-method push_js_context + (of-object "HulahopWebView") + (c-name "hulahop_web_view_push_js_context") + (return-type "none") +) + +(define-method pop_js_context + (of-object "HulahopWebView") + (c-name "hulahop_web_view_pop_js_context") + (return-type "none") +) + diff --git a/python/webview.py b/python/webview.py index 834e012..da4aa40 100644 --- a/python/webview.py +++ b/python/webview.py @@ -29,47 +29,65 @@ class _Chrome: _com_interfaces_ = interfaces.nsIWebBrowserChrome, \ interfaces.nsIWebBrowserChrome2, \ interfaces.nsIEmbeddingSiteWindow, \ + interfaces.nsIWebProgressListener, \ interfaces.nsIInterfaceRequestor def __init__(self, web_view): self.web_view = web_view self.title = '' + self._modal = False # nsIWebBrowserChrome def destroyBrowserWindow(self): logging.debug("nsIWebBrowserChrome.destroyBrowserWindow") + if self._modal: + self.exitModalEventLoop(0) self.web_view.get_toplevel().destroy() def exitModalEventLoop(self, status): - logging.debug("UNIMPLEMENTED: nsIWebBrowserChrome.exitModalEventLoop") + logging.debug("nsIWebBrowserChrome.exitModalEventLoop: %r" % status) + """ + if self._continue_modal_loop: + self.enable_parent(True) """ if self._modal: - self.web_view.get_toplevel().grab_remove() + self._continue_modal_loop = False self._modal = False - gtk.main_quit() - - #self.web_view.pop_js_context() - """ + self._modal_status = status + #self.web_view.get_toplevel().grab_remove() def isWindowModal(self): - logging.debug("UNIMPLEMENTED: nsIWebBrowserChrome.isWindowModal") - return False + logging.debug("nsIWebBrowserChrome.isWindowModal") + return self._modal def setStatus(self, statusType, status): #logging.debug("nsIWebBrowserChrome.setStatus") self.web_view._set_status(status.encode('utf-8')) def showAsModal(self): - logging.debug("UNIMPLEMENTED: nsIWebBrowserChrome.showAsModal") - """ + logging.debug("nsIWebBrowserChrome.showAsModal") self._modal = True - self.web_view.get_toplevel().grab_add() - - #self.web_view.push_js_context() - import time; time.sleep(5) - gtk.main() - """ - + self._continue_modal_loop = True + self._modal_status = None + #EnableParent(PR_FALSE); + #self.web_view.get_toplevel().grab_add() + + cls = components.classes["@mozilla.org/thread-manager;1"] + thread_manager = cls.getService(interfaces.nsIThreadManager) + current_thread = thread_manager.currentThread + + self.web_view.push_js_context() + while self._continue_modal_loop: + processed = current_thread.processNextEvent(True) + if not processed: + break + self.web_view.pop_js_context() + + self._modal = False + self._continue_modal_loop = False + + return self._modal_status + def sizeBrowserTo(self, cx, cy): logging.debug("nsIWebBrowserChrome.sizeBrowserTo: %r %r" % (cx, cy)) self.web_view.get_toplevel().resize(cx, cy) @@ -126,6 +144,18 @@ class _Chrome: else: self.web_view.get_toplevel().hide() + # nsIWebProgressListener + def onStateChange(self, web_progress, request, state_flags, status): + if (state_flags & interfaces.nsIWebProgressListener.STATE_STOP) and \ + (state_flags & interfaces.nsIWebProgressListener.STATE_IS_NETWORK): + if self.web_view.is_chrome: + self.web_view.dom_window.sizeToContent() + + def onStatusChange(self, web_progress, request, status, message): pass + def onSecurityChange(self, web_progress, request, state): pass + def onProgressChange(self, web_progress, request, cur_self_progress, max_self_progress, cur_total_progress, max_total_progress): pass + def onLocationChange(self, web_progress, request, location): pass + # nsIInterfaceRequestor def queryInterface(self, uuid): if not uuid in self._com_interfaces_: @@ -147,7 +177,7 @@ class _Chrome: result = None return result - + class WebView(_hulahop.WebView): TYPE_WINDOW = 0 @@ -163,12 +193,20 @@ class WebView(_hulahop.WebView): _hulahop.WebView.__init__(self) self.type = WebView.TYPE_WINDOW + self.is_chrome = False - self._chrome = xpcom.server.WrapObject( - _Chrome(self), interfaces.nsIEmbeddingSiteWindow) + chrome = _Chrome(self) + + self._chrome = xpcom.server.WrapObject(chrome, interfaces.nsIEmbeddingSiteWindow) weak_ref = xpcom.client.WeakReference(self._chrome) self.browser.containerWindow = self._chrome + listener = xpcom.server.WrapObject(chrome, interfaces.nsIWebProgressListener) + weak_ref2 = xpcom.client.WeakReference(listener) + # FIXME: weak_ref2._comobj_ looks quite a bit ugly. + self.browser.addWebBrowserListener(weak_ref2._comobj_, + interfaces.nsIWebProgressListener) + self._status = '' self.create_window() diff --git a/src/Makefile.am b/src/Makefile.am index 5afe7b3..15e63e7 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -4,6 +4,7 @@ INCLUDES = \ $(MOZILLA_CFLAGS) \ -I$(MOZILLA_INCLUDE_ROOT)/docshell \ -I$(MOZILLA_INCLUDE_ROOT)/dom \ + -I$(MOZILLA_INCLUDE_ROOT)/js \ -I$(MOZILLA_INCLUDE_ROOT)/xulapp \ -I$(MOZILLA_INCLUDE_ROOT)/nspr \ -I$(MOZILLA_INCLUDE_ROOT)/pyxpcom \ @@ -11,6 +12,7 @@ INCLUDES = \ -I$(MOZILLA_INCLUDE_ROOT)/webbrwsr \ -I$(MOZILLA_INCLUDE_ROOT)/widget \ -I$(MOZILLA_INCLUDE_ROOT)/xpcom \ + -I$(MOZILLA_INCLUDE_ROOT)/xpconnect \ -DMOZILLA_HOME=\"$(MOZILLA_HOME)\" \ -DPLUGIN_PATH=\"$(libdir)/mozilla/plugins\" \ -DDATA_DIR=\"$(pkgdatadir)\" diff --git a/src/hulahop-web-view.cpp b/src/hulahop-web-view.cpp index 2eeebc6..286f3cf 100644 --- a/src/hulahop-web-view.cpp +++ b/src/hulahop-web-view.cpp @@ -28,6 +28,8 @@ #include <nsIDOMEventTarget.h> #include <nsIBaseWindow.h> #include <nsIInterfaceRequestorUtils.h> +#include <jscntxt.h> +#include <nsIJSContextStack.h> #include <PyXPCOM.h> #include <gtk/gtkfixed.h> @@ -294,3 +296,20 @@ hulahop_web_view_grab_focus(HulahopWebView *web_view) gtk_widget_grab_focus(web_view->mozilla_widget); } } + +void +hulahop_web_view_push_js_context (HulahopWebView *web_view) +{ + nsCOMPtr<nsIJSContextStack> stack(do_GetService("@mozilla.org/js/xpc/ContextStack;1")); + nsresult rv = stack->Push(nsnull); + g_assert(NS_SUCCEEDED(rv)); +} + +void +hulahop_web_view_pop_js_context (HulahopWebView *web_view) +{ + nsCOMPtr<nsIJSContextStack> stack(do_GetService("@mozilla.org/js/xpc/ContextStack;1")); + nsresult rv = stack->Pop(nsnull); + g_assert(NS_SUCCEEDED(rv)); +} + diff --git a/src/hulahop-web-view.h b/src/hulahop-web-view.h index 7f56a63..40ea6e8 100644 --- a/src/hulahop-web-view.h +++ b/src/hulahop-web-view.h @@ -42,6 +42,9 @@ void hulahop_web_view_create_window (HulahopWebView *web_view); PyObject *hulahop_web_view_get_browser (HulahopWebView *web_view); PyObject *hulahop_web_view_get_window_root (HulahopWebView *web_view); +void hulahop_web_view_push_js_context (HulahopWebView *web_view); +void hulahop_web_view_pop_js_context (HulahopWebView *web_view); + G_END_DECLS #endif |