Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJonas Smedegaard <dr@jones.dk>2008-11-11 19:15:19 (GMT)
committer Jonas Smedegaard <dr@jones.dk>2008-11-11 19:15:19 (GMT)
commit79b51226ff0a6bb2d9d5a815948b5537119ef9bb (patch)
tree35cfc51c4f0ad9cd102d8775715226b38dd39de6
parentb8468ef1e2a7eccd88d9fbd143be1e90d94f616c (diff)
parentb455d21f18aeedf7d15cd716f419fe85f1bd77fd (diff)
Merge commit 'v0.4.7' into upstream
Conflicts (add test, avoid debian/* ): tests/test-web-view.py
-rw-r--r--configure.ac2
-rw-r--r--python/__init__.py41
-rw-r--r--python/hulahop.defs12
-rw-r--r--python/webview.py33
-rw-r--r--src/hulahop-web-view.cpp45
-rw-r--r--src/hulahop-web-view.h8
-rw-r--r--src/hulahop.cpp37
-rw-r--r--src/hulahop.h11
-rw-r--r--tests/test-web-view.py39
9 files changed, 158 insertions, 70 deletions
diff --git a/configure.ac b/configure.ac
index 6d81b09..63da75f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,5 +1,5 @@
m4_define([hulahop_build_id],[2008072400]) # FIXME: when should we update this?
-m4_define([hulahop_version],[0.4.5])
+m4_define([hulahop_version],[0.4.7])
AC_INIT([hulahop],[hulahop_version],[],[hulahop])
diff --git a/python/__init__.py b/python/__init__.py
index 6065ebe..a1fde26 100644
--- a/python/__init__.py
+++ b/python/__init__.py
@@ -16,6 +16,7 @@
# Boston, MA 02111-1307, USA.
import os
+import logging
import sys
import ConfigParser
@@ -26,6 +27,7 @@ from hulahop import config
sys.path.insert(0, os.path.join(config.libxul_dir, 'python'))
from hulahop._hulahop import shutdown
+from hulahop._hulahop import get_view_for_window
from hulahop import _hulahop
_XO_DPI = 200
@@ -60,33 +62,36 @@ def startup(profile_path, components_dirs=[]):
def _check_compreg(profile_path):
comp_path = os.path.join(profile_path, 'compatibility.ini')
- existant = True
- valid = True
try:
cp = ConfigParser.ConfigParser(defaults={'app_version' : ''})
if not cp.read(comp_path):
- existant = False
+ valid = False
else:
valid = cp.get('main', 'app_version') == _app_version and \
cp.get('main', 'libxul_dir') == config.libxul_dir
except ConfigParser.Error:
valid = False
-
- if not valid and existant:
- compreg = os.path.join(profile_path, 'compreg.dat')
-
- os.unlink(comp_path)
- os.unlink(compreg)
-
- cp = ConfigParser.ConfigParser()
- cp.add_section('main')
- cp.set('main', 'app_version', _app_version)
- cp.set('main', 'libxul_dir', config.libxul_dir)
-
- f = open(comp_path, 'w')
- cp.write(f)
- f.close()
+
+ if not valid:
+ compreg = os.path.join(profile_path, 'compreg.dat')
+ if os.path.exists(compreg):
+ try:
+ os.unlink(compreg)
+ except OSError, e:
+ logging.error('Unlink error: %s' % e)
+
+ cp = ConfigParser.ConfigParser()
+ cp.add_section('main')
+ cp.set('main', 'app_version', _app_version)
+ cp.set('main', 'libxul_dir', config.libxul_dir)
+
+ f = open(comp_path, 'w')
+ try:
+ cp.write(f)
+ except ConfigParser.Error, e:
+ logging.error('Can not write %s error: %s' % (comp_path, e))
+ f.close()
def _get_layout_dpi():
gtk_xft_dpi = gtk.settings_get_default().get_property('gtk-xft-dpi')
diff --git a/python/hulahop.defs b/python/hulahop.defs
index 55c1733..d07bf16 100644
--- a/python/hulahop.defs
+++ b/python/hulahop.defs
@@ -5,9 +5,9 @@
(gtype-id "HULAHOP_TYPE_WEB_VIEW")
)
-(define-method create_window
+(define-virtual setup
(of-object "HulahopWebView")
- (c-name "hulahop_web_view_create_window")
+ (c-name "hulahop_web_view_setup")
(return-type "none")
)
@@ -76,3 +76,11 @@
(return-type "none")
)
+(define-function get_view_for_window
+ (c-name "hulahop_get_view_for_window")
+ (return-type "HulahopWebView*")
+ (parameters
+ '("PyObject*" "dom_window")
+ )
+)
+
diff --git a/python/webview.py b/python/webview.py
index b4dc51f..3cccde6 100644
--- a/python/webview.py
+++ b/python/webview.py
@@ -25,8 +25,6 @@ from xpcom import components
from xpcom.components import interfaces
from xpcom.nsError import *
-_views = []
-
class _Chrome:
_com_interfaces_ = interfaces.nsIWebBrowserChrome, \
interfaces.nsIWebBrowserChrome2, \
@@ -147,6 +145,9 @@ class _Chrome:
#logging.debug("nsIEmbeddingSiteWindow.get_visibility: %r" % self.web_view.get_toplevel().props.visible)
return self.web_view.get_toplevel().props.visible
+ def get_webBrowser(self):
+ return self.web_view.browser
+
def get_chromeFlags(self):
return self._chrome_flags
@@ -206,6 +207,7 @@ class WebView(_hulahop.WebView):
'status' : (str, None, None, None,
gobject.PARAM_READABLE)
}
+
def __init__(self):
_hulahop.WebView.__init__(self)
@@ -225,15 +227,13 @@ class WebView(_hulahop.WebView):
interfaces.nsIWebProgressListener)
self._status = ''
+ self._first_uri = None
- self.create_window()
+ def do_setup(self):
+ _hulahop.WebView.do_setup(self)
- self.connect('destroy', self.__destroy_cb)
-
- _views.append(self)
-
- def __destroy_cb(self):
- _views.remove(self)
+ if self._first_uri:
+ self.load_uri(self._first_uri)
def _notify_title_changed(self):
self.notify('title')
@@ -268,9 +268,12 @@ class WebView(_hulahop.WebView):
return self.browser.contentDOMWindow
def load_uri(self, uri):
- self.web_navigation.loadURI(
- uri, interfaces.nsIWebNavigation.LOAD_FLAGS_NONE,
- None, None, None)
+ try:
+ self.web_navigation.loadURI(
+ uri, interfaces.nsIWebNavigation.LOAD_FLAGS_NONE,
+ None, None, None)
+ except xpcom.Exception:
+ self._first_uri = uri
dom_window = property(get_dom_window)
browser = property(get_browser)
@@ -278,9 +281,3 @@ class WebView(_hulahop.WebView):
doc_shell = property(get_doc_shell)
web_progress = property(get_web_progress)
web_navigation = property(get_web_navigation)
-
-def lookup_view(chrome):
- for view in _views:
- if view._chrome == chrome:
- return view
- return None
diff --git a/src/hulahop-web-view.cpp b/src/hulahop-web-view.cpp
index eee333d..9104b20 100644
--- a/src/hulahop-web-view.cpp
+++ b/src/hulahop-web-view.cpp
@@ -49,10 +49,6 @@ struct _HulahopWebView {
GtkWidget *mozilla_widget;
};
-struct _HulahopWebViewClass {
- GtkBinClass base_class;
-};
-
G_DEFINE_TYPE(HulahopWebView, hulahop_web_view, GTK_TYPE_BIN)
static GObjectClass *parent_class = NULL;
@@ -95,6 +91,13 @@ hulahop_web_view_unrealize(GtkWidget *widget)
GTK_WIDGET_CLASS(parent_class)->unrealize(widget);
}
+void
+hulahop_web_view_setup(HulahopWebView *web_view)
+{
+ web_view->base_window->Create();
+ web_view->mozilla_widget = GTK_BIN(web_view)->child;
+}
+
static void
hulahop_web_view_realize(GtkWidget *widget)
{
@@ -123,9 +126,13 @@ hulahop_web_view_realize(GtkWidget *widget)
widget->style = gtk_style_attach (widget->style, widget->window);
gtk_style_set_background(widget->style, widget->window, GTK_STATE_NORMAL);
- g_assert(GTK_IS_WIDGET(web_view->mozilla_widget));
+ if (web_view->mozilla_widget) {
+ gtk_widget_reparent(web_view->mozilla_widget, widget);
+ } else {
+ HULAHOP_WEB_VIEW_GET_CLASS(web_view)->setup(web_view);
+ }
- gtk_widget_reparent(web_view->mozilla_widget, widget);
+ g_assert(web_view->mozilla_widget);
g_signal_connect_object(web_view->mozilla_widget,
"focus-in-event",
@@ -228,7 +235,9 @@ hulahop_web_view_class_init(HulahopWebViewClass *web_view_class)
widget_class->unmap = hulahop_web_view_unmap;
widget_class->size_allocate = hulahop_web_view_size_allocate;
- gobject_class->dispose = hulahop_web_view_dispose;
+ gobject_class->dispose = hulahop_web_view_dispose;
+
+ web_view_class->setup = hulahop_web_view_setup;
}
static void
@@ -236,8 +245,6 @@ hulahop_web_view_init(HulahopWebView *web_view)
{
web_view->offscreen_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_widget_realize(web_view->offscreen_window);
-
- nsresult rv;
web_view->browser = do_CreateInstance
("@mozilla.org/embedding/browser/nsWebBrowser;1");
@@ -247,10 +254,13 @@ hulahop_web_view_init(HulahopWebView *web_view)
item->SetItemType(nsIDocShellTreeItem::typeContentWrapper);
web_view->base_window = do_QueryInterface(web_view->browser);
+ g_assert(web_view->base_window);
- rv = web_view->base_window->InitWindow(web_view->offscreen_window,
- nsnull, 0, 0, 100, 100);
+ nsresult rv;
+ rv = web_view->base_window->InitWindow(web_view, nsnull, 0, 0, 100, 100);
g_assert(NS_SUCCEEDED(rv));
+
+ GTK_WIDGET_UNSET_FLAGS(GTK_WIDGET(web_view), GTK_NO_WINDOW);
}
PyObject *
@@ -281,19 +291,6 @@ hulahop_web_view_get_window_root(HulahopWebView *web_view)
}
void
-hulahop_web_view_create_window(HulahopWebView *web_view)
-{
- nsresult rv;
-
- rv = web_view->base_window->Create();
- g_assert(NS_SUCCEEDED(rv));
-
- web_view->mozilla_widget = GTK_BIN(web_view->offscreen_window)->child;
-
- GTK_WIDGET_UNSET_FLAGS(GTK_WIDGET(web_view), GTK_NO_WINDOW);
-}
-
-void
hulahop_web_view_grab_focus(HulahopWebView *web_view)
{
if (web_view->mozilla_widget) {
diff --git a/src/hulahop-web-view.h b/src/hulahop-web-view.h
index f832b7a..cd3b710 100644
--- a/src/hulahop-web-view.h
+++ b/src/hulahop-web-view.h
@@ -35,10 +35,15 @@ typedef struct _HulahopWebViewClass HulahopWebViewClass;
#define HULAHOP_IS_WEB_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), HULAHOP_TYPE_WEB_VIEW))
#define HULAHOP_WEB_VIEW_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS((object), HULAHOP_TYPE_WEB_VIEW, HulahopWebViewClass))
+struct _HulahopWebViewClass {
+ GtkBinClass base_class;
+
+ void (* setup) (HulahopWebView *web_view);
+};
+
GType hulahop_web_view_get_type (void);
void hulahop_web_view_grab_focus (HulahopWebView *web_view);
-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);
@@ -48,7 +53,6 @@ void hulahop_web_view_pop_js_context (HulahopWebView *web_view);
void hulahop_web_view_evaluate_script (HulahopWebView *web_view,
const char *script);
-
G_END_DECLS
#endif
diff --git a/src/hulahop.cpp b/src/hulahop.cpp
index 3e3b963..6adc2e3 100644
--- a/src/hulahop.cpp
+++ b/src/hulahop.cpp
@@ -20,6 +20,12 @@
#include <nsCOMPtr.h>
#include <nsILocalFile.h>
#include <nsXULAppAPI.h>
+#include <nsIWindowWatcher.h>
+#include <nsIWebBrowser.h>
+#include <nsIWebBrowserChrome.h>
+#include <nsIDOMWindow.h>
+#include <nsIBaseWindow.h>
+#include <PyXPCOM.h>
#include "HulahopDirectoryProvider.h"
#include "hulahop.h"
@@ -87,3 +93,34 @@ hulahop_add_components_path(const char *path)
{
kDirectoryProvider.AddComponentsPath(path);
}
+
+HulahopWebView *
+hulahop_get_view_for_window(PyObject *dom_window)
+{
+ nsCOMPtr<nsIDOMWindow> domWindow;
+ Py_nsISupports::InterfaceFromPyObject(dom_window,
+ NS_GET_IID(nsIDOMWindow),
+ getter_AddRefs(domWindow),
+ PR_FALSE);
+ NS_ENSURE_TRUE(domWindow, NULL);
+
+ nsCOMPtr<nsIWindowWatcher> wwatch = do_GetService
+ ("@mozilla.org/embedcomp/window-watcher;1");
+ NS_ENSURE_TRUE(wwatch, NULL);
+
+ nsCOMPtr<nsIWebBrowserChrome> chrome;
+ wwatch->GetChromeForWindow(domWindow, getter_AddRefs(chrome));
+ NS_ENSURE_TRUE(chrome, NULL);
+
+ nsCOMPtr<nsIWebBrowser> browser;
+ chrome->GetWebBrowser(getter_AddRefs(browser));
+ NS_ENSURE_TRUE(browser, NULL);
+
+ nsCOMPtr<nsIBaseWindow> baseWindow = do_QueryInterface(browser);
+ NS_ENSURE_TRUE(baseWindow, NULL);
+
+ gpointer native_parent;
+ baseWindow->GetParentNativeWindow(&native_parent);
+
+ return HULAHOP_WEB_VIEW(native_parent);
+}
diff --git a/src/hulahop.h b/src/hulahop.h
index b678d7e..c8649ce 100644
--- a/src/hulahop.h
+++ b/src/hulahop.h
@@ -20,14 +20,15 @@
#ifndef __HULAHOP_H__
#define __HULAHOP_H__
-#include <glib.h>
+#include "hulahop-web-view.h"
G_BEGIN_DECLS
-gboolean hulahop_startup (void);
-void hulahop_shutdown (void);
-void hulahop_set_profile_path (const char *path);
-void hulahop_add_components_path (const char *path);
+gboolean hulahop_startup (void);
+void hulahop_shutdown (void);
+void hulahop_set_profile_path (const char *path);
+void hulahop_add_components_path (const char *path);
+HulahopWebView *hulahop_get_view_for_window (PyObject *dom_window);
G_END_DECLS
diff --git a/tests/test-web-view.py b/tests/test-web-view.py
new file mode 100644
index 0000000..86038e3
--- /dev/null
+++ b/tests/test-web-view.py
@@ -0,0 +1,39 @@
+import os
+
+import gtk
+
+import hulahop
+hulahop.startup(os.path.expanduser('~/.test-hulahop'))
+from hulahop.webview import WebView
+
+def quit(window):
+ hulahop.shutdown()
+ gtk.main_quit()
+
+def entry_activate_cb(entry):
+ web_view.load_uri(entry.get_text())
+
+window = gtk.Window()
+window.set_default_size(600, 400)
+window.connect("destroy", quit)
+
+vbox = gtk.VBox()
+
+entry = gtk.Entry()
+entry.connect('activate', entry_activate_cb)
+vbox.pack_start(entry, False)
+entry.show()
+
+web_view = WebView()
+web_view.load_uri('http://www.gnome.org')
+vbox.pack_start(web_view)
+web_view.show()
+
+window.add(vbox)
+vbox.show()
+
+window.show()
+
+entry.grab_focus()
+
+gtk.main()