diff dwt/browser/Mozilla.d @ 125:5583f8eeee6c

Synced mozilla with dwt-linux
author Jacob Carlborg <doob@me.com>
date Fri, 16 Jan 2009 12:49:08 +0100
parents d8635bb48c7c
children 38807a925e24
line wrap: on
line diff
--- a/dwt/browser/Mozilla.d	Fri Jan 16 12:19:08 2009 +0100
+++ b/dwt/browser/Mozilla.d	Fri Jan 16 12:49:08 2009 +0100
@@ -1,5 +1,5 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2008 IBM Corporation and others.
+/*******************************************************************************
+ * Copyright (c) 2003, 2007 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -7,30 +7,54 @@
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ * Port to the D programming language:
+ *      John Reimer <terminal.node@gmail.com>
  *******************************************************************************/
 module dwt.browser.Mozilla;
 
 import dwt.dwthelper.utils;
 
-import java.io.UnsupportedEncodingException;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.Enumeration;
-import java.util.Locale;
-import java.util.Vector;
+import tango.text.locale.Core;
+import tango.io.Stdout;
+import tango.text.convert.Format;
+import tango.io.Console;
+import tango.sys.Environment;
+import tango.stdc.string;
+
+import dwt.internal.c.gtk;
 
 import dwt.DWT;
 import dwt.DWTError;
 import dwt.graphics.Device;
 import dwt.graphics.Point;
 import dwt.graphics.Rectangle;
-import dwt.internal.C;
+
+import dwt.browser.Browser;
+import dwt.browser.WebBrowser;
+import dwt.browser.MozillaDelegate;
+import dwt.browser.AppFileLocProvider;
+import dwt.browser.WindowCreator2;
+import dwt.browser.PromptService2Factory;
+import dwt.browser.HelperAppLauncherDialogFactory;
+import dwt.browser.DownloadFactory;
+import dwt.browser.DownloadFactory_1_8;
+import dwt.browser.FilePickerFactory;
+import dwt.browser.FilePickerFactory_1_8;
+import dwt.browser.InputStream;
+import dwt.browser.StatusTextEvent;
+import dwt.browser.ProgressEvent;
+import dwt.browser.LocationEvent;
+import dwt.browser.WindowEvent;
+import dwt.browser.TitleEvent;
+
 import dwt.internal.Compatibility;
 import dwt.internal.LONG;
 import dwt.internal.Library;
-import dwt.internal.mozilla.XPCOM;
-import dwt.internal.mozilla.XPCOMObject;
+
+import XPCOM = dwt.internal.mozilla.XPCOM;
+import XPCOMInit = dwt.internal.mozilla.XPCOMInit;
+
+import dwt.internal.mozilla.Common;
 import dwt.internal.mozilla.nsEmbedString;
 import dwt.internal.mozilla.nsIAppShell;
 import dwt.internal.mozilla.nsIBaseWindow;
@@ -41,7 +65,9 @@
 import dwt.internal.mozilla.nsICookie;
 import dwt.internal.mozilla.nsICookieManager;
 import dwt.internal.mozilla.nsID;
+import dwt.internal.mozilla.nsIDOMNode;
 import dwt.internal.mozilla.nsIDOMEvent;
+import dwt.internal.mozilla.nsIDOMEventListener;
 import dwt.internal.mozilla.nsIDOMEventTarget;
 import dwt.internal.mozilla.nsIDOMKeyEvent;
 import dwt.internal.mozilla.nsIDOMMouseEvent;
@@ -49,12 +75,12 @@
 import dwt.internal.mozilla.nsIDOMSerializer_1_7;
 import dwt.internal.mozilla.nsIDOMWindow;
 import dwt.internal.mozilla.nsIDOMWindowCollection;
+import dwt.internal.mozilla.nsIDOMDocument;
 import dwt.internal.mozilla.nsIDirectoryService;
 import dwt.internal.mozilla.nsIDocShell;
-import dwt.internal.mozilla.nsIDocShell_1_8;
-import dwt.internal.mozilla.nsIDocShell_1_9;
 import dwt.internal.mozilla.nsIEmbeddingSiteWindow;
 import dwt.internal.mozilla.nsIFile;
+import dwt.internal.mozilla.nsIFactory;
 import dwt.internal.mozilla.nsIIOService;
 import dwt.internal.mozilla.nsIInterfaceRequestor;
 import dwt.internal.mozilla.nsIJSContextStack;
@@ -64,10 +90,11 @@
 import dwt.internal.mozilla.nsIPrefLocalizedString;
 import dwt.internal.mozilla.nsIPrefService;
 import dwt.internal.mozilla.nsIProperties;
+import dwt.internal.mozilla.nsIRequest;
 import dwt.internal.mozilla.nsIServiceManager;
 import dwt.internal.mozilla.nsISimpleEnumerator;
+import dwt.internal.mozilla.nsIStreamListener;
 import dwt.internal.mozilla.nsISupports;
-import dwt.internal.mozilla.nsISupportsWeakReference;
 import dwt.internal.mozilla.nsITooltipListener;
 import dwt.internal.mozilla.nsIURI;
 import dwt.internal.mozilla.nsIURIContentListener;
@@ -81,8 +108,9 @@
 import dwt.internal.mozilla.nsIWebProgress;
 import dwt.internal.mozilla.nsIWebProgressListener;
 import dwt.internal.mozilla.nsIWindowWatcher;
-import dwt.internal.mozilla.init.GREVersionRange;
-import dwt.internal.mozilla.init.XPCOMInit;
+import dwt.internal.mozilla.nsIWindowCreator;
+import dwt.internal.mozilla.nsStringAPI;
+
 import dwt.layout.FillLayout;
 import dwt.widgets.Composite;
 import dwt.widgets.Display;
@@ -91,34 +119,34 @@
 import dwt.widgets.Listener;
 import dwt.widgets.Menu;
 import dwt.widgets.Shell;
+import dwt.widgets.Control;
 
-class Mozilla : WebBrowser {
-    int /*long*/ embedHandle;
+class Mozilla : WebBrowser, 
+                nsIWeakReference, 
+                nsIWebProgressListener, 
+                nsIWebBrowserChrome,
+                nsIWebBrowserChromeFocus, 
+                nsIEmbeddingSiteWindow, 
+                nsIInterfaceRequestor, 
+                nsISupportsWeakReference, 
+                nsIContextMenuListener, 
+                nsIURIContentListener,
+                nsITooltipListener, 
+                nsIDOMEventListener {
+                    
+    GtkWidget* embedHandle;
     nsIWebBrowser webBrowser;
     Object webBrowserObject;
-    MozillaDelegate delegate;
+    MozillaDelegate mozDelegate;
 
-    /* Interfaces for this Mozilla embedding notification */
-    XPCOMObject supports;
-    XPCOMObject weakReference;
-    XPCOMObject webProgressListener;
-    XPCOMObject webBrowserChrome;
-    XPCOMObject webBrowserChromeFocus;
-    XPCOMObject embeddingSiteWindow;
-    XPCOMObject interfaceRequestor;
-    XPCOMObject supportsWeakReference;
-    XPCOMObject contextMenuListener;    
-    XPCOMObject uriContentListener;
-    XPCOMObject tooltipListener;
-    XPCOMObject domEventListener;
     int chromeFlags = nsIWebBrowserChrome.CHROME_DEFAULT;
     int refCount, lastKeyCode, lastCharCode;
-    int /*long*/ request;
+    nsIRequest request;
     Point location, size;
     bool visible, isChild, ignoreDispose, awaitingNavigate;
     Shell tip = null;
     Listener listener;
-    Vector unhookedDOMWindows = new Vector ();
+    nsIDOMWindow[] unhookedDOMWindows;
 
     static nsIAppShell AppShell;
     static AppFileLocProvider LocationProvider;
@@ -151,7 +179,7 @@
     static final String PREFERENCE_PROXYTYPE = "network.proxy.type"; //$NON-NLS-1$
     static final String PROFILE_AFTER_CHANGE = "profile-after-change"; //$NON-NLS-1$
     static final String PROFILE_BEFORE_CHANGE = "profile-before-change"; //$NON-NLS-1$
-    static final String PROFILE_DIR = SEPARATOR_OS + "eclipse" + SEPARATOR_OS; //$NON-NLS-1$
+    static       String PROFILE_DIR; //= SEPARATOR_OS ~ "eclipse" ~ SEPARATOR_OS; //$NON-NLS-1$
     static final String PROFILE_DO_CHANGE = "profile-do-change"; //$NON-NLS-1$
     static final String PROPERTY_PROXYPORT = "network.proxy_port"; //$NON-NLS-1$
     static final String PROPERTY_PROXYHOST = "network.proxy_host"; //$NON-NLS-1$
@@ -165,160 +193,110 @@
     // TEMPORARY CODE
     static final String GRE_INITIALIZED = "dwt.browser.XULRunnerInitialized"; //$NON-NLS-1$
 
-    static {
-        MozillaClearSessions = new Runnable () {
+    this () {
+        PROFILE_DIR = SEPARATOR_OS ~ "eclipse" ~ SEPARATOR_OS;
+        MozillaClearSessions = new class() Runnable {
             public void run () {
                 if (!Initialized) return;
-                int /*long*/[] result = new int /*long*/[1];
-                int rc = XPCOM.NS_GetServiceManager (result);
-                if (rc !is XPCOM.NS_OK) error (rc);
-                if (result[0] is 0) error (XPCOM.NS_NOINTERFACE);
-                nsIServiceManager serviceManager = new nsIServiceManager (result[0]);
-                result[0] = 0;
-                byte[] aContractID = MozillaDelegate.wcsToMbcs (null, XPCOM.NS_COOKIEMANAGER_CONTRACTID, true);
-                rc = serviceManager.GetServiceByContractID (aContractID, nsICookieManager.NS_ICOOKIEMANAGER_IID, result);
-                if (rc !is XPCOM.NS_OK) error (rc);
-                if (result[0] is 0) error (XPCOM.NS_NOINTERFACE);
+                nsIServiceManager serviceManager;
+                int rc = XPCOM.NS_GetServiceManager (&serviceManager);
+                if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+                if (serviceManager is null) error (XPCOM.NS_NOINTERFACE, __FILE__, __LINE__);
+
+                nsICookieManager manager;
+                rc = serviceManager.GetServiceByContractID (XPCOM.NS_COOKIEMANAGER_CONTRACTID.ptr, &nsICookieManager.IID, cast(void**)&manager);
+                if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+                if (manager is null) error (XPCOM.NS_NOINTERFACE, __FILE__, __LINE__);
                 serviceManager.Release ();
 
-                nsICookieManager manager = new nsICookieManager (result[0]);
-                result[0] = 0;
-                rc = manager.GetEnumerator (result);
-                if (rc !is XPCOM.NS_OK) error (rc);
+                nsISimpleEnumerator enumerator;
+                rc = manager.GetEnumerator (&enumerator);
+                if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
                 manager.Release ();
 
-                nsISimpleEnumerator enumerator = new nsISimpleEnumerator (result[0]);
-                int[] moreElements = new int[1]; /* PRBool */
-                rc = enumerator.HasMoreElements (moreElements);
-                if (rc !is XPCOM.NS_OK) error (rc);
-                while (moreElements[0] !is 0) {
-                    result[0] = 0;
-                    rc = enumerator.GetNext (result);
-                    if (rc !is XPCOM.NS_OK) error (rc);
-                    nsICookie cookie = new nsICookie (result[0]);
-                    long[] expires = new long[1];
-                    rc = cookie.GetExpires (expires);
-                    if (expires[0] is 0) {
+                PRBool moreElements;
+                rc = enumerator.HasMoreElements (&moreElements);
+                if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+                while (moreElements !is 0) {
+                    nsICookie cookie;
+                    rc = enumerator.GetNext (cast(nsISupports*)&cookie);
+                    if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+                    PRUint64 expires;
+                    rc = cookie.GetExpires (&expires);
+                    if (expires is 0) {
                         /* indicates a session cookie */
-                        int /*long*/ domain = XPCOM.nsEmbedCString_new ();
-                        int /*long*/ name = XPCOM.nsEmbedCString_new ();
-                        int /*long*/ path = XPCOM.nsEmbedCString_new ();
-                        cookie.GetHost (domain);
-                        cookie.GetName (name);
-                        cookie.GetPath (path);
-                        rc = manager.Remove (domain, name, path, 0);
-                        XPCOM.nsEmbedCString_delete (domain);
-                        XPCOM.nsEmbedCString_delete (name);
-                        XPCOM.nsEmbedCString_delete (path);
-                        if (rc !is XPCOM.NS_OK) error (rc);
+                        scope auto domain = new nsEmbedCString;
+                        scope auto name = new nsEmbedCString;
+                        scope auto path = new nsEmbedCString;
+                        cookie.GetHost (cast(nsACString*)domain);
+                        cookie.GetName (cast(nsACString*)name);
+                        cookie.GetPath (cast(nsACString*)path);
+                        rc = manager.Remove (cast(nsACString*)domain, cast(nsACString*)name, cast(nsACString*)path, 0);
+                        if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
                     }
                     cookie.Release ();
-                    rc = enumerator.HasMoreElements (moreElements);
-                    if (rc !is XPCOM.NS_OK) error (rc);
+                    rc = enumerator.HasMoreElements (&moreElements);
+                    if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
                 }
                 enumerator.Release ();
             }
         };
     }
 
+extern(D)
 public void create (Composite parent, int style) {
-    delegate = new MozillaDelegate (browser);
-    final Display display = parent.getDisplay ();
+    mozDelegate = new MozillaDelegate (super.browser);
+    Display display = parent.getDisplay ();
 
-    int /*long*/[] result = new int /*long*/[1];
     if (!Initialized) {
         bool initLoaded = false;
         bool IsXULRunner = false;
 
-        String greInitialized = System.getProperty cast(GRE_INITIALIZED); 
-        if ("true".equals (greInitialized)) { //$NON-NLS-1$
+        String greInitialized = System.getProperty (GRE_INITIALIZED); 
+        if ("true" == greInitialized) { //$NON-NLS-1$
             /* 
              * Another browser has already initialized xulrunner in this process,
              * so just bind to it instead of trying to initialize a new one.
              */
             Initialized = true;
         }
-
-        String mozillaPath = System.getProperty cast(XULRUNNER_PATH);
-        /*
-        * Browser clients that ship XULRunner in a plug-in must have an opportunity 
-        * to set the dwt.browser.XULRunnerPath system property to point
-        * at their XULRunner before the first Mozilla-based Browser is created.  To
-        * facilitate this, reflection is used to reference non-existent class
-        * dwt.browser.XULRunnerInitializer the first time a Mozilla-
-        * based Browser is created.   A client wishing to use this hook can do so
-        * by creating a fragment of dwt that implements this class and
-        * sets the system property in its static initializer.
-        */
+        String mozillaPath = System.getProperty (XULRUNNER_PATH);
         if (mozillaPath is null) {
-            try {
-                Class.forName ("dwt.browser.XULRunnerInitializer"); //$NON-NLS-1$
-                mozillaPath = System.getProperty cast(XULRUNNER_PATH);
-            } catch (ClassNotFoundException e) {
-                /* no fragment is providing this class, which is the typical case */
-            }
-        }
-
-        if (mozillaPath is null) {
-            try {
-                String libName = delegate.getSWTInitLibraryName ();
-                Library.loadLibrary (libName);
-                initLoaded = true;
-            } catch (UnsatisfiedLinkError e) {
-                /* 
-                * If this library failed to load then do not attempt to detect a
-                * xulrunner to use.  The Browser may still be usable if MOZILLA_FIVE_HOME
-                * points at a GRE. 
-                */
-            }
+            // we don't need to load an initial library in D, so set to "true"
+            initLoaded = true;
         } else {
-            mozillaPath += SEPARATOR_OS + delegate.getLibraryName ();
+            mozillaPath ~= SEPARATOR_OS ~ mozDelegate.getLibraryName ();
             IsXULRunner = true;
         }
-
+         
         if (initLoaded) {
             /* attempt to discover a XULRunner to use as the GRE */
-            GREVersionRange range = new GREVersionRange ();
-            byte[] bytes = MozillaDelegate.wcsToMbcs (null, GRERANGE_LOWER, true);
-            int /*long*/ lower = C.malloc (bytes.length);
-            C.memmove (lower, bytes, bytes.length);
-            range.lower = lower;
+            XPCOMInit.GREVersionRange range;
+
+            range.lower = GRERANGE_LOWER.ptr;
             range.lowerInclusive = LowerRangeInclusive;
 
-            bytes = MozillaDelegate.wcsToMbcs (null, GRERANGE_UPPER, true);
-            int /*long*/ upper = C.malloc (bytes.length);
-            C.memmove (upper, bytes, bytes.length);
-            range.upper = upper;
+            range.upper = GRERANGE_UPPER.ptr;
             range.upperInclusive = UpperRangeInclusive;
 
-            int length = XPCOMInit.PATH_MAX;
-            int /*long*/ greBuffer = C.malloc (length);
-            int /*long*/ propertiesPtr = C.malloc (2 * C.PTR_SIZEOF);
-            int rc = XPCOMInit.GRE_GetGREPathWithProperties (range, 1, propertiesPtr, 0, greBuffer, length);
+            char[] greBuffer = new char[XPCOMInit.PATH_MAX];
+
+            int rc = XPCOMInit.GRE_GetGREPathWithProperties (&range, 1, null, 0, greBuffer.ptr, greBuffer.length);
 
             /*
              * A XULRunner was not found that supports wrapping of XPCOM handles as JavaXPCOM objects.
              * Drop the lower version bound and try to detect an earlier XULRunner installation.
              */
+
             if (rc !is XPCOM.NS_OK) {
-                C.free (lower);
-                bytes = MozillaDelegate.wcsToMbcs (null, GRERANGE_LOWER_FALLBACK, true);
-                lower = C.malloc (bytes.length);
-                C.memmove (lower, bytes, bytes.length);
-                range.lower = lower;
-                rc = XPCOMInit.GRE_GetGREPathWithProperties (range, 1, propertiesPtr, 0, greBuffer, length);
+                range.lower = GRERANGE_LOWER_FALLBACK.ptr;
+                rc = XPCOMInit.GRE_GetGREPathWithProperties (&range, 1, null, 0, greBuffer.ptr, greBuffer.length);
             }
 
-            C.free (lower);
-            C.free (upper);
-            C.free (propertiesPtr);
             if (rc is XPCOM.NS_OK) {
                 /* indicates that a XULRunner was found */
-                length = C.strlen (greBuffer);
-                bytes = new byte[length];
-                C.memmove (bytes, greBuffer, length);
-                mozillaPath = new String (MozillaDelegate.mbcsToWcs (null, bytes));
-                IsXULRunner = mozillaPath.length () > 0;
+                mozillaPath = greBuffer;
+                IsXULRunner = mozillaPath.length > 0;
 
                 /*
                  * Test whether the detected XULRunner can be used as the GRE before loading swt's
@@ -328,36 +306,34 @@
                  * One case where this will fail is attempting to use a 64-bit xulrunner while swt
                  * is running in 32-bit mode, or vice versa.
                  */
+
                 if (IsXULRunner) {
-                    byte[] path = MozillaDelegate.wcsToMbcs (null, mozillaPath, true);
-                    rc = XPCOMInit.XPCOMGlueStartup (path);
+                    rc = XPCOMInit.XPCOMGlueStartup (mozillaPath.ptr);
                     if (rc !is XPCOM.NS_OK) {
-                        mozillaPath = mozillaPath.substring (0, mozillaPath.lastIndexOf cast(SEPARATOR_OS));
-                        if (Device.DEBUG) System.out.println ("cannot use detected XULRunner: " + mozillaPath); //$NON-NLS-1$
+                        mozillaPath = mozillaPath.substring (0, mozillaPath.lastIndexOf (SEPARATOR_OS));
+                        if (Device.DEBUG) Cerr ("cannot use detected XULRunner: ") (mozillaPath).newline; //$NON-NLS-1$
+                        
+                        /* attempt to XPCOMGlueStartup the GRE pointed at by MOZILLA_FIVE_HOME */
+                        auto ptr = Environment.get(XPCOM.MOZILLA_FIVE_HOME);
 
-                        /* attempt to XPCOMGlueStartup the GRE pointed at by MOZILLA_FIVE_HOME */
-                        int /*long*/ ptr = C.getenv (MozillaDelegate.wcsToMbcs (null, XPCOM.MOZILLA_FIVE_HOME, true));
-                        if (ptr is 0) {
+                        if (ptr is null) {
                             IsXULRunner = false;
                         } else {
-                            length = C.strlen (ptr);
-                            byte[] buffer = new byte[length];
-                            C.memmove (buffer, ptr, length);
-                            mozillaPath = new String (MozillaDelegate.mbcsToWcs (null, buffer));
+                            mozillaPath = ptr;
                             /*
                              * Attempting to XPCOMGlueStartup a mozilla-based GRE !is xulrunner can
                              * crash, so don't attempt unless the GRE appears to be xulrunner.
                              */
                             if (mozillaPath.indexOf("xulrunner") is -1) { //$NON-NLS-1$
                                 IsXULRunner = false;    
+
                             } else {
-                                mozillaPath += SEPARATOR_OS + delegate.getLibraryName ();
-                                path = MozillaDelegate.wcsToMbcs (null, mozillaPath, true);
-                                rc = XPCOMInit.XPCOMGlueStartup (path);
+                                mozillaPath ~= SEPARATOR_OS ~ mozDelegate.getLibraryName ();
+                                rc = XPCOMInit.XPCOMGlueStartup (toStringz(mozillaPath));
                                 if (rc !is XPCOM.NS_OK) {
                                     IsXULRunner = false;
                                     mozillaPath = mozillaPath.substring (0, mozillaPath.lastIndexOf (SEPARATOR_OS));
-                                    if (Device.DEBUG) System.out.println ("failed to start as XULRunner: " + mozillaPath); //$NON-NLS-1$
+                                    if (Device.DEBUG) Cerr ("failed to start as XULRunner: " )(mozillaPath).newline; //$NON-NLS-1$
                                 }
                             }
                         } 
@@ -367,50 +343,36 @@
                     }
                 }
             }
-            C.free (greBuffer);
         }
 
         if (IsXULRunner) {
-            if (Device.DEBUG) System.out.println ("XULRunner path: " + mozillaPath); //$NON-NLS-1$
-            try {
-                Library.loadLibrary ("swt-xulrunner"); //$NON-NLS-1$
-            } catch (UnsatisfiedLinkError e) {
-                DWT.error (DWT.ERROR_NO_HANDLES, e);
-            }
-            byte[] path = MozillaDelegate.wcsToMbcs (null, mozillaPath, true);
-            int rc = XPCOM.XPCOMGlueStartup (path);
-            if (rc !is XPCOM.NS_OK) {
-                browser.dispose ();
-                error (rc);
-            }
+            if (Device.DEBUG) Cerr ("XULRunner path: ") (mozillaPath).newline; //$NON-NLS-1$
+
             XPCOMWasGlued = true;
 
             /*
              * Remove the trailing xpcom lib name from mozillaPath because the
              * Mozilla.initialize and NS_InitXPCOM2 invocations require a directory name only.
-             */ 
-            mozillaPath = mozillaPath.substring (0, mozillaPath.lastIndexOf cast(SEPARATOR_OS));
+             */
+            mozillaPath = mozillaPath.substring (0, mozillaPath.lastIndexOf (SEPARATOR_OS));
         } else {
             if ((style & DWT.MOZILLA) !is 0) {
                 browser.dispose ();
-                String errorString = (mozillaPath !is null && mozillaPath.length () > 0) ?
-                    " [Failed to use detected XULRunner: " + mozillaPath + "]" :
+                String errorString = (mozillaPath !is null && mozillaPath.length > 0) ?
+                    " [Failed to use detected XULRunner: " ~ mozillaPath ~ "]" :
                     " [Could not detect registered XULRunner to use]";  //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
                 DWT.error (DWT.ERROR_NO_HANDLES, null, errorString);
             }
 
             /* attempt to use the GRE pointed at by MOZILLA_FIVE_HOME */
-            int /*long*/ ptr = C.getenv (MozillaDelegate.wcsToMbcs (null, XPCOM.MOZILLA_FIVE_HOME, true));
-            if (ptr !is 0) {
-                int length = C.strlen (ptr);
-                byte[] buffer = new byte[length];
-                C.memmove (buffer, ptr, length);
-                mozillaPath = new String (MozillaDelegate.mbcsToWcs (null, buffer));
+            auto mozFiveHome = Environment.get(XPCOM.MOZILLA_FIVE_HOME);
+            if (mozFiveHome !is null) {
+                mozillaPath = mozFiveHome;
             } else {
                 browser.dispose ();
                 DWT.error (DWT.ERROR_NO_HANDLES, null, " [Unknown Mozilla path (MOZILLA_FIVE_HOME not set)]"); //$NON-NLS-1$
             }
-            if (Device.DEBUG) System.out.println ("Mozilla path: " + mozillaPath); //$NON-NLS-1$
+            if (Device.DEBUG) Cerr ("Mozilla path: ") (mozillaPath).newline; //$NON-NLS-1$
 
             /*
             * Note.  Embedding a Mozilla GTK1.2 causes a crash.  The workaround
@@ -422,38 +384,17 @@
                 browser.dispose ();
                 DWT.error (DWT.ERROR_NO_HANDLES, null, " [Mozilla GTK2 required (GTK1.2 detected)]"); //$NON-NLS-1$                         
             }
-
-            try {
-                Library.loadLibrary ("swt-mozilla"); //$NON-NLS-1$
-            } catch (UnsatisfiedLinkError e) {
-                try {
-                    /* 
-                     * The initial loadLibrary attempt may have failed as a result of the user's
-                     * system not having libstdc++.so.6 installed, so try to load the alternate
-                     * swt mozilla library that depends on libswtc++.so.5 instead.
-                     */
-                    Library.loadLibrary ("swt-mozilla-gcc3"); //$NON-NLS-1$
-                } catch (UnsatisfiedLinkError ex) {
-                    browser.dispose ();
-                    /*
-                     * Print the error from the first failed attempt since at this point it's
-                     * known that the failure was not due to the libstdc++.so.6 dependency.
-                     */
-                    DWT.error (DWT.ERROR_NO_HANDLES, e, " [MOZILLA_FIVE_HOME='" + mozillaPath + "']"); //$NON-NLS-1$ //$NON-NLS-2$
-                }
-            }
         }
 
         if (!Initialized) {
-            int /*long*/[] retVal = new int /*long*/[1];
-            nsEmbedString pathString = new nsEmbedString (mozillaPath);
-            int rc = XPCOM.NS_NewLocalFile (pathString.getAddress (), 1, retVal);
-            pathString.dispose ();
+            nsILocalFile localFile;
+            scope auto pathString = new nsEmbedString (mozillaPath.toString16());
+            nsresult rc = XPCOM.NS_NewLocalFile (cast(nsAString*)pathString, 1, &localFile);
             if (rc !is XPCOM.NS_OK) {
                 browser.dispose ();
-                error (rc);
+                error (rc, __FILE__, __LINE__);
             }
-            if (retVal[0] is 0) {
+            if (localFile is null) {
                 browser.dispose ();
                 error (XPCOM.NS_ERROR_NULL_POINTER);
             }
@@ -461,12 +402,18 @@
             LocationProvider = new AppFileLocProvider (mozillaPath);
             LocationProvider.AddRef ();
 
-            nsIFile localFile = new nsILocalFile (retVal[0]);
-            rc = XPCOM.NS_InitXPCOM2 (0, localFile.getAddress(), LocationProvider.getAddress ());
+            nsIDirectoryServiceProvider directoryServiceProvider;
+            rc = LocationProvider.QueryInterface( &nsIDirectoryServiceProvider.IID, cast(void**)&directoryServiceProvider);
+            if (rc !is XPCOM.NS_OK) {
+                browser.dispose();
+                error(rc);
+            }
+            rc = XPCOM.NS_InitXPCOM2 (null, cast(nsIFile)localFile, directoryServiceProvider);
             localFile.Release ();
+            LocationProvider.Release();
             if (rc !is XPCOM.NS_OK) {
                 browser.dispose ();
-                DWT.error (DWT.ERROR_NO_HANDLES, null, " [MOZILLA_FIVE_HOME may not point at an embeddable GRE] [NS_InitEmbedding " + mozillaPath + " error " + rc + "]"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+                DWT.error (DWT.ERROR_NO_HANDLES, null, Format(" [MOZILLA_FIVE_HOME may not point at an embeddable GRE] [NS_InitEmbedding {0} error {1} ] ", mozillaPath, rc ) ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
             }
             System.setProperty (GRE_INITIALIZED, "true"); //$NON-NLS-1$
             if (IsXULRunner) {
@@ -474,195 +421,147 @@
             }
         }
 
-        /* If JavaXPCOM is detected then attempt to initialize it with the XULRunner being used */
-        if (IsXULRunner) {
-            try {
-                Class clazz = Class.forName ("org.mozilla.xpcom.Mozilla"); //$NON-NLS-1$
-                Method method = clazz.getMethod ("getInstance", new Class[0]); //$NON-NLS-1$
-                Object mozilla = method.invoke (null, new Object[0]);
-                method = clazz.getMethod ("getComponentManager", new Class[0]); //$NON-NLS-1$
-                try {
-                    method.invoke (mozilla, new Object[0]);
-                } catch (InvocationTargetException e) {
-                    /* indicates that JavaXPCOM has not been initialized yet */
-                    Class fileClass = Class.forName ("java.io.File"); //$NON-NLS-1$
-                    method = clazz.getMethod ("initialize", new Class[] {fileClass}); //$NON-NLS-1$
-                    Constructor constructor = fileClass.getDeclaredConstructor (new Class[] {String.class});
-                    Object argument = constructor.newInstance (new Object[] {mozillaPath});
-                    method.invoke (mozilla, new Object[] {argument});
-                }
-            } catch (ClassNotFoundException e) {
-                /* JavaXPCOM is not on the classpath */
-            } catch (NoSuchMethodException e) {
-                /* the JavaXPCOM on the classpath does not implement initialize() */
-            } catch (IllegalArgumentException e) {
-            } catch (IllegalAccessException e) {
-            } catch (InvocationTargetException e) {
-            } catch (InstantiationException e) {
-            }
-        }
-
-        int rc = XPCOM.NS_GetComponentManager (result);
+        nsIComponentManager componentManager;
+        int rc = XPCOM.NS_GetComponentManager (&componentManager);
         if (rc !is XPCOM.NS_OK) {
             browser.dispose ();
-            error (rc);
+            error (rc, __FILE__, __LINE__);
         }
-        if (result[0] is 0) {
+        if (componentManager is null) {
             browser.dispose ();
-            error (XPCOM.NS_NOINTERFACE);
+            error (XPCOM.NS_NOINTERFACE, __FILE__, __LINE__);
         }
         
-        nsIComponentManager componentManager = new nsIComponentManager (result[0]);
-        result[0] = 0;
-        if (delegate.needsSpinup ()) {
+        if (mozDelegate.needsSpinup ()) {
             /* nsIAppShell is discontinued as of xulrunner 1.9, so do not fail if it is not found */
-            rc = componentManager.CreateInstance (XPCOM.NS_APPSHELL_CID, 0, nsIAppShell.NS_IAPPSHELL_IID, result);
+            rc = componentManager.CreateInstance (&XPCOM.NS_APPSHELL_CID, null, &nsIAppShell.IID, cast(void**)&AppShell);
             if (rc !is XPCOM.NS_ERROR_NO_INTERFACE) {
                 if (rc !is XPCOM.NS_OK) {
                     browser.dispose ();
-                    error (rc);
+                    error (rc, __FILE__, __LINE__);
                 }
-                if (result[0] is 0) {
+                if (AppShell is null) {
                     browser.dispose ();
-                    error (XPCOM.NS_NOINTERFACE);
+                    error (XPCOM.NS_NOINTERFACE, __FILE__, __LINE__);
                 }
     
-                AppShell = new nsIAppShell (result[0]);
-                rc = AppShell.Create (0, null);
+                rc = AppShell.Create (null, null);
                 if (rc !is XPCOM.NS_OK) {
                     browser.dispose ();
-                    error (rc);
+                    error (rc, __FILE__, __LINE__);
                 }
                 rc = AppShell.Spinup ();
                 if (rc !is XPCOM.NS_OK) {
                     browser.dispose ();
-                    error (rc);
+                    error (rc, __FILE__, __LINE__);
                 }
             }
-            result[0] = 0;
         }
 
-        WindowCreator = new WindowCreator2 ();
+        WindowCreator = new WindowCreator2;
         WindowCreator.AddRef ();
         
-        rc = XPCOM.NS_GetServiceManager (result);
+        nsIServiceManager serviceManager;
+        rc = XPCOM.NS_GetServiceManager (&serviceManager);
         if (rc !is XPCOM.NS_OK) {
             browser.dispose ();
-            error (rc);
+            error (rc, __FILE__, __LINE__);
         }
-        if (result[0] is 0) {
+        if (serviceManager is null) {
             browser.dispose ();
-            error (XPCOM.NS_NOINTERFACE);
+            error (XPCOM.NS_NOINTERFACE, __FILE__, __LINE__);
         }
         
-        nsIServiceManager serviceManager = new nsIServiceManager (result[0]);
-        result[0] = 0;      
-        byte[] aContractID = MozillaDelegate.wcsToMbcs (null, XPCOM.NS_WINDOWWATCHER_CONTRACTID, true);
-        rc = serviceManager.GetServiceByContractID (aContractID, nsIWindowWatcher.NS_IWINDOWWATCHER_IID, result);
+        nsIWindowWatcher windowWatcher;
+        rc = serviceManager.GetServiceByContractID (XPCOM.NS_WINDOWWATCHER_CONTRACTID.ptr, &nsIWindowWatcher.IID, cast(void**)&windowWatcher);
         if (rc !is XPCOM.NS_OK) {
             browser.dispose ();
-            error (rc);
+            error (rc, __FILE__, __LINE__);
         }
-        if (result[0] is 0) {
+        if (windowWatcher is null) {
             browser.dispose ();
-            error (XPCOM.NS_NOINTERFACE);       
+            error (XPCOM.NS_NOINTERFACE, __FILE__, __LINE__);       
         }
 
-        nsIWindowWatcher windowWatcher = new nsIWindowWatcher (result[0]);
-        result[0] = 0;
-        rc = windowWatcher.SetWindowCreator (WindowCreator.getAddress());
+        rc = windowWatcher.SetWindowCreator (cast(nsIWindowCreator)WindowCreator);
         if (rc !is XPCOM.NS_OK) {
             browser.dispose ();
-            error (rc);
+            error (rc, __FILE__, __LINE__);
         }
         windowWatcher.Release ();
 
-        /* compute the profile directory and set it on the AppFileLocProvider */
         if (LocationProvider !is null) {
-            byte[] buffer = MozillaDelegate.wcsToMbcs (null, XPCOM.NS_DIRECTORYSERVICE_CONTRACTID, true);
-            rc = serviceManager.GetServiceByContractID (buffer, nsIDirectoryService.NS_IDIRECTORYSERVICE_IID, result);
+            nsIDirectoryService directoryService;
+            rc = serviceManager.GetServiceByContractID (XPCOM.NS_DIRECTORYSERVICE_CONTRACTID.ptr, &nsIDirectoryService.IID, cast(void**)&directoryService);
             if (rc !is XPCOM.NS_OK) {
                 browser.dispose ();
-                error (rc);
+                error (rc, __FILE__, __LINE__);
             }
-            if (result[0] is 0) {
+            if (directoryService is null) {
                 browser.dispose ();
-                error (XPCOM.NS_NOINTERFACE);
+                error (XPCOM.NS_NOINTERFACE, __FILE__, __LINE__);
             }
 
-            nsIDirectoryService directoryService = new nsIDirectoryService (result[0]);
-            result[0] = 0;
-            rc = directoryService.QueryInterface (nsIProperties.NS_IPROPERTIES_IID, result);
+            nsIProperties properties;
+            rc = directoryService.QueryInterface (&nsIProperties.IID, cast(void**)&properties);
             if (rc !is XPCOM.NS_OK) {
                 browser.dispose ();
-                error (rc);
+                error (rc, __FILE__, __LINE__);
             }
-            if (result[0] is 0) {
+            if (properties is null) {
                 browser.dispose ();
-                error (XPCOM.NS_NOINTERFACE);
+                error (XPCOM.NS_NOINTERFACE, __FILE__, __LINE__);
             }
             directoryService.Release ();
 
-            nsIProperties properties = new nsIProperties (result[0]);
-            result[0] = 0;
-            buffer = MozillaDelegate.wcsToMbcs (null, XPCOM.NS_APP_APPLICATION_REGISTRY_DIR, true);
-            rc = properties.Get (buffer, nsIFile.NS_IFILE_IID, result);
+            nsIFile profileDir;
+            rc = properties.Get (XPCOM.NS_APP_APPLICATION_REGISTRY_DIR.ptr, &nsIFile.IID, cast(void**)&profileDir);
             if (rc !is XPCOM.NS_OK) {
                 browser.dispose ();
-                error (rc);
+                error (rc, __FILE__, __LINE__);
             }
-            if (result[0] is 0) {
+            if (profileDir is null) {
                 browser.dispose ();
-                error (XPCOM.NS_NOINTERFACE);
+                error (XPCOM.NS_NOINTERFACE, __FILE__, __LINE__);
             }
             properties.Release ();
 
-            nsIFile profileDir = new nsIFile (result[0]);
-            result[0] = 0;
-            int /*long*/ path = XPCOM.nsEmbedCString_new ();
-            rc = profileDir.GetNativePath (path);
+            scope auto path = new nsEmbedCString;
+            rc = profileDir.GetNativePath (cast(nsACString*)path);
             if (rc !is XPCOM.NS_OK) {
                 browser.dispose ();
-                error (rc);
+                error (rc, __FILE__, __LINE__);
             }
-            int length = XPCOM.nsEmbedCString_Length (path);
-            int /*long*/ ptr = XPCOM.nsEmbedCString_get (path);
-            buffer = new byte [length];
-            XPCOM.memmove (buffer, ptr, length);
-            String profilePath = new String (MozillaDelegate.mbcsToWcs (null, buffer)) + PROFILE_DIR;
+
+            String profilePath = path.toString() ~ PROFILE_DIR;
             LocationProvider.setProfilePath (profilePath);
             LocationProvider.isXULRunner = IsXULRunner;
-            XPCOM.nsEmbedCString_delete (path);
+
             profileDir.Release ();
 
             /* notify observers of a new profile directory being used */
-            buffer = MozillaDelegate.wcsToMbcs (null, XPCOM.NS_OBSERVER_CONTRACTID, true);
-            rc = serviceManager.GetServiceByContractID (buffer, nsIObserverService.NS_IOBSERVERSERVICE_IID, result);
+            nsIObserverService observerService;
+            rc = serviceManager.GetServiceByContractID (XPCOM.NS_OBSERVER_CONTRACTID.ptr, &nsIObserverService.IID, cast(void**)&observerService);
             if (rc !is XPCOM.NS_OK) {
                 browser.dispose ();
-                error (rc);
+                error (rc, __FILE__, __LINE__);
             }
-            if (result[0] is 0) {
+            if (observerService is null) {
                 browser.dispose ();
-                error (XPCOM.NS_NOINTERFACE);
+                error (XPCOM.NS_NOINTERFACE, __FILE__, __LINE__);
             }
 
-            nsIObserverService observerService = new nsIObserverService (result[0]);
-            result[0] = 0;
-            buffer = MozillaDelegate.wcsToMbcs (null, PROFILE_DO_CHANGE, true);
-            length = STARTUP.length ();
-            char[] chars = new char [length + 1];
-            STARTUP.getChars (0, length, chars, 0);
-            rc = observerService.NotifyObservers (0, buffer, chars);
+            wchar* chars = STARTUP.toString16().toString16z();
+            rc = observerService.NotifyObservers (null, PROFILE_DO_CHANGE.ptr, chars);
             if (rc !is XPCOM.NS_OK) {
                 browser.dispose ();
-                error (rc);
+                error (rc, __FILE__, __LINE__);
             }
-            buffer = MozillaDelegate.wcsToMbcs (null, PROFILE_AFTER_CHANGE, true);
-            rc = observerService.NotifyObservers (0, buffer, chars);
+
+            rc = observerService.NotifyObservers (null, PROFILE_AFTER_CHANGE.ptr, chars);
             if (rc !is XPCOM.NS_OK) {
                 browser.dispose ();
-                error (rc);
+                error (rc, __FILE__, __LINE__);
             }
             observerService.Release ();
         }
@@ -672,40 +571,37 @@
          * and charset.  The fix for this is to set mozilla's locale and charset
          * preference values according to the user's current locale and charset.
          */
-        aContractID = MozillaDelegate.wcsToMbcs (null, XPCOM.NS_PREFSERVICE_CONTRACTID, true);
-        rc = serviceManager.GetServiceByContractID (aContractID, nsIPrefService.NS_IPREFSERVICE_IID, result);
+
+        nsIPrefService prefService;
+        rc = serviceManager.GetServiceByContractID (XPCOM.NS_PREFSERVICE_CONTRACTID.ptr, &nsIPrefService.IID, cast(void**)&prefService);
         serviceManager.Release ();
         if (rc !is XPCOM.NS_OK) {
             browser.dispose ();
-            error (rc);
+            error (rc, __FILE__, __LINE__);
         }
-        if (result[0] is 0) {
+        if (serviceManager is null) {
             browser.dispose ();
-            error (XPCOM.NS_NOINTERFACE);
+            error (XPCOM.NS_NOINTERFACE, __FILE__, __LINE__);
         }
 
-        nsIPrefService prefService = new nsIPrefService (result[0]);
-        result[0] = 0;
-        byte[] buffer = new byte[1];
-        rc = prefService.GetBranch (buffer, result);    /* empty buffer denotes root preference level */
+        char[1] buffer = new char[1];
+        nsIPrefBranch prefBranch;
+        rc = prefService.GetBranch (buffer.ptr, &prefBranch);    /* empty buffer denotes root preference level */
         prefService.Release ();
         if (rc !is XPCOM.NS_OK) {
             browser.dispose ();
-            error (rc);
+            error (rc, __FILE__, __LINE__);
         }
-        if (result[0] is 0) {
+        if (prefBranch is null) {
             browser.dispose ();
-            error (XPCOM.NS_NOINTERFACE);
+            error (XPCOM.NS_NOINTERFACE, __FILE__, __LINE__);
         }
 
-        nsIPrefBranch prefBranch = new nsIPrefBranch (result[0]);
-        result[0] = 0;
-
         /* get Mozilla's current locale preference value */
         String prefLocales = null;
         nsIPrefLocalizedString localizedString = null;
-        buffer = MozillaDelegate.wcsToMbcs (null, PREFERENCE_LANGUAGES, true);
-        rc = prefBranch.GetComplexValue (buffer, nsIPrefLocalizedString.NS_IPREFLOCALIZEDSTRING_IID, result);
+        //buffer = MozillaDelegate.wcsToMbcs (null, PREFERENCE_LANGUAGES, true);
+        rc = prefBranch.GetComplexValue (PREFERENCE_LANGUAGES.ptr, &nsIPrefLocalizedString.IID, cast(void**)&localizedString);
         /* 
          * Feature of Debian.  For some reason attempting to query for the current locale
          * preference fails on Debian.  The workaround for this is to assume a value of
@@ -713,44 +609,41 @@
          * a profile.
          */
         if (rc !is XPCOM.NS_OK) {
-            prefLocales = "en-us,en" + TOKENIZER_LOCALE;    //$NON-NLS-1$
+            prefLocales = "en-us,en" ~ TOKENIZER_LOCALE;    //$NON-NLS-1$
         } else {
-            if (result[0] is 0) {
+            if (localizedString is null) {
                 browser.dispose ();
-                error (XPCOM.NS_NOINTERFACE);
+                error (XPCOM.NS_NOINTERFACE, __FILE__, __LINE__);
             }
-            localizedString = new nsIPrefLocalizedString (result[0]);
-            result[0] = 0;
-            rc = localizedString.ToString (result);
+            PRUnichar* tmpChars;
+            rc = localizedString.ToString (&tmpChars);
             if (rc !is XPCOM.NS_OK) {
                 browser.dispose ();
-                error (rc);
-            }
-            if (result[0] is 0) {
-                browser.dispose ();
-                error (XPCOM.NS_NOINTERFACE);
+                error (rc, __FILE__, __LINE__);
             }
-            int length = XPCOM.strlen_PRUnichar (result[0]);
-            char[] dest = new char[length];
-            XPCOM.memmove (dest, result[0], length * 2);
-            prefLocales = new String (dest) + TOKENIZER_LOCALE;
+            if (tmpChars is null) {
+                browser.dispose ();
+                error (XPCOM.NS_NOINTERFACE, __FILE__, __LINE__);
+            }
+            int span = XPCOM.strlen_PRUnichar (tmpChars);
+            prefLocales = Utf.toString(tmpChars[0 .. span]) ~ TOKENIZER_LOCALE;
         }
-        result[0] = 0;
 
         /*
          * construct the new locale preference value by prepending the
          * user's current locale and language to the original value 
          */
-        Locale locale = Locale.getDefault ();
-        String language = locale.getLanguage ();
-        String country = locale.getCountry ();
-        StringBuffer stringBuffer = new StringBuffer (language);
-        stringBuffer.append cast(SEPARATOR_LOCALE);
-        stringBuffer.append (country.toLowerCase ());
-        stringBuffer.append cast(TOKENIZER_LOCALE);
-        stringBuffer.append (language);
-        stringBuffer.append cast(TOKENIZER_LOCALE);
-        String newLocales = stringBuffer.toString ();
+
+        String language = Culture.current.twoLetterLanguageName ();
+        String country = Region.current.twoLetterRegionName ();
+        String stringBuffer = language.dup;
+
+        stringBuffer ~= SEPARATOR_LOCALE;
+        stringBuffer ~= country.toLowerCase ();
+        stringBuffer ~= TOKENIZER_LOCALE;
+        stringBuffer ~= language;
+        stringBuffer ~= TOKENIZER_LOCALE;
+        String newLocales = stringBuffer.dup;
 
         int start, end = -1;
         do {
@@ -763,36 +656,30 @@
                 token = prefLocales.substring (start, end);
             }
             if (token.length () > 0) {
-                token = (token + TOKENIZER_LOCALE).trim ();
+                token = (token ~ TOKENIZER_LOCALE).trim ();
                 /* ensure that duplicate locale values are not added */
                 if (newLocales.indexOf (token) is -1) {
-                    stringBuffer.append (token);
+                    stringBuffer ~= token;
                 }
             }
         } while (end !is -1);
-        newLocales = stringBuffer.toString ();
+        newLocales[] = stringBuffer[];
         if (!newLocales.equals (prefLocales)) {
             /* write the new locale value */
             newLocales = newLocales.substring (0, newLocales.length () - TOKENIZER_LOCALE.length ()); /* remove trailing tokenizer */
-            int length = newLocales.length ();
-            char[] charBuffer = new char[length + 1];
-            newLocales.getChars (0, length, charBuffer, 0);
             if (localizedString is null) {
-                byte[] contractID = MozillaDelegate.wcsToMbcs (null, XPCOM.NS_PREFLOCALIZEDSTRING_CONTRACTID, true);
-                rc = componentManager.CreateInstanceByContractID (contractID, 0, nsIPrefLocalizedString.NS_IPREFLOCALIZEDSTRING_IID, result);
+                rc = componentManager.CreateInstanceByContractID (XPCOM.NS_PREFLOCALIZEDSTRING_CONTRACTID.ptr, null, &nsIPrefLocalizedString.IID, cast(void**)&localizedString);
                 if (rc !is XPCOM.NS_OK) {
                     browser.dispose ();
-                    error (rc);
-                }
-                if (result[0] is 0) {
-                    browser.dispose ();
-                    error (XPCOM.NS_NOINTERFACE);
+                    error (rc, __FILE__, __LINE__);
                 }
-                localizedString = new nsIPrefLocalizedString (result[0]);
-                result[0] = 0;
+                if (localizedString is null) {
+                    browser.dispose ();
+                    error (XPCOM.NS_NOINTERFACE, __FILE__, __LINE__);
+                }
             }
-            localizedString.SetDataWithLength (length, charBuffer);
-            rc = prefBranch.SetComplexValue (buffer, nsIPrefLocalizedString.NS_IPREFLOCALIZEDSTRING_IID, localizedString.getAddress());
+            localizedString.SetDataWithLength (newLocales.length, newLocales.toString16().toString16z());
+            rc = prefBranch.SetComplexValue (PREFERENCE_LANGUAGES.ptr, &nsIPrefLocalizedString.IID, cast(nsISupports)localizedString);
         }
         if (localizedString !is null) {
             localizedString.Release ();
@@ -801,8 +688,7 @@
 
         /* get Mozilla's current charset preference value */
         String prefCharset = null;
-        buffer = MozillaDelegate.wcsToMbcs (null, PREFERENCE_CHARSET, true);
-        rc = prefBranch.GetComplexValue (buffer, nsIPrefLocalizedString.NS_IPREFLOCALIZEDSTRING_IID, result);
+        rc = prefBranch.GetComplexValue (PREFERENCE_CHARSET.ptr, &nsIPrefLocalizedString.IID, cast(void**)&localizedString);
         /* 
          * Feature of Debian.  For some reason attempting to query for the current charset
          * preference fails on Debian.  The workaround for this is to assume a value of
@@ -812,50 +698,40 @@
         if (rc !is XPCOM.NS_OK) {
             prefCharset = "ISO-8859-1"; //$NON_NLS-1$
         } else {
-            if (result[0] is 0) {
+            if (localizedString is null) {
                 browser.dispose ();
-                error (XPCOM.NS_NOINTERFACE);
+                error (XPCOM.NS_NOINTERFACE, __FILE__, __LINE__);
             }
-            localizedString = new nsIPrefLocalizedString (result[0]);
-            result[0] = 0;
-            rc = localizedString.ToString (result);
+            PRUnichar* tmpChar;
+            rc = localizedString.ToString (&tmpChar);
             if (rc !is XPCOM.NS_OK) {
                 browser.dispose ();
-                error (rc);
-            }
-            if (result[0] is 0) {
-                browser.dispose ();
-                error (XPCOM.NS_NOINTERFACE);
+                error (rc, __FILE__, __LINE__);
             }
-            int length = XPCOM.strlen_PRUnichar (result[0]);
-            char[] dest = new char[length];
-            XPCOM.memmove (dest, result[0], length * 2);
-            prefCharset = new String (dest);
+            if (tmpChar is null) {
+                browser.dispose ();
+                error (XPCOM.NS_NOINTERFACE, __FILE__, __LINE__);
+            }
+            int span = XPCOM.strlen_PRUnichar (tmpChar);
+            prefCharset = Utf.toString(tmpChar[0 .. span]);
         }
-        result[0] = 0;
 
         String newCharset = System.getProperty ("file.encoding");   // $NON-NLS-1$
         if (!newCharset.equals (prefCharset)) {
             /* write the new charset value */
-            int length = newCharset.length ();
-            char[] charBuffer = new char[length + 1];
-            newCharset.getChars (0, length, charBuffer, 0);
             if (localizedString is null) {
-                byte[] contractID = MozillaDelegate.wcsToMbcs (null, XPCOM.NS_PREFLOCALIZEDSTRING_CONTRACTID, true);
-                rc = componentManager.CreateInstanceByContractID (contractID, 0, nsIPrefLocalizedString.NS_IPREFLOCALIZEDSTRING_IID, result);
+                rc = componentManager.CreateInstanceByContractID (XPCOM.NS_PREFLOCALIZEDSTRING_CONTRACTID.ptr, null, &nsIPrefLocalizedString.IID, cast(void**)&localizedString);
                 if (rc !is XPCOM.NS_OK) {
                     browser.dispose ();
-                    error (rc);
-                }
-                if (result[0] is 0) {
-                    browser.dispose ();
-                    error (XPCOM.NS_NOINTERFACE);
+                    error (rc, __FILE__, __LINE__);
                 }
-                localizedString = new nsIPrefLocalizedString (result[0]);
-                result[0] = 0;
+                if (localizedString is null) {
+                    browser.dispose ();
+                    error (XPCOM.NS_NOINTERFACE, __FILE__, __LINE__);
+                }
             }
-            localizedString.SetDataWithLength (length, charBuffer);
-            rc = prefBranch.SetComplexValue (buffer, nsIPrefLocalizedString.NS_IPREFLOCALIZEDSTRING_IID, localizedString.getAddress ());
+            localizedString.SetDataWithLength (newCharset.length, newCharset.toString16().toString16z());
+            rc = prefBranch.SetComplexValue (PREFERENCE_CHARSET.ptr, &nsIPrefLocalizedString.IID, cast(nsISupports)localizedString);
         }
         if (localizedString !is null) localizedString.Release ();
 
@@ -863,8 +739,11 @@
         * Check for proxy values set as documented java properties and update mozilla's
         * preferences with these values if needed.
         */
-        String proxyHost = System.getProperty cast(PROPERTY_PROXYHOST);
-        String proxyPortString = System.getProperty cast(PROPERTY_PROXYPORT);
+
+        // NOTE: in dwt, these properties don't exist so both keys will return null
+        // (which appears to be ok in this situaion)
+        String proxyHost = System.getProperty (PROPERTY_PROXYHOST);
+        String proxyPortString = System.getProperty (PROPERTY_PROXYPORT);
 
         int port = -1;
         if (proxyPortString !is null) {
@@ -877,46 +756,33 @@
         }
 
         if (proxyHost !is null) {
-            byte[] contractID = MozillaDelegate.wcsToMbcs (null, XPCOM.NS_PREFLOCALIZEDSTRING_CONTRACTID, true);
-            rc = componentManager.CreateInstanceByContractID (contractID, 0, nsIPrefLocalizedString.NS_IPREFLOCALIZEDSTRING_IID, result);
-            if (rc !is XPCOM.NS_OK) error (rc);
-            if (result[0] is 0) error (XPCOM.NS_NOINTERFACE);
+            rc = componentManager.CreateInstanceByContractID (XPCOM.NS_PREFLOCALIZEDSTRING_CONTRACTID.ptr, null, &nsIPrefLocalizedString.IID, cast(void**)&localizedString);
+            if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+            if (localizedString is null) error (XPCOM.NS_NOINTERFACE, __FILE__, __LINE__);
 
-            localizedString = new nsIPrefLocalizedString (result[0]);
-            result[0] = 0;
-            int length = proxyHost.length ();
-            char[] charBuffer = new char[length + 1];
-            proxyHost.getChars (0, length, charBuffer, 0);
-            rc = localizedString.SetDataWithLength (length, charBuffer);
-            if (rc !is XPCOM.NS_OK) error (rc);
-            buffer = MozillaDelegate.wcsToMbcs (null, PREFERENCE_PROXYHOST_FTP, true);
-            rc = prefBranch.SetComplexValue (buffer, nsIPrefLocalizedString.NS_IPREFLOCALIZEDSTRING_IID, localizedString.getAddress ());
-            if (rc !is XPCOM.NS_OK) error (rc);
-            buffer = MozillaDelegate.wcsToMbcs (null, PREFERENCE_PROXYHOST_HTTP, true);
-            rc = prefBranch.SetComplexValue (buffer, nsIPrefLocalizedString.NS_IPREFLOCALIZEDSTRING_IID, localizedString.getAddress ());
-            if (rc !is XPCOM.NS_OK) error (rc);
-            buffer = MozillaDelegate.wcsToMbcs (null, PREFERENCE_PROXYHOST_SSL, true);
-            rc = prefBranch.SetComplexValue (buffer, nsIPrefLocalizedString.NS_IPREFLOCALIZEDSTRING_IID, localizedString.getAddress ());
-            if (rc !is XPCOM.NS_OK) error (rc);
+            rc = localizedString.SetDataWithLength (proxyHost.length, proxyHost.toString16().toString16z());
+            if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+            rc = prefBranch.SetComplexValue (PREFERENCE_PROXYHOST_FTP.ptr, &nsIPrefLocalizedString.IID, cast(nsISupports)localizedString);
+            if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+            rc = prefBranch.SetComplexValue (PREFERENCE_PROXYHOST_HTTP.ptr, &nsIPrefLocalizedString.IID, cast(nsISupports)localizedString);
+            if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+            rc = prefBranch.SetComplexValue (PREFERENCE_PROXYHOST_SSL.ptr, &nsIPrefLocalizedString.IID, cast(nsISupports)localizedString);
+            if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
             localizedString.Release ();
         }
 
         if (port !is -1) {
-            buffer = MozillaDelegate.wcsToMbcs (null, PREFERENCE_PROXYPORT_FTP, true);
-            rc = prefBranch.SetIntPref (buffer, port);
-            if (rc !is XPCOM.NS_OK) error (rc);
-            buffer = MozillaDelegate.wcsToMbcs (null, PREFERENCE_PROXYPORT_HTTP, true);
-            rc = prefBranch.SetIntPref (buffer, port);
-            if (rc !is XPCOM.NS_OK) error (rc);
-            buffer = MozillaDelegate.wcsToMbcs (null, PREFERENCE_PROXYPORT_SSL, true);
-            rc = prefBranch.SetIntPref (buffer, port);
-            if (rc !is XPCOM.NS_OK) error (rc);
+            rc = prefBranch.SetIntPref (PREFERENCE_PROXYPORT_FTP.ptr, port);
+            if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+            rc = prefBranch.SetIntPref (PREFERENCE_PROXYPORT_HTTP.ptr, port);
+            if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+            rc = prefBranch.SetIntPref (PREFERENCE_PROXYPORT_SSL.ptr, port);
+            if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
         }
 
         if (proxyHost !is null || port !is -1) {
-            buffer = MozillaDelegate.wcsToMbcs (null, PREFERENCE_PROXYTYPE, true);
-            rc = prefBranch.SetIntPref (buffer, 1);
-            if (rc !is XPCOM.NS_OK) error (rc);
+            rc = prefBranch.SetIntPref (PREFERENCE_PROXYTYPE.ptr, 1);
+            if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
         }
 
         /*
@@ -926,19 +792,17 @@
         * is responsible for creating the new Browser and Shell in an OpenWindowListener,
         * they should decide whether the new window is unwelcome or not and act accordingly. 
         */
-        buffer = MozillaDelegate.wcsToMbcs (null, PREFERENCE_DISABLEOPENDURINGLOAD, true);
-        rc = prefBranch.SetBoolPref (buffer, 0);
+        rc = prefBranch.SetBoolPref (PREFERENCE_DISABLEOPENDURINGLOAD.ptr, 0);
         if (rc !is XPCOM.NS_OK) {
             browser.dispose ();
-            error (rc);
+            error (rc, __FILE__, __LINE__);
         }
 
         /* Ensure that the status text can be set through means like javascript */ 
-        buffer = MozillaDelegate.wcsToMbcs (null, PREFERENCE_DISABLEWINDOWSTATUSCHANGE, true);
-        rc = prefBranch.SetBoolPref (buffer, 0);
+        rc = prefBranch.SetBoolPref (PREFERENCE_DISABLEWINDOWSTATUSCHANGE.ptr, 0);
         if (rc !is XPCOM.NS_OK) {
             browser.dispose ();
-            error (rc);
+            error (rc, __FILE__, __LINE__);
         }
 
         prefBranch.Release ();
@@ -946,27 +810,27 @@
         PromptService2Factory factory = new PromptService2Factory ();
         factory.AddRef ();
 
-        rc = componentManager.QueryInterface (nsIComponentRegistrar.NS_ICOMPONENTREGISTRAR_IID, result);
+        nsIComponentRegistrar componentRegistrar;
+        rc = componentManager.QueryInterface (&nsIComponentRegistrar.IID, cast(void**)&componentRegistrar);
         if (rc !is XPCOM.NS_OK) {
             browser.dispose ();
-            error (rc);
+            error (rc, __FILE__, __LINE__);
         }
-        if (result[0] is 0) {
+        if (componentRegistrar is null) {
             browser.dispose ();
-            error (XPCOM.NS_NOINTERFACE);
+            error (XPCOM.NS_NOINTERFACE, __FILE__, __LINE__);
         }
         
-        nsIComponentRegistrar componentRegistrar = new nsIComponentRegistrar (result[0]);
-        result[0] = 0;
-        aContractID = MozillaDelegate.wcsToMbcs (null, XPCOM.NS_PROMPTSERVICE_CONTRACTID, true); 
-        byte[] aClassName = MozillaDelegate.wcsToMbcs (null, "Prompt Service", true); //$NON-NLS-1$
-        rc = componentRegistrar.RegisterFactory (XPCOM.NS_PROMPTSERVICE_CID, aClassName, aContractID, factory.getAddress ());
+        String aClassName = "Prompt Service"; 
+
+        rc = componentRegistrar.RegisterFactory (&XPCOM.NS_PROMPTSERVICE_CID, aClassName.ptr, XPCOM.NS_PROMPTSERVICE_CONTRACTID.ptr, cast(nsIFactory)factory);
+
         if (rc !is XPCOM.NS_OK) {
             browser.dispose ();
-            error (rc);
+            error (rc, __FILE__, __LINE__);
         }
         factory.Release ();
-        
+
         /*
         * This Download factory will be used if the GRE version is < 1.8.
         * If the GRE version is 1.8.x then the Download factory that is registered later for
@@ -976,23 +840,21 @@
         */
         DownloadFactory downloadFactory = new DownloadFactory ();
         downloadFactory.AddRef ();
-        aContractID = MozillaDelegate.wcsToMbcs (null, XPCOM.NS_DOWNLOAD_CONTRACTID, true);
-        aClassName = MozillaDelegate.wcsToMbcs (null, "Download", true); //$NON-NLS-1$
-        rc = componentRegistrar.RegisterFactory (XPCOM.NS_DOWNLOAD_CID, aClassName, aContractID, downloadFactory.getAddress ());
+        aClassName = "Download";
+        rc = componentRegistrar.RegisterFactory (&XPCOM.NS_DOWNLOAD_CID, aClassName.ptr, XPCOM.NS_DOWNLOAD_CONTRACTID.ptr, cast(nsIFactory)downloadFactory);
         if (rc !is XPCOM.NS_OK) {
             browser.dispose ();
-            error (rc);
+            error (rc, __FILE__, __LINE__);
         }
         downloadFactory.Release ();
 
         FilePickerFactory pickerFactory = IsXULRunner ? new FilePickerFactory_1_8 () : new FilePickerFactory ();
         pickerFactory.AddRef ();
-        aContractID = MozillaDelegate.wcsToMbcs (null, XPCOM.NS_FILEPICKER_CONTRACTID, true);
-        aClassName = MozillaDelegate.wcsToMbcs (null, "FilePicker", true); //$NON-NLS-1$
-        rc = componentRegistrar.RegisterFactory (XPCOM.NS_FILEPICKER_CID, aClassName, aContractID, pickerFactory.getAddress ());
+        aClassName = "FilePicker";
+        rc = componentRegistrar.RegisterFactory (&XPCOM.NS_FILEPICKER_CID, aClassName.ptr, XPCOM.NS_FILEPICKER_CONTRACTID.ptr, cast(nsIFactory)pickerFactory);
         if (rc !is XPCOM.NS_OK) {
             browser.dispose ();
-            error (rc);
+            error (rc, __FILE__, __LINE__);
         }
         pickerFactory.Release ();
 
@@ -1002,145 +864,62 @@
         Initialized = true;
     }
 
-    if (display.getData cast(DISPOSE_LISTENER_HOOKED) is null) {
-        display.setData (DISPOSE_LISTENER_HOOKED, DISPOSE_LISTENER_HOOKED);
-        display.addListener (DWT.Dispose, new Listener () {
-            public void handleEvent (Event event) {
-                if (BrowserCount > 0) return; /* another display is still active */
-
-                int /*long*/[] result = new int /*long*/[1];
-                int rc = XPCOM.NS_GetServiceManager (result);
-                if (rc !is XPCOM.NS_OK) error (rc);
-                if (result[0] is 0) error (XPCOM.NS_NOINTERFACE);
-
-                nsIServiceManager serviceManager = new nsIServiceManager (result[0]);
-                result[0] = 0;      
-                byte[] buffer = MozillaDelegate.wcsToMbcs (null, XPCOM.NS_OBSERVER_CONTRACTID, true);
-                rc = serviceManager.GetServiceByContractID (buffer, nsIObserverService.NS_IOBSERVERSERVICE_IID, result);
-                if (rc !is XPCOM.NS_OK) error (rc);
-                if (result[0] is 0) error (XPCOM.NS_NOINTERFACE);
-
-                nsIObserverService observerService = new nsIObserverService (result[0]);
-                result[0] = 0;
-                buffer = MozillaDelegate.wcsToMbcs (null, PROFILE_BEFORE_CHANGE, true);
-                int length = SHUTDOWN_PERSIST.length ();
-                char[] chars = new char [length + 1];
-                SHUTDOWN_PERSIST.getChars (0, length, chars, 0);
-                rc = observerService.NotifyObservers (0, buffer, chars);
-                if (rc !is XPCOM.NS_OK) error (rc);
-                observerService.Release ();
-
-                if (LocationProvider !is null) {
-                    String prefsLocation = LocationProvider.profilePath + AppFileLocProvider.PREFERENCES_FILE;
-                    nsEmbedString pathString = new nsEmbedString (prefsLocation);
-                    rc = XPCOM.NS_NewLocalFile (pathString.getAddress (), 1, result);
-                    if (rc !is XPCOM.NS_OK) Mozilla.error (rc);
-                    if (result[0] is 0) Mozilla.error (XPCOM.NS_ERROR_NULL_POINTER);
-                    pathString.dispose ();
-
-                    nsILocalFile localFile = new nsILocalFile (result [0]);
-                    result[0] = 0;
-                    rc = localFile.QueryInterface (nsIFile.NS_IFILE_IID, result); 
-                    if (rc !is XPCOM.NS_OK) Mozilla.error (rc);
-                    if (result[0] is 0) Mozilla.error (XPCOM.NS_ERROR_NO_INTERFACE);
-                    localFile.Release ();
-
-                    nsIFile prefFile = new nsIFile (result[0]);
-                    result[0] = 0;
-
-                    buffer = MozillaDelegate.wcsToMbcs (null, XPCOM.NS_PREFSERVICE_CONTRACTID, true);
-                    rc = serviceManager.GetServiceByContractID (buffer, nsIPrefService.NS_IPREFSERVICE_IID, result);
-                    if (rc !is XPCOM.NS_OK) error (rc);
-                    if (result[0] is 0) error (XPCOM.NS_NOINTERFACE);
-
-                    nsIPrefService prefService = new nsIPrefService (result[0]);
-                    result[0] = 0;
-                    rc = prefService.SavePrefFile(prefFile.getAddress ());
-                    prefService.Release ();
-                    prefFile.Release ();
-                }
-                serviceManager.Release ();
-
-                if (XPCOMWasGlued) {
-                    /*
-                    * XULRunner 1.9 can crash on Windows if XPCOMGlueShutdown is invoked here,
-                    * presumably because one or more of its unloaded symbols are referenced when
-                    * this callback returns.  The workaround is to delay invoking XPCOMGlueShutdown
-                    * so that its symbols are still available once this callback returns.
-                    */
-                    display.asyncExec (new Runnable () {
-                        public void run () {
-                            XPCOM.XPCOMGlueShutdown ();
-                        }
-                    });
-                    XPCOMWasGlued = false;
-                }
-                if (XPCOMInitWasGlued) {
-                    XPCOMInit.XPCOMGlueShutdown ();
-                    XPCOMInitWasGlued = false;
-                }
-                Initialized = false;
-            }
-        });
+    if (display.getData (DISPOSE_LISTENER_HOOKED) is null) {
+        display.setData (DISPOSE_LISTENER_HOOKED, stringcast(DISPOSE_LISTENER_HOOKED));
+        display.addListener (DWT.Dispose, dgListener( &handleDisposeEvent, display )  );
     }
 
     BrowserCount++;
-    int rc = XPCOM.NS_GetComponentManager (result);
+    nsIComponentManager componentManager;
+    int rc = XPCOM.NS_GetComponentManager (&componentManager);
     if (rc !is XPCOM.NS_OK) {
         browser.dispose ();
-        error (rc);
-    }
-    if (result[0] is 0) {
-        browser.dispose ();
-        error (XPCOM.NS_NOINTERFACE);
+        error (rc, __FILE__, __LINE__);
     }
-    
-    nsIComponentManager componentManager = new nsIComponentManager (result[0]);
-    result[0] = 0;
-    nsID NS_IWEBBROWSER_CID = new nsID ("F1EAC761-87E9-11d3-AF80-00A024FFC08C"); //$NON-NLS-1$
-    rc = componentManager.CreateInstance (NS_IWEBBROWSER_CID, 0, nsIWebBrowser.NS_IWEBBROWSER_IID, result);
-    if (rc !is XPCOM.NS_OK) {
+    if (componentManager is null) {
         browser.dispose ();
-        error (rc);
-    }
-    if (result[0] is 0) {
-        browser.dispose ();
-        error (XPCOM.NS_NOINTERFACE);   
+        error (XPCOM.NS_NOINTERFACE, __FILE__, __LINE__);
     }
     
-    webBrowser = new nsIWebBrowser (result[0]);
-    result[0] = 0;
-
-    createCOMInterfaces ();
-    AddRef ();
-
-    rc = webBrowser.SetContainerWindow (webBrowserChrome.getAddress());
+    nsID NS_IWEBBROWSER_CID = { 0xF1EAC761, 0x87E9, 0x11d3, [0xAF, 0x80, 0x00, 0xA0, 0x24, 0xFF, 0xC0, 0x8C] }; //$NON-NLS-1$
+    rc = componentManager.CreateInstance (&NS_IWEBBROWSER_CID, null, &nsIWebBrowser.IID, cast(void**)&webBrowser);
     if (rc !is XPCOM.NS_OK) {
         browser.dispose ();
-        error (rc);
+        error (rc, __FILE__, __LINE__);
+    }
+    if (webBrowser is null) {
+        browser.dispose ();
+        error (XPCOM.NS_NOINTERFACE, __FILE__, __LINE__);   
+    }
+    
+    this.AddRef ();
+
+    rc = webBrowser.SetContainerWindow ( cast(nsIWebBrowserChrome)this );
+    if (rc !is XPCOM.NS_OK) {
+        browser.dispose ();
+        error (rc, __FILE__, __LINE__);
     }
             
-    rc = webBrowser.QueryInterface (nsIBaseWindow.NS_IBASEWINDOW_IID, result);
+    nsIBaseWindow baseWindow;
+    rc = webBrowser.QueryInterface (&nsIBaseWindow.IID, cast(void**)&baseWindow);
     if (rc !is XPCOM.NS_OK) {
         browser.dispose ();
-        error (rc);
+        error (rc, __FILE__, __LINE__);
     }
-    if (result[0] is 0) {
+    if (baseWindow is null) {
         browser.dispose ();
-        error (XPCOM.NS_ERROR_NO_INTERFACE);
+        error (XPCOM.NS_ERROR_NO_INTERFACE, __FILE__, __LINE__);
     }
     
-    nsIBaseWindow baseWindow = new nsIBaseWindow (result[0]);
-    result[0] = 0;
     Rectangle rect = browser.getClientArea ();
     if (rect.isEmpty ()) {
         rect.width = 1;
         rect.height = 1;
     }
 
-    embedHandle = delegate.getHandle ();
+    embedHandle = mozDelegate.getHandle ();
 
-    rc = baseWindow.InitWindow (embedHandle, 0, 0, 0, rect.width, rect.height);
+    rc = baseWindow.InitWindow (cast(void*)embedHandle, null, 0, 0, rect.width, rect.height);
     if (rc !is XPCOM.NS_OK) {
         browser.dispose ();
         error (XPCOM.NS_ERROR_FAILURE);
@@ -1159,27 +938,25 @@
 
     if (!PerformedVersionCheck) {
         PerformedVersionCheck = true;
-
-        rc = componentManager.QueryInterface (nsIComponentRegistrar.NS_ICOMPONENTREGISTRAR_IID, result);
+        
+        nsIComponentRegistrar componentRegistrar;
+        rc = componentManager.QueryInterface (&nsIComponentRegistrar.IID, cast(void**)&componentRegistrar);
         if (rc !is XPCOM.NS_OK) {
             browser.dispose ();
-            error (rc);
+            error (rc, __FILE__,__LINE__);
         }
-        if (result[0] is 0) {
+        if (componentRegistrar is null) {
             browser.dispose ();
-            error (XPCOM.NS_NOINTERFACE);
+            error (XPCOM.NS_NOINTERFACE,__FILE__,__LINE__);
         }
-        nsIComponentRegistrar componentRegistrar = new nsIComponentRegistrar (result[0]);
-        result[0] = 0;
 
         HelperAppLauncherDialogFactory dialogFactory = new HelperAppLauncherDialogFactory ();
         dialogFactory.AddRef ();
-        byte[] aContractID = MozillaDelegate.wcsToMbcs (null, XPCOM.NS_HELPERAPPLAUNCHERDIALOG_CONTRACTID, true);
-        byte[] aClassName = MozillaDelegate.wcsToMbcs (null, "Helper App Launcher Dialog", true); //$NON-NLS-1$
-        rc = componentRegistrar.RegisterFactory (XPCOM.NS_HELPERAPPLAUNCHERDIALOG_CID, aClassName, aContractID, dialogFactory.getAddress ());
+        String aClassName = "Helper App Launcher Dialog"; //$NON-NLS-1$
+        rc = componentRegistrar.RegisterFactory (&XPCOM.NS_HELPERAPPLAUNCHERDIALOG_CID, aClassName.ptr, XPCOM.NS_HELPERAPPLAUNCHERDIALOG_CONTRACTID.ptr, cast(nsIFactory)dialogFactory);
         if (rc !is XPCOM.NS_OK) {
             browser.dispose ();
-            error (rc);
+            error (rc,__FILE__,__LINE__);
         }
         dialogFactory.Release ();
 
@@ -1187,24 +964,23 @@
         * Check for the availability of the pre-1.8 implementation of nsIDocShell
         * to determine if the GRE's version is < 1.8.
         */
-        rc = webBrowser.QueryInterface (nsIInterfaceRequestor.NS_IINTERFACEREQUESTOR_IID, result);
+        nsIInterfaceRequestor interfaceRequestor;
+        rc = webBrowser.QueryInterface (&nsIInterfaceRequestor.IID, cast(void**)&interfaceRequestor);
         if (rc !is XPCOM.NS_OK) {
             browser.dispose ();
             error (XPCOM.NS_ERROR_FAILURE);
         }
-        if (result[0] is 0) {
+        if (interfaceRequestor is null) {
             browser.dispose ();
-            error (XPCOM.NS_ERROR_NO_INTERFACE);
+            error (XPCOM.NS_ERROR_NO_INTERFACE, __FILE__, __LINE__);
         }
-        nsIInterfaceRequestor interfaceRequestor = new nsIInterfaceRequestor (result[0]);
-        result[0] = 0;
 
-        rc = interfaceRequestor.GetInterface (nsIDocShell.NS_IDOCSHELL_IID, result);
-        if (rc is XPCOM.NS_OK && result[0] !is 0) {
+        nsIDocShell docShell;
+        rc = interfaceRequestor.GetInterface (&nsIDocShell.IID, cast(void**)&docShell);
+        if (rc is XPCOM.NS_OK && docShell !is null) {
             IsPre_1_8 = true;
-            new nsISupports (result[0]).Release ();
+            docShell.Release ();
         }
-        result[0] = 0;
 
         /*
         * A Download factory for contract "Transfer" must be registered iff the GRE's version is 1.8.x.
@@ -1216,22 +992,22 @@
         *   functionality is provided by the GRE.
         */
         if (!IsPre_1_8) {
-            rc = interfaceRequestor.GetInterface (nsIDocShell_1_8.NS_IDOCSHELL_IID, result);
-            if (rc is XPCOM.NS_OK && result[0] !is 0) { /* 1.8 */
-                new nsISupports (result[0]).Release ();
-                result[0] = 0;
-
+            nsIDocShell_1_8 docShell_1_8;
+            rc = interfaceRequestor.GetInterface (&nsIDocShell_1_8.IID, cast(void**)&docShell_1_8);
+            if (rc is XPCOM.NS_OK && docShell_1_8 !is null) { /* 1.8 */
+                docShell_1_8.Release ();
+ 
                 DownloadFactory_1_8 downloadFactory_1_8 = new DownloadFactory_1_8 ();
                 downloadFactory_1_8.AddRef ();
-                aContractID = MozillaDelegate.wcsToMbcs (null, XPCOM.NS_TRANSFER_CONTRACTID, true);
-                aClassName = MozillaDelegate.wcsToMbcs (null, "Transfer", true); //$NON-NLS-1$
-                rc = componentRegistrar.RegisterFactory (XPCOM.NS_DOWNLOAD_CID, aClassName, aContractID, downloadFactory_1_8.getAddress ());
+                
+                aClassName = "Transfer"; //$NON-NLS-1$
+                rc = componentRegistrar.RegisterFactory (&XPCOM.NS_DOWNLOAD_CID, aClassName.ptr, XPCOM.NS_TRANSFER_CONTRACTID.ptr, cast(nsIFactory)downloadFactory_1_8);
                 if (rc !is XPCOM.NS_OK) {
                     browser.dispose ();
-                    error (rc);
+                    error (rc, __FILE__, __LINE__);
                 }
                 downloadFactory_1_8.Release ();
-            } else { /* >= 1.9 */
+                } else { /* >= 1.9 */
                 /*
                  * Bug in XULRunner 1.9.  Mozilla no longer clears its background before initial content has
                  * been set.  As a result embedders appear broken if they do not immediately navigate to a url.
@@ -1241,46 +1017,149 @@
                  * normal.  The Mozilla bug for this is https://bugzilla.mozilla.org/show_bug.cgi?id=415789.
                  */
                 awaitingNavigate = true;
-                rc = webBrowser.QueryInterface (nsIWebNavigation.NS_IWEBNAVIGATION_IID, result);
+                nsIWebNavigation webNavigation;
+                rc = webBrowser.QueryInterface (&nsIWebNavigation.IID, cast(void**)&webNavigation);
                 if (rc !is XPCOM.NS_OK) {
                     browser.dispose ();
-                    error (rc);
-                }
-                if (result[0] is 0) {
-                    browser.dispose ();
-                    error (XPCOM.NS_ERROR_NO_INTERFACE);
+                    error (rc, __FILE__, __LINE__);
                 }
-                nsIWebNavigation webNavigation = new nsIWebNavigation (result[0]);
-                char[] uri = new char[ABOUT_BLANK.length () + 1];
-                ABOUT_BLANK.getChars (0, ABOUT_BLANK.length (), uri, 0);
-                rc = webNavigation.LoadURI (uri, nsIWebNavigation.LOAD_FLAGS_NONE, 0, 0, 0);
+                if (webNavigation is null) {
+                    browser.dispose ();
+                    error (XPCOM.NS_ERROR_NO_INTERFACE, __FILE__, __LINE__);
+                }
+                rc = webNavigation.LoadURI (ABOUT_BLANK.toString16().toString16z(), nsIWebNavigation.LOAD_FLAGS_NONE, null, null, null);
                 webNavigation.Release ();
-
                 dialogFactory.isPre_1_9 = false;
             }
         }
-        result[0] = 0;
         interfaceRequestor.Release ();
         componentRegistrar.Release ();
     }
     componentManager.Release ();
 
-    rc = webBrowser.AddWebBrowserListener (weakReference.getAddress (), nsIWebProgressListener.NS_IWEBPROGRESSLISTENER_IID);
+    rc = webBrowser.AddWebBrowserListener (cast(nsIWeakReference)this, &nsIWebProgressListener.IID);
     if (rc !is XPCOM.NS_OK) {
         browser.dispose ();
-        error (rc);
+        error (rc, __FILE__, __LINE__);
+    }
+
+    // TODO: Find appropriate place to "Release" uriContentListener -JJR
+    nsIURIContentListener uriContentListener;
+    this.QueryInterface(&nsIURIContentListener.IID, cast(void**)&uriContentListener);
+    if (rc !is XPCOM.NS_OK) {
+        browser.dispose();
+        error(rc);
+    }
+    if (uriContentListener is null) {
+        browser.dispose();
+        error(XPCOM.NS_ERROR_NO_INTERFACE);
+    }
+
+    rc = webBrowser.SetParentURIContentListener (uriContentListener);
+    if (rc !is XPCOM.NS_OK) {
+        browser.dispose ();
+        error (rc, __FILE__, __LINE__);
     }
 
-    rc = webBrowser.SetParentURIContentListener (uriContentListener.getAddress ());
-    if (rc !is XPCOM.NS_OK) {
-        browser.dispose ();
-        error (rc);
+    mozDelegate.init ();
+        
+    int[] folderEvents = [
+        DWT.Dispose,
+        DWT.Resize,  
+        DWT.FocusIn,
+        DWT.Activate,
+        DWT.Deactivate,
+        DWT.Show,
+        DWT.KeyDown     // needed to make browser traversable
+    ];
+    
+    for (int i = 0; i < folderEvents.length; i++) {
+        browser.addListener (folderEvents[i], dgListener( &handleFolderEvent ));
     }
+}
 
-    delegate_.init_ ();
+/*******************************************************************************
+
+    Event Handlers for the Mozilla Class:
+    
+    These represent replacements for SWT's anonymous classes as used within
+    the Mozilla class.  Since D 1.0x anonymous classes do not work equivalently 
+    to Java's, we replace the anonymous classes with D delegates and templates
+    (ie dgListener which wrap the delegate in a class).  This circumvents some
+    nasty, evasive bugs.
+    
+    extern(D) becomes a necessary override on these methods because this class 
+    implements a XPCOM/COM interface resulting in all class methods defaulting
+    to extern(System). -JJR
+
+ ******************************************************************************/
+
+extern(D)
+private void handleDisposeEvent (Event event, Display display) {
+    if (BrowserCount > 0) return; /* another display is still active */
+
+    nsIServiceManager serviceManager;
+
+    int rc = XPCOM.NS_GetServiceManager (&serviceManager);
+    if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+    if (serviceManager is null) error (XPCOM.NS_NOINTERFACE, __FILE__, __LINE__);
+
+    nsIObserverService observerService;
+    rc = serviceManager.GetServiceByContractID (XPCOM.NS_OBSERVER_CONTRACTID.ptr, &nsIObserverService.IID, cast(void**)&observerService);
+    if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+    if (observerService is null) error (XPCOM.NS_NOINTERFACE, __FILE__, __LINE__);
+
+    rc = observerService.NotifyObservers (null, PROFILE_BEFORE_CHANGE.ptr, SHUTDOWN_PERSIST.toString16().toString16z());
+    if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+    observerService.Release ();
 
-    listener = new Listener () {
-        public void handleEvent (Event event) {
+    if (LocationProvider !is null) {
+        String prefsLocation = LocationProvider.profilePath ~ AppFileLocProvider.PREFERENCES_FILE;
+        scope auto pathString = new nsEmbedString (prefsLocation.toString16());
+        nsILocalFile localFile;
+        rc = XPCOM.NS_NewLocalFile (cast(nsAString*)pathString, 1, &localFile);
+        if (rc !is XPCOM.NS_OK) Mozilla.error (rc, __FILE__, __LINE__);
+        if (localFile is null) Mozilla.error (XPCOM.NS_ERROR_NULL_POINTER);
+
+        nsIFile prefFile;
+        rc = localFile.QueryInterface (&nsIFile.IID, cast(void**)&prefFile); 
+        if (rc !is XPCOM.NS_OK) Mozilla.error (rc, __FILE__, __LINE__);
+        if (prefFile is null) Mozilla.error (XPCOM.NS_ERROR_NO_INTERFACE, __FILE__, __LINE__);
+        localFile.Release ();
+
+        nsIPrefService prefService;
+        rc = serviceManager.GetServiceByContractID (XPCOM.NS_PREFSERVICE_CONTRACTID.ptr, &nsIPrefService.IID, cast(void**)&prefService);
+        if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+        if (prefService is null) error (XPCOM.NS_NOINTERFACE, __FILE__, __LINE__);
+
+        rc = prefService.SavePrefFile(prefFile);
+        prefService.Release ();
+        prefFile.Release ();
+    }
+    serviceManager.Release ();
+
+    if (XPCOMWasGlued) {
+        /*
+         * XULRunner 1.9 can crash on Windows if XPCOMGlueShutdown is invoked here,
+         * presumably because one or more of its unloaded symbols are referenced when
+         * this callback returns.  The workaround is to delay invoking XPCOMGlueShutdown
+         * so that its symbols are still available once this callback returns.
+         */
+         display.asyncExec (new class() Runnable {
+             public void run () {
+                 XPCOMInit.XPCOMGlueShutdown ();
+             }
+         });
+         XPCOMWasGlued = XPCOMInitWasGlued = false;
+    } 
+
+    Initialized = false;
+}
+  
+        
+extern(D)
+private void handleFolderEvent (Event event) {
+            Control control = cast(Control)browser;
             switch (event.type) {
                 case DWT.Dispose: {
                     /* make this handler run after other dispose listeners */
@@ -1299,7 +1178,7 @@
                 case DWT.Activate: Activate (); break;
                 case DWT.Deactivate: {
                     Display display = event.display;
-                    if (Mozilla.this.browser is display.getFocusControl ()) Deactivate ();
+                    if (control is display.getFocusControl ()) Deactivate ();
                     break;
                 }
                 case DWT.Show: {
@@ -1310,7 +1189,7 @@
                     * its size after the container has been made visible. 
                     */
                     Display display = event.display;
-                    display.asyncExec(new Runnable () {
+                    display.asyncExec(new class () Runnable {
                         public void run() {
                             if (browser.isDisposed ()) return;
                             onResize ();
@@ -1318,457 +1197,266 @@
                     });
                     break;
                 }
+                default: break;
             }
         }
-    };  
-    int[] folderEvents = new int[] {
-        DWT.Dispose,
-        DWT.Resize,  
-        DWT.FocusIn,
-        DWT.Activate,
-        DWT.Deactivate,
-        DWT.Show,
-        DWT.KeyDown     // needed to make browser traversable
-    };
-    for (int i = 0; i < folderEvents.length; i++) {
-        browser.addListener (folderEvents[i], listener);
-    }
-}
+
+/*******************************************************************************
 
+*******************************************************************************/
+    
+extern(D)
 public bool back () {
     if (awaitingNavigate) return false;
 
-    int /*long*/[] result = new int /*long*/[1];
-    int rc = webBrowser.QueryInterface (nsIWebNavigation.NS_IWEBNAVIGATION_IID, result);
-    if (rc !is XPCOM.NS_OK) error (rc);
-    if (result[0] is 0) error (XPCOM.NS_ERROR_NO_INTERFACE);
+    //int /*long*/[] result = new int /*long*/[1];
+    nsIWebNavigation webNavigation;
+    int rc = webBrowser.QueryInterface (&nsIWebNavigation.IID, cast(void**)&webNavigation);
+    if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+    if (webNavigation is null) error (XPCOM.NS_ERROR_NO_INTERFACE, __FILE__, __LINE__);
     
-    nsIWebNavigation webNavigation = new nsIWebNavigation (result[0]);          
+    //nsIWebNavigation webNavigation = new nsIWebNavigation (result[0]);          
     rc = webNavigation.GoBack ();   
     webNavigation.Release ();
     return rc is XPCOM.NS_OK;
 }
 
-void createCOMInterfaces () {
-    // Create each of the interfaces that this object implements
-    supports = new XPCOMObject (new int[] {2, 0, 0}) {
-        public int /*long*/ method0 (int /*long*/[] args) {return QueryInterface (args[0], args[1]);}
-        public int /*long*/ method1 (int /*long*/[] args) {return AddRef ();}
-        public int /*long*/ method2 (int /*long*/[] args) {return Release ();}
-    };
-    
-    weakReference = new XPCOMObject (new int[] {2, 0, 0, 2}) {
-        public int /*long*/ method0 (int /*long*/[] args) {return QueryInterface (args[0], args[1]);}
-        public int /*long*/ method1 (int /*long*/[] args) {return AddRef ();}
-        public int /*long*/ method2 (int /*long*/[] args) {return Release ();}
-        public int /*long*/ method3 (int /*long*/[] args) {return QueryReferent (args[0], args[1]);}
-    };
-
-    webProgressListener = new XPCOMObject (new int[] {2, 0, 0, 4, 6, 3, 4, 3}) {
-        public int /*long*/ method0 (int /*long*/[] args) {return QueryInterface (args[0], args[1]);}
-        public int /*long*/ method1 (int /*long*/[] args) {return AddRef ();}
-        public int /*long*/ method2 (int /*long*/[] args) {return Release ();}
-        public int /*long*/ method3 (int /*long*/[] args) {return OnStateChange (args[0], args[1], cast(int)/*64*/args[2], cast(int)/*64*/args[3]);}
-        public int /*long*/ method4 (int /*long*/[] args) {return OnProgressChange (args[0], args[1], cast(int)/*64*/args[2], cast(int)/*64*/args[3], cast(int)/*64*/args[4], cast(int)/*64*/args[5]);}
-        public int /*long*/ method5 (int /*long*/[] args) {return OnLocationChange (args[0], args[1], args[2]);}
-        public int /*long*/ method6 (int /*long*/[] args) {return OnStatusChange (args[0], args[1], cast(int)/*64*/args[2], args[3]);}
-        public int /*long*/ method7 (int /*long*/[] args) {return OnSecurityChange (args[0], args[1], cast(int)/*64*/args[2]);}
-    };
-    
-    webBrowserChrome = new XPCOMObject (new int[] {2, 0, 0, 2, 1, 1, 1, 1, 0, 2, 0, 1, 1}) {
-        public int /*long*/ method0 (int /*long*/[] args) {return QueryInterface (args[0], args[1]);}
-        public int /*long*/ method1 (int /*long*/[] args) {return AddRef ();}
-        public int /*long*/ method2 (int /*long*/[] args) {return Release ();}
-        public int /*long*/ method3 (int /*long*/[] args) {return SetStatus (cast(int)/*64*/args[0], args[1]);}
-        public int /*long*/ method4 (int /*long*/[] args) {return GetWebBrowser (args[0]);}
-        public int /*long*/ method5 (int /*long*/[] args) {return SetWebBrowser (args[0]);}
-        public int /*long*/ method6 (int /*long*/[] args) {return GetChromeFlags (args[0]);}
-        public int /*long*/ method7 (int /*long*/[] args) {return SetChromeFlags (cast(int)/*64*/args[0]);}
-        public int /*long*/ method8 (int /*long*/[] args) {return DestroyBrowserWindow ();}
-        public int /*long*/ method9 (int /*long*/[] args) {return SizeBrowserTo (cast(int)/*64*/args[0], cast(int)/*64*/args[1]);}
-        public int /*long*/ method10 (int /*long*/[] args) {return ShowAsModal ();}
-        public int /*long*/ method11 (int /*long*/[] args) {return IsWindowModal (args[0]);}
-        public int /*long*/ method12 (int /*long*/[] args) {return ExitModalEventLoop (cast(int)/*64*/args[0]);}
-    };
-    
-    webBrowserChromeFocus = new XPCOMObject (new int[] {2, 0, 0, 0, 0}) {
-        public int /*long*/ method0 (int /*long*/[] args) {return QueryInterface (args[0], args[1]);}
-        public int /*long*/ method1 (int /*long*/[] args) {return AddRef ();}
-        public int /*long*/ method2 (int /*long*/[] args) {return Release ();}
-        public int /*long*/ method3 (int /*long*/[] args) {return FocusNextElement ();}
-        public int /*long*/ method4 (int /*long*/[] args) {return FocusPrevElement ();}
-    };
-        
-    embeddingSiteWindow = new XPCOMObject (new int[] {2, 0, 0, 5, 5, 0, 1, 1, 1, 1, 1}) {
-        public int /*long*/ method0 (int /*long*/[] args) {return QueryInterface (args[0], args[1]);}
-        public int /*long*/ method1 (int /*long*/[] args) {return AddRef ();}
-        public int /*long*/ method2 (int /*long*/[] args) {return Release ();}
-        public int /*long*/ method3 (int /*long*/[] args) {return SetDimensions (cast(int)/*64*/args[0], cast(int)/*64*/args[1], cast(int)/*64*/args[2], cast(int)/*64*/args[3], cast(int)/*64*/args[4]);}
-        public int /*long*/ method4 (int /*long*/[] args) {return GetDimensions (cast(int)/*64*/args[0], args[1], args[2], args[3], args[4]);}
-        public int /*long*/ method5 (int /*long*/[] args) {return SetFocus ();}
-        public int /*long*/ method6 (int /*long*/[] args) {return GetVisibility (args[0]);}
-        public int /*long*/ method7 (int /*long*/[] args) {return SetVisibility (cast(int)/*64*/args[0]);}
-        public int /*long*/ method8 (int /*long*/[] args) {return GetTitle (args[0]);}
-        public int /*long*/ method9 (int /*long*/[] args) {return SetTitle (args[0]);}
-        public int /*long*/ method10 (int /*long*/[] args) {return GetSiteWindow (args[0]);}
-    };
-    
-    interfaceRequestor = new XPCOMObject (new int[] {2, 0, 0, 2} ){
-        public int /*long*/ method0 (int /*long*/[] args) {return QueryInterface (args[0], args[1]);}
-        public int /*long*/ method1 (int /*long*/[] args) {return AddRef ();}
-        public int /*long*/ method2 (int /*long*/[] args) {return Release ();}
-        public int /*long*/ method3 (int /*long*/[] args) {return GetInterface (args[0], args[1]);}
-    };
-        
-    supportsWeakReference = new XPCOMObject (new int[] {2, 0, 0, 1}) {
-        public int /*long*/ method0 (int /*long*/[] args) {return QueryInterface (args[0], args[1]);}
-        public int /*long*/ method1 (int /*long*/[] args) {return AddRef ();}
-        public int /*long*/ method2 (int /*long*/[] args) {return Release ();}
-        public int /*long*/ method3 (int /*long*/[] args) {return GetWeakReference (args[0]);}
-    };
-    
-    contextMenuListener = new XPCOMObject (new int[] {2, 0, 0, 3}) {
-        public int /*long*/ method0 (int /*long*/[] args) {return QueryInterface (args[0], args[1]);}
-        public int /*long*/ method1 (int /*long*/[] args) {return AddRef ();}
-        public int /*long*/ method2 (int /*long*/[] args) {return Release ();}
-        public int /*long*/ method3 (int /*long*/[] args) {return OnShowContextMenu (cast(int)/*64*/args[0], args[1], args[2]);}
-    };
-    
-    uriContentListener = new XPCOMObject (new int[] {2, 0, 0, 2, 5, 3, 4, 1, 1, 1, 1}) {
-        public int /*long*/ method0 (int /*long*/[] args) {return QueryInterface (args[0], args[1]);}
-        public int /*long*/ method1 (int /*long*/[] args) {return AddRef ();}
-        public int /*long*/ method2 (int /*long*/[] args) {return Release ();}
-        public int /*long*/ method3 (int /*long*/[] args) {return OnStartURIOpen (args[0], args[1]);}
-        public int /*long*/ method4 (int /*long*/[] args) {return DoContent (args[0], cast(int)/*64*/args[1], args[2], args[3], args[4]);}
-        public int /*long*/ method5 (int /*long*/[] args) {return IsPreferred (args[0], args[1], args[2]);}
-        public int /*long*/ method6 (int /*long*/[] args) {return CanHandleContent (args[0], cast(int)/*64*/args[1], args[2], args[3]);}
-        public int /*long*/ method7 (int /*long*/[] args) {return GetLoadCookie (args[0]);}
-        public int /*long*/ method8 (int /*long*/[] args) {return SetLoadCookie (args[0]);}
-        public int /*long*/ method9 (int /*long*/[] args) {return GetParentContentListener (args[0]);}
-        public int /*long*/ method10 (int /*long*/[] args) {return SetParentContentListener (args[0]);}     
-    };
-    
-    tooltipListener = new XPCOMObject (new int[] {2, 0, 0, 3, 0}) {
-        public int /*long*/ method0 (int /*long*/[] args) {return QueryInterface (args[0], args[1]);}
-        public int /*long*/ method1 (int /*long*/[] args) {return AddRef ();}
-        public int /*long*/ method2 (int /*long*/[] args) {return Release ();}
-        public int /*long*/ method3 (int /*long*/[] args) {return OnShowTooltip (cast(int)/*64*/args[0], cast(int)/*64*/args[1], args[2]);}
-        public int /*long*/ method4 (int /*long*/[] args) {return OnHideTooltip ();}        
-    };
-
-    domEventListener = new XPCOMObject (new int[] {2, 0, 0, 1}) {
-        public int /*long*/ method0 (int /*long*/[] args) {return QueryInterface (args[0], args[1]);}
-        public int /*long*/ method1 (int /*long*/[] args) {return AddRef ();}
-        public int /*long*/ method2 (int /*long*/[] args) {return Release ();}
-        public int /*long*/ method3 (int /*long*/[] args) {return HandleEvent (args[0]);}
-    };
-}
-
-void disposeCOMInterfaces () {
-    if (supports !is null) {
-        supports.dispose ();
-        supports = null;
-    }   
-    if (weakReference !is null) {
-        weakReference.dispose ();
-        weakReference = null;   
-    }
-    if (webProgressListener !is null) {
-        webProgressListener.dispose ();
-        webProgressListener = null;
-    }
-    if (webBrowserChrome !is null) {
-        webBrowserChrome.dispose ();
-        webBrowserChrome = null;
-    }
-    if (webBrowserChromeFocus !is null) {
-        webBrowserChromeFocus.dispose ();
-        webBrowserChromeFocus = null;
-    }
-    if (embeddingSiteWindow !is null) {
-        embeddingSiteWindow.dispose ();
-        embeddingSiteWindow = null;
-    }
-    if (interfaceRequestor !is null) {
-        interfaceRequestor.dispose ();
-        interfaceRequestor = null;
-    }       
-    if (supportsWeakReference !is null) {
-        supportsWeakReference.dispose ();
-        supportsWeakReference = null;
-    }   
-    if (contextMenuListener !is null) {
-        contextMenuListener.dispose ();
-        contextMenuListener = null;
-    }
-    if (uriContentListener !is null) {
-        uriContentListener.dispose ();
-        uriContentListener = null;
-    }
-    if (tooltipListener !is null) {
-        tooltipListener.dispose ();
-        tooltipListener = null;
-    }
-    if (domEventListener !is null) {
-        domEventListener.dispose ();
-        domEventListener = null;
-    }
-}
-
+extern(D)
 public bool execute (String script) {
     if (awaitingNavigate) return false;
 
-    String url = PREFIX_JAVASCRIPT + script + ";void(0);";  //$NON-NLS-1$
-    int /*long*/[] result = new int /*long*/[1];
-    int rc = webBrowser.QueryInterface (nsIWebNavigation.NS_IWEBNAVIGATION_IID, result);
-    if (rc !is XPCOM.NS_OK) error (rc);
-    if (result[0] is 0) error (XPCOM.NS_ERROR_NO_INTERFACE);
+    String url = PREFIX_JAVASCRIPT ~ script ~ ";void(0);";  //$NON-NLS-1$
+    //int /*long*/[] result = new int /*long*/[1];
+    nsIWebNavigation webNavigation;
+    int rc = webBrowser.QueryInterface (&nsIWebNavigation.IID, cast(void**)&webNavigation);
+    if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+    if (webNavigation is null) error (XPCOM.NS_ERROR_NO_INTERFACE, __FILE__, __LINE__);
 
-    nsIWebNavigation webNavigation = new nsIWebNavigation (result[0]);
-    char[] arg = url.toCharArray (); 
-    char[] c = new char[arg.length+1];
-    System.arraycopy (arg, 0, c, 0, arg.length);
-    rc = webNavigation.LoadURI (c, nsIWebNavigation.LOAD_FLAGS_NONE, 0, 0, 0);
+    //nsIWebNavigation webNavigation = new nsIWebNavigation (result[0]);
+    //char[] arg = url.toCharArray (); 
+    //char[] c = new char[arg.length+1];
+    //System.arraycopy (arg, 0, c, 0, arg.length);
+    rc = webNavigation.LoadURI (url.toString16().toString16z(), nsIWebNavigation.LOAD_FLAGS_NONE, null, null, null);
     webNavigation.Release ();
     return rc is XPCOM.NS_OK;
 }
 
-static Browser findBrowser (int /*long*/ handle) {
-    return MozillaDelegate.findBrowser (handle);
+extern(D)
+static Browser findBrowser (void* handle) {
+    return MozillaDelegate.findBrowser (cast(GtkWidget*)handle);
 }
 
-static Browser findBrowser (nsIDOMWindow aDOMWindow) {
-    int /*long*/[] result = new int /*long*/[1];
-    int rc = XPCOM.NS_GetServiceManager (result);
-    if (rc !is XPCOM.NS_OK) Mozilla.error (rc);
-    if (result[0] is 0) Mozilla.error (XPCOM.NS_NOINTERFACE);
-
-    nsIServiceManager serviceManager = new nsIServiceManager (result[0]);
-    result[0] = 0;
-    byte[] aContractID = MozillaDelegate.wcsToMbcs (null, XPCOM.NS_WINDOWWATCHER_CONTRACTID, true);
-    rc = serviceManager.GetServiceByContractID (aContractID, nsIWindowWatcher.NS_IWINDOWWATCHER_IID, result);
-    if (rc !is XPCOM.NS_OK) Mozilla.error(rc);
-    if (result[0] is 0) Mozilla.error (XPCOM.NS_NOINTERFACE);       
-    serviceManager.Release ();
-
-    nsIWindowWatcher windowWatcher = new nsIWindowWatcher (result[0]);
-    result[0] = 0;
-    /* the chrome will only be answered for the top-level nsIDOMWindow */
-    rc = aDOMWindow.GetTop (result);
-    if (rc !is XPCOM.NS_OK) Mozilla.error (rc);
-    if (result[0] is 0) Mozilla.error (XPCOM.NS_NOINTERFACE);
-    int /*long*/ topDOMWindow = result[0];
-    result[0] = 0;
-    rc = windowWatcher.GetChromeForWindow (topDOMWindow, result);
-    if (rc !is XPCOM.NS_OK) Mozilla.error (rc);
-    if (result[0] is 0) Mozilla.error (XPCOM.NS_NOINTERFACE);
-    new nsISupports (topDOMWindow).Release ();
-    windowWatcher.Release ();   
-
-    nsIWebBrowserChrome webBrowserChrome = new nsIWebBrowserChrome (result[0]);
-    result[0] = 0;
-    rc = webBrowserChrome.QueryInterface (nsIEmbeddingSiteWindow.NS_IEMBEDDINGSITEWINDOW_IID, result);
-    if (rc !is XPCOM.NS_OK) Mozilla.error (rc);
-    if (result[0] is 0) Mozilla.error (XPCOM.NS_NOINTERFACE);       
-    webBrowserChrome.Release ();
-
-    nsIEmbeddingSiteWindow embeddingSiteWindow = new nsIEmbeddingSiteWindow (result[0]);
-    result[0] = 0;
-    rc = embeddingSiteWindow.GetSiteWindow (result);
-    if (rc !is XPCOM.NS_OK) Mozilla.error (rc);
-    if (result[0] is 0) Mozilla.error (XPCOM.NS_NOINTERFACE);       
-    embeddingSiteWindow.Release ();
-
-    return findBrowser (result[0]); 
-}
-
+extern(D)
 public bool forward () {
     if (awaitingNavigate) return false;
 
-    int /*long*/[] result = new int /*long*/[1];
-    int rc = webBrowser.QueryInterface (nsIWebNavigation.NS_IWEBNAVIGATION_IID, result);
-    if (rc !is XPCOM.NS_OK) error (rc);
-    if (result[0] is 0) error (XPCOM.NS_ERROR_NO_INTERFACE);
+    //int /*long*/[] result = new int /*long*/[1];
+    nsIWebNavigation webNavigation;
+    int rc = webBrowser.QueryInterface (&nsIWebNavigation.IID, cast(void**)&webNavigation);
+    if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+    if (webNavigation is null) error (XPCOM.NS_ERROR_NO_INTERFACE, __FILE__, __LINE__);
     
-    nsIWebNavigation webNavigation = new nsIWebNavigation (result[0]);
+    //nsIWebNavigation webNavigation = new nsIWebNavigation (result[0]);
     rc = webNavigation.GoForward ();
     webNavigation.Release ();
 
     return rc is XPCOM.NS_OK;
 }
 
-public String getBrowserType () {
-    return "mozilla"; //$NON-NLS-1$
-}
-
+extern(D)
 public String getText () {
     if (awaitingNavigate) return ""; //$NON-NLS-1$
 
-    int /*long*/[] result = new int /*long*/[1];
-    int rc = webBrowser.GetContentDOMWindow (result);
-    if (rc !is XPCOM.NS_OK) error (rc);
-    if (result[0] is 0) error (XPCOM.NS_NOINTERFACE);
+    //int /*long*/[] result = new int /*long*/[1];
+    nsIDOMWindow window;
+    int rc = webBrowser.GetContentDOMWindow (&window);
+    if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+    if (window is null) error (XPCOM.NS_NOINTERFACE, __FILE__, __LINE__);
 
-    nsIDOMWindow window = new nsIDOMWindow (result[0]);
-    result[0] = 0;
-    rc = window.GetDocument (result);
-    if (rc !is XPCOM.NS_OK) error (rc);
-    if (result[0] is 0) error (XPCOM.NS_NOINTERFACE);
+    //nsIDOMWindow window = new nsIDOMWindow (result[0]);
+    //result[0] = 0;
+    nsIDOMDocument document;
+    rc = window.GetDocument (&document);
+    if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+    if (document is null) error (XPCOM.NS_NOINTERFACE, __FILE__, __LINE__);
     window.Release ();
 
-    int /*long*/ document = result[0];
-    result[0] = 0;
-    rc = XPCOM.NS_GetComponentManager (result);
-    if (rc !is XPCOM.NS_OK) error (rc);
-    if (result[0] is 0) error (XPCOM.NS_NOINTERFACE);
+    //int /*long*/ document = result[0];
+    //result[0] = 0;
+    nsIComponentManager componentManager;
+    rc = XPCOM.NS_GetComponentManager (&componentManager);
+    if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+    if (componentManager is null) error (XPCOM.NS_NOINTERFACE, __FILE__, __LINE__);
+
+    //nsIComponentManager componentManager = new nsIComponentManager (result[0]);
+    //result[0] = 0;
+    //byte[] contractID = MozillaDelegate.wcsToMbcs (null, XPCOM.NS_DOMSERIALIZER_CONTRACTID, true);
+    String chars = null;
+    nsIDOMSerializer_1_7 serializer_1_7;
+    rc = componentManager.CreateInstanceByContractID (XPCOM.NS_DOMSERIALIZER_CONTRACTID.ptr, null, &nsIDOMSerializer_1_7.IID, cast(void**)&serializer_1_7);
+    if (rc is XPCOM.NS_OK) {    /* mozilla >= 1.7 */
+        if (serializer_1_7 is null) error (XPCOM.NS_NOINTERFACE, __FILE__, __LINE__);
 
-    nsIComponentManager componentManager = new nsIComponentManager (result[0]);
-    result[0] = 0;
-    byte[] contractID = MozillaDelegate.wcsToMbcs (null, XPCOM.NS_DOMSERIALIZER_CONTRACTID, true);
-    char[] chars = null;
+        //nsIDOMSerializer_1_7 serializer = new nsIDOMSerializer_1_7 (result[0]);
+        //result[0] = 0;
+        scope auto string = new nsEmbedString;
+        rc = serializer_1_7.SerializeToString (cast(nsIDOMNode)document, cast(nsAString*) string);
+        serializer_1_7.Release ();
 
-    rc = componentManager.CreateInstanceByContractID (contractID, 0, nsIDOMSerializer_1_7.NS_IDOMSERIALIZER_IID, result);
-    if (rc is XPCOM.NS_OK) {    /* mozilla >= 1.7 */
-        if (result[0] is 0) error (XPCOM.NS_NOINTERFACE);
-
-        nsIDOMSerializer_1_7 serializer = new nsIDOMSerializer_1_7 (result[0]);
-        result[0] = 0;
-        int /*long*/ string = XPCOM.nsEmbedString_new ();
-        rc = serializer.SerializeToString (document, string);
+        //int length = XPCOM.nsEmbedString_Length (string);
+        //int /*long*/ buffer = XPCOM.nsEmbedString_get (string);
+        //chars = new char[length];
+        //XPCOM.memmove (chars, buffer, length * 2);
+        //XPCOM.nsEmbedString_delete (string);
+        chars = string.toString();
+    } else {    /* mozilla < 1.7 */
+        nsIDOMSerializer serializer;
+        rc = componentManager.CreateInstanceByContractID (XPCOM.NS_DOMSERIALIZER_CONTRACTID.ptr, null, &nsIDOMSerializer.IID, cast(void**)&serializer);
+        if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+        if (serializer is null) error (XPCOM.NS_NOINTERFACE, __FILE__, __LINE__);
+        // TODO: Lookup SerializeToString contract. Find out if the string must provide it's own memory to the method. -JJR
+        PRUnichar* string;
+        //nsIDOMSerializer serializer = new nsIDOMSerializer (result[0]);
+        //result[0] = 0;
+        rc = serializer.SerializeToString (cast(nsIDOMNode)document, &string );
         serializer.Release ();
 
-        int length = XPCOM.nsEmbedString_Length (string);
-        int /*long*/ buffer = XPCOM.nsEmbedString_get (string);
-        chars = new char[length];
-        XPCOM.memmove (chars, buffer, length * 2);
-        XPCOM.nsEmbedString_delete (string);
-    } else {    /* mozilla < 1.7 */
-        rc = componentManager.CreateInstanceByContractID (contractID, 0, nsIDOMSerializer.NS_IDOMSERIALIZER_IID, result);
-        if (rc !is XPCOM.NS_OK) error (rc);
-        if (result[0] is 0) error (XPCOM.NS_NOINTERFACE);
-
-        nsIDOMSerializer serializer = new nsIDOMSerializer (result[0]);
-        result[0] = 0;
-        rc = serializer.SerializeToString (document, result);
-        serializer.Release ();
-
-        int length = XPCOM.strlen_PRUnichar (result[0]);
-        chars = new char[length];
-        XPCOM.memmove (chars, result[0], length * 2);
+        //int length = XPCOM.strlen_PRUnichar (string);
+        //chars = new char[length];
+        //XPCOM.memmove (chars, result[0], length * 2);
+        chars = Utf.toString(fromString16z(string));
     }
 
     componentManager.Release ();
-    new nsISupports (document).Release ();
-    return new String (chars);
+    document.Release ();
+    return chars.dup;
 }
 
+extern(D)
 public String getUrl () {
     if (awaitingNavigate) return ""; //$NON-NLS-1$
 
-    int /*long*/[] result = new int /*long*/[1];
-    int rc = webBrowser.QueryInterface (nsIWebNavigation.NS_IWEBNAVIGATION_IID, result);
-    if (rc !is XPCOM.NS_OK) error (rc);
-    if (result[0] is 0) error (XPCOM.NS_ERROR_NO_INTERFACE);
+    //int /*long*/[] result = new int /*long*/[1];
+    nsIWebNavigation webNavigation;
+    int rc = webBrowser.QueryInterface (&nsIWebNavigation.IID, cast(void**)&webNavigation);
+    if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+    if (webNavigation is null) error (XPCOM.NS_ERROR_NO_INTERFACE, __FILE__, __LINE__);
 
-    nsIWebNavigation webNavigation = new nsIWebNavigation (result[0]);
-    int /*long*/[] aCurrentURI = new int /*long*/[1];
-    rc = webNavigation.GetCurrentURI (aCurrentURI);
-    if (rc !is XPCOM.NS_OK) error (rc);
+    //nsIWebNavigation webNavigation = new nsIWebNavigation (result[0]);
+    nsIURI aCurrentURI;
+    rc = webNavigation.GetCurrentURI (&aCurrentURI);
+    if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
     webNavigation.Release ();
 
-    byte[] dest = null;
-    if (aCurrentURI[0] !is 0) {
-        nsIURI uri = new nsIURI (aCurrentURI[0]);
-        int /*long*/ aSpec = XPCOM.nsEmbedCString_new ();
-        rc = uri.GetSpec (aSpec);
-        if (rc !is XPCOM.NS_OK) error (rc);
-        int length = XPCOM.nsEmbedCString_Length (aSpec);
-        int /*long*/ buffer = XPCOM.nsEmbedCString_get (aSpec);
-        dest = new byte[length];
-        XPCOM.memmove (dest, buffer, length);
-        XPCOM.nsEmbedCString_delete (aSpec);
-        uri.Release ();
+    String location = null;
+    if (aCurrentURI !is null) {
+        //nsIURI uri = new nsIURI (aCurrentURI[0]);
+        scope auto aSpec = new nsEmbedCString;
+        rc = aCurrentURI.GetSpec (cast(nsACString*)aSpec);
+        if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+        //int length = XPCOM.nsEmbedCString_Length (aSpec);
+        //int /*long*/ buffer = XPCOM.nsEmbedCString_get (aSpec);
+        location = aSpec.toString;
+        //XPCOM.memmove (dest, buffer, length);
+        //XPCOM.nsEmbedCString_delete (aSpec);
+        aCurrentURI.Release ();
     }
-    if (dest is null) return ""; //$NON-NLS-1$
+    if (location is null) return ""; //$NON-NLS-1$
 
-    String location = new String (dest);
     /*
      * If the URI indicates that the page is being rendered from memory
      * (via setText()) then set it to about:blank to be consistent with IE.
      */
-    if (location.equals cast(URI_FROMMEMORY)) location = ABOUT_BLANK;
+    if (location.equals (URI_FROMMEMORY)) location = ABOUT_BLANK;
     return location;
 }
 
+extern(D)
 public Object getWebBrowser () {
     if ((browser.getStyle () & DWT.MOZILLA) is 0) return null;
     if (webBrowserObject !is null) return webBrowserObject;
-
+    implMissing(__FILE__,__LINE__);
+/+
     try {
+        // TODO: this references the JavaXPCOM browser... not sure what needs to be done here,
+        // but I don't think this method is necessary.
         Class clazz = Class.forName ("org.mozilla.xpcom.Mozilla"); //$NON-NLS-1$
         Method method = clazz.getMethod ("getInstance", new Class[0]); //$NON-NLS-1$
         Object mozilla = method.invoke (null, new Object[0]);
         method = clazz.getMethod ("wrapXPCOMObject", new Class[] {Long.TYPE, String.class}); //$NON-NLS-1$
-        webBrowserObject = method.invoke (mozilla, new Object[] {new Long (webBrowser.getAddress ()), nsIWebBrowser.NS_IWEBBROWSER_IID_STR});
+        webBrowserObject = webBrowser.getAddress ()), nsIWebBrowser.NS_IWEBBROWSER_IID_STR});
         /*
          * The following AddRef() is needed to offset the automatic Release() that
          * will be performed by JavaXPCOM when webBrowserObject is finalized.
          */
         webBrowser.AddRef ();
         return webBrowserObject;
-    } catch (ClassNotFoundException e) {
-    } catch (NoSuchMethodException e) {
-    } catch (IllegalArgumentException e) {
-    } catch (IllegalAccessException e) {
-    } catch (InvocationTargetException e) {
-    }
-    return null;
+   } catch (ClassNotFoundException e) {
+   } catch (NoSuchMethodException e) {
+   } catch (IllegalArgumentException e) {
+   } catch (IllegalAccessException e) {
+   } catch (InvocationTargetException e) {
+   }
++/
+   return null;
 }
 
+extern(D)
 public bool isBackEnabled () {
     if (awaitingNavigate) return false;
 
-    int /*long*/[] result = new int /*long*/[1];
-    int rc = webBrowser.QueryInterface (nsIWebNavigation.NS_IWEBNAVIGATION_IID, result);
-    if (rc !is XPCOM.NS_OK) error (rc);
-    if (result[0] is 0) error (XPCOM.NS_ERROR_NO_INTERFACE);
+    //int /*long*/[] result = new int /*long*/[1];
+    nsIWebNavigation webNavigation;
+    int rc = webBrowser.QueryInterface (&nsIWebNavigation.IID, cast(void**)&webNavigation);
+    if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+    if (webNavigation is null) error (XPCOM.NS_ERROR_NO_INTERFACE, __FILE__, __LINE__);
     
-    nsIWebNavigation webNavigation = new nsIWebNavigation (result[0]);
-    int[] aCanGoBack = new int[1]; /* PRBool */
-    rc = webNavigation.GetCanGoBack (aCanGoBack);   
+    //nsIWebNavigation webNavigation = new nsIWebNavigation (result[0]);
+    PRBool aCanGoBack; /* PRBool */
+    rc = webNavigation.GetCanGoBack (&aCanGoBack);   
     webNavigation.Release ();
-    return aCanGoBack[0] !is 0;
+    return aCanGoBack !is 0;
 }
 
+extern(D)
 public bool isForwardEnabled () {
     if (awaitingNavigate) return false;
 
-    int /*long*/[] result = new int /*long*/[1];
-    int rc = webBrowser.QueryInterface (nsIWebNavigation.NS_IWEBNAVIGATION_IID, result);
-    if (rc !is XPCOM.NS_OK) error (rc);
-    if (result[0] is 0) error (XPCOM.NS_ERROR_NO_INTERFACE);
+    //int /*long*/[] result = new int /*long*/[1];
+    nsIWebNavigation webNavigation;
+    int rc = webBrowser.QueryInterface (&nsIWebNavigation.IID, cast(void**)&webNavigation);
+    if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+    if (webNavigation is null) error (XPCOM.NS_ERROR_NO_INTERFACE, __FILE__, __LINE__);
     
-    nsIWebNavigation webNavigation = new nsIWebNavigation (result[0]);
-    int[] aCanGoForward = new int[1]; /* PRBool */
-    rc = webNavigation.GetCanGoForward (aCanGoForward);
+    //nsIWebNavigation webNavigation = new nsIWebNavigation (result[0]);
+    PRBool aCanGoForward; /* PRBool */
+    rc = webNavigation.GetCanGoForward (&aCanGoForward);
     webNavigation.Release ();
-    return aCanGoForward[0] !is 0;
+    return aCanGoForward !is 0;
 }
 
-static String error (int code) {
-    throw new DWTError ("XPCOM error " + code); //$NON-NLS-1$
+extern(D)
+static void error (int code ) {
+    error ( code, "NOT GIVEN", 0 );
 }
 
+extern(D)
+static String error (int code, char[] file, int line) {
+    Stdout ("File: ")(file)("  Line: ")(line).newline;
+    throw new DWTError ("XPCOM error " ~ Integer.toString(code)); //$NON-NLS-1$
+}
+
+extern(D)
 void onDispose (Display display) {
-    int rc = webBrowser.RemoveWebBrowserListener (weakReference.getAddress (), nsIWebProgressListener.NS_IWEBPROGRESSLISTENER_IID);
-    if (rc !is XPCOM.NS_OK) error (rc);
+    int rc = webBrowser.RemoveWebBrowserListener (cast(nsIWeakReference)this, &nsIWebProgressListener.IID);
+    if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
 
-    rc = webBrowser.SetParentURIContentListener (0);
-    if (rc !is XPCOM.NS_OK) error (rc);
+    rc = webBrowser.SetParentURIContentListener (null);
+    if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
     
     unhookDOMListeners ();
     if (listener !is null) {
-        int[] folderEvents = new int[] {
+        int[] folderEvents = [
             DWT.Dispose,
             DWT.Resize,  
             DWT.FocusIn,
@@ -1776,24 +1464,25 @@
             DWT.Deactivate,
             DWT.Show,
             DWT.KeyDown,
-        };
+        ];
         for (int i = 0; i < folderEvents.length; i++) {
             browser.removeListener (folderEvents[i], listener);
         }
         listener = null;
     }
 
-    int /*long*/[] result = new int /*long*/[1];
-    rc = webBrowser.QueryInterface (nsIBaseWindow.NS_IBASEWINDOW_IID, result);
-    if (rc !is XPCOM.NS_OK) error (rc);
-    if (result[0] is 0) error (XPCOM.NS_ERROR_NO_INTERFACE);
+    //int /*long*/[] result = new int /*long*/[1];
+    nsIBaseWindow baseWindow;
+    rc = webBrowser.QueryInterface (&nsIBaseWindow.IID, cast(void**)&baseWindow);
+    if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+    if (baseWindow is null) error (XPCOM.NS_ERROR_NO_INTERFACE, __FILE__, __LINE__);
 
-    nsIBaseWindow baseWindow = new nsIBaseWindow (result[0]);
+    //nsIBaseWindow baseWindow = new nsIBaseWindow (result[0]);
     rc = baseWindow.Destroy ();
-    if (rc !is XPCOM.NS_OK) error (rc);
+    if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
     baseWindow.Release ();
 
-    this ();
+    Release ();
     webBrowser.Release ();
     webBrowser = null;
     webBrowserObject = null;
@@ -1802,70 +1491,78 @@
     tip = null;
     location = size = null;
 
-    Enumeration elements = unhookedDOMWindows.elements ();
-    while (elements.hasMoreElements ()) {
-        LONG ptrObject = cast(LONG)elements.nextElement ();
-        new nsISupports (ptrObject.value).Release ();
+    //Enumeration elements = unhookedDOMWindows.elements ();
+    foreach (win ; unhookedDOMWindows) {
+        //LONG ptrObject = (LONG)elements.nextElement ();
+        win.Release ();
     }
     unhookedDOMWindows = null;
 
-    delegate.onDispose (embedHandle);
-    delegate = null;
+    mozDelegate.onDispose (embedHandle);
+    mozDelegate = null;
 
-    embedHandle = 0;
+    embedHandle = null;
     BrowserCount--;
 }
 
+extern(D)
 void Activate () {
-    int /*long*/[] result = new int /*long*/[1];
-    int rc = webBrowser.QueryInterface (nsIWebBrowserFocus.NS_IWEBBROWSERFOCUS_IID, result);
-    if (rc !is XPCOM.NS_OK) error (rc);
-    if (result[0] is 0) error (XPCOM.NS_ERROR_NO_INTERFACE);
+    //int /*long*/[] result = new int /*long*/[1];
+    nsIWebBrowserFocus webBrowserFocus;
+    int rc = webBrowser.QueryInterface (&nsIWebBrowserFocus.IID, cast(void**)&webBrowserFocus);
+    if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+    if (webBrowserFocus is null) error (XPCOM.NS_ERROR_NO_INTERFACE, __FILE__, __LINE__);
     
-    nsIWebBrowserFocus webBrowserFocus = new nsIWebBrowserFocus (result[0]);
+    //nsIWebBrowserFocus webBrowserFocus = new nsIWebBrowserFocus (result[0]);
     rc = webBrowserFocus.Activate ();
-    if (rc !is XPCOM.NS_OK) error (rc);
-    webBrowserFocus.Release ();
-}
-    
-void Deactivate () {
-    int /*long*/[] result = new int /*long*/[1];
-    int rc = webBrowser.QueryInterface (nsIWebBrowserFocus.NS_IWEBBROWSERFOCUS_IID, result);
-    if (rc !is XPCOM.NS_OK) error (rc);
-    if (result[0] is 0) error (XPCOM.NS_ERROR_NO_INTERFACE);
-    
-    nsIWebBrowserFocus webBrowserFocus = new nsIWebBrowserFocus (result[0]);
-    rc = webBrowserFocus.Deactivate ();
-    if (rc !is XPCOM.NS_OK) error (rc);
+    if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
     webBrowserFocus.Release ();
 }
 
+extern(D)
+void Deactivate () {
+    //int /*long*/[] result = new int /*long*/[1];
+    nsIWebBrowserFocus webBrowserFocus;
+    int rc = webBrowser.QueryInterface (&nsIWebBrowserFocus.IID, cast(void**)&webBrowserFocus);
+    if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+    if (webBrowserFocus is null) error (XPCOM.NS_ERROR_NO_INTERFACE, __FILE__, __LINE__);
+    
+    //nsIWebBrowserFocus webBrowserFocus = new nsIWebBrowserFocus (result[0]);
+    rc = webBrowserFocus.Deactivate ();
+    if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+    webBrowserFocus.Release ();
+}
+
+extern(D)
 void onResize () {
     Rectangle rect = browser.getClientArea ();
     int width = Math.max (1, rect.width);
     int height = Math.max (1, rect.height);
 
-    int /*long*/[] result = new int /*long*/[1];
-    int rc = webBrowser.QueryInterface (nsIBaseWindow.NS_IBASEWINDOW_IID, result);
-    if (rc !is XPCOM.NS_OK) error (rc);
-    if (result[0] is 0) error (XPCOM.NS_ERROR_NO_INTERFACE);
+    //int /*long*/[] result = new int /*long*/[1];
+    nsIBaseWindow baseWindow;
+    int rc = webBrowser.QueryInterface (&nsIBaseWindow.IID, cast(void**)&baseWindow);
+    if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+    if (baseWindow is null) error (XPCOM.NS_ERROR_NO_INTERFACE, __FILE__, __LINE__);
 
-    delegate.setSize (embedHandle, width, height);
-    nsIBaseWindow baseWindow = new nsIBaseWindow (result[0]);
+    mozDelegate.setSize (embedHandle, width, height);
+    //nsIBaseWindow baseWindow = new nsIBaseWindow (result[0]);
     rc = baseWindow.SetPositionAndSize (0, 0, width, height, 1);
-    if (rc !is XPCOM.NS_OK) error (rc);
+    if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
     baseWindow.Release ();
 }
 
+extern(D)
 public void refresh () {
     if (awaitingNavigate) return;
 
-    int /*long*/[] result = new int /*long*/[1];
-    int rc = webBrowser.QueryInterface (nsIWebNavigation.NS_IWEBNAVIGATION_IID, result);
+    //int /*long*/[] result = new int /*long*/[1];
+    nsIWebNavigation webNavigation;
+    int rc = webBrowser.QueryInterface (&nsIWebNavigation.IID, cast(void**)&webNavigation);
     if (rc !is XPCOM.NS_OK) error(rc);
-    if (result[0] is 0) error (XPCOM.NS_ERROR_NO_INTERFACE);
+    if (webNavigation is null) error (XPCOM.NS_ERROR_NO_INTERFACE, __FILE__, __LINE__);
     
-    nsIWebNavigation webNavigation = new nsIWebNavigation (result[0]);          
+    //nsIWebNavigation webNavigation = new nsIWebNavigation (result[0]);          
     rc = webNavigation.Reload (nsIWebNavigation.LOAD_FLAGS_NONE);
     webNavigation.Release ();
     if (rc is XPCOM.NS_OK) return;
@@ -1879,9 +1576,10 @@
     * attempting to load a non-existent local url, which is not a Browser error,
     * so this error code should be ignored. 
     */
-    if (rc !is XPCOM.NS_ERROR_INVALID_POINTER && rc !is XPCOM.NS_ERROR_FILE_NOT_FOUND) error (rc);
+    if (rc !is XPCOM.NS_ERROR_INVALID_POINTER && rc !is XPCOM.NS_ERROR_FILE_NOT_FOUND) error (rc, __FILE__, __LINE__);
 }
 
+extern(D)
 public bool setText (String html) {
     /*
     *  Feature in Mozilla.  The focus memory of Mozilla must be 
@@ -1900,58 +1598,63 @@
     *  would be to have a way to call deactivate when the Browser
     *  or one of its children loses focus.
     */
-    if (browser !is browser.getDisplay ().getFocusControl ()) Deactivate ();
-    
+    if (browser !is browser.getDisplay().getFocusControl ()) {
+        Deactivate ();
+    }
     /* convert the String containing HTML to an array of bytes with UTF-8 data */
+    /+
     byte[] data = null;
     try {
         data = html.getBytes ("UTF-8"); //$NON-NLS-1$
     } catch (UnsupportedEncodingException e) {
         return false;
     }
-
+    +/
     awaitingNavigate = false;
 
-    byte[] contentTypeBuffer = MozillaDelegate.wcsToMbcs (null, "text/html", true); // $NON-NLS-1$
-    int /*long*/ aContentType = XPCOM.nsEmbedCString_new (contentTypeBuffer, contentTypeBuffer.length);
-    byte[] contentCharsetBuffer = MozillaDelegate.wcsToMbcs (null, "UTF-8", true);  //$NON-NLS-1$
-    int /*long*/ aContentCharset = XPCOM.nsEmbedCString_new (contentCharsetBuffer, contentCharsetBuffer.length);
+    //byte[] contentTypeBuffer = MozillaDelegate.wcsToMbcs (null, "text/html", true); // $NON-NLS-1$
+    scope auto aContentType = new nsEmbedCString ("text/html");
+    //byte[] contentCharsetBuffer = MozillaDelegate.wcsToMbcs (null, "UTF-8", true);  //$NON-NLS-1$
+    scope auto aContentCharset = new nsEmbedCString ("UTF-8");
 
-    int /*long*/[] result = new int /*long*/[1];
-    int rc = XPCOM.NS_GetServiceManager (result);
-    if (rc !is XPCOM.NS_OK) error (rc);
-    if (result[0] is 0) error (XPCOM.NS_NOINTERFACE);
+    //int /*long*/[] result = new int /*long*/[1];
+    nsIServiceManager serviceManager;
+    int rc = XPCOM.NS_GetServiceManager (&serviceManager);
+    if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+    if (serviceManager is null) error (XPCOM.NS_NOINTERFACE, __FILE__, __LINE__);
 
-    nsIServiceManager serviceManager = new nsIServiceManager (result[0]);
-    result[0] = 0;
-    rc = serviceManager.GetService (XPCOM.NS_IOSERVICE_CID, nsIIOService.NS_IIOSERVICE_IID, result);
-    if (rc !is XPCOM.NS_OK) error (rc);
-    if (result[0] is 0) error (XPCOM.NS_NOINTERFACE);
+    //nsIServiceManager serviceManager = new nsIServiceManager (result[0]);
+    //result[0] = 0;
+    nsIIOService ioService;
+    rc = serviceManager.GetService (&XPCOM.NS_IOSERVICE_CID, &nsIIOService.IID, cast(void**)&ioService);
+    if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+    if (ioService is null) error (XPCOM.NS_NOINTERFACE, __FILE__, __LINE__);
     serviceManager.Release ();
 
-    nsIIOService ioService = new nsIIOService (result[0]);
-    result[0] = 0;
+    //nsIIOService ioService = new nsIIOService (result[0]);
+    //result[0] = 0;
     /*
     * Note.  Mozilla ignores LINK tags used to load CSS stylesheets
     * when the URI protocol for the nsInputStreamChannel
     * is about:blank.  The fix is to specify the file protocol.
     */
-    byte[] aString = MozillaDelegate.wcsToMbcs (null, URI_FROMMEMORY, false);
-    int /*long*/ aSpec = XPCOM.nsEmbedCString_new (aString, aString.length);
-    rc = ioService.NewURI (aSpec, null, 0, result);
-    if (rc !is XPCOM.NS_OK) error (rc);
-    if (result[0] is 0) error (XPCOM.NS_NOINTERFACE);
-    XPCOM.nsEmbedCString_delete (aSpec);
+    //byte[] aString = MozillaDelegate.wcsToMbcs (null, URI_FROMMEMORY, false);
+    scope auto aSpec = new nsEmbedCString(URI_FROMMEMORY);
+    nsIURI uri;
+    rc = ioService.NewURI (cast(nsACString*)aSpec, null, null, &uri);
+    if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+    if (uri is null) error (XPCOM.NS_NOINTERFACE, __FILE__, __LINE__);
+    //XPCOM.nsEmbedCString_delete (aSpec);
     ioService.Release ();
 
-    nsIURI uri = new nsIURI (result[0]);
-    result[0] = 0;
-
-    rc = webBrowser.QueryInterface (nsIInterfaceRequestor.NS_IINTERFACEREQUESTOR_IID, result);
-    if (rc !is XPCOM.NS_OK) error (rc);
-    if (result[0] is 0) error (XPCOM.NS_ERROR_NO_INTERFACE);
-    nsIInterfaceRequestor interfaceRequestor = new nsIInterfaceRequestor (result[0]);
-    result[0] = 0;
+    //nsIURI uri = new nsIURI (result[0]);
+    //result[0] = 0;
+    nsIInterfaceRequestor interfaceRequestor;
+    rc = webBrowser.QueryInterface (&nsIInterfaceRequestor.IID, cast(void**)&interfaceRequestor);
+    if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+    if (interfaceRequestor is null) error (XPCOM.NS_ERROR_NO_INTERFACE, __FILE__, __LINE__);
+    //nsIInterfaceRequestor interfaceRequestor = new nsIInterfaceRequestor (result[0]);
+    //result[0] = 0;
 
     /*
     * Feature in Mozilla. LoadStream invokes the nsIInputStream argument
@@ -1959,163 +1662,174 @@
     * a non java thread to the JVM otherwise the nsIInputStream Read and
     * Close methods never get called.
     */
-    InputStream inputStream = new InputStream (data);
+    
+    // Using fully qualified name for disambiguation with dwthelper InputStream -JJR
+    auto inputStream = new dwt.browser.InputStream.InputStream (cast(byte[])html);
     inputStream.AddRef ();
 
-    rc = interfaceRequestor.GetInterface (nsIDocShell_1_9.NS_IDOCSHELL_IID, result);
+    nsIDocShell_1_9 docShell_1_9;
+    rc = interfaceRequestor.GetInterface (&nsIDocShell_1_9.IID, cast(void**)&docShell_1_9);
     if (rc is XPCOM.NS_OK) {
-        if (result[0] is 0) error (XPCOM.NS_ERROR_NO_INTERFACE);
-        nsIDocShell_1_9 docShell = new nsIDocShell_1_9 (result[0]);
-        rc = docShell.LoadStream (inputStream.getAddress (), uri.getAddress (), aContentType,  aContentCharset, 0);
-        docShell.Release ();
+        if (docShell_1_9 is null) error (XPCOM.NS_ERROR_NO_INTERFACE, __FILE__, __LINE__);
+        //nsIDocShell_1_9 docShell = new nsIDocShell_1_9 (result[0]);
+        rc = docShell_1_9.LoadStream (inputStream, uri, cast(nsACString*)aContentType,  cast(nsACString*)aContentCharset, null);
+        docShell_1_9.Release ();
     } else {
-        result[0] = 0;
-        rc = interfaceRequestor.GetInterface (nsIDocShell_1_8.NS_IDOCSHELL_IID, result);
+        //result[0] = 0;
+        nsIDocShell_1_8 docShell_1_8;
+        rc = interfaceRequestor.GetInterface (&nsIDocShell_1_8.IID, cast(void**)&docShell_1_8);
         if (rc is XPCOM.NS_OK) {    
-            if (result[0] is 0) error (XPCOM.NS_ERROR_NO_INTERFACE);
-            nsIDocShell_1_8 docShell = new nsIDocShell_1_8 (result[0]);
-            rc = docShell.LoadStream (inputStream.getAddress (), uri.getAddress (), aContentType,  aContentCharset, 0);
-            docShell.Release ();
+            if (docShell_1_8 is null) error (XPCOM.NS_ERROR_NO_INTERFACE, __FILE__, __LINE__);
+            //nsIDocShell_1_8 docShell = new nsIDocShell_1_8 (result[0]);
+            rc = docShell_1_8.LoadStream (inputStream, uri, cast(nsACString*)aContentType,  cast(nsACString*)aContentCharset, null);
+            docShell_1_8.Release ();
         } else {
-            result[0] = 0;
-            rc = interfaceRequestor.GetInterface (nsIDocShell.NS_IDOCSHELL_IID, result);
-            if (rc !is XPCOM.NS_OK) error (rc);
-            if (result[0] is 0) error (XPCOM.NS_ERROR_NO_INTERFACE);
-            nsIDocShell docShell = new nsIDocShell (result[0]);
-            rc = docShell.LoadStream (inputStream.getAddress (), uri.getAddress (), aContentType,  aContentCharset, 0);
+            //result[0] = 0;
+            nsIDocShell docShell;
+            rc = interfaceRequestor.GetInterface (&nsIDocShell.IID, cast(void**)&docShell);
+            if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+            if (docShell is null) error (XPCOM.NS_ERROR_NO_INTERFACE, __FILE__, __LINE__);
+            //nsIDocShell docShell = new nsIDocShell (result[0]);
+            rc = docShell.LoadStream (inputStream, uri, cast(nsACString*) aContentType,  cast(nsACString*)aContentCharset, null);
             docShell.Release ();
         }
     }
-    if (rc !is XPCOM.NS_OK) error (rc);
-    result[0] = 0;
+    if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+    //result[0] = 0;
 
     inputStream.Release ();
     interfaceRequestor.Release ();
     uri.Release ();
-    XPCOM.nsEmbedCString_delete (aContentCharset);
-    XPCOM.nsEmbedCString_delete (aContentType);
+    //XPCOM.nsEmbedCString_delete (aContentCharset);
+    //XPCOM.nsEmbedCString_delete (aContentType);
     return true;
 }
 
+extern(D)
 public bool setUrl (String url) {
     awaitingNavigate = false;
 
-    int /*long*/[] result = new int /*long*/[1];
-    int rc = webBrowser.QueryInterface (nsIWebNavigation.NS_IWEBNAVIGATION_IID, result);
-    if (rc !is XPCOM.NS_OK) error (rc);
-    if (result[0] is 0) error (XPCOM.NS_ERROR_NO_INTERFACE);
+    nsIWebNavigation webNavigation;
+    int rc = webBrowser.QueryInterface (&nsIWebNavigation.IID, cast(void**)&webNavigation);
+    if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+    if (webNavigation is null) error (XPCOM.NS_ERROR_NO_INTERFACE, __FILE__, __LINE__);
 
-    nsIWebNavigation webNavigation = new nsIWebNavigation (result[0]);
-    char[] uri = new char[url.length () + 1];
-    url.getChars (0, url.length (), uri, 0);
-    rc = webNavigation.LoadURI (uri, nsIWebNavigation.LOAD_FLAGS_NONE, 0, 0, 0);
+    rc = webNavigation.LoadURI (url.toString16().toString16z(), nsIWebNavigation.LOAD_FLAGS_NONE, null, null, null);
     webNavigation.Release ();
     return rc is XPCOM.NS_OK;
 }
 
+extern(D)
 public void stop () {
     if (awaitingNavigate) return;
 
-    int /*long*/[] result = new int /*long*/[1];
-    int rc = webBrowser.QueryInterface (nsIWebNavigation.NS_IWEBNAVIGATION_IID, result);
-    if (rc !is XPCOM.NS_OK) error (rc);
-    if (result[0] is 0) error (XPCOM.NS_ERROR_NO_INTERFACE);
+    nsIWebNavigation webNavigation;
+    //int /*long*/[] result = new int /*long*/[1];
+    int rc = webBrowser.QueryInterface (&nsIWebNavigation.IID, cast(void**)&webNavigation);
+    if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+    if (webNavigation is null) error (XPCOM.NS_ERROR_NO_INTERFACE, __FILE__, __LINE__);
     
-    nsIWebNavigation webNavigation = new nsIWebNavigation (result[0]);      
+    //nsIWebNavigation webNavigation = new nsIWebNavigation (result[0]);      
     rc = webNavigation.Stop (nsIWebNavigation.STOP_ALL);
-    if (rc !is XPCOM.NS_OK) error (rc);
+    if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
     webNavigation.Release ();
 }
 
+extern(D)
 void hookDOMListeners (nsIDOMEventTarget target, bool isTop) {
-    nsEmbedString string = new nsEmbedString (XPCOM.DOMEVENT_FOCUS);
-    target.AddEventListener (string.getAddress (), domEventListener.getAddress (), 0);
-    string.dispose ();
-    string = new nsEmbedString (XPCOM.DOMEVENT_UNLOAD);
-    target.AddEventListener (string.getAddress (), domEventListener.getAddress (), 0);
-    string.dispose ();
-    string = new nsEmbedString (XPCOM.DOMEVENT_MOUSEDOWN);
-    target.AddEventListener (string.getAddress (), domEventListener.getAddress (), 0);
-    string.dispose ();
-    string = new nsEmbedString (XPCOM.DOMEVENT_MOUSEUP);
-    target.AddEventListener (string.getAddress (), domEventListener.getAddress (), 0);
-    string.dispose ();
-    string = new nsEmbedString (XPCOM.DOMEVENT_MOUSEMOVE);
-    target.AddEventListener (string.getAddress (), domEventListener.getAddress (), 0);
-    string.dispose ();
-    string = new nsEmbedString (XPCOM.DOMEVENT_MOUSEWHEEL);
-    target.AddEventListener (string.getAddress (), domEventListener.getAddress (), 0);
-    string.dispose ();
-    string = new nsEmbedString (XPCOM.DOMEVENT_MOUSEDRAG);
-    target.AddEventListener (string.getAddress (), domEventListener.getAddress (), 0);
-    string.dispose ();
+    scope auto string = new nsEmbedString (XPCOM.DOMEVENT_FOCUS.toString16());
+    target.AddEventListener (cast(nsAString*)string, cast(nsIDOMEventListener)this, 0);
+    //string.dispose ();
+    string = new nsEmbedString (XPCOM.DOMEVENT_UNLOAD.toString16());
+    target.AddEventListener (cast(nsAString*)string, cast(nsIDOMEventListener)this, 0);
+    //string.dispose ();
+    string = new nsEmbedString (XPCOM.DOMEVENT_MOUSEDOWN.toString16());
+    target.AddEventListener (cast(nsAString*)string,cast(nsIDOMEventListener)this, 0);
+    //string.dispose ();
+    string = new nsEmbedString (XPCOM.DOMEVENT_MOUSEUP.toString16());
+    target.AddEventListener (cast(nsAString*)string, cast(nsIDOMEventListener)this, 0);
+    //string.dispose ();
+    string = new nsEmbedString (XPCOM.DOMEVENT_MOUSEMOVE.toString16());
+    target.AddEventListener (cast(nsAString*)string, cast(nsIDOMEventListener)this, 0);
+    //string.dispose ();
+    string = new nsEmbedString (XPCOM.DOMEVENT_MOUSEWHEEL.toString16());
+    target.AddEventListener (cast(nsAString*)string, cast(nsIDOMEventListener)this, 0);
+    //string.dispose ();
+    string = new nsEmbedString (XPCOM.DOMEVENT_MOUSEDRAG.toString16());
+    target.AddEventListener (cast(nsAString*)string, cast(nsIDOMEventListener)this, 0);
+    //string.dispose ();
 
     /*
     * Only hook mouseover and mouseout if the target is a top-level frame, so that mouse moves
     * between frames will not generate events.
     */
-    if (isTop && delegate.hookEnterExit ()) {
-        string = new nsEmbedString (XPCOM.DOMEVENT_MOUSEOVER);
-        target.AddEventListener (string.getAddress (), domEventListener.getAddress (), 0);
-        string.dispose ();
-        string = new nsEmbedString (XPCOM.DOMEVENT_MOUSEOUT);
-        target.AddEventListener (string.getAddress (), domEventListener.getAddress (), 0);
-        string.dispose ();
+    if (isTop && mozDelegate.hookEnterExit ()) {
+        string = new nsEmbedString (XPCOM.DOMEVENT_MOUSEOVER.toString16());
+        target.AddEventListener (cast(nsAString*)string, cast(nsIDOMEventListener)this, 0);
+        //string.dispose ();
+        string = new nsEmbedString (XPCOM.DOMEVENT_MOUSEOUT.toString16());
+        target.AddEventListener (cast(nsAString*)string, cast(nsIDOMEventListener)this, 0);
+        //string.dispose ();
     }
 
-    string = new nsEmbedString (XPCOM.DOMEVENT_KEYDOWN);
-    target.AddEventListener (string.getAddress (), domEventListener.getAddress (), 0);
-    string.dispose ();
-    string = new nsEmbedString (XPCOM.DOMEVENT_KEYPRESS);
-    target.AddEventListener (string.getAddress (), domEventListener.getAddress (), 0);
-    string.dispose ();
-    string = new nsEmbedString (XPCOM.DOMEVENT_KEYUP);
-    target.AddEventListener (string.getAddress (), domEventListener.getAddress (), 0);
-    string.dispose ();
+    string = new nsEmbedString (XPCOM.DOMEVENT_KEYDOWN.toString16());
+    target.AddEventListener (cast(nsAString*)string, cast(nsIDOMEventListener)this, 0);
+    //string.dispose ();
+    string = new nsEmbedString (XPCOM.DOMEVENT_KEYPRESS.toString16());
+    target.AddEventListener (cast(nsAString*)string, cast(nsIDOMEventListener)this, 0);
+    //string.dispose ();
+    string = new nsEmbedString (XPCOM.DOMEVENT_KEYUP.toString16());
+    target.AddEventListener (cast(nsAString*)string, cast(nsIDOMEventListener)this, 0);
+    //string.dispose ();
 }
 
+extern(D)
 void unhookDOMListeners () {
-    int /*long*/[] result = new int /*long*/[1];
-    int rc = webBrowser.GetContentDOMWindow (result);
-    if (rc !is XPCOM.NS_OK) error (rc);
-    if (result[0] is 0) error (XPCOM.NS_ERROR_NO_INTERFACE);
+    //int /*long*/[] result = new int /*long*/[1];
+    nsIDOMWindow window;
+    int rc = webBrowser.GetContentDOMWindow (&window);
+    if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+    if (window is null) error (XPCOM.NS_ERROR_NO_INTERFACE, __FILE__, __LINE__);
 
-    nsIDOMWindow window = new nsIDOMWindow (result[0]);
-    result[0] = 0;
-    rc = window.QueryInterface (nsIDOMEventTarget.NS_IDOMEVENTTARGET_IID, result);
-    if (rc !is XPCOM.NS_OK) error (rc);
-    if (result[0] is 0) error (XPCOM.NS_ERROR_NO_INTERFACE);
+    //nsIDOMWindow window = new nsIDOMWindow (result[0]);
+    //result[0] = 0;
+    nsIDOMEventTarget target;
+    rc = window.QueryInterface (&nsIDOMEventTarget.IID, cast(void**)&target);
+    if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+    if (target is null) error (XPCOM.NS_ERROR_NO_INTERFACE, __FILE__, __LINE__);
 
-    nsIDOMEventTarget target = new nsIDOMEventTarget (result[0]);
-    result[0] = 0;
+    //nsIDOMEventTarget target = new nsIDOMEventTarget (result[0]);
+    //result[0] = 0;
     unhookDOMListeners (target);
     target.Release ();
 
     /* Listeners must be unhooked in pages contained in frames */
-    rc = window.GetFrames (result);
-    if (rc !is XPCOM.NS_OK) error (rc);
-    if (result[0] is 0) error (XPCOM.NS_ERROR_NO_INTERFACE);
-    nsIDOMWindowCollection frames = new nsIDOMWindowCollection (result[0]);
-    result[0] = 0;
-    int[] frameCount = new int[1];
-    rc = frames.GetLength (frameCount); /* PRUint32 */
-    if (rc !is XPCOM.NS_OK) error (rc);
-    int count = frameCount[0];
+    nsIDOMWindowCollection frames;
+    rc = window.GetFrames (&frames);
+    if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+    if (frames is null) error (XPCOM.NS_ERROR_NO_INTERFACE, __FILE__, __LINE__);
+    //nsIDOMWindowCollection frames = new nsIDOMWindowCollection (result[0]);
+    //result[0] = 0;
+    PRUint32 count;
+    rc = frames.GetLength (&count); /* PRUint32 */
+    if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+    //int count = frameCount[0];
 
     if (count > 0) {
+        nsIDOMWindow frame;
         for (int i = 0; i < count; i++) {
-            rc = frames.Item (i, result);
-            if (rc !is XPCOM.NS_OK) error (rc);
-            if (result[0] is 0) error (XPCOM.NS_ERROR_NO_INTERFACE);
+            rc = frames.Item (i, &frame);
+            if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+            if (frame is null) error (XPCOM.NS_ERROR_NO_INTERFACE, __FILE__, __LINE__);
 
-            nsIDOMWindow frame = new nsIDOMWindow (result[0]);
-            result[0] = 0;
-            rc = frame.QueryInterface (nsIDOMEventTarget.NS_IDOMEVENTTARGET_IID, result);
-            if (rc !is XPCOM.NS_OK) error (rc);
-            if (result[0] is 0) error (XPCOM.NS_ERROR_NO_INTERFACE);
+            //nsIDOMWindow frame = new nsIDOMWindow (result[0]);
+            //result[0] = 0;
+            rc = frame.QueryInterface (&nsIDOMEventTarget.IID, cast(void**)&target);
+            if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+            if (target is null) error (XPCOM.NS_ERROR_NO_INTERFACE, __FILE__, __LINE__);
 
-            target = new nsIDOMEventTarget (result[0]);
-            result[0] = 0;
+            //target = new nsIDOMEventTarget (result[0]);
+            //result[0] = 0;
             unhookDOMListeners (target);
             target.Release ();
             frame.Release ();
@@ -2125,158 +1839,166 @@
     window.Release ();
 }
 
+extern(D)
 void unhookDOMListeners (nsIDOMEventTarget target) {
-    nsEmbedString string = new nsEmbedString (XPCOM.DOMEVENT_FOCUS);
-    target.RemoveEventListener (string.getAddress (), domEventListener.getAddress (), 0);
-    string.dispose ();
-    string = new nsEmbedString (XPCOM.DOMEVENT_UNLOAD);
-    target.RemoveEventListener (string.getAddress (), domEventListener.getAddress (), 0);
-    string.dispose ();
-    string = new nsEmbedString (XPCOM.DOMEVENT_MOUSEDOWN);
-    target.RemoveEventListener (string.getAddress (), domEventListener.getAddress (), 0);
-    string.dispose ();
-    string = new nsEmbedString (XPCOM.DOMEVENT_MOUSEUP);
-    target.RemoveEventListener (string.getAddress (), domEventListener.getAddress (), 0);
-    string.dispose ();
-    string = new nsEmbedString (XPCOM.DOMEVENT_MOUSEMOVE);
-    target.RemoveEventListener (string.getAddress (), domEventListener.getAddress (), 0);
-    string.dispose ();
-    string = new nsEmbedString (XPCOM.DOMEVENT_MOUSEWHEEL);
-    target.RemoveEventListener (string.getAddress (), domEventListener.getAddress (), 0);
-    string.dispose ();
-    string = new nsEmbedString (XPCOM.DOMEVENT_MOUSEDRAG);
-    target.RemoveEventListener (string.getAddress (), domEventListener.getAddress (), 0);
-    string.dispose ();
-    string = new nsEmbedString (XPCOM.DOMEVENT_MOUSEOVER);
-    target.RemoveEventListener (string.getAddress (), domEventListener.getAddress (), 0);
-    string.dispose ();
-    string = new nsEmbedString (XPCOM.DOMEVENT_MOUSEOUT);
-    target.RemoveEventListener (string.getAddress (), domEventListener.getAddress (), 0);
-    string.dispose ();
-    string = new nsEmbedString (XPCOM.DOMEVENT_KEYDOWN);
-    target.RemoveEventListener (string.getAddress (), domEventListener.getAddress (), 0);
-    string.dispose ();
-    string = new nsEmbedString (XPCOM.DOMEVENT_KEYPRESS);
-    target.RemoveEventListener (string.getAddress (), domEventListener.getAddress (), 0);
-    string.dispose ();
-    string = new nsEmbedString (XPCOM.DOMEVENT_KEYUP);
-    target.RemoveEventListener (string.getAddress (), domEventListener.getAddress (), 0);
-    string.dispose ();
+    scope auto string = new nsEmbedString (XPCOM.DOMEVENT_FOCUS.toString16());
+    target.RemoveEventListener (cast(nsAString*)string, cast(nsIDOMEventListener)this, 0);
+    //string.dispose ();
+    string = new nsEmbedString (XPCOM.DOMEVENT_UNLOAD.toString16());
+    target.RemoveEventListener (cast(nsAString*)string, cast(nsIDOMEventListener)this, 0);
+    //string.dispose ();
+    string = new nsEmbedString (XPCOM.DOMEVENT_MOUSEDOWN.toString16());
+    target.RemoveEventListener (cast(nsAString*)string, cast(nsIDOMEventListener)this, 0);
+    //string.dispose ();
+    string = new nsEmbedString (XPCOM.DOMEVENT_MOUSEUP.toString16());
+    target.RemoveEventListener (cast(nsAString*)string, cast(nsIDOMEventListener)this, 0);
+    //string.dispose ();
+    string = new nsEmbedString (XPCOM.DOMEVENT_MOUSEMOVE.toString16());
+    target.RemoveEventListener (cast(nsAString*)string, cast(nsIDOMEventListener)this, 0);
+    //string.dispose ();
+    string = new nsEmbedString (XPCOM.DOMEVENT_MOUSEWHEEL.toString16());
+    target.RemoveEventListener (cast(nsAString*)string, cast(nsIDOMEventListener)this, 0);
+    //string.dispose ();
+    string = new nsEmbedString (XPCOM.DOMEVENT_MOUSEDRAG.toString16());
+    target.RemoveEventListener (cast(nsAString*)string, cast(nsIDOMEventListener)this, 0);
+    //string.dispose ();
+    string = new nsEmbedString (XPCOM.DOMEVENT_MOUSEOVER.toString16());
+    target.RemoveEventListener (cast(nsAString*)string, cast(nsIDOMEventListener)this, 0);
+    //string.dispose ();
+    string = new nsEmbedString (XPCOM.DOMEVENT_MOUSEOUT.toString16());
+    target.RemoveEventListener (cast(nsAString*)string, cast(nsIDOMEventListener)this, 0);
+    //string.dispose ();
+    string = new nsEmbedString (XPCOM.DOMEVENT_KEYDOWN.toString16());
+    target.RemoveEventListener (cast(nsAString*)string, cast(nsIDOMEventListener)this, 0);
+    //string.dispose ();
+    string = new nsEmbedString (XPCOM.DOMEVENT_KEYPRESS.toString16());
+    target.RemoveEventListener (cast(nsAString*)string, cast(nsIDOMEventListener)this, 0);
+    //string.dispose ();
+    string = new nsEmbedString (XPCOM.DOMEVENT_KEYUP.toString16());
+    target.RemoveEventListener (cast(nsAString*)string, cast(nsIDOMEventListener)this, 0);
+    //string.dispose ();
 }
 
 /* nsISupports */
 
-int QueryInterface (int /*long*/ riid, int /*long*/ ppvObject) {
-    if (riid is 0 || ppvObject is 0) return XPCOM.NS_ERROR_NO_INTERFACE;
+extern(System)
+nsresult QueryInterface (nsID* riid, void** ppvObject) {
+    if (riid is null || ppvObject is null) return XPCOM.NS_ERROR_NO_INTERFACE;
 
-    nsID guid = new nsID ();
-    XPCOM.memmove (guid, riid, nsID.sizeof);
-
-    if (guid.Equals (nsISupports.NS_ISUPPORTS_IID)) {
-        XPCOM.memmove (ppvObject, new int /*long*/[] {supports.getAddress ()}, C.PTR_SIZEOF);
+    if (*riid == nsISupports.IID) {
+        *ppvObject = cast(void*)cast(nsISupports)this;
         AddRef ();
         return XPCOM.NS_OK;
     }
-    if (guid.Equals (nsIWeakReference.NS_IWEAKREFERENCE_IID)) {
-        XPCOM.memmove (ppvObject, new int /*long*/[] {weakReference.getAddress ()}, C.PTR_SIZEOF);
+    if (*riid == nsIWeakReference.IID) {
+        *ppvObject = cast(void*)cast(nsIWeakReference)this;
         AddRef ();
         return XPCOM.NS_OK;
     }
-    if (guid.Equals (nsIWebProgressListener.NS_IWEBPROGRESSLISTENER_IID)) {
-        XPCOM.memmove (ppvObject, new int /*long*/[] {webProgressListener.getAddress ()}, C.PTR_SIZEOF);
+    if (*riid == nsIWebProgressListener.IID) {
+        *ppvObject = cast(void*)cast(nsIWebProgressListener)this;
         AddRef ();
         return XPCOM.NS_OK;
     }
-    if (guid.Equals (nsIWebBrowserChrome.NS_IWEBBROWSERCHROME_IID)) {
-        XPCOM.memmove (ppvObject, new int /*long*/[] {webBrowserChrome.getAddress ()}, C.PTR_SIZEOF);
+    if (*riid == nsIWebBrowserChrome.IID) {
+        *ppvObject = cast(void*)cast(nsIWebBrowserChrome)this;
         AddRef ();
         return XPCOM.NS_OK;
     }
-    if (guid.Equals (nsIWebBrowserChromeFocus.NS_IWEBBROWSERCHROMEFOCUS_IID)) {
-        XPCOM.memmove (ppvObject, new int /*long*/[] {webBrowserChromeFocus.getAddress ()}, C.PTR_SIZEOF);
+    if (*riid == nsIWebBrowserChromeFocus.IID) {
+        *ppvObject = cast(void*)cast(nsIWebBrowserChromeFocus)this;
         AddRef ();
         return XPCOM.NS_OK;
     }
-    if (guid.Equals (nsIEmbeddingSiteWindow.NS_IEMBEDDINGSITEWINDOW_IID)) {
-        XPCOM.memmove (ppvObject, new int /*long*/[] {embeddingSiteWindow.getAddress ()}, C.PTR_SIZEOF);
+    if (*riid == nsIEmbeddingSiteWindow.IID) {
+        *ppvObject = cast(void*)cast(nsIEmbeddingSiteWindow)this;
         AddRef ();
         return XPCOM.NS_OK;
     }
-    if (guid.Equals (nsIInterfaceRequestor.NS_IINTERFACEREQUESTOR_IID)) {
-        XPCOM.memmove (ppvObject, new int /*long*/[] {interfaceRequestor.getAddress ()}, C.PTR_SIZEOF);
+    if (*riid == nsIInterfaceRequestor.IID) {
+        *ppvObject = cast(void*)cast(nsIInterfaceRequestor)this;
         AddRef ();
         return XPCOM.NS_OK;
     }
-    if (guid.Equals (nsISupportsWeakReference.NS_ISUPPORTSWEAKREFERENCE_IID)) {
-        XPCOM.memmove (ppvObject, new int /*long*/[] {supportsWeakReference.getAddress ()}, C.PTR_SIZEOF);
+    if (*riid == nsISupportsWeakReference.IID) {
+        *ppvObject = cast(void*)cast(nsISupportsWeakReference)this;
         AddRef ();
         return XPCOM.NS_OK;
     }
-    if (guid.Equals (nsIContextMenuListener.NS_ICONTEXTMENULISTENER_IID)) {
-        XPCOM.memmove (ppvObject, new int /*long*/[] {contextMenuListener.getAddress ()}, C.PTR_SIZEOF);
+    if (*riid == nsIContextMenuListener.IID) {
+        *ppvObject = cast(void*)cast(nsIContextMenuListener)this;
         AddRef ();
         return XPCOM.NS_OK;
     }
-    if (guid.Equals (nsIURIContentListener.NS_IURICONTENTLISTENER_IID)) {
-        XPCOM.memmove (ppvObject, new int /*long*/[] {uriContentListener.getAddress ()}, C.PTR_SIZEOF);
+    if (*riid == nsIURIContentListener.IID) {
+        *ppvObject = cast(void*)cast(nsIURIContentListener)this;
         AddRef ();
         return XPCOM.NS_OK;
     }
-    if (guid.Equals (nsITooltipListener.NS_ITOOLTIPLISTENER_IID)) {
-        XPCOM.memmove (ppvObject, new int /*long*/[] {tooltipListener.getAddress ()}, C.PTR_SIZEOF);
+    if (*riid == nsITooltipListener.IID) {
+        *ppvObject = cast(void*)cast(nsITooltipListener)this;
         AddRef ();
         return XPCOM.NS_OK;
     }
-    XPCOM.memmove (ppvObject, new int /*long*/[] {0}, C.PTR_SIZEOF);
+    *ppvObject = null;
     return XPCOM.NS_ERROR_NO_INTERFACE;
 }
 
-int AddRef () {
+extern(System)
+nsrefcnt AddRef () {
     refCount++;
     return refCount;
 }
 
-int Release () {
+extern(System)
+nsrefcnt Release () {
     refCount--;
-    if (refCount is 0) disposeCOMInterfaces ();
+    if (refCount is 0) return 0;
     return refCount;
 }
 
 /* nsIWeakReference */  
-    
-int QueryReferent (int /*long*/ riid, int /*long*/ ppvObject) {
+
+extern(System)
+nsresult QueryReferent (nsID* riid, void** ppvObject) {
     return QueryInterface (riid, ppvObject);
 }
 
 /* nsIInterfaceRequestor */
 
-int GetInterface (int /*long*/ riid, int /*long*/ ppvObject) {
-    if (riid is 0 || ppvObject is 0) return XPCOM.NS_ERROR_NO_INTERFACE;
-    nsID guid = new nsID ();
-    XPCOM.memmove (guid, riid, nsID.sizeof);
-    if (guid.Equals (nsIDOMWindow.NS_IDOMWINDOW_IID)) {
-        int /*long*/[] aContentDOMWindow = new int /*long*/[1];
-        int rc = webBrowser.GetContentDOMWindow (aContentDOMWindow);
-        if (rc !is XPCOM.NS_OK) error (rc);
-        if (aContentDOMWindow[0] is 0) error (XPCOM.NS_ERROR_NO_INTERFACE);
-        XPCOM.memmove (ppvObject, aContentDOMWindow, C.PTR_SIZEOF);
+extern(System)
+nsresult GetInterface ( nsID* riid, void** ppvObject) {
+    if (riid is null || ppvObject is null) return XPCOM.NS_ERROR_NO_INTERFACE;
+    //nsID guid = new nsID ();
+    //XPCOM.memmove (guid, riid, nsID.sizeof);
+    if (*riid == nsIDOMWindow.IID) {
+        nsIDOMWindow aContentDOMWindow;
+        //int /*long*/[] aContentDOMWindow = new int /*long*/[1];
+        int rc = webBrowser.GetContentDOMWindow (&aContentDOMWindow);
+        if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+        if (aContentDOMWindow is null) error (XPCOM.NS_ERROR_NO_INTERFACE, __FILE__, __LINE__);
+        *ppvObject = cast(void*)aContentDOMWindow;
+        //XPCOM.memmove (ppvObject, aContentDOMWindow, C.PTR_SIZEOF);
         return rc;
     }
     return QueryInterface (riid, ppvObject);
 }
 
-int GetWeakReference (int /*long*/ ppvObject) {
-    XPCOM.memmove (ppvObject, new int /*long*/[] {weakReference.getAddress ()}, C.PTR_SIZEOF);
+extern(System)
+nsresult GetWeakReference (nsIWeakReference* ppvObject) {
+    *ppvObject = cast(nsIWeakReference)this;
+    //XPCOM.memmove (ppvObject, new int /*long*/[] {weakReference.getAddress ()}, C.PTR_SIZEOF);
     AddRef ();
     return XPCOM.NS_OK;
 }
 
 /* nsIWebProgressListener */
 
-int OnStateChange (int /*long*/ aWebProgress, int /*long*/ aRequest, int aStateFlags, int aStatus) {
+extern(System)
+nsresult OnStateChange (nsIWebProgress aWebProgress, nsIRequest aRequest, PRUint32 aStateFlags, nsresult aStatus) {
     if ((aStateFlags & nsIWebProgressListener.STATE_IS_DOCUMENT) is 0) return XPCOM.NS_OK;
     if ((aStateFlags & nsIWebProgressListener.STATE_START) !is 0) {
-        if (request is 0) request = aRequest;
+        if (request is null) request = aRequest;
 
         if (!awaitingNavigate) {
             /*
@@ -2285,15 +2007,16 @@
              * process.  These listeners cannot be added yet because the
              * nsIDOMWindow is not ready to take them at this stage.
              */
-            int /*long*/[] result = new int /*long*/[1];
-            nsIWebProgress progress = new nsIWebProgress (aWebProgress);
-            int rc = progress.GetDOMWindow (result);
-            if (rc !is XPCOM.NS_OK) error (rc);
-            if (result[0] is 0) error (XPCOM.NS_NOINTERFACE);
-            unhookedDOMWindows.addElement (new LONG (result[0]));
+            //int /*long*/[] result = new int /*long*/[1];
+            nsIDOMWindow window;
+            //nsIWebProgress progress = new nsIWebProgress (aWebProgress);
+            int rc = aWebProgress.GetDOMWindow (&window);
+            if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+            if (window is null) error (XPCOM.NS_NOINTERFACE, __FILE__, __LINE__);
+            unhookedDOMWindows ~= window;
         }
     } else if ((aStateFlags & nsIWebProgressListener.STATE_REDIRECTING) !is 0) {
-        if (request is aRequest) request = 0;
+        if (request is aRequest) request = null;
     } else if ((aStateFlags & nsIWebProgressListener.STATE_STOP) !is 0) {
         /*
         * If this page's nsIDOMWindow handle is still in unhookedDOMWindows then
@@ -2302,30 +2025,32 @@
         * received for every window in a page, which is when these listeners
         * are typically added.
         */
-        int /*long*/[] result = new int /*long*/[1];
-        nsIWebProgress progress = new nsIWebProgress (aWebProgress);
-        int rc = progress.GetDOMWindow (result);
-        if (rc !is XPCOM.NS_OK) error (rc);
-        if (result[0] is 0) error (XPCOM.NS_NOINTERFACE);
-        nsIDOMWindow domWindow = new nsIDOMWindow (result[0]);
+        //int /*long*/[] result = new int /*long*/[1];
+        //nsIWebProgress progress = new nsIWebProgress (aWebProgress);
+        nsIDOMWindow domWindow;
+        int rc = aWebProgress.GetDOMWindow (&domWindow);
+        if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+        if (domWindow is null) error (XPCOM.NS_NOINTERFACE, __FILE__, __LINE__);
+        //nsIDOMWindow domWindow = new nsIDOMWindow (result[0]);
 
-        LONG ptrObject = new LONG (result[0]);
-        result[0] = 0;
-        int index = unhookedDOMWindows.indexOf (ptrObject);
+        //LONG ptrObject = new LONG (result[0]);
+        //result[0] = 0;
+        int index = unhookedDOMWindows.arrayIndexOf (domWindow);
         if (index !is -1) {
-            rc = webBrowser.GetContentDOMWindow (result);
-            if (rc !is XPCOM.NS_OK) error (rc);
-            if (result[0] is 0) error (XPCOM.NS_ERROR_NO_INTERFACE);
-            bool isTop = result[0] is domWindow.getAddress ();
-            new nsISupports (result[0]).Release ();
-            result[0] = 0;
+            nsIDOMWindow contentWindow;
+            rc = webBrowser.GetContentDOMWindow (&contentWindow);
+            if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+            if (contentWindow is null) error (XPCOM.NS_ERROR_NO_INTERFACE, __FILE__, __LINE__);
+            bool isTop = contentWindow is domWindow;
+            contentWindow.Release ();
+            //result[0] = 0;
+            nsIDOMEventTarget target;
+            rc = domWindow.QueryInterface (&nsIDOMEventTarget.IID, cast(void**)&target);
+            if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+            if (target is null) error (XPCOM.NS_ERROR_NO_INTERFACE, __FILE__, __LINE__);
 
-            rc = domWindow.QueryInterface (nsIDOMEventTarget.NS_IDOMEVENTTARGET_IID, result);
-            if (rc !is XPCOM.NS_OK) error (rc);
-            if (result[0] is 0) error (XPCOM.NS_ERROR_NO_INTERFACE);
-
-            nsIDOMEventTarget target = new nsIDOMEventTarget (result[0]);
-            result[0] = 0;
+            //nsIDOMEventTarget target = new nsIDOMEventTarget (result[0]);
+            //result[0] = 0;
             hookDOMListeners (target, isTop);
             target.Release ();
 
@@ -2333,13 +2058,13 @@
             * Remove and unreference the nsIDOMWindow from the collection of windows
             * that are waiting to have DOM listeners hooked on them. 
             */
-            unhookedDOMWindows.remove (ptrObject);
-            new nsISupports (ptrObject.value).Release ();
+            unhookedDOMWindows = unhookedDOMWindows.arrayIndexRemove (index);
+            domWindow.Release ();
         }
         domWindow.Release ();
 
         /*
-        * Feature in Mozilla.  When a request is redirected cast(STATE_REDIRECTING),
+        * Feature in Mozilla.  When a request is redirected (STATE_REDIRECTING),
         * it never reaches the state STATE_STOP and it is replaced with a new request.
         * The new request is received when it is in the state STATE_STOP.
         * To handle this case,  the variable request is set to 0 when the corresponding
@@ -2347,8 +2072,8 @@
         * - the new request resulting from the redirection - is used to send
         * the ProgressListener.completed event.
         */
-        if (request is aRequest || request is 0) {
-            request = 0;
+        if (request is aRequest || request is null) {
+            request = null;
             if (!awaitingNavigate) {
                 StatusTextEvent event = new StatusTextEvent (browser);
                 event.display = browser.getDisplay ();
@@ -2370,30 +2095,32 @@
         * Hook DOM listeners to the page's nsIDOMWindow here because this is
         * the earliest opportunity to do so.    
         */
-        int /*long*/[] result = new int /*long*/[1];
-        nsIWebProgress progress = new nsIWebProgress (aWebProgress);
-        int rc = progress.GetDOMWindow (result);
-        if (rc !is XPCOM.NS_OK) error (rc);
-        if (result[0] is 0) error (XPCOM.NS_NOINTERFACE);
-        nsIDOMWindow domWindow = new nsIDOMWindow (result[0]);
+        //int /*long*/[] result = new int /*long*/[1];
+       // nsIWebProgress progress = new nsIWebProgress (aWebProgress);
+        nsIDOMWindow domWindow;
+        int rc = aWebProgress.GetDOMWindow (&domWindow);
+        if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+        if (domWindow is null) error (XPCOM.NS_NOINTERFACE, __FILE__, __LINE__);
+        //nsIDOMWindow domWindow = new nsIDOMWindow (result[0]);
 
-        LONG ptrObject = new LONG (result[0]);
-        result[0] = 0;
-        int index = unhookedDOMWindows.indexOf (ptrObject);
+        //LONG ptrObject = new LONG (result[0]);
+        //result[0] = 0;
+        int index = unhookedDOMWindows.arrayIndexOf ( domWindow);
         if (index !is -1) {
-            rc = webBrowser.GetContentDOMWindow (result);
-            if (rc !is XPCOM.NS_OK) error (rc);
-            if (result[0] is 0) error (XPCOM.NS_ERROR_NO_INTERFACE);
-            bool isTop = result[0] is domWindow.getAddress ();
-            new nsISupports (result[0]).Release ();
-            result[0] = 0;
+            nsIDOMWindow contentWindow;
+            rc = webBrowser.GetContentDOMWindow (&contentWindow);
+            if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+            if (contentWindow is null) error (XPCOM.NS_ERROR_NO_INTERFACE, __FILE__, __LINE__);
+            bool isTop = contentWindow is domWindow;
+            contentWindow.Release ();
+            //result[0] = 0;
+            nsIDOMEventTarget target;
+            rc = domWindow.QueryInterface (&nsIDOMEventTarget.IID, cast(void**)&target);
+            if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+            if (target is null) error (XPCOM.NS_ERROR_NO_INTERFACE, __FILE__, __LINE__);
 
-            rc = domWindow.QueryInterface (nsIDOMEventTarget.NS_IDOMEVENTTARGET_IID, result);
-            if (rc !is XPCOM.NS_OK) error (rc);
-            if (result[0] is 0) error (XPCOM.NS_ERROR_NO_INTERFACE);
-
-            nsIDOMEventTarget target = new nsIDOMEventTarget (result[0]);
-            result[0] = 0;
+            //nsIDOMEventTarget target = new nsIDOMEventTarget (result[0]);
+            //result[0] = 0;
             hookDOMListeners (target, isTop);
             target.Release ();
 
@@ -2401,28 +2128,30 @@
             * Remove and unreference the nsIDOMWindow from the collection of windows
             * that are waiting to have DOM listeners hooked on them. 
             */
-            unhookedDOMWindows.remove (ptrObject);
-            new nsISupports (ptrObject.value).Release ();
+            unhookedDOMWindows = unhookedDOMWindows.arrayIndexRemove(index);
+            domWindow.Release ();
         }
         domWindow.Release ();
     }
     return XPCOM.NS_OK;
 }
 
-int OnProgressChange (int /*long*/ aWebProgress, int /*long*/ aRequest, int aCurSelfProgress, int aMaxSelfProgress, int aCurTotalProgress, int aMaxTotalProgress) {
-    if (awaitingNavigate || progressListeners.length is 0) return XPCOM.NS_OK;
+extern(System)
+nsresult OnProgressChange (nsIWebProgress aWebProgress, nsIRequest aRequest, PRInt32 aCurSelfProgress, PRInt32 aMaxSelfProgress, PRInt32 aCurTotalProgress, PRInt32 aMaxTotalProgress) {
+    if (awaitingNavigate || super.progressListeners.length is 0) return XPCOM.NS_OK;
     ProgressEvent event = new ProgressEvent (browser);
     event.display = browser.getDisplay ();
     event.widget = browser;
     event.current = aCurTotalProgress;
     event.total = aMaxTotalProgress;
-    for (int i = 0; i < progressListeners.length; i++) {
-        progressListeners[i].changed (event);
+    for (int i = 0; i < super.progressListeners.length; i++) {
+        super.progressListeners[i].changed (event);
     }
     return XPCOM.NS_OK;
 }
 
-int OnLocationChange (int /*long*/ aWebProgress, int /*long*/ aRequest, int /*long*/ aLocation) {
+extern(System)
+nsresult OnLocationChange (nsIWebProgress aWebProgress, nsIRequest aRequest, nsIURI aLocation) {
     /*
     * Feature in Mozilla.  When a page is loaded via setText before a previous
     * setText page load has completed, the expected OnStateChange STATE_STOP for the
@@ -2432,35 +2161,38 @@
     * (but never arrives).  To handle this case, the request field is updated to the new
     * overriding request since its OnStateChange STATE_STOP will be received next.
     */
-    if (request !is 0 && request !is aRequest) request = aRequest;
+    if (request !is null && request !is aRequest) request = aRequest;
 
     if (awaitingNavigate || locationListeners.length is 0) return XPCOM.NS_OK;
 
-    nsIWebProgress webProgress = new nsIWebProgress (aWebProgress);
-    int /*long*/[] aDOMWindow = new int /*long*/[1];
-    int rc = webProgress.GetDOMWindow (aDOMWindow);
-    if (rc !is XPCOM.NS_OK) error (rc);
-    if (aDOMWindow[0] is 0) error (XPCOM.NS_ERROR_NO_INTERFACE);
+    //nsIWebProgress webProgress = new nsIWebProgress (aWebProgress);
     
-    nsIDOMWindow domWindow = new nsIDOMWindow (aDOMWindow[0]);
-    int /*long*/[] aTop = new int /*long*/[1];
-    rc = domWindow.GetTop (aTop);
-    if (rc !is XPCOM.NS_OK) error (rc);
-    if (aTop[0] is 0) error (XPCOM.NS_ERROR_NO_INTERFACE);
+    nsIDOMWindow domWindow;
+    //int /*long*/[] aDOMWindow = new int /*long*/[1];
+    int rc = aWebProgress.GetDOMWindow (&domWindow);
+    if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+    if (domWindow is null) error (XPCOM.NS_ERROR_NO_INTERFACE, __FILE__, __LINE__);
+    
+    //nsIDOMWindow domWindow = new nsIDOMWindow (aDOMWindow[0]);
+    //int /*long*/[] aTop = new int /*long*/[1];
+    nsIDOMWindow topWindow;
+    rc = domWindow.GetTop (&topWindow);
+    if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+    if (topWindow is null) error (XPCOM.NS_ERROR_NO_INTERFACE, __FILE__, __LINE__);
     domWindow.Release ();
     
-    nsIDOMWindow topWindow = new nsIDOMWindow (aTop[0]);
+    //nsIDOMWindow topWindow = new nsIDOMWindow (aTop[0]);
     topWindow.Release ();
     
-    nsIURI location = new nsIURI (aLocation);
-    int /*long*/ aSpec = XPCOM.nsEmbedCString_new ();
-    location.GetSpec (aSpec);
-    int length = XPCOM.nsEmbedCString_Length (aSpec);
-    int /*long*/ buffer = XPCOM.nsEmbedCString_get (aSpec);
-    byte[] dest = new byte[length];
-    XPCOM.memmove (dest, buffer, length);
-    XPCOM.nsEmbedCString_delete (aSpec);
-    String url = new String (dest);
+    //nsIURI location = new nsIURI (aLocation);
+    scope auto aSpec = new nsEmbedCString;
+    aLocation.GetSpec (cast(nsACString*)aSpec);
+    //int length = XPCOM.nsEmbedCString_Length (aSpec);
+    //int /*long*/ buffer = XPCOM.nsEmbedCString_get (aSpec);
+    //byte[] dest = new byte[length];
+    //XPCOM.memmove (dest, buffer, length);
+    //XPCOM.nsEmbedCString_delete (aSpec);
+    String url = aSpec.toString;
 
     /*
      * As of Mozilla 1.8, the first time that a page is displayed, regardless of
@@ -2468,7 +2200,7 @@
      * to about:blank and fires the corresponding navigation events.  Do not send
      * this event on to the user since it is not expected.
      */
-    if (!IsPre_1_8 && aRequest is 0 && url.startsWith cast(ABOUT_BLANK)) return XPCOM.NS_OK;
+    if (!IsPre_1_8 && aRequest is null && url.startsWith (ABOUT_BLANK)) return XPCOM.NS_OK;
 
     LocationEvent event = new LocationEvent (browser);
     event.display = browser.getDisplay ();
@@ -2478,80 +2210,88 @@
      * If the URI indicates that the page is being rendered from memory
      * (via setText()) then set it to about:blank to be consistent with IE.
      */
-    if (event.location.equals cast(URI_FROMMEMORY)) event.location = ABOUT_BLANK;
-    event.top = aTop[0] is aDOMWindow[0];
+    if (event.location.equals (URI_FROMMEMORY)) event.location = ABOUT_BLANK;
+    event.top = topWindow is domWindow;
     for (int i = 0; i < locationListeners.length; i++) {
         locationListeners[i].changed (event);
     }
     return XPCOM.NS_OK;
 }
 
-int OnStatusChange (int /*long*/ aWebProgress, int /*long*/ aRequest, int aStatus, int /*long*/ aMessage) {
+extern(System)
+nsresult OnStatusChange (nsIWebProgress aWebProgress, nsIRequest aRequest, nsresult aStatus, PRUnichar* aMessage) {
     if (awaitingNavigate || statusTextListeners.length is 0) return XPCOM.NS_OK;
     StatusTextEvent event = new StatusTextEvent (browser);
     event.display = browser.getDisplay ();
     event.widget = browser;
-    int length = XPCOM.strlen_PRUnichar (aMessage);
-    char[] dest = new char[length];
-    XPCOM.memmove (dest, aMessage, length * 2);
-    event.text = new String (dest);
+    //int length = XPCOM.strlen_PRUnichar (aMessage);
+    //char[] dest = new char[length];
+    //XPCOM.memmove (dest, aMessage, length * 2);
+    event.text = Utf.toString(fromString16z(aMessage));
     for (int i = 0; i < statusTextListeners.length; i++) {
         statusTextListeners[i].changed (event);
     }
     return XPCOM.NS_OK;
 }       
 
-int OnSecurityChange (int /*long*/ aWebProgress, int /*long*/ aRequest, int state) {
+extern(System)
+nsresult OnSecurityChange (nsIWebProgress aWebProgress, nsIRequest aRequest, PRUint32 state) {
     return XPCOM.NS_OK;
 }
 
 /* nsIWebBrowserChrome */
 
-int SetStatus (int statusType, int /*long*/ status) {
+extern(System)
+nsresult SetStatus (PRUint32 statusType, PRUnichar* status) {
     if (awaitingNavigate || statusTextListeners.length is 0) return XPCOM.NS_OK;
     StatusTextEvent event = new StatusTextEvent (browser);
     event.display = browser.getDisplay ();
     event.widget = browser;
-    int length = XPCOM.strlen_PRUnichar (status);
-    char[] dest = new char[length];
-    XPCOM.memmove (dest, status, length * 2);
-    String string = new String (dest);
-    event.text = string;
+    //int length = XPCOM.strlen_PRUnichar (status);
+    //char[] dest = new char[length];
+    //XPCOM.memmove (dest, status, length * 2);
+    //String string = new String (dest);
+    event.text = Utf.toString(fromString16z(status));
     for (int i = 0; i < statusTextListeners.length; i++) {
         statusTextListeners[i].changed (event);
     }
     return XPCOM.NS_OK;
 }
 
-int GetWebBrowser (int /*long*/ aWebBrowser) {
-    int /*long*/[] ret = new int /*long*/[1];   
+extern(System)
+nsresult GetWebBrowser (nsIWebBrowser* aWebBrowser) {
+    //int /*long*/[] ret = new int /*long*/[1];   
     if (webBrowser !is null) {
         webBrowser.AddRef ();
-        ret[0] = webBrowser.getAddress ();  
+        *aWebBrowser = webBrowser;  
     }
-    XPCOM.memmove (aWebBrowser, ret, C.PTR_SIZEOF);
+    //XPCOM.memmove (aWebBrowser, ret, C.PTR_SIZEOF);
     return XPCOM.NS_OK;
 }
 
-int SetWebBrowser (int /*long*/ aWebBrowser) {
+extern(System)
+nsresult SetWebBrowser (nsIWebBrowser aWebBrowser) {
     if (webBrowser !is null) webBrowser.Release ();
-    webBrowser = aWebBrowser !is 0 ? new nsIWebBrowser (aWebBrowser) : null;                
-    return XPCOM.NS_OK;
-}
-   
-int GetChromeFlags (int /*long*/ aChromeFlags) {
-    int[] ret = new int[1];
-    ret[0] = chromeFlags;
-    XPCOM.memmove (aChromeFlags, ret, 4); /* PRUint32 */
+    webBrowser = aWebBrowser !is null ? cast(nsIWebBrowser)cast(void*)aWebBrowser : null;                
     return XPCOM.NS_OK;
 }
 
-int SetChromeFlags (int aChromeFlags) {
+extern(System)
+nsresult GetChromeFlags (PRUint32* aChromeFlags) {
+    //int[] ret = new int[1];
+    *aChromeFlags = chromeFlags;
+    //XPCOM.memmove (aChromeFlags, ret, 4); /* PRUint32 */
+    return XPCOM.NS_OK;
+}
+
+extern(System)
+nsresult SetChromeFlags (PRUint32 aChromeFlags) {
     chromeFlags = aChromeFlags;
     return XPCOM.NS_OK;
 }
 
-int DestroyBrowserWindow () {
+extern(System)
+nsresult DestroyBrowserWindow () {
     WindowEvent newEvent = new WindowEvent (browser);
     newEvent.display = browser.getDisplay ();
     newEvent.widget = browser;
@@ -2567,8 +2307,9 @@
     browser.dispose ();
     return XPCOM.NS_OK;
 }
-    
-int SizeBrowserTo (int aCX, int aCY) {
+
+extern(System)
+nsresult SizeBrowserTo (PRInt32 aCX, PRInt32 aCY) {
     size = new Point (aCX, aCY);
     bool isChrome = (chromeFlags & nsIWebBrowserChrome.CHROME_OPENAS_CHROME) !is 0;
     if (isChrome) {
@@ -2578,50 +2319,56 @@
     return XPCOM.NS_OK;
 }
 
-int ShowAsModal () {
-    int /*long*/[] result = new int /*long*/[1];
-    int rc = XPCOM.NS_GetServiceManager (result);
-    if (rc !is XPCOM.NS_OK) error (rc);
-    if (result[0] is 0) error (XPCOM.NS_NOINTERFACE);
+extern(System)
+nsresult ShowAsModal () {
+    //int /*long*/[] result = new int /*long*/[1];
+    nsIServiceManager serviceManager;
+    int rc = XPCOM.NS_GetServiceManager (&serviceManager);
+    if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+    if (serviceManager is null) error (XPCOM.NS_NOINTERFACE, __FILE__, __LINE__);
 
-    nsIServiceManager serviceManager = new nsIServiceManager (result[0]);
-    result[0] = 0;
-    byte[] aContractID = MozillaDelegate.wcsToMbcs (null, XPCOM.NS_CONTEXTSTACK_CONTRACTID, true);
-    rc = serviceManager.GetServiceByContractID (aContractID, nsIJSContextStack.NS_IJSCONTEXTSTACK_IID, result);
-    if (rc !is XPCOM.NS_OK) error (rc);
-    if (result[0] is 0) error (XPCOM.NS_NOINTERFACE);
+    //nsIServiceManager serviceManager = new nsIServiceManager (result[0]);
+    //result[0] = 0;
+    //byte[] aContractID = MozillaDelegate.wcsToMbcs (null, XPCOM.NS_CONTEXTSTACK_CONTRACTID, true);
+    nsIJSContextStack stack;
+    rc = serviceManager.GetServiceByContractID (XPCOM.NS_CONTEXTSTACK_CONTRACTID.ptr, &nsIJSContextStack.IID, cast(void**)&stack);
+    if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+    if (stack is null) error (XPCOM.NS_NOINTERFACE, __FILE__, __LINE__);
     serviceManager.Release ();
 
-    nsIJSContextStack stack = new nsIJSContextStack (result[0]);
-    result[0] = 0;
-    rc = stack.Push (0);
-    if (rc !is XPCOM.NS_OK) error (rc);
+    //nsIJSContextStack stack = new nsIJSContextStack (result[0]);
+    //result[0] = 0;
+    rc = stack.Push (null);
+    if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
 
     Shell shell = browser.getShell ();
     Display display = browser.getDisplay ();
     while (!shell.isDisposed ()) {
         if (!display.readAndDispatch ()) display.sleep ();
     }
-
-    rc = stack.Pop (result);
-    if (rc !is XPCOM.NS_OK) error (rc);
+    JSContext* result;
+    rc = stack.Pop (&result);
+    if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
     stack.Release ();
     return XPCOM.NS_OK;
 }
 
-int IsWindowModal (int /*long*/ retval) {
-    int result = (chromeFlags & nsIWebBrowserChrome.CHROME_MODAL) !is 0 ? 1 : 0;
-    XPCOM.memmove (retval, new int[] {result}, 4); /* PRBool */
+extern(System)
+nsresult IsWindowModal (PRBool* retval) {
+    *retval = (chromeFlags & nsIWebBrowserChrome.CHROME_MODAL) !is 0 ? 1 : 0;
+    //XPCOM.memmove (retval, new int[] {result}, 4); /* PRBool */
     return XPCOM.NS_OK;
 }
-   
-int ExitModalEventLoop (int aStatus) {
+
+extern(System)
+nsresult ExitModalEventLoop (nsresult aStatus) {
     return XPCOM.NS_OK;
 }
 
 /* nsIEmbeddingSiteWindow */ 
 
-int SetDimensions (int flags, int x, int y, int cx, int cy) {
+extern(System)
+nsresult SetDimensions (PRUint32 flags, PRInt32 x, PRInt32 y, PRInt32 cx, PRInt32 cy) {
     if ((flags & nsIEmbeddingSiteWindow.DIM_FLAGS_POSITION) !is 0) {
         location = new Point (x, y);
         browser.getShell ().setLocation (x, y);
@@ -2635,34 +2382,37 @@
     return XPCOM.NS_OK;
 }
 
-int GetDimensions (int flags, int /*long*/ x, int /*long*/ y, int /*long*/ cx, int /*long*/ cy) {
+extern(System)
+nsresult GetDimensions (PRUint32 flags, PRInt32* x, PRInt32* y, PRInt32* cx, PRInt32* cy) {
     if ((flags & nsIEmbeddingSiteWindow.DIM_FLAGS_POSITION) !is 0) {
         Point location = browser.getShell ().getLocation ();
-        if (x !is 0) C.memmove (x, new int[] {location.x}, 4); /* PRInt32 */
-        if (y !is 0) C.memmove (y, new int[] {location.y}, 4); /* PRInt32 */
+        if (x !is null) *x = location.x; /* PRInt32 */
+        if (y !is null) *y = location.y; /* PRInt32 */
     }
     if ((flags & nsIEmbeddingSiteWindow.DIM_FLAGS_SIZE_INNER) !is 0) {
         Point size = browser.getSize ();
-        if (cx !is 0) C.memmove (cx, new int[] {size.x}, 4); /* PRInt32 */
-        if (cy !is 0) C.memmove (cy, new int[] {size.y}, 4); /* PRInt32 */
+        if (cx !is null) *cx = size.x; /* PRInt32 */
+        if (cy !is null) *cy = size.y; /* PRInt32 */
     }
     if ((flags & nsIEmbeddingSiteWindow.DIM_FLAGS_SIZE_OUTER) !is 0) {
         Point size = browser.getShell().getSize ();
-        if (cx !is 0) C.memmove (cx, new int[] {size.x}, 4); /* PRInt32 */
-        if (cy !is 0) C.memmove (cy, new int[] {size.y}, 4); /* PRInt32 */
+        if (cx !is null) *cx = size.x; /* PRInt32 */
+        if (cy !is null) *cy = size.y; /* PRInt32 */
     }
     return XPCOM.NS_OK;
 }
 
-int SetFocus () {
-    int /*long*/[] result = new int /*long*/[1];
-    int rc = webBrowser.QueryInterface (nsIBaseWindow.NS_IBASEWINDOW_IID, result);
-    if (rc !is XPCOM.NS_OK) error (rc);
-    if (result[0] is 0) error (XPCOM.NS_ERROR_NO_INTERFACE);
+extern(System)
+nsresult SetFocus () {
+    //int /*long*/[] result = new int /*long*/[1];
+    nsIBaseWindow baseWindow;
+    int rc = webBrowser.QueryInterface (&nsIBaseWindow.IID, cast(void**)&baseWindow);
+    if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+    if (baseWindow is null) error (XPCOM.NS_ERROR_NO_INTERFACE, __FILE__, __LINE__);
     
-    nsIBaseWindow baseWindow = new nsIBaseWindow (result[0]);
+    //nsIBaseWindow baseWindow = new nsIBaseWindow (result[0]);
     rc = baseWindow.SetFocus ();
-    if (rc !is XPCOM.NS_OK) error (rc);
+    if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
     baseWindow.Release ();
 
     /*
@@ -2673,13 +2423,16 @@
     return XPCOM.NS_OK;         
 }   
 
-int GetVisibility (int /*long*/ aVisibility) {
+extern(System)
+nsresult GetVisibility (PRBool* aVisibility) {
     bool visible = browser.isVisible () && !browser.getShell ().getMinimized ();
-    XPCOM.memmove (aVisibility, new int[] {visible ? 1 : 0}, 4); /* PRBool */
+    *aVisibility = visible ? 1 : 0;
+    //XPCOM.memmove (aVisibility, new int[] {visible ? 1 : 0}, 4); /* PRBool */
     return XPCOM.NS_OK;
 }
 
-int SetVisibility (int aVisibility) {
+extern(System)
+nsresult SetVisibility (PRBool aVisibility) {
     if (isChild) {
         WindowEvent event = new WindowEvent (browser);
         event.display = browser.getDisplay ();
@@ -2716,11 +2469,13 @@
     return XPCOM.NS_OK;         
 }
 
-int GetTitle (int /*long*/ aTitle) {
+extern(System)
+nsresult GetTitle (PRUnichar** aTitle) {
     return XPCOM.NS_OK;         
 }
  
-int SetTitle (int /*long*/ aTitle) {
+extern(System)
+nsresult SetTitle (PRUnichar* aTitle) {
     if (awaitingNavigate || titleListeners.length is 0) return XPCOM.NS_OK;
     TitleEvent event = new TitleEvent (browser);
     event.display = browser.getDisplay ();
@@ -2732,9 +2487,9 @@
     */
     int length = XPCOM.strlen_PRUnichar (aTitle);
     if (length > 0) {
-        char[] dest = new char[length];
-        XPCOM.memmove (dest, aTitle, length * 2);
-        event.title = new String (dest);
+        //char[] dest = new char[length];
+        //XPCOM.memmove (dest, aTitle, length * 2);
+        event.title = Utf.toString(fromString16z(aTitle));
     } else {
         event.title = getUrl ();
     }
@@ -2744,7 +2499,8 @@
     return XPCOM.NS_OK;         
 }
 
-int GetSiteWindow (int /*long*/ aSiteWindow) {
+extern(System)
+nsresult GetSiteWindow (void** aSiteWindow) {
     /*
     * Note.  The handle is expected to be an HWND on Windows and
     * a GtkWidget* on GTK.  This callback is invoked on Windows
@@ -2752,20 +2508,21 @@
     * dialog comes up. If no handle is returned, the print dialog
     * does not come up on this platform.  
     */
-    XPCOM.memmove (aSiteWindow, new int /*long*/[] {embedHandle}, C.PTR_SIZEOF);
+    *aSiteWindow = cast(void*) embedHandle;
     return XPCOM.NS_OK;         
 }  
  
 /* nsIWebBrowserChromeFocus */
 
-int FocusNextElement () {
+extern(System)
+nsresult FocusNextElement () {
     /*
     * Bug in Mozilla embedding API.  Mozilla takes back the focus after sending
     * this event.  This prevents tabbing out of Mozilla. This behaviour can be reproduced
     * with the Mozilla application TestGtkEmbed.  The workaround is to
     * send the traversal notification after this callback returns.
     */
-    browser.getDisplay ().asyncExec (new Runnable () {
+    browser.getDisplay ().asyncExec (new class() Runnable {
         public void run () {
             if (browser.isDisposed ()) return;
             browser.traverse (DWT.TRAVERSE_TAB_NEXT);
@@ -2774,14 +2531,15 @@
     return XPCOM.NS_OK;  
 }
 
-int FocusPrevElement () {
+extern(System)
+nsresult FocusPrevElement () {
     /*
     * Bug in Mozilla embedding API.  Mozilla takes back the focus after sending
     * this event.  This prevents tabbing out of Mozilla. This behaviour can be reproduced
     * with the Mozilla application TestGtkEmbed.  The workaround is to
     * send the traversal notification after this callback returns.
     */
-    browser.getDisplay ().asyncExec (new Runnable () {
+    browser.getDisplay ().asyncExec (new class() Runnable {
         public void run () {
             if (browser.isDisposed ()) return;
             browser.traverse (DWT.TRAVERSE_TAB_PREVIOUS);
@@ -2792,31 +2550,33 @@
 
 /* nsIContextMenuListener */
 
-int OnShowContextMenu (int aContextFlags, int /*long*/ aEvent, int /*long*/ aNode) {
+extern(System)
+nsresult OnShowContextMenu (PRUint32 aContextFlags, nsIDOMEvent aEvent, nsIDOMNode aNode) {
     if (awaitingNavigate) return XPCOM.NS_OK;
 
-    nsIDOMEvent domEvent = new nsIDOMEvent (aEvent);
-    int /*long*/[] result = new int /*long*/[1];
-    int rc = domEvent.QueryInterface (nsIDOMMouseEvent.NS_IDOMMOUSEEVENT_IID, result);
-    if (rc !is XPCOM.NS_OK) error (rc);
-    if (result[0] is 0) error (XPCOM.NS_NOINTERFACE);
+    //nsIDOMEvent domEvent = new nsIDOMEvent (aEvent);
+    //int /*long*/[] result = new int /*long*/[1];
+    nsIDOMMouseEvent domMouseEvent;
+    int rc = aEvent.QueryInterface (&nsIDOMMouseEvent.IID, cast(void**)&domMouseEvent);
+    if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+    if (domMouseEvent is null) error (XPCOM.NS_NOINTERFACE, __FILE__, __LINE__);
 
-    nsIDOMMouseEvent domMouseEvent = new nsIDOMMouseEvent (result[0]);
-    int[] aScreenX = new int[1], aScreenY = new int[1];
-    rc = domMouseEvent.GetScreenX (aScreenX);
-    if (rc !is XPCOM.NS_OK) error (rc);
-    rc = domMouseEvent.GetScreenY (aScreenY);
-    if (rc !is XPCOM.NS_OK) error (rc);
+    //nsIDOMMouseEvent domMouseEvent = new nsIDOMMouseEvent (result[0]);
+    PRInt32 aScreenX, aScreenY;
+    rc = domMouseEvent.GetScreenX (&aScreenX);
+    if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+    rc = domMouseEvent.GetScreenY (&aScreenY);
+    if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
     domMouseEvent.Release ();
     
-    Event event = new Event ();
-    event.x = aScreenX[0];
-    event.y = aScreenY[0];
+    auto event = new Event;
+    event.x = aScreenX;
+    event.y = aScreenY;
     browser.notifyListeners (DWT.MenuDetect, event);
-    if (!event.doit || browser.isDisposed ()) return XPCOM.NS_OK;
+    if (!event.doit) return XPCOM.NS_OK;
     Menu menu = browser.getMenu ();
     if (menu !is null && !menu.isDisposed ()) {
-        if (aScreenX[0] !is event.x || aScreenY[0] !is event.y) {
+        if (aScreenX !is event.x || aScreenY !is event.y) {
             menu.setLocation (event.x, event.y);
         }
         menu.setVisible (true);
@@ -2826,28 +2586,30 @@
 
 /* nsIURIContentListener */
 
-int OnStartURIOpen (int /*long*/ aURI, int /*long*/ retval) {
+extern(System)
+nsresult OnStartURIOpen (nsIURI aURI, PRBool* retval) {
     if (awaitingNavigate || locationListeners.length is 0) {
-        XPCOM.memmove (retval, new int[] {0}, 4); /* PRBool */
+        *retval = 0;
+        //XPCOM.memmove (retval, new int[] {0}, 4); /* PRBool */
         return XPCOM.NS_OK;
     }
-    nsIURI location = new nsIURI (aURI);
-    int /*long*/ aSpec = XPCOM.nsEmbedCString_new ();
-    location.GetSpec (aSpec);
-    int length = XPCOM.nsEmbedCString_Length (aSpec);
-    int /*long*/ buffer = XPCOM.nsEmbedCString_get (aSpec);
-    buffer = XPCOM.nsEmbedCString_get (aSpec);
-    byte[] dest = new byte[length];
-    XPCOM.memmove (dest, buffer, length);
-    XPCOM.nsEmbedCString_delete (aSpec);
-    String value = new String (dest);
+    //nsIURI location = new nsIURI (aURI);
+    scope auto aSpec = new nsEmbedCString;
+    aURI.GetSpec (cast(nsACString*)aSpec);
+    //int length = XPCOM.nsEmbedCString_Length (aSpec);
+    //int /*long*/ buffer = XPCOM.nsEmbedCString_get (aSpec);
+    //buffer = XPCOM.nsEmbedCString_get (aSpec);
+    //byte[] dest = new byte[length];
+    //XPCOM.memmove (dest, buffer, length);
+    //XPCOM.nsEmbedCString_delete (aSpec);
+    String value = aSpec.toString;
     bool doit = true;
-    if (request is 0) {
+    if (request is null) {
         /* 
          * listeners should not be notified of internal transitions like "javascipt:..."
          * because this is an implementation side-effect, not a true navigate
          */
-        if (!value.startsWith cast(PREFIX_JAVASCRIPT)) {
+        if (!value.startsWith (PREFIX_JAVASCRIPT)) {
             LocationEvent event = new LocationEvent (browser);
             event.display = browser.getDisplay();
             event.widget = browser;
@@ -2856,7 +2618,7 @@
              * If the URI indicates that the page is being rendered from memory
              * (via setText()) then set it to about:blank to be consistent with IE.
              */
-            if (event.location.equals cast(URI_FROMMEMORY)) event.location = ABOUT_BLANK;
+            if (event.location.equals (URI_FROMMEMORY)) event.location = ABOUT_BLANK;
             event.doit = doit;
             for (int i = 0; i < locationListeners.length; i++) {
                 locationListeners[i].changing (event);
@@ -2864,57 +2626,64 @@
             doit = event.doit && !browser.isDisposed();
         }
     }
-    XPCOM.memmove (retval, new int[] {doit ? 0 : 1}, 4); /* PRBool */
+    *retval = doit ? 0 : 1;
+    //XPCOM.memmove (retval, new int[] {doit ? 0 : 1}, 4); /* PRBool */
     return XPCOM.NS_OK;
 }
 
-int DoContent (int /*long*/ aContentType, int aIsContentPreferred, int /*long*/ aRequest, int /*long*/ aContentHandler, int /*long*/ retval) {
+extern(System)
+nsresult DoContent (char* aContentType, PRBool aIsContentPreferred, nsIRequest aRequest, nsIStreamListener* aContentHandler, PRBool* retval) {
     return XPCOM.NS_ERROR_NOT_IMPLEMENTED;
 }
 
-int IsPreferred (int /*long*/ aContentType, int /*long*/ aDesiredContentType, int /*long*/ retval) {
+extern(System)
+nsresult IsPreferred (char* aContentType, char** aDesiredContentType, PRBool* retval) {
     bool preferred = false;
-    int size = XPCOM.strlen (aContentType);
+    auto size = strlen (aContentType);
     if (size > 0) {
-        byte[] typeBytes = new byte[size + 1];
-        XPCOM.memmove (typeBytes, aContentType, size);
-        String contentType = new String (typeBytes, 0, size);
+        //byte[] typeBytes = new byte[size + 1];
+        //XPCOM.memmove (typeBytes, aContentType, size);
+        String contentType = fromStringz(aContentType);
 
         /* do not attempt to handle known problematic content types */
         if (!contentType.equals (XPCOM.CONTENT_MAYBETEXT) && !contentType.equals (XPCOM.CONTENT_MULTIPART)) {
             /* determine whether browser can handle the content type */
-            int /*long*/[] result = new int /*long*/[1];
-            int rc = XPCOM.NS_GetServiceManager (result);
-            if (rc !is XPCOM.NS_OK) error (rc);
-            if (result[0] is 0) error (XPCOM.NS_NOINTERFACE);
-            nsIServiceManager serviceManager = new nsIServiceManager (result[0]);
-            result[0] = 0;
+            // int /*long*/[] result = new int /*long*/[1];
+            nsIServiceManager serviceManager;
+            int rc = XPCOM.NS_GetServiceManager (&serviceManager);
+            if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+            if (serviceManager is null) error (XPCOM.NS_NOINTERFACE, __FILE__, __LINE__);
+            //nsIServiceManager serviceManager = new nsIServiceManager (result[0]);
+            //result[0] = 0;
 
             /* First try to use the nsIWebNavigationInfo if it's available (>= mozilla 1.8) */
-            byte[] aContractID = MozillaDelegate.wcsToMbcs (null, XPCOM.NS_WEBNAVIGATIONINFO_CONTRACTID, true);
-            rc = serviceManager.GetServiceByContractID (aContractID, nsIWebNavigationInfo.NS_IWEBNAVIGATIONINFO_IID, result);
+            //byte[] aContractID = MozillaDelegate.wcsToMbcs (null, XPCOM.NS_WEBNAVIGATIONINFO_CONTRACTID, true);
+            nsIWebNavigationInfo info;
+            rc = serviceManager.GetServiceByContractID (XPCOM.NS_WEBNAVIGATIONINFO_CONTRACTID.ptr, &nsIWebNavigationInfo.IID, cast(void**)&info);
             if (rc is XPCOM.NS_OK) {
-                byte[] bytes = MozillaDelegate.wcsToMbcs (null, contentType, true);
-                int /*long*/ typePtr = XPCOM.nsEmbedCString_new (bytes, bytes.length);
-                nsIWebNavigationInfo info = new nsIWebNavigationInfo (result[0]);
-                result[0] = 0;
-                int[] isSupportedResult = new int[1]; /* PRUint32 */
-                rc = info.IsTypeSupported (typePtr, 0, isSupportedResult);
-                if (rc !is XPCOM.NS_OK) error (rc);
+                //byte[] bytes = MozillaDelegate.wcsToMbcs (null, contentType, true);
+                scope auto typePtr = new nsEmbedCString(contentType);
+                //nsIWebNavigationInfo info = new nsIWebNavigationInfo (result[0]);
+                //result[0] = 0;
+                PRUint32 isSupportedResult; /* PRUint32 */
+                rc = info.IsTypeSupported (cast(nsACString*)typePtr, null, &isSupportedResult);
+                if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
                 info.Release ();
-                XPCOM.nsEmbedCString_delete (typePtr);
-                preferred = isSupportedResult[0] !is 0;
+                //XPCOM.nsEmbedCString_delete (typePtr);
+                preferred = isSupportedResult !is 0;
             } else {
                 /* nsIWebNavigationInfo is not available, so do the type lookup */
-                result[0] = 0;
-                rc = serviceManager.GetService (XPCOM.NS_CATEGORYMANAGER_CID, nsICategoryManager.NS_ICATEGORYMANAGER_IID, result);
-                if (rc !is XPCOM.NS_OK) error (rc);
-                if (result[0] is 0) error (XPCOM.NS_NOINTERFACE);
+                //result[0] = 0;
+                nsICategoryManager categoryManager;
+                rc = serviceManager.GetService (&XPCOM.NS_CATEGORYMANAGER_CID, &nsICategoryManager.IID, cast(void**)&categoryManager);
+                if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+                if (categoryManager is null) error (XPCOM.NS_NOINTERFACE, __FILE__, __LINE__);
 
-                nsICategoryManager categoryManager = new nsICategoryManager (result[0]);
-                result[0] = 0;
-                byte[] categoryBytes = MozillaDelegate.wcsToMbcs (null, "Gecko-Content-Viewers", true); //$NON-NLS-1$
-                rc = categoryManager.GetCategoryEntry (categoryBytes, typeBytes, result);
+                //nsICategoryManager categoryManager = new nsICategoryManager (result[0]);
+                //result[0] = 0;
+                char* categoryBytes = "Gecko-Content-Viewers"; //$NON-NLS-1$
+                char* result;
+                rc = categoryManager.GetCategoryEntry (categoryBytes, aContentType, &result);
                 categoryManager.Release ();
                 /* if no viewer for the content type is registered then rc is XPCOM.NS_ERROR_NOT_AVAILABLE */
                 preferred = rc is XPCOM.NS_OK;
@@ -2923,42 +2692,48 @@
         }
     }
 
-    XPCOM.memmove(retval, new int[] {preferred ? 1 : 0}, 4); /* PRBool */
+    *retval = preferred ? 1 : 0; /* PRBool */
     if (preferred) {
-        XPCOM.memmove (aDesiredContentType, new int /*long*/[] {0}, C.PTR_SIZEOF);
+        *aDesiredContentType = null;
     }
     return XPCOM.NS_OK;
 }
 
-int CanHandleContent (int /*long*/ aContentType, int aIsContentPreferred, int /*long*/ aDesiredContentType, int /*long*/ retval) {
+extern(System)
+nsresult CanHandleContent (char* aContentType, PRBool aIsContentPreferred, char** aDesiredContentType, PRBool* retval) {
     return XPCOM.NS_ERROR_NOT_IMPLEMENTED;
 }
 
-int GetLoadCookie (int /*long*/ aLoadCookie) {
+extern(System)
+nsresult GetLoadCookie (nsISupports* aLoadCookie) {
     return XPCOM.NS_ERROR_NOT_IMPLEMENTED;
 }
 
-int SetLoadCookie (int /*long*/ aLoadCookie) {
+extern(System)
+nsresult SetLoadCookie (nsISupports aLoadCookie) {
     return XPCOM.NS_ERROR_NOT_IMPLEMENTED;
 }
 
-int GetParentContentListener (int /*long*/ aParentContentListener) {
+extern(System)
+nsresult GetParentContentListener (nsIURIContentListener* aParentContentListener) {
     return XPCOM.NS_ERROR_NOT_IMPLEMENTED;
 }
-    
-int SetParentContentListener (int /*long*/ aParentContentListener) {
+
+extern(System)
+nsresult SetParentContentListener (nsIURIContentListener aParentContentListener) {
     return XPCOM.NS_ERROR_NOT_IMPLEMENTED;
 }
 
 /* nsITooltipListener */
 
-int OnShowTooltip (int aXCoords, int aYCoords, int /*long*/ aTipText) {
+extern(System)
+nsresult OnShowTooltip (PRInt32 aXCoords, PRInt32 aYCoords, PRUnichar* aTipText) {
     if (awaitingNavigate) return XPCOM.NS_OK;
 
-    int length = XPCOM.strlen_PRUnichar (aTipText);
-    char[] dest = new char[length];
-    XPCOM.memmove (dest, aTipText, length * 2);
-    String text = new String (dest);
+    //int length = XPCOM.strlen_PRUnichar (aTipText);
+    //char[] dest = new char[length];
+    //XPCOM.memmove (dest, aTipText, length * 2);
+    String text = Utf.toString(fromString16z(aTipText));
     if (tip !is null && !tip.isDisposed ()) tip.dispose ();
     Display display = browser.getDisplay ();
     Shell parent = browser.getShell ();
@@ -2984,7 +2759,8 @@
     return XPCOM.NS_OK;
 }
 
-int OnHideTooltip () {
+extern(System)
+nsresult OnHideTooltip () {
     if (tip !is null && !tip.isDisposed ()) tip.dispose ();
     tip = null;
     return XPCOM.NS_OK;
@@ -2992,48 +2768,51 @@
 
 /* nsIDOMEventListener */
 
-int HandleEvent (int /*long*/ event) {
-    nsIDOMEvent domEvent = new nsIDOMEvent (event);
+extern(System)
+nsresult HandleEvent (nsIDOMEvent event) {
+    //nsIDOMEvent domEvent = new nsIDOMEvent (event);
 
-    int /*long*/ type = XPCOM.nsEmbedString_new ();
-    int rc = domEvent.GetType (type);
-    if (rc !is XPCOM.NS_OK) error (rc);
-    int length = XPCOM.nsEmbedString_Length (type);
-    int /*long*/ buffer = XPCOM.nsEmbedString_get (type);
-    char[] chars = new char[length];
-    XPCOM.memmove (chars, buffer, length * 2);
-    String typeString = new String (chars);
-    XPCOM.nsEmbedString_delete (type);
+    scope auto type = new nsEmbedString;
+    int rc = event.GetType (cast(nsAString*)type);
+    if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+    //int length = XPCOM.nsEmbedString_Length (type);
+    //int /*long*/ buffer = XPCOM.nsEmbedString_get (type);
+    //char[] chars = new char[length];
+    //XPCOM.memmove (chars, buffer, length * 2);
+    String typeString = type.toString;
+    //XPCOM.nsEmbedString_delete (type);
 
     if (XPCOM.DOMEVENT_UNLOAD.equals (typeString)) {
-        int /*long*/[] result = new int /*long*/[1];
-        rc = domEvent.GetCurrentTarget (result);
-        if (rc !is XPCOM.NS_OK) error (rc);
-        if (result[0] is 0) error (XPCOM.NS_NOINTERFACE);
+        //int /*long*/[] result = new int /*long*/[1];
+        nsIDOMEventTarget target;
+        rc = event.GetCurrentTarget (&target);
+        if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+        if (target is null) error (XPCOM.NS_NOINTERFACE, __FILE__, __LINE__);
 
-        nsIDOMEventTarget target = new nsIDOMEventTarget (result[0]);
+        //nsIDOMEventTarget target = new nsIDOMEventTarget (result[0]);
         unhookDOMListeners (target);
         target.Release ();
         return XPCOM.NS_OK;
     }
 
     if (XPCOM.DOMEVENT_FOCUS.equals (typeString)) {
-        delegate.handleFocus ();
+        mozDelegate.handleFocus ();
         return XPCOM.NS_OK;
     }
 
     if (XPCOM.DOMEVENT_KEYDOWN.equals (typeString)) {
-        int /*long*/[] result = new int /*long*/[1];
-        rc = domEvent.QueryInterface (nsIDOMKeyEvent.NS_IDOMKEYEVENT_IID, result);
-        if (rc !is XPCOM.NS_OK) error (rc);
-        if (result[0] is 0) error (XPCOM.NS_NOINTERFACE);
-        nsIDOMKeyEvent domKeyEvent = new nsIDOMKeyEvent (result[0]);
-        result[0] = 0;
+        //int /*long*/[] result = new int /*long*/[1];
+        nsIDOMKeyEvent domKeyEvent;
+        rc = event.QueryInterface (&nsIDOMKeyEvent.IID, cast(void**)&domKeyEvent);
+        if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+        if (domKeyEvent is null) error (XPCOM.NS_NOINTERFACE, __FILE__, __LINE__);
+        //nsIDOMKeyEvent domKeyEvent = new nsIDOMKeyEvent (result[0]);
+        //result[0] = 0;
 
-        int[] aKeyCode = new int[1]; /* PRUint32 */
-        rc = domKeyEvent.GetKeyCode (aKeyCode);
-        if (rc !is XPCOM.NS_OK) error (rc);
-        int keyCode = translateKey (aKeyCode[0]);
+        PRUint32 aKeyCode; /* PRUint32 */
+        rc = domKeyEvent.GetKeyCode (&aKeyCode);
+        if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+        int keyCode = super.translateKey (aKeyCode);
 
         /*
         * if keyCode is lastKeyCode then either a repeating key like Shift
@@ -3051,25 +2830,25 @@
                 case DWT.SCROLL_LOCK:
                 case DWT.COMMAND: {
                     /* keypress events will not be received for these keys, so send KeyDowns for them now */
-                    int[] aAltKey = new int[1], aCtrlKey = new int[1], aShiftKey = new int[1], aMetaKey = new int[1]; /* PRBool */
-                    rc = domKeyEvent.GetAltKey (aAltKey);
-                    if (rc !is XPCOM.NS_OK) error (rc);
-                    rc = domKeyEvent.GetCtrlKey (aCtrlKey);
-                    if (rc !is XPCOM.NS_OK) error (rc);
-                    rc = domKeyEvent.GetShiftKey (aShiftKey);
-                    if (rc !is XPCOM.NS_OK) error (rc);
-                    rc = domKeyEvent.GetMetaKey (aMetaKey);
-                    if (rc !is XPCOM.NS_OK) error (rc);
+                    PRBool aAltKey, aCtrlKey, aShiftKey, aMetaKey; /* PRBool */
+                    rc = domKeyEvent.GetAltKey (&aAltKey);
+                    if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+                    rc = domKeyEvent.GetCtrlKey (&aCtrlKey);
+                    if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+                    rc = domKeyEvent.GetShiftKey (&aShiftKey);
+                    if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+                    rc = domKeyEvent.GetMetaKey (&aMetaKey);
+                    if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
 
                     Event keyEvent = new Event ();
                     keyEvent.widget = browser;
                     keyEvent.type = DWT.KeyDown;
                     keyEvent.keyCode = keyCode;
-                    keyEvent.stateMask = (aAltKey[0] !is 0 ? DWT.ALT : 0) | (aCtrlKey[0] !is 0 ? DWT.CTRL : 0) | (aShiftKey[0] !is 0 ? DWT.SHIFT : 0) | (aMetaKey[0] !is 0 ? DWT.COMMAND : 0);
+                    keyEvent.stateMask = (aAltKey !is 0 ? DWT.ALT : 0) | (aCtrlKey !is 0 ? DWT.CTRL : 0) | (aShiftKey !is 0 ? DWT.SHIFT : 0) | (aMetaKey !is 0 ? DWT.COMMAND : 0);
                     keyEvent.stateMask &= ~keyCode;     /* remove current keydown if it's a state key */
                     browser.notifyListeners (keyEvent.type, keyEvent);
-                    if (!keyEvent.doit || browser.isDisposed ()) {
-                        domEvent.PreventDefault ();
+                    if (!keyEvent.doit) {
+                        event.PreventDefault ();
                     }
                     break;
                 }
@@ -3080,28 +2859,28 @@
                     * does not have Meta as a modifier, or has Meta+Ctrl as a modifier, then then do nothing here
                     * because its KeyDown event will be sent from the keypress listener.
                     */
-                    int[] aMetaKey = new int[1]; /* PRBool */
-                    rc = domKeyEvent.GetMetaKey (aMetaKey);
-                    if (rc !is XPCOM.NS_OK) error (rc);
-                    if (aMetaKey[0] !is 0) {
-                        int[] aCtrlKey = new int[1]; /* PRBool */
-                        rc = domKeyEvent.GetCtrlKey (aCtrlKey);
-                        if (rc !is XPCOM.NS_OK) error (rc);
-                        if (aCtrlKey[0] is 0) {
-                            int[] aAltKey = new int[1], aShiftKey = new int[1]; /* PRBool */
-                            rc = domKeyEvent.GetAltKey (aAltKey);
-                            if (rc !is XPCOM.NS_OK) error (rc);
-                            rc = domKeyEvent.GetShiftKey (aShiftKey);
-                            if (rc !is XPCOM.NS_OK) error (rc);
+                    PRBool aMetaKey; /* PRBool */
+                    rc = domKeyEvent.GetMetaKey (&aMetaKey);
+                    if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+                    if (aMetaKey !is 0) {
+                        PRBool aCtrlKey; /* PRBool */
+                        rc = domKeyEvent.GetCtrlKey (&aCtrlKey);
+                        if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+                        if (aCtrlKey is 0) {
+                            PRBool aAltKey, aShiftKey; /* PRBool */
+                            rc = domKeyEvent.GetAltKey (&aAltKey);
+                            if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+                            rc = domKeyEvent.GetShiftKey (&aShiftKey);
+                            if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
 
                             Event keyEvent = new Event ();
                             keyEvent.widget = browser;
                             keyEvent.type = DWT.KeyDown;
                             keyEvent.keyCode = lastKeyCode;
-                            keyEvent.stateMask = (aAltKey[0] !is 0 ? DWT.ALT : 0) | (aCtrlKey[0] !is 0? DWT.CTRL : 0) | (aShiftKey[0] !is 0? DWT.SHIFT : 0) | (aMetaKey[0] !is 0? DWT.COMMAND : 0);
+                            keyEvent.stateMask = (aAltKey !is 0 ? DWT.ALT : 0) | (aCtrlKey !is 0? DWT.CTRL : 0) | (aShiftKey !is 0? DWT.SHIFT : 0) | (aMetaKey !is 0? DWT.COMMAND : 0);
                             browser.notifyListeners (keyEvent.type, keyEvent);
-                            if (!keyEvent.doit || browser.isDisposed ()) {
-                                domEvent.PreventDefault ();
+                            if (!keyEvent.doit) {
+                                event.PreventDefault ();
                             }
                         }
                     }
@@ -3129,30 +2908,32 @@
             case DWT.CAPS_LOCK:
             case DWT.NUM_LOCK:
             case DWT.SCROLL_LOCK: return XPCOM.NS_OK;
+            default: break;
         }
 
-        int /*long*/[] result = new int /*long*/[1];
-        rc = domEvent.QueryInterface (nsIDOMKeyEvent.NS_IDOMKEYEVENT_IID, result);
-        if (rc !is XPCOM.NS_OK) error (rc);
-        if (result[0] is 0) error (XPCOM.NS_NOINTERFACE);
-        nsIDOMKeyEvent domKeyEvent = new nsIDOMKeyEvent (result[0]);
-        result[0] = 0;
+        //int /*long*/[] result = new int /*long*/[1];
+        nsIDOMKeyEvent domKeyEvent;
+        rc = event.QueryInterface (&nsIDOMKeyEvent.IID, cast(void**)&domKeyEvent);
+        if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+        if (domKeyEvent is null) error (XPCOM.NS_NOINTERFACE, __FILE__, __LINE__);
+        //nsIDOMKeyEvent domKeyEvent = new nsIDOMKeyEvent (result[0]);
+        //result[0] = 0;
 
-        int[] aAltKey = new int[1], aCtrlKey = new int[1], aShiftKey = new int[1], aMetaKey = new int[1]; /* PRBool */
-        rc = domKeyEvent.GetAltKey (aAltKey);
-        if (rc !is XPCOM.NS_OK) error (rc);
-        rc = domKeyEvent.GetCtrlKey (aCtrlKey);
-        if (rc !is XPCOM.NS_OK) error (rc);
-        rc = domKeyEvent.GetShiftKey (aShiftKey);
-        if (rc !is XPCOM.NS_OK) error (rc);
-        rc = domKeyEvent.GetMetaKey (aMetaKey);
-        if (rc !is XPCOM.NS_OK) error (rc);
+        PRBool aAltKey, aCtrlKey, aShiftKey, aMetaKey; /* PRBool */
+        rc = domKeyEvent.GetAltKey (&aAltKey);
+        if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+        rc = domKeyEvent.GetCtrlKey (&aCtrlKey);
+        if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+        rc = domKeyEvent.GetShiftKey (&aShiftKey);
+        if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+        rc = domKeyEvent.GetMetaKey (&aMetaKey);
+        if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
         domKeyEvent.Release ();
 
-        int[] aCharCode = new int[1]; /* PRUint32 */
-        rc = domKeyEvent.GetCharCode (aCharCode);
-        if (rc !is XPCOM.NS_OK) error (rc);
-        lastCharCode = aCharCode[0];
+        PRUint32 aCharCode; /* PRUint32 */
+        rc = domKeyEvent.GetCharCode (&aCharCode);
+        if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+        lastCharCode = aCharCode;
         if (lastCharCode is 0) {
             switch (lastKeyCode) {
                 case DWT.TAB: lastCharCode = DWT.TAB; break;
@@ -3160,9 +2941,10 @@
                 case DWT.BS: lastCharCode = DWT.BS; break;
                 case DWT.ESC: lastCharCode = DWT.ESC; break;
                 case DWT.DEL: lastCharCode = DWT.DEL; break;
+                default: break;
             }
         }
-        if (aCtrlKey[0] !is 0 && (0 <= lastCharCode && lastCharCode <= 0x7F)) {
+        if (aCtrlKey !is 0 && (0 <= lastCharCode && lastCharCode <= 0x7F)) {
             if ('a'  <= lastCharCode && lastCharCode <= 'z') lastCharCode -= 'a' - 'A';
             if (64 <= lastCharCode && lastCharCode <= 95) lastCharCode -= 64;
         }
@@ -3172,26 +2954,27 @@
         keyEvent.type = DWT.KeyDown;
         keyEvent.keyCode = lastKeyCode;
         keyEvent.character = cast(wchar)lastCharCode;
-        keyEvent.stateMask = (aAltKey[0] !is 0 ? DWT.ALT : 0) | (aCtrlKey[0] !is 0 ? DWT.CTRL : 0) | (aShiftKey[0] !is 0 ? DWT.SHIFT : 0) | (aMetaKey[0] !is 0 ? DWT.COMMAND : 0);
+        keyEvent.stateMask = (aAltKey !is 0 ? DWT.ALT : 0) | (aCtrlKey !is 0 ? DWT.CTRL : 0) | (aShiftKey !is 0 ? DWT.SHIFT : 0) | (aMetaKey !is 0 ? DWT.COMMAND : 0);
         browser.notifyListeners (keyEvent.type, keyEvent);
-        if (!keyEvent.doit || browser.isDisposed ()) {
-            domEvent.PreventDefault ();
+        if (!keyEvent.doit) {
+            event.PreventDefault ();
         }
         return XPCOM.NS_OK;
     }
 
     if (XPCOM.DOMEVENT_KEYUP.equals (typeString)) {
-        int /*long*/[] result = new int /*long*/[1];
-        rc = domEvent.QueryInterface (nsIDOMKeyEvent.NS_IDOMKEYEVENT_IID, result);
-        if (rc !is XPCOM.NS_OK) error (rc);
-        if (result[0] is 0) error (XPCOM.NS_NOINTERFACE);
-        nsIDOMKeyEvent domKeyEvent = new nsIDOMKeyEvent (result[0]);
-        result[0] = 0;
+        //int /*long*/[] result = new int /*long*/[1];
+        nsIDOMKeyEvent domKeyEvent;
+        rc = event.QueryInterface (&nsIDOMKeyEvent.IID, cast(void**)&domKeyEvent);
+        if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+        if (domKeyEvent is null) error (XPCOM.NS_NOINTERFACE, __FILE__, __LINE__);
+        //nsIDOMKeyEvent domKeyEvent = new nsIDOMKeyEvent (result[0]);
+        //result[0] = 0;
 
-        int[] aKeyCode = new int[1]; /* PRUint32 */
-        rc = domKeyEvent.GetKeyCode (aKeyCode);
-        if (rc !is XPCOM.NS_OK) error (rc);
-        int keyCode = translateKey (aKeyCode[0]);
+        PRUint32 aKeyCode; /* PRUint32 */
+        rc = domKeyEvent.GetKeyCode (&aKeyCode);
+        if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+        int keyCode = super.translateKey (aKeyCode);
         if (keyCode is 0) {
             /* indicates a key for which key events are not sent */
             domKeyEvent.Release ();
@@ -3203,15 +2986,15 @@
             lastCharCode = 0;
         }
 
-        int[] aAltKey = new int[1], aCtrlKey = new int[1], aShiftKey = new int[1], aMetaKey = new int[1]; /* PRBool */
-        rc = domKeyEvent.GetAltKey (aAltKey);
-        if (rc !is XPCOM.NS_OK) error (rc);
-        rc = domKeyEvent.GetCtrlKey (aCtrlKey);
-        if (rc !is XPCOM.NS_OK) error (rc);
-        rc = domKeyEvent.GetShiftKey (aShiftKey);
-        if (rc !is XPCOM.NS_OK) error (rc);
-        rc = domKeyEvent.GetMetaKey (aMetaKey);
-        if (rc !is XPCOM.NS_OK) error (rc);
+        PRBool aAltKey, aCtrlKey, aShiftKey, aMetaKey; /* PRBool */
+        rc = domKeyEvent.GetAltKey (&aAltKey);
+        if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+        rc = domKeyEvent.GetCtrlKey (&aCtrlKey);
+        if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+        rc = domKeyEvent.GetShiftKey (&aShiftKey);
+        if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+        rc = domKeyEvent.GetMetaKey (&aMetaKey);
+        if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
         domKeyEvent.Release ();
 
         Event keyEvent = new Event ();
@@ -3219,7 +3002,7 @@
         keyEvent.type = DWT.KeyUp;
         keyEvent.keyCode = lastKeyCode;
         keyEvent.character = cast(wchar)lastCharCode;
-        keyEvent.stateMask = (aAltKey[0] !is 0 ? DWT.ALT : 0) | (aCtrlKey[0] !is 0 ? DWT.CTRL : 0) | (aShiftKey[0] !is 0 ? DWT.SHIFT : 0) | (aMetaKey[0] !is 0 ? DWT.COMMAND : 0);
+        keyEvent.stateMask = (aAltKey !is 0 ? DWT.ALT : 0) | (aCtrlKey !is 0 ? DWT.CTRL : 0) | (aShiftKey !is 0 ? DWT.SHIFT : 0) | (aMetaKey !is 0 ? DWT.COMMAND : 0);
         switch (lastKeyCode) {
             case DWT.SHIFT:
             case DWT.CONTROL:
@@ -3227,10 +3010,11 @@
             case DWT.COMMAND: {
                 keyEvent.stateMask |= lastKeyCode;
             }
+            default: break;
         }
         browser.notifyListeners (keyEvent.type, keyEvent);
-        if (!keyEvent.doit || browser.isDisposed ()) {
-            domEvent.PreventDefault ();
+        if (!keyEvent.doit) {
+            event.PreventDefault ();
         }
         lastKeyCode = lastCharCode = 0;
         return XPCOM.NS_OK;
@@ -3238,12 +3022,13 @@
 
     /* mouse event */
 
-    int /*long*/[] result = new int /*long*/[1];
-    rc = domEvent.QueryInterface (nsIDOMMouseEvent.NS_IDOMMOUSEEVENT_IID, result);
-    if (rc !is XPCOM.NS_OK) error (rc);
-    if (result[0] is 0) error (XPCOM.NS_NOINTERFACE);
-    nsIDOMMouseEvent domMouseEvent = new nsIDOMMouseEvent (result[0]);
-    result[0] = 0;
+    //int /*long*/[] result = new int /*long*/[1];
+    nsIDOMMouseEvent domMouseEvent;
+    rc = event.QueryInterface (&nsIDOMMouseEvent.IID, cast(void**)&domMouseEvent);
+    if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+    if (domMouseEvent is null) error (XPCOM.NS_NOINTERFACE, __FILE__, __LINE__);
+    //nsIDOMMouseEvent domMouseEvent = new nsIDOMMouseEvent (result[0]);
+    //result[0] = 0;
 
     /*
      * MouseOver and MouseOut events are fired any time the mouse enters or exits
@@ -3253,45 +3038,46 @@
      * is within the Browser.
      */
     if (XPCOM.DOMEVENT_MOUSEOVER.equals (typeString) || XPCOM.DOMEVENT_MOUSEOUT.equals (typeString)) {
-        rc = domMouseEvent.GetRelatedTarget (result);
-        if (rc !is XPCOM.NS_OK) error (rc);
-        if (result[0] !is 0) {
+        nsIDOMEventTarget eventTarget;
+        rc = domMouseEvent.GetRelatedTarget (&eventTarget);
+        if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+        if (eventTarget !is null) {
             domMouseEvent.Release ();
             return XPCOM.NS_OK;
         }
     }
 
-    int[] aClientX = new int[1], aClientY = new int[1], aDetail = new int[1]; /* PRInt32 */
-    rc = domMouseEvent.GetClientX (aClientX);
-    if (rc !is XPCOM.NS_OK) error (rc);
-    rc = domMouseEvent.GetClientY (aClientY);
-    if (rc !is XPCOM.NS_OK) error (rc);
-    rc = domMouseEvent.GetDetail (aDetail);
-    if (rc !is XPCOM.NS_OK) error (rc);
-    short[] aButton = new short[1]; /* PRUint16 */
-    rc = domMouseEvent.GetButton (aButton);
-    if (rc !is XPCOM.NS_OK) error (rc);
-    int[] aAltKey = new int[1], aCtrlKey = new int[1], aShiftKey = new int[1], aMetaKey = new int[1]; /* PRBool */
-    rc = domMouseEvent.GetAltKey (aAltKey);
-    if (rc !is XPCOM.NS_OK) error (rc);
-    rc = domMouseEvent.GetCtrlKey (aCtrlKey);
-    if (rc !is XPCOM.NS_OK) error (rc);
-    rc = domMouseEvent.GetShiftKey (aShiftKey);
-    if (rc !is XPCOM.NS_OK) error (rc);
-    rc = domMouseEvent.GetMetaKey (aMetaKey);
-    if (rc !is XPCOM.NS_OK) error (rc);
+    PRInt32 aClientX, aClientY, aDetail; /* PRInt32 */
+    rc = domMouseEvent.GetClientX (&aClientX);
+    if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+    rc = domMouseEvent.GetClientY (&aClientY);
+    if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+    rc = domMouseEvent.GetDetail (&aDetail);
+    if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+    PRUint16 aButton; /* PRUint16 */
+    rc = domMouseEvent.GetButton (&aButton);
+    if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+    PRBool aAltKey, aCtrlKey, aShiftKey, aMetaKey; /* PRBool */
+    rc = domMouseEvent.GetAltKey (&aAltKey);
+    if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+    rc = domMouseEvent.GetCtrlKey (&aCtrlKey);
+    if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+    rc = domMouseEvent.GetShiftKey (&aShiftKey);
+    if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
+    rc = domMouseEvent.GetMetaKey (&aMetaKey);
+    if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
     domMouseEvent.Release ();
 
     Event mouseEvent = new Event ();
     mouseEvent.widget = browser;
-    mouseEvent.x = aClientX[0]; mouseEvent.y = aClientY[0];
-    mouseEvent.stateMask = (aAltKey[0] !is 0 ? DWT.ALT : 0) | (aCtrlKey[0] !is 0 ? DWT.CTRL : 0) | (aShiftKey[0] !is 0 ? DWT.SHIFT : 0) | (aMetaKey[0] !is 0 ? DWT.COMMAND : 0);
+    mouseEvent.x = aClientX; mouseEvent.y = aClientY;
+    mouseEvent.stateMask = (aAltKey !is 0 ? DWT.ALT : 0) | (aCtrlKey !is 0 ? DWT.CTRL : 0) | (aShiftKey !is 0 ? DWT.SHIFT : 0) | (aMetaKey !is 0 ? DWT.COMMAND : 0);
 
     if (XPCOM.DOMEVENT_MOUSEDOWN.equals (typeString)) {
-        delegate.handleMouseDown ();
+        mozDelegate.handleMouseDown ();
         mouseEvent.type = DWT.MouseDown;
-        mouseEvent.button = aButton[0] + 1;
-        mouseEvent.count = aDetail[0];
+        mouseEvent.button = aButton + 1;
+        mouseEvent.count = aDetail;
     } else if (XPCOM.DOMEVENT_MOUSEUP.equals (typeString)) {
         /*
          * Bug on OSX.  For some reason multiple mouseup events come from the DOM
@@ -3300,8 +3086,8 @@
          * button 3 mouseup events that do not have a count since mouse events
          * without a click count are not valid.
          */
-        int button = aButton[0] + 1;
-        int count = aDetail[0];
+        int button = aButton + 1;
+        int count = aDetail;
         if (count is 0 && button is 3) return XPCOM.NS_OK;
         mouseEvent.type = DWT.MouseUp;
         mouseEvent.button = button;
@@ -3310,33 +3096,33 @@
         mouseEvent.type = DWT.MouseMove;
     } else if (XPCOM.DOMEVENT_MOUSEWHEEL.equals (typeString)) {
         mouseEvent.type = DWT.MouseWheel;
-        mouseEvent.count = -aDetail[0];
+        mouseEvent.count = -aDetail;
     } else if (XPCOM.DOMEVENT_MOUSEOVER.equals (typeString)) {
         mouseEvent.type = DWT.MouseEnter;
     } else if (XPCOM.DOMEVENT_MOUSEOUT.equals (typeString)) {
         mouseEvent.type = DWT.MouseExit;
     } else if (XPCOM.DOMEVENT_MOUSEDRAG.equals (typeString)) {
         mouseEvent.type = DWT.DragDetect;
-        mouseEvent.button = aButton[0] + 1;
+        mouseEvent.button = aButton + 1;
         switch (mouseEvent.button) {
             case 1: mouseEvent.stateMask |= DWT.BUTTON1; break;
             case 2: mouseEvent.stateMask |= DWT.BUTTON2; break;
             case 3: mouseEvent.stateMask |= DWT.BUTTON3; break;
             case 4: mouseEvent.stateMask |= DWT.BUTTON4; break;
             case 5: mouseEvent.stateMask |= DWT.BUTTON5; break;
+            default: break;
         }
     }
 
     browser.notifyListeners (mouseEvent.type, mouseEvent);
-    if (browser.isDisposed ()) return XPCOM.NS_OK;
-    if (aDetail[0] is 2 && XPCOM.DOMEVENT_MOUSEDOWN.equals (typeString)) {
+    if (aDetail is 2 && XPCOM.DOMEVENT_MOUSEDOWN.equals (typeString)) {
         mouseEvent = new Event ();
         mouseEvent.widget = browser;
-        mouseEvent.x = aClientX[0]; mouseEvent.y = aClientY[0];
-        mouseEvent.stateMask = (aAltKey[0] !is 0 ? DWT.ALT : 0) | (aCtrlKey[0] !is 0 ? DWT.CTRL : 0) | (aShiftKey[0] !is 0 ? DWT.SHIFT : 0) | (aMetaKey[0] !is 0 ? DWT.COMMAND : 0);
+        mouseEvent.x = aClientX; mouseEvent.y = aClientY;
+        mouseEvent.stateMask = (aAltKey !is 0 ? DWT.ALT : 0) | (aCtrlKey !is 0 ? DWT.CTRL : 0) | (aShiftKey !is 0 ? DWT.SHIFT : 0) | (aMetaKey !is 0 ? DWT.COMMAND : 0);
         mouseEvent.type = DWT.MouseDoubleClick;
-        mouseEvent.button = aButton[0] + 1;
-        mouseEvent.count = aDetail[0];
+        mouseEvent.button = aButton + 1;
+        mouseEvent.count = aDetail;
         browser.notifyListeners (mouseEvent.type, mouseEvent);  
     }
     return XPCOM.NS_OK;