Added:
trunk/gom/xulapp/components/gom/src/gomvalue.cpp
- copied, changed from r85,
/trunk/gom/xulapp/components/gom/src/gomvalue.c
trunk/gom/xulapp/components/gom/src/xgGObject.cpp
trunk/gom/xulapp/components/gom/src/xgGObject.h
Removed:
trunk/gom/xulapp/components/gom/src/gomvalue.c
trunk/gom/xulapp/components/gom/src/xgGObjectUtils.cpp
trunk/gom/xulapp/components/gom/src/xgGObjectUtils.h
Modified:
trunk/gom/ChangeLog
trunk/gom/include/Makefile.inc
trunk/gom/include/gom/gomcamel.h
trunk/gom/xulapp/Makefile.inc
trunk/gom/xulapp/app/application.ini.in
trunk/gom/xulapp/app/default-prefs.js
trunk/gom/xulapp/chrome/content/gom.xul
trunk/gom/xulapp/components/gom/src/Makefile.in
trunk/gom/xulapp/components/gom/src/xgGtkElement.cpp
trunk/gom/xulapp/components/gom/src/xgGtkElement.h
trunk/gom/xulapp/components/gom/src/xgScriptElement.cpp
Log:
2008-09-01 jacob berkman <ja...@ilovegom.org>
* xulapp/components/gom/src/xgGObject.{h,cpp} (class xgGObject):
modify xgGObjectUtils to be an nsIXPCScriptable xgIGObjectHolder
* xulapp/components/gom/src/gomvalue.cpp (gom_g_value): use
xgGObject instead of gomjsobject for getting a GObject from a
jsval
(gom_jsval): use xgGObject instead of gomjsobject for getting a
JSObject from a GObject
* xulapp/components/gom/src/xgGtkElement.cpp: use xgGObject as a
base class
(xgGtkElement::Init): create the object here
(xgGtkElement::ParentChanged): add child properties using
attributes
(xgGtkElement::WillAppendChild): don't unref the return of
GetGObject()
(xgGtkElement::GetJSContext): get the JSContext from this
element's document
* xulapp/app/application.ini.in (EnableExtensionManager): enable
extensions
* include/gom/gomcamel.h: don't try to pull in headers mozilla
won't like
Modified: trunk/gom/ChangeLog
==============================================================================
--- trunk/gom/ChangeLog (original)
+++ trunk/gom/ChangeLog Mon Sep 1 01:29:45 2008
@@ -1,3 +1,52 @@
+2008-09-01 jacob berkman <ja...@ilovegom.org>
+
+ * xulapp/components/gom/src/xgGObject.{h,cpp} (class xgGObject):
+ modify xgGObjectUtils to be an nsIXPCScriptable xgIGObjectHolder
+
+ * xulapp/components/gom/src/gomvalue.cpp (gom_g_value): use
+ xgGObject instead of gomjsobject for getting a GObject from a
+ jsval
+ (gom_jsval): use xgGObject instead of gomjsobject for getting a
+ JSObject from a GObject
+
+ * xulapp/components/gom/src/xgGtkElement.cpp: use xgGObject as a
+ base class
+ (xgGtkElement::Init): create the object here
+ (xgGtkElement::ParentChanged): add child properties using
+ attributes
+ (xgGtkElement::WillAppendChild): don't unref the return of
+ GetGObject()
+ (xgGtkElement::GetJSContext): get the JSContext from this
+ element's document
+
+ * xulapp/app/application.ini.in (EnableExtensionManager): enable
+ extensions
+
+ * include/gom/gomcamel.h: don't try to pull in headers mozilla
+ won't like
+
+2008-08-30 jacob berkman <ja...@ilovegom.org>
+
+ * xulapp/components/gom/src/gomcamel.c:
+ * xulapp/components/gom/src/gomvalue.c: copy from libgom
+
+ * xulapp/components/gom/src/xgGObjectUtils.h: static class which
+ handles some GObject/JSObject interaction for us
+
+ * xulapp/components/gom/src/xgGtkElement.cpp:
+ (xgGtkElement::WidgetActivate): handle activate events on
+ GtkEntries
+ (xgGtkElement::OnCreated): add our GObject's properties to our
+ JSObject
+ (xgGtkElement::HandlesAttribute): only handle attributes for which
+ we have a property
+
+ * include/gommacros.h (GOM_LOC): print the file's basename, not
+ its full path
+
+ * include/gom/gomvalue.h (GOM_VALUE_ERROR): C++ doesn't allow
+ trailing commas, or something daft
+
2008-08-27 jacob <ja...@ilovegom.org>
* xulapp/components/gom/src/xgGtkElement.cpp (xgGtkElement::SetAttribute):
Modified: trunk/gom/include/Makefile.inc
==============================================================================
--- trunk/gom/include/Makefile.inc (original)
+++ trunk/gom/include/Makefile.inc Mon Sep 1 01:29:45 2008
@@ -1,7 +1,10 @@
# -*- Makefile -*-
dist_noinst_DATA += include/gomwidgets.in
+
dist_noinst_HEADERS += include/gommacros.h
+dist_noinst_HEADERS += include/gom/gomcamel.h
+dist_noinst_HEADERS += include/gom/gomvalue.h
CLEANFILES += include/gomwidgets.h
Modified: trunk/gom/include/gom/gomcamel.h
==============================================================================
--- trunk/gom/include/gom/gomcamel.h (original)
+++ trunk/gom/include/gom/gomcamel.h Mon Sep 1 01:29:45 2008
@@ -24,7 +24,7 @@
#ifndef GOM_CAMEL_H
#define GOM_CAMEL_H
-#include <glib/gmem.h>
+#include <glib.h>
G_BEGIN_DECLS
Modified: trunk/gom/xulapp/Makefile.inc
==============================================================================
--- trunk/gom/xulapp/Makefile.inc (original)
+++ trunk/gom/xulapp/Makefile.inc Mon Sep 1 01:29:45 2008
@@ -23,6 +23,7 @@
package:
$(MAKE) -C mozilla.obj/gom/installer
+check: package
dist_noinst_DATA += xulapp/Makefile.in
dist_noinst_DATA += xulapp/build.mk
@@ -59,6 +60,10 @@
dist_noinst_DATA += xulapp/components/gom/public/xgIGObjectHolder.idl
dist_noinst_DATA += xulapp/components/gom/src/Makefile.in
+dist_noinst_DATA += xulapp/components/gom/src/gomcamel.c
+dist_noinst_DATA += xulapp/components/gom/src/gomvalue.cpp
+dist_noinst_DATA += xulapp/components/gom/src/xgGObject.cpp
+dist_noinst_DATA += xulapp/components/gom/src/xgGObject.h
dist_noinst_DATA += xulapp/components/gom/src/xgGomElementFactory.cpp
dist_noinst_DATA += xulapp/components/gom/src/xgGomElementFactory.h
dist_noinst_DATA += xulapp/components/gom/src/xgGomModule.cpp
Modified: trunk/gom/xulapp/app/application.ini.in
==============================================================================
--- trunk/gom/xulapp/app/application.ini.in (original)
+++ trunk/gom/xulapp/app/application.ini.in Mon Sep 1 01:29:45 2008
@@ -10,3 +10,5 @@
MinVersion=1.9
MaxVersion=1.9.0.*
+[XRE]
+EnableExtensionManager=1
Modified: trunk/gom/xulapp/app/default-prefs.js
==============================================================================
--- trunk/gom/xulapp/app/default-prefs.js (original)
+++ trunk/gom/xulapp/app/default-prefs.js Mon Sep 1 01:29:45 2008
@@ -1 +1,18 @@
pref ('toolkit.defaultChromeURI', 'chrome://gom/content/gom.xul');
+
+pref("xpinstall.dialog.confirm", "chrome://mozapps/content/xpinstall/xpinstallConfirm.xul");
+pref("xpinstall.dialog.progress.skin", "chrome://mozapps/content/extensions/extensions.xul?type=themes");
+pref("xpinstall.dialog.progress.chrome", "chrome://mozapps/content/extensions/extensions.xul?type=extensions");
+pref("xpinstall.dialog.progress.type.skin", "Extension:Manager-themes");
+pref("xpinstall.dialog.progress.type.chrome", "Extension:Manager-extensions");
+pref("extensions.update.enabled", true);
+pref("extensions.update.interval", 86400);
+pref("extensions.dss.enabled", false);
+pref("extensions.dss.switchPending", false);
+pref("extensions.ignoreMTimeChanges", false);
+pref("extensions.logging.enabled", false);
+pref("general.skins.selectedSkin", "classic/1.0");
+// NB these point at AMO
+pref("extensions.update.url", "chrome://mozapps/locale/extensions/extensions.properties");
+pref("extensions.getMoreExtensionsURL", "chrome://mozapps/locale/extensions/extensions.properties");
+pref("extensions.getMoreThemesURL", "chrome://mozapps/locale/extensions/extensions.properties");
Modified: trunk/gom/xulapp/chrome/content/gom.xul
==============================================================================
--- trunk/gom/xulapp/chrome/content/gom.xul (original)
+++ trunk/gom/xulapp/chrome/content/gom.xul Mon Sep 1 01:29:45 2008
@@ -8,7 +8,7 @@
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<script src="gom.js"/>
<hbox>
- <textbox id="urlbar" flex="1"
value="file:///Users/jacob/cvs/gom/examples/console.gom" onchange="go();"/>
+ <textbox id="urlbar" flex="1"
value="file:///home/jacob/cvs/gom/examples/console.gom" onchange="go();"/>
<button id="go" label="Go" oncommand="go();"/>
</hbox>
<browser id="browser" src="" flex="1" type="content-primary"/>
Modified: trunk/gom/xulapp/components/gom/src/Makefile.in
==============================================================================
--- trunk/gom/xulapp/components/gom/src/Makefile.in (original)
+++ trunk/gom/xulapp/components/gom/src/Makefile.in Mon Sep 1 01:29:45 2008
@@ -60,7 +60,8 @@
LOCAL_INCLUDES += $(MOZ_GTK2_CFLAGS)
CPPSRCS := \
- xgGObjectUtils.cpp \
+ gomvalue.cpp \
+ xgGObject.cpp \
xgGomElementFactory.cpp \
xgGomModule.cpp \
xgGtkElement.cpp \
@@ -70,7 +71,6 @@
CSRCS := \
gomcamel.c \
- gomvalue.c \
$(NULL)
EXTRA_DSO_LDOPTS = \
Copied: trunk/gom/xulapp/components/gom/src/gomvalue.cpp (from r85,
/trunk/gom/xulapp/components/gom/src/gomvalue.c)
==============================================================================
--- /trunk/gom/xulapp/components/gom/src/gomvalue.c (original)
+++ trunk/gom/xulapp/components/gom/src/gomvalue.cpp Mon Sep 1 01:29:45
2008
@@ -27,7 +27,9 @@
#include "gom/gomvalue.h"
-#include <gom/gomjsobject.h>
+#include "xgGObject.h"
+
+#include <nsCOMPtr.h>
GQuark
gom_value_error_quark (void)
@@ -39,20 +41,26 @@
gom_g_value (JSContext *cx, GValue *gval, jsval jval, GError **error)
{
switch (JSVAL_TAG (jval)) {
-#if 0
case JSVAL_OBJECT: {
- GObject *gobj;
- gobj = gom_js_object_get_g_object (cx, JSVAL_TO_OBJECT (jval));
- if (!gobj) {
- g_set_error (error, GOM_VALUE_ERROR,
GOM_VALUE_ERROR_G_OBJECT_NOT_FOUND,
- "Cannot get GObject from JSObject %p (%s)",
- JSVAL_TO_OBJECT (jval),
- JS_GET_CLASS (cx, JSVAL_TO_OBJECT (jval))->name);
- return FALSE;
+ nsCOMPtr<nsISupports> native;
+ nsresult rv = xgGObject::GetNative (cx, JSVAL_TO_OBJECT (jval),
getter_AddRefs (native));
+ if (NS_SUCCEEDED (rv)) {
+ nsCOMPtr<xgIGObjectHolder> holder (do_QueryInterface (native,
&rv));
+ if (NS_SUCCEEDED (rv)) {
+ GObject *gobj;
+ rv = holder->GetGObject (&gobj);
+ if (NS_SUCCEEDED (rv)) {
+ g_value_set_object (gval, gobj);
+ break;
+ }
+ }
}
- break;
+ g_set_error (error, GOM_VALUE_ERROR,
GOM_VALUE_ERROR_G_OBJECT_NOT_FOUND,
+ "Cannot get GObject from JSObject %p (%s)",
+ (gpointer)JSVAL_TO_OBJECT (jval),
+ JS_GET_CLASS (cx, JSVAL_TO_OBJECT (jval))->name);
+ return FALSE;
}
-#endif
case JSVAL_DOUBLE:
g_value_init (gval, G_TYPE_DOUBLE);
g_value_set_double (gval, *JSVAL_TO_DOUBLE (jval));
@@ -153,24 +161,22 @@
break;
default:
-#if 0
if (G_VALUE_HOLDS_OBJECT (gval)) {
- gobj = g_value_get_object (gval);
+ gobj = (GObject *)g_value_get_object (gval);
if (!gobj) {
*jval = JSVAL_NULL;
} else {
- jsobj = gom_js_object_get_or_create_js_object (cx, gobj);
+ jsobj = xgGObject::GetNewOrUsed (cx, gobj);
if (!jsobj) {
g_set_error (error, GOM_VALUE_ERROR,
GOM_VALUE_ERROR_JS_OBJECT_NOT_FOUND,
"Cannot get JSObject from Object %p (%s)",
- gobj, g_type_name (G_TYPE_FROM_INSTANCE
(gobj)));
+ (gpointer)gobj, g_type_name
(G_TYPE_FROM_INSTANCE (gobj)));
return FALSE;
}
*jval = OBJECT_TO_JSVAL (jsobj);
}
ret = TRUE;
}
-#endif
break;
}
Added: trunk/gom/xulapp/components/gom/src/xgGObject.cpp
==============================================================================
--- (empty file)
+++ trunk/gom/xulapp/components/gom/src/xgGObject.cpp Mon Sep 1 01:29:45
2008
@@ -0,0 +1,624 @@
+/*
+The MIT License
+
+Copyright (c) 2008 jacob berkman <ja...@ilovegom.org>
+
+Permission is hereby granted, free of charge, to any person obtaining a
copy
+of this software and associated documentation files (the "Software"), to
deal
+in the Software without restriction, including without limitation the
rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+*/
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "xgGObject.h"
+
+#include "gommacros.h"
+#include "gom/gomcamel.h"
+#include "gom/gomvalue.h"
+
+#include <jsapi.h>
+
+#include <nsCOMPtr.h>
+#include <nsCRTGlue.h>
+#include <nsIXPConnect.h>
+#include <nsServiceManagerUtils.h>
+
+xgGObject::xgGObject ()
+{
+}
+
+xgGObject::~xgGObject ()
+{
+ if (mObject) {
+ g_object_unref (mObject);
+ mObject = NULL;
+ }
+}
+
+NS_IMPL_ISUPPORTS2 (xgGObject, xgIGObjectHolder, nsIXPCScriptable)
+
+nsresult
+xgGObject::Init (GObject *object)
+{
+ gpointer obj = g_object_get_data (object, "XG_GOBJECT");
+ if (obj) {
+ return NS_ERROR_ALREADY_INITIALIZED;
+ }
+ mObject = object;
+ g_object_set_data (object, "XG_GOBJECT", this);
+ g_object_ref (object);
+ return NS_OK;
+}
+
+/* GObjectPtr getGObject (); */
+NS_IMETHODIMP
+xgGObject::GetGObject (GObject **_retval)
+{
+ *_retval = mObject;
+ return NS_OK;
+}
+
+
+nsresult
+xgGObject::DefineProperties (JSContext *jscx, nsISupports *aCOMObj)
+{
+ nsresult rv;
+
+ nsCOMPtr<nsIXPConnect> xpc (do_GetService
("@mozilla.org/js/xpc/XPConnect;1", &rv));
+ NS_ENSURE_SUCCESS (rv, rv);
+
+ nsCOMPtr<nsIXPConnectJSObjectHolder> jswrapper;
+ rv = xpc->WrapNative (jscx, JS_GetGlobalObject (jscx), aCOMObj,
NS_GET_IID (nsISupports), getter_AddRefs (jswrapper));
+ NS_ENSURE_SUCCESS (rv, rv);
+
+#if 0
+ nsCOMPtr<nsIXPConnectWrappedNative> wrapper (do_QueryInterface
(jswrapper, &rv));
+ NS_ENSURE_SUCCESS (rv, rv);
+ nsDOMClassInfo::PreserveNodeWrapper(wrapper);
+#endif
+
+ JSObject *jsobj;
+ rv = jswrapper->GetJSObject (&jsobj);
+ NS_ENSURE_SUCCESS (rv, rv);
+
+ g_message (GOM_LOC ("Got JSObject: %p"), (void *)jsobj);
+
+ guint n_properties;
+ GParamSpec **props = g_object_class_list_properties
(G_OBJECT_GET_CLASS (mObject), &n_properties);
+ g_message (GOM_LOC ("Adding %d properties from %s"), n_properties,
G_OBJECT_TYPE_NAME (mObject));
+
+ JS_BeginRequest (jscx);
+
+ const char *camelName;
+ for (guint i = 0; i < n_properties; i++) {
+ camelName = gom_camel_case (props[i]->name);
+ if (!JS_DefineProperty (jscx, jsobj, camelName, JSVAL_VOID,
+ xgGObject::GetProperty,
+ xgGObject::SetProperty,
+ JSPROP_ENUMERATE | JSPROP_PERMANENT)) {
+ g_printerr ("Could not define a property for %s\n", camelName);
+ } else {
+ g_print (GOM_LOC ("Defined property: %s.%s\n"),
+ G_OBJECT_TYPE_NAME (mObject), camelName);
+ }
+ GOM_CAMEL_FREE (camelName, props[i]->name);
+ }
+
+ JS_EndRequest (jscx);
+
+ return NS_OK;
+}
+
+// static
+JSBool
+xgGObject::GetProperty (JSContext *cx,
+ JSObject *obj,
+ jsval id,
+ jsval *vp)
+{
+ if (JSVAL_IS_INT (id)) {
+ return JS_TRUE;
+ }
+
+ nsresult rv;
+
+ nsCOMPtr<nsISupports> native;
+ rv = GetNative (cx, obj, getter_AddRefs (native));
+ NS_ENSURE_SUCCESS (rv, JS_FALSE);
+
+ nsCOMPtr<xgIGObjectHolder> holder (do_QueryInterface (native, &rv));
+ NS_ENSURE_SUCCESS (rv, JS_FALSE);
+
+ GObject *gobj;
+ rv = holder->GetGObject (&gobj);
+ NS_ENSURE_SUCCESS (rv, rv);
+ NS_ENSURE_TRUE (G_IS_OBJECT (gobj), NS_ERROR_UNEXPECTED);
+
+ const char *name = JSVAL_CHARS (id);
+ GParamSpec *spec;
+ guint signal_id;
+
+ g_print (GOM_LOC (""));
+ if (!Resolve (G_TYPE_FROM_INSTANCE (gobj), name, &spec, &signal_id)) {
+ return JS_TRUE;
+ }
+
+#if 0
+ if (signal_id) {
+ closure = gom_js_object_get_closure_prop (gobj, signal_id);
+ g_print ("closure: %p\n", closure);
+ *vp = closure ? OBJECT_TO_JSVAL (JS_GetFunctionObject
(closure->fun)) : JSVAL_VOID;
+ return JS_TRUE;
+ }
+#endif
+
+ g_assert (spec);
+
+ GValue gval = { 0 };
+ g_value_init (&gval, G_PARAM_SPEC_VALUE_TYPE (spec));
+ g_object_get_property (gobj, spec->name, &gval);
+
+ GError *error = NULL;
+ if (!gom_jsval (cx, vp, &gval, &error)) {
+ g_printerr ("Could not get jsval: %s\n", error->message);
+ g_value_unset (&gval);
+ g_error_free (error);
+ return JS_FALSE;
+ }
+ g_value_unset (&gval);
+
+ return JS_TRUE;
+}
+
+// static
+JSBool
+xgGObject::SetProperty (JSContext *cx,
+ JSObject *obj,
+ jsval id,
+ jsval *vp)
+{
+ if (JSVAL_IS_INT (id)) {
+ return JS_TRUE;
+ }
+
+ nsresult rv;
+
+ nsCOMPtr<nsISupports> native;
+ rv = GetNative (cx, obj, getter_AddRefs (native));
+ NS_ENSURE_SUCCESS (rv, JS_FALSE);
+
+ nsCOMPtr<xgIGObjectHolder> holder (do_QueryInterface (native, &rv));
+ NS_ENSURE_SUCCESS (rv, JS_FALSE);
+
+ GObject *gobj;
+ rv = holder->GetGObject (&gobj);
+ NS_ENSURE_SUCCESS (rv, rv);
+ NS_ENSURE_TRUE (G_IS_OBJECT (gobj), NS_ERROR_UNEXPECTED);
+
+ const char *name = JSVAL_CHARS (id);
+ GParamSpec *spec;
+ guint signal_id;
+
+ g_print (GOM_LOC (""));
+ if (!Resolve (G_TYPE_FROM_INSTANCE (gobj), name, &spec, &signal_id)) {
+ return JS_TRUE;
+ }
+
+#if 0
+ GomJSClosure *closure;
+ if (signal_id) {
+ JSFunction *fun;
+ if (!JSVAL_IS_OBJECT (*vp) ||
+ !JS_ObjectIsFunction (cx, JSVAL_TO_OBJECT (*vp))) {
+ g_printerr ("jsval is not a function. sucka.\n");
+ return JS_FALSE;
+ }
+ fun = JS_ValueToFunction (cx, *vp);
+ if (!fun) {
+ g_printerr ("could not get function from value\n");
+ return JS_FALSE;
+ }
+ closure = gom_js_object_get_closure_prop (gobj, signal_id);
+ if (closure) {
+ closure->fun = fun;
+ } else {
+ closure = (GomJSClosure *)gom_js_closure_new (cx, obj, fun);
+ gom_js_object_set_closure_prop (gobj, signal_id, closure);
+ g_signal_connect_closure_by_id (gobj, signal_id, 0,
&closure->closure, FALSE);
+ }
+ return JS_TRUE;
+ }
+#endif
+ g_assert (spec);
+
+ GValue gval = { 0 };
+ GError *error = NULL;
+ if (!gom_g_value (cx, &gval, *vp, &error)) {
+ g_printerr ("Could not get GValue: %s\n", error->message);
+ g_error_free (error);
+ return JS_FALSE;
+ }
+
+ g_object_set_property (gobj, spec->name, &gval);
+ g_value_unset (&gval);
+
+ return JS_TRUE;
+}
+
+gboolean
+xgGObject::Resolve (const char *name,
+ GParamSpec **spec,
+ guint *signal_id)
+{
+ return Resolve (G_TYPE_FROM_INSTANCE (mObject), name, spec, signal_id);
+}
+
+// static
+gboolean
+xgGObject::Resolve (GType aType,
+ const char *name,
+ GParamSpec **spec,
+ guint *signal_id)
+{
+ const char *n;
+
+ n = gom_camel_uncase (name);
+
+ if (n[0] == 'o' && n[1] == 'n' &&
+ (*signal_id = g_signal_lookup (&n[2], aType))) {
+#if 1
+ g_print ("resolve %s.%s -> signal %u\n", g_type_name (aType), n,
*signal_id);
+#endif
+ *spec = NULL;
+ GOM_CAMEL_FREE (n, name);
+ return PR_TRUE;
+ }
+
+ *spec = g_object_class_find_property ((GObjectClass
*)g_type_class_peek (aType), n);
+ *signal_id = 0;
+#if 1
+ g_print ("resolve %s.%s -> %s: %s\n",
+ g_type_name (aType), name, n,
+ *spec ? g_type_name (G_PARAM_SPEC_VALUE_TYPE
(*spec)) : "FAIL");
+#endif
+ GOM_CAMEL_FREE (n, name);
+
+ return *spec != NULL;
+}
+
+nsresult
+xgGObject::GetNative (JSContext *cx,
+ JSObject *obj,
+ nsISupports **_retval)
+{
+ nsresult rv;
+ nsCOMPtr<nsIXPConnect> xpc (do_GetService
("@mozilla.org/js/xpc/XPConnect;1", &rv));
+ NS_ENSURE_SUCCESS (rv, rv);
+
+ nsCOMPtr<nsIXPConnectWrappedNative> wrappedNative;
+ rv = xpc->GetWrappedNativeOfJSObject (cx, obj, getter_AddRefs
(wrappedNative));
+ NS_ENSURE_SUCCESS (rv, rv);
+
+ return wrappedNative->GetNative (_retval);
+}
+
+// static
+JSObject *
+xgGObject::GetNewOrUsed (JSContext *cx, GObject *gobj)
+{
+ nsCOMPtr<xgIGObjectHolder> holder (static_cast<xgIGObjectHolder
*>(g_object_get_data (gobj, "XG_GOBJECT")));
+ if (!holder) {
+ xgGObject *obj = new xgGObject ();
+ holder = obj;
+ if (NS_FAILED (obj->Init (gobj))) {
+ return NULL;
+ }
+ obj->DefineProperties (cx, holder);
+ }
+
+ nsresult rv;
+ nsCOMPtr<nsIXPConnect> xpc (do_GetService
("@mozilla.org/js/xpc/XPConnect;1", &rv));
+ NS_ENSURE_SUCCESS (rv, NULL);
+
+ nsCOMPtr<nsIXPConnectJSObjectHolder> jswrapper;
+ rv = xpc->WrapNative (cx, JS_GetGlobalObject (cx), holder, NS_GET_IID
(nsISupports), getter_AddRefs (jswrapper));
+ NS_ENSURE_SUCCESS (rv, NULL);
+
+ JSObject *jsobj;
+ rv = jswrapper->GetJSObject (&jsobj);
+ NS_ENSURE_SUCCESS (rv, NULL);
+
+ return jsobj;
+}
+
+/* readonly attribute string className; */
+NS_IMETHODIMP
+xgGObject::GetClassName(char **aClassName)
+{
+ *aClassName = NS_strdup (G_OBJECT_TYPE_NAME (mObject));
+ return NS_OK;
+}
+
+/* readonly attribute PRUint32 scriptableFlags; */
+NS_IMETHODIMP
+xgGObject::GetScriptableFlags (PRUint32 *aScriptableFlags)
+{
+ *aScriptableFlags = WANT_ADDPROPERTY | WANT_GETPROPERTY |
WANT_SETPROPERTY | WANT_NEWRESOLVE | WANT_NEWENUMERATE;
+ return NS_OK;
+}
+
+/* void preCreate (in nsISupports nativeObj, in JSContextPtr cx, in
JSObjectPtr globalObj, out JSObjectPtr parentObj); */
+NS_IMETHODIMP xgGObject::PreCreate(nsISupports *nativeObj, JSContext * cx,
JSObject * globalObj, JSObject * *parentObj)
+{
+ XG_RETURN_NOT_IMPLEMENTED;
+}
+
+/* void create (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx,
in JSObjectPtr obj); */
+NS_IMETHODIMP xgGObject::Create(nsIXPConnectWrappedNative *wrapper,
JSContext * cx, JSObject * obj)
+{
+ XG_RETURN_NOT_IMPLEMENTED;
+}
+
+/* void postCreate (in nsIXPConnectWrappedNative wrapper, in JSContextPtr
cx, in JSObjectPtr obj); */
+NS_IMETHODIMP xgGObject::PostCreate(nsIXPConnectWrappedNative *wrapper,
JSContext * cx, JSObject * obj)
+{
+ XG_RETURN_NOT_IMPLEMENTED;
+}
+
+/* PRBool addProperty (in nsIXPConnectWrappedNative wrapper, in
JSContextPtr cx, in JSObjectPtr obj, in JSVal id, in JSValPtr vp); */
+NS_IMETHODIMP
+xgGObject::AddProperty (nsIXPConnectWrappedNative *wrapper,
+ JSContext *cx, JSObject *obj, jsval id, jsval *vp, PRBool *_retval)
+{
+#if 0
+ if (JSVAL_IS_INT (id)) {
+ *_retval = PR_TRUE;
+ return NS_OK;
+ }
+
+ const char *name = JSVAL_CHARS (id);
+ GParamSpec *spec;
+ guint signal_id;
+
+#if 1
+ g_print (GOM_LOC (""));
+#endif
+ if (!Resolve (name, &spec, &signal_id)) {
+ *_retval = PR_TRUE;
+ return NS_OK;
+ }
+#endif
+ *_retval = PR_TRUE;
+ return NS_OK;
+}
+
+/* PRBool delProperty (in nsIXPConnectWrappedNative wrapper, in
JSContextPtr cx, in JSObjectPtr obj, in JSVal id, in JSValPtr vp); */
+NS_IMETHODIMP xgGObject::DelProperty(nsIXPConnectWrappedNative *wrapper,
JSContext * cx, JSObject * obj, jsval id, jsval * vp, PRBool *_retval)
+{
+ XG_RETURN_NOT_IMPLEMENTED;
+}
+
+/* PRBool getProperty (in nsIXPConnectWrappedNative wrapper, in
JSContextPtr cx, in JSObjectPtr obj, in JSVal id, in JSValPtr vp); */
+NS_IMETHODIMP
+xgGObject::GetProperty (nsIXPConnectWrappedNative *wrapper,
+ JSContext * cx, JSObject * obj, jsval id, jsval * vp, PRBool *_retval)
+{
+ if (JSVAL_IS_INT (id)) {
+ *_retval = PR_TRUE;
+ return NS_OK;
+ }
+
+ const char *name = JSVAL_CHARS (id);
+ GParamSpec *spec;
+ guint signal_id;
+
+#if 1
+ g_print (GOM_LOC (""));
+#endif
+ if (!Resolve (name, &spec, &signal_id)) {
+ *_retval = PR_TRUE;
+ return NS_OK;
+ }
+
+#if 0
+ if (signal_id) {
+ closure = gom_js_object_get_closure_prop (gobj, signal_id);
+ g_print ("closure: %p\n", closure);
+ *vp = closure ? OBJECT_TO_JSVAL (JS_GetFunctionObject
(closure->fun)) : JSVAL_VOID;
+ return JS_TRUE;
+ }
+#endif
+
+ g_assert (spec);
+
+ GValue gval = { 0 };
+ g_value_init (&gval, G_PARAM_SPEC_VALUE_TYPE (spec));
+ g_object_get_property (mObject, spec->name, &gval);
+
+ GError *error = NULL;
+ if (!gom_jsval (cx, vp, &gval, &error)) {
+ g_printerr ("Could not get jsval: %s\n", error->message);
+ g_value_unset (&gval);
+ g_error_free (error);
+ *_retval = PR_FALSE;
+ return NS_OK;
+ }
+ g_value_unset (&gval);
+
+ *_retval = PR_TRUE;
+ return NS_OK;
+}
+
+/* PRBool setProperty (in nsIXPConnectWrappedNative wrapper, in
JSContextPtr cx, in JSObjectPtr obj, in JSVal id, in JSValPtr vp); */
+NS_IMETHODIMP xgGObject::SetProperty(nsIXPConnectWrappedNative *wrapper,
JSContext * cx, JSObject * obj, jsval id, jsval * vp, PRBool *_retval)
+{
+ g_message (GOM_LOC ("well, got here?"));
+ if (JSVAL_IS_INT (id)) {
+ *_retval = PR_TRUE;
+ return NS_OK;
+ }
+
+ const char *name = JSVAL_CHARS (id);
+ GParamSpec *spec;
+ guint signal_id;
+
+ g_print (GOM_LOC (""));
+ if (!Resolve (name, &spec, &signal_id)) {
+ *_retval = PR_TRUE;
+ return NS_OK;
+ }
+
+#if 0
+ GomJSClosure *closure;
+ if (signal_id) {
+ JSFunction *fun;
+ if (!JSVAL_IS_OBJECT (*vp) ||
+ !JS_ObjectIsFunction (cx, JSVAL_TO_OBJECT (*vp))) {
+ g_printerr ("jsval is not a function. sucka.\n");
+ return JS_FALSE;
+ }
+ fun = JS_ValueToFunction (cx, *vp);
+ if (!fun) {
+ g_printerr ("could not get function from value\n");
+ return JS_FALSE;
+ }
+ closure = gom_js_object_get_closure_prop (gobj, signal_id);
+ if (closure) {
+ closure->fun = fun;
+ } else {
+ closure = (GomJSClosure *)gom_js_closure_new (cx, obj, fun);
+ gom_js_object_set_closure_prop (gobj, signal_id, closure);
+ g_signal_connect_closure_by_id (gobj, signal_id, 0,
&closure->closure, FALSE);
+ }
+ return JS_TRUE;
+ }
+#endif
+ g_assert (spec);
+
+ GValue gval = { 0 };
+ GError *error = NULL;
+ if (!gom_g_value (cx, &gval, *vp, &error)) {
+ g_printerr ("Could not get GValue: %s\n", error->message);
+ g_error_free (error);
+ *_retval = PR_FALSE;
+ return NS_OK;
+ }
+
+ g_object_set_property (mObject, spec->name, &gval);
+ g_value_unset (&gval);
+
+ *_retval = PR_TRUE;
+ return NS_OK;
+}
+
+/* PRBool enumerate (in nsIXPConnectWrappedNative wrapper, in JSContextPtr
cx, in JSObjectPtr obj); */
+NS_IMETHODIMP xgGObject::Enumerate(nsIXPConnectWrappedNative *wrapper,
JSContext * cx, JSObject * obj, PRBool *_retval)
+{
+ XG_RETURN_NOT_IMPLEMENTED;
+}
+
+/* PRBool newEnumerate (in nsIXPConnectWrappedNative wrapper, in
JSContextPtr cx, in JSObjectPtr obj, in PRUint32 enum_op, in JSValPtr
statep, out JSID idp); */
+NS_IMETHODIMP xgGObject::NewEnumerate(nsIXPConnectWrappedNative *wrapper,
JSContext * cx, JSObject * obj, PRUint32 enum_op, jsval * statep, jsid
*idp, PRBool *_retval)
+{
+ XG_RETURN_NOT_IMPLEMENTED;
+}
+
+/* PRBool newResolve (in nsIXPConnectWrappedNative wrapper, in
JSContextPtr cx, in JSObjectPtr obj, in JSVal id, in PRUint32 flags, out
JSObjectPtr objp); */
+NS_IMETHODIMP
+xgGObject::NewResolve (nsIXPConnectWrappedNative *wrapper,
+ JSContext *cx, JSObject *obj, jsval id, PRUint32 flags, JSObject
**objp, PRBool *_retval)
+{
+ if (JSVAL_IS_INT (id)) {
+ *objp = NULL;
+ *_retval = PR_TRUE;
+ return NS_OK;
+ }
+ const char *name = JSVAL_CHARS (id);
+ GParamSpec *spec;
+ guint signal_id;
+
+ g_print (GOM_LOC (""));
+ if (!Resolve (name, &spec, &signal_id)) {
+ *objp = NULL;
+ *_retval = PR_TRUE;
+ return NS_OK;
+ }
+
+ *_retval = PR_TRUE;
+ return NS_OK;
+}
+
+/* PRBool convert (in nsIXPConnectWrappedNative wrapper, in JSContextPtr
cx, in JSObjectPtr obj, in PRUint32 type, in JSValPtr vp); */
+NS_IMETHODIMP xgGObject::Convert(nsIXPConnectWrappedNative *wrapper,
JSContext * cx, JSObject * obj, PRUint32 type, jsval * vp, PRBool *_retval)
+{
+ XG_RETURN_NOT_IMPLEMENTED;
+}
+
+/* void finalize (in nsIXPConnectWrappedNative wrapper, in JSContextPtr
cx, in JSObjectPtr obj); */
+NS_IMETHODIMP xgGObject::Finalize(nsIXPConnectWrappedNative *wrapper,
JSContext * cx, JSObject * obj)
+{
+ XG_RETURN_NOT_IMPLEMENTED;
+}
+
+/* PRBool checkAccess (in nsIXPConnectWrappedNative wrapper, in
JSContextPtr cx, in JSObjectPtr obj, in JSVal id, in PRUint32 mode, in
JSValPtr vp); */
+NS_IMETHODIMP xgGObject::CheckAccess(nsIXPConnectWrappedNative *wrapper,
JSContext * cx, JSObject * obj, jsval id, PRUint32 mode, jsval * vp, PRBool
*_retval)
+{
+ XG_RETURN_NOT_IMPLEMENTED;
+}
+
+/* PRBool call (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx,
in JSObjectPtr obj, in PRUint32 argc, in JSValPtr argv, in JSValPtr vp); */
+NS_IMETHODIMP xgGObject::Call(nsIXPConnectWrappedNative *wrapper,
JSContext * cx, JSObject * obj, PRUint32 argc, jsval * argv, jsval * vp,
PRBool *_retval)
+{
+ XG_RETURN_NOT_IMPLEMENTED;
+}
+
+/* PRBool construct (in nsIXPConnectWrappedNative wrapper, in JSContextPtr
cx, in JSObjectPtr obj, in PRUint32 argc, in JSValPtr argv, in JSValPtr
vp); */
+NS_IMETHODIMP xgGObject::Construct(nsIXPConnectWrappedNative *wrapper,
JSContext * cx, JSObject * obj, PRUint32 argc, jsval * argv, jsval * vp,
PRBool *_retval)
+{
+ XG_RETURN_NOT_IMPLEMENTED;
+}
+
+/* PRBool hasInstance (in nsIXPConnectWrappedNative wrapper, in
JSContextPtr cx, in JSObjectPtr obj, in JSVal val, out PRBool bp); */
+NS_IMETHODIMP xgGObject::HasInstance(nsIXPConnectWrappedNative *wrapper,
JSContext * cx, JSObject * obj, jsval val, PRBool *bp, PRBool *_retval)
+{
+ XG_RETURN_NOT_IMPLEMENTED;
+}
+
+/* void trace (in nsIXPConnectWrappedNative wrapper, in JSTracerPtr trc,
in JSObjectPtr obj); */
+NS_IMETHODIMP xgGObject::Trace(nsIXPConnectWrappedNative *wrapper,
JSTracer * trc, JSObject * obj)
+{
+ XG_RETURN_NOT_IMPLEMENTED;
+}
+
+/* PRBool equality (in nsIXPConnectWrappedNative wrapper, in JSContextPtr
cx, in JSObjectPtr obj, in JSVal val); */
+NS_IMETHODIMP xgGObject::Equality(nsIXPConnectWrappedNative *wrapper,
JSContext * cx, JSObject * obj, jsval val, PRBool *_retval)
+{
+ XG_RETURN_NOT_IMPLEMENTED;
+}
+
+/* JSObjectPtr outerObject (in nsIXPConnectWrappedNative wrapper, in
JSContextPtr cx, in JSObjectPtr obj); */
+NS_IMETHODIMP xgGObject::OuterObject(nsIXPConnectWrappedNative *wrapper,
JSContext * cx, JSObject * obj, JSObject * *_retval)
+{
+ XG_RETURN_NOT_IMPLEMENTED;
+}
+
+/* JSObjectPtr innerObject (in nsIXPConnectWrappedNative wrapper, in
JSContextPtr cx, in JSObjectPtr obj); */
+NS_IMETHODIMP xgGObject::InnerObject(nsIXPConnectWrappedNative *wrapper,
JSContext * cx, JSObject * obj, JSObject * *_retval)
+{
+ XG_RETURN_NOT_IMPLEMENTED;
+}
Added: trunk/gom/xulapp/components/gom/src/xgGObject.h
==============================================================================
--- (empty file)
+++ trunk/gom/xulapp/components/gom/src/xgGObject.h Mon Sep 1 01:29:45 2008
@@ -0,0 +1,61 @@
+/*
+The MIT License
+
+Copyright (c) 2008 jacob berkman <ja...@ilovegom.org>
+
+Permission is hereby granted, free of charge, to any person obtaining a
copy
+of this software and associated documentation files (the "Software"), to
deal
+in the Software without restriction, including without limitation the
rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+*/
+#ifndef XG_G_OBJECT_UTILS_H
+#define XG_G_OBJECT_UTILS_H
+
+#include "xgIGObjectHolder.h"
+
+#include <jspubtd.h>
+#include <nscore.h>
+#include <nsIXPCScriptable.h>
+
+class xgGObject : public xgIGObjectHolder,
+ public nsIXPCScriptable
+{
+public:
+ NS_DECL_ISUPPORTS
+ NS_DECL_XGIGOBJECTHOLDER
+ NS_DECL_NSIXPCSCRIPTABLE
+
+ xgGObject();
+ nsresult Init (GObject *aObject);
+
+ gboolean Resolve (const char *name, GParamSpec **spec, guint
*signal_id);
+
+ nsresult DefineProperties (JSContext *cx, nsISupports *aComObj);
+
+ static JSObject *GetNewOrUsed (JSContext *cx, GObject *gobj);
+ static nsresult GetNative (JSContext *cx, JSObject *obj, nsISupports
**_retval);
+
+protected:
+ static gboolean Resolve (GType aType, const char *name, GParamSpec
**spec, guint *signal_id);
+ static JSBool GetProperty (JSContext *cx, JSObject *obj, jsval id,
jsval *vp);
+ static JSBool SetProperty (JSContext *cx, JSObject *obj, jsval id,
jsval *vp);
+
+ GObject *mObject;
+
+ ~xgGObject ();
+};
+
+#endif // XG_G_OBJECT_UTILS_H
Modified: trunk/gom/xulapp/components/gom/src/xgGtkElement.cpp
==============================================================================
--- trunk/gom/xulapp/components/gom/src/xgGtkElement.cpp (original)
+++ trunk/gom/xulapp/components/gom/src/xgGtkElement.cpp Mon Sep 1
01:29:45 2008
@@ -26,7 +26,6 @@
#endif
#include "xgGtkElement.h"
-#include "xgGObjectUtils.h"
#include <gtk/gtk.h>
@@ -35,13 +34,17 @@
#include <nsIAtom.h>
#include <nsIAtomService.h>
+#include <nsIDocument.h>
#include <nsIDOMDocument.h>
#include <nsIDOMDocumentEvent.h>
#include <nsIDOMElement.h>
#include <nsIDOMEvent.h>
#include <nsIDOMEventTarget.h>
+#include <nsIDOMNamedNodeMap.h>
#include <nsIDOMNode.h>
#include <nsIDOMUIEvent.h>
+#include <nsIScriptContext.h>
+#include <nsIScriptGlobalObject.h>
#include <nsMemory.h>
#include <nsServiceManagerUtils.h>
#include <nsStringAPI.h>
@@ -54,21 +57,17 @@
{
}
-NS_IMPL_ISUPPORTS3 (xgGtkElement, nsIXTFAttributeHandler, nsIXTFElement,
xgIGObjectHolder)
+NS_IMPL_ISUPPORTS_INHERITED2 (xgGtkElement, xgGObject,
nsIXTFAttributeHandler, nsIXTFElement)
nsresult
-xgGtkElement::Init (GType gtype)
+xgGtkElement::Init (GType aType)
{
- mType = gtype;
- return NS_OK;
-}
-
-/* GObjectPtr getGObject (); */
-NS_IMETHODIMP
-xgGtkElement::GetGObject (GObject **_retval)
-{
- *_retval = mObject ? G_OBJECT (g_object_ref (mObject)) : NULL;
- return NS_OK;
+ nsresult rv;
+ g_print (GOM_LOC ("Creating new <%s>...\n"), g_type_name (aType));
+ GObject *obj = (GObject *)g_object_new (aType, NULL);
+ rv = xgGObject::Init (obj);
+ g_object_unref (obj);
+ return rv;
}
void
@@ -138,14 +137,6 @@
xgGtkElement::OnCreated (nsIXTFElementWrapper *wrapper)
{
nsresult rv;
- if (!mType) {
- return NS_ERROR_FAILURE;
- }
- g_print (GOM_LOC ("Creating new <%s>...\n"), g_type_name (mType));
- mObject = (GObject *)g_object_new (mType, NULL);
- if (!mObject) {
- return NS_ERROR_UNEXPECTED;
- }
mWrapper = wrapper;
mWrapper->SetNotificationMask (NOTIFY_PARENT_CHANGED |
@@ -157,7 +148,12 @@
rv = mWrapper->GetElementNode (getter_AddRefs (elem));
NS_ENSURE_SUCCESS (rv, rv);
- xgGObjectUtils::DefineProperties (elem, mType);
+ JSContext *jscx;
+ rv = GetJSContext (&jscx);
+ NS_ENSURE_SUCCESS (rv, rv);
+
+ rv = DefineProperties (jscx, elem);
+ NS_ENSURE_SUCCESS (rv, rv);
if (GTK_IS_ENTRY (mObject)) {
g_signal_connect (mObject, "activate",
@@ -268,10 +264,49 @@
G_OBJECT_TYPE_NAME (mObject));
return NS_ERROR_FAILURE;
}
- g_assert ((GtkWidget *)parent == gtk_widget_get_parent (GTK_WIDGET
(mObject)));
- g_object_unref (parent);
+ g_assert (GTK_WIDGET (parent) == gtk_widget_get_parent (GTK_WIDGET
(mObject)));
- //g_hash_table_foreach (mAttrs, append_child_attrs_foreach, mObject);
+ nsresult rv;
+ nsCOMPtr<nsIDOMElement> elem;
+ rv = mWrapper->GetElementNode (getter_AddRefs (elem));
+ NS_ENSURE_SUCCESS (rv, rv);
+
+ nsCOMPtr<nsIDOMNamedNodeMap> attrs;
+ rv = elem->GetAttributes (getter_AddRefs (attrs));
+ NS_ENSURE_SUCCESS (rv, rv);
+
+ PRUint32 len;
+ rv = attrs->GetLength (&len);
+ NS_ENSURE_SUCCESS (rv, rv);
+
+ nsCOMPtr<nsIDOMNode> attr;
+ nsAutoString attrName;
+ nsAutoString attrValue;
+ const char *camel_prop;
+ GValue gval = { 0 };
+
+ for (PRUint32 i = 0; i < len; i++) {
+ rv = attrs->Item (i, getter_AddRefs (attr));
+ NS_ENSURE_SUCCESS (rv, rv);
+
+ rv = attr->GetNodeName (attrName);
+ NS_ENSURE_SUCCESS (rv, rv);
+
+ NS_ConvertUTF16toUTF8 attrCName (attrName);
+ camel_prop = gom_camel_uncase (attrCName.get ());
+
+ rv = attr->GetNodeValue (attrValue);
+ NS_ENSURE_SUCCESS (rv, rv);
+
+ g_value_init (&gval, G_TYPE_STRING);
+ g_value_set_string (&gval, NS_ConvertUTF16toUTF8 (attrValue).get ());
+ append_child_attrs_foreach ((gpointer)camel_prop,
+ (gpointer)&gval,
+ (gpointer)mObject);
+
+ GOM_CAMEL_FREE (camel_prop, attrCName.get ());
+ g_value_unset (&gval);
+ }
return NS_OK;
}
@@ -302,9 +337,6 @@
GObject *widget = NULL;
if (!wrappedChild || NS_FAILED (wrappedChild->GetGObject (&widget)) ||
!GTK_IS_WIDGET (widget)) {
- if (widget) {
- g_object_unref (widget);
- }
return NS_ERROR_FAILURE;
}
@@ -410,7 +442,7 @@
GOM_ATOM_TO_GSTRING_RETURN (prop, name, NS_ERROR_INVALID_ARG);
GParamSpec *spec;
guint signal_id;
- *_retval = xgGObjectUtils::Resolve (mType, prop, &spec, &signal_id) ?
PR_TRUE : PR_FALSE;
+ *_retval = Resolve (prop, &spec, &signal_id) ? PR_TRUE : PR_FALSE;
g_print (GOM_LOC ("%s -> %d\n"), prop, *_retval);
return NS_OK;
}
@@ -424,7 +456,7 @@
GParamSpec *spec;
guint signal_id;
- if (!xgGObjectUtils::Resolve (mType, prop, &spec, &signal_id)) {
+ if (!Resolve (prop, &spec, &signal_id)) {
return NS_ERROR_FAILURE;
}
if (!spec) {
@@ -435,7 +467,7 @@
GValue gval = { 0 };
if (G_TYPE_FUNDAMENTAL (G_PARAM_SPEC_VALUE_TYPE (spec)) ==
G_TYPE_OBJECT) {
g_warning (GOM_LOC ("Attribute %s.%s is a %s, which a string cannot be
converted to"),
- g_type_name (mType), prop,
+ G_OBJECT_TYPE_NAME (mObject), prop,
g_type_name (G_PARAM_SPEC_VALUE_TYPE (spec)));
return NS_ERROR_FAILURE;
} else if (gtk_builder_value_from_string (NULL, spec, value, &gval,
&error)) {
@@ -463,7 +495,7 @@
GParamSpec *spec;
guint signal_id;
- if (!xgGObjectUtils::Resolve (mType, prop, &spec, &signal_id)) {
+ if (!Resolve (prop, &spec, &signal_id)) {
return NS_ERROR_FAILURE;
}
if (!spec) {
@@ -490,7 +522,7 @@
GParamSpec *spec;
guint signal_id;
- *_retval = xgGObjectUtils::Resolve (mType, prop, &spec, &signal_id);
+ *_retval = Resolve (prop, &spec, &signal_id);
return NS_OK;
}
@@ -507,4 +539,35 @@
xgGtkElement::GetAttributeNameAt (PRUint32 index, nsIAtom **_retval)
{
XG_RETURN_NOT_IMPLEMENTED;
+}
+
+nsresult
+xgGtkElement::GetJSContext (JSContext **jscx)
+{
+ nsresult rv;
+
+ nsCOMPtr<nsIDOMElement> elem;
+ rv = mWrapper->GetElementNode (getter_AddRefs (elem));
+ NS_ENSURE_SUCCESS (rv, rv);
+
+ nsCOMPtr<nsIDOMDocument> doc;
+ rv = elem->GetOwnerDocument (getter_AddRefs (doc));
+ NS_ENSURE_SUCCESS (rv, rv);
+
+ nsCOMPtr<nsIDocument> nsdoc (do_QueryInterface (doc, &rv));
+ NS_ENSURE_SUCCESS (rv, rv);
+
+ nsCOMPtr<nsIScriptGlobalObject> global (nsdoc->GetScriptGlobalObject
());
+ NS_ENSURE_TRUE (global, NS_ERROR_UNEXPECTED);
+
+ rv = global->EnsureScriptEnvironment
(nsIProgrammingLanguage::JAVASCRIPT);
+ NS_ENSURE_SUCCESS (rv, rv);
+
+ nsCOMPtr<nsIScriptContext> cx (global->GetScriptContext
(nsIProgrammingLanguage::JAVASCRIPT));
+ NS_ENSURE_TRUE (cx, NS_ERROR_UNEXPECTED);
+
+ *jscx = (JSContext *)cx->GetNativeContext ();
+ NS_ENSURE_TRUE (*jscx, NS_ERROR_UNEXPECTED);
+
+ return NS_OK;
}
Modified: trunk/gom/xulapp/components/gom/src/xgGtkElement.h
==============================================================================
--- trunk/gom/xulapp/components/gom/src/xgGtkElement.h (original)
+++ trunk/gom/xulapp/components/gom/src/xgGtkElement.h Mon Sep 1 01:29:45
2008
@@ -24,7 +24,7 @@
#ifndef XG_GTK_ELEMENT_H
#define XG_GTK_ELEMENT_H
-#include "xgIGObjectHolder.h"
+#include "xgGObject.h"
#include <nsIXTFElement.h>
#include <nsIXTFElementWrapper.h>
@@ -34,13 +34,13 @@
#include <glib-object.h>
#include <gtk/gtk.h>
-class xgGtkElement : public xgIGObjectHolder,
+class xgGtkElement : public xgGObject,
public nsIXTFAttributeHandler,
- public nsIXTFElement
+ public nsIXTFElement
{
public:
- NS_DECL_ISUPPORTS
- NS_DECL_XGIGOBJECTHOLDER
+ NS_DECL_ISUPPORTS_INHERITED
+ NS_FORWARD_XGIGOBJECTHOLDER(xgGObject::)
NS_DECL_NSIXTFATTRIBUTEHANDLER
NS_DECL_NSIXTFELEMENT
@@ -48,10 +48,8 @@
nsresult Init (GType aType);
protected:
+ nsresult GetJSContext (JSContext **jscx);
nsCOMPtr<nsIXTFElementWrapper> mWrapper;
-
- GType mType;
- GObject *mObject;
private:
~xgGtkElement();
Modified: trunk/gom/xulapp/components/gom/src/xgScriptElement.cpp
==============================================================================
--- trunk/gom/xulapp/components/gom/src/xgScriptElement.cpp (original)
+++ trunk/gom/xulapp/components/gom/src/xgScriptElement.cpp Mon Sep 1
01:29:45 2008
@@ -131,7 +131,8 @@
nsAutoString aRet;
PRBool isUndefined;
- rv = cx->EvaluateString (mScript, NULL, NULL, NULL, 0, 0, &aRet,
&isUndefined);
+ rv = cx->EvaluateString (mScript, global->GetGlobalJSObject (), NULL,
+ mSrc.get (), 0, 0, &aRet, &isUndefined);
mScript.Truncate ();
mGlobal = NULL;
NS_ENSURE_SUCCESS (rv, rv);