changeset 339:c317081df76f

Mozilla module complete (first phase complete)
author John Reimer <terminal.node@gmail.com>
date Sat, 25 Oct 2008 21:01:54 -0700
parents d47095c2d585
children 3f4a5c7d138f
files dwt/browser/Mozilla.d dwt/dwthelper/utils.d
diffstat 2 files changed, 460 insertions(+), 415 deletions(-) [+]
line wrap: on
line diff
--- a/dwt/browser/Mozilla.d	Thu Oct 23 21:32:32 2008 -0700
+++ b/dwt/browser/Mozilla.d	Sat Oct 25 21:01:54 2008 -0700
@@ -1663,7 +1663,7 @@
     mozDelegate.onDispose (embedHandle);
     mozDelegate = null;
 
-    embedHandle = 0;
+    embedHandle = null;
     BrowserCount--;
 }
 
@@ -1862,15 +1862,16 @@
 public bool setUrl (String url) {
     awaitingNavigate = false;
 
-    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);
 
-    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);
+    //nsIWebNavigation webNavigation = new nsIWebNavigation (result[0]);
+    //char[] uri = new char[url.length () + 1];
+    //url.getChars (0, url.length (), uri, 0);
+    rc = webNavigation.LoadURI (Utf.toString16(url).toString16z, nsIWebNavigation.LOAD_FLAGS_NONE, null, null, null);
     webNavigation.Release ();
     return rc is XPCOM.NS_OK;
 }
@@ -1878,39 +1879,40 @@
 public void stop () {
     if (awaitingNavigate) return;
 
-    int /*long*/[] result = new int /*long*/[1];
-    int rc = webBrowser.QueryInterface (nsIWebNavigation.NS_IWEBNAVIGATION_IID, result);
+    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);
-    if (result[0] is 0) error (XPCOM.NS_ERROR_NO_INTERFACE);
+    if (webNavigation is null) error (XPCOM.NS_ERROR_NO_INTERFACE);
     
-    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);
     webNavigation.Release ();
 }
 
 void hookDOMListeners (nsIDOMEventTarget target, bool isTop) {
-    nsEmbedString string = new nsEmbedString (XPCOM.DOMEVENT_FOCUS);
-    target.AddEventListener (string.getAddress (), domEventListener.getAddress (), 0);
-    string.dispose ();
+    scope auto string = new nsEmbedString (XPCOM.DOMEVENT_FOCUS);
+    target.AddEventListener (cast(nsAString*)string, domEventListener, 0);
+    //string.dispose ();
     string = new nsEmbedString (XPCOM.DOMEVENT_UNLOAD);
-    target.AddEventListener (string.getAddress (), domEventListener.getAddress (), 0);
-    string.dispose ();
+    target.AddEventListener (cast(nsAString*)string, domEventListener, 0);
+    //string.dispose ();
     string = new nsEmbedString (XPCOM.DOMEVENT_MOUSEDOWN);
-    target.AddEventListener (string.getAddress (), domEventListener.getAddress (), 0);
-    string.dispose ();
+    target.AddEventListener (cast(nsAString*)string, domEventListener, 0);
+    //string.dispose ();
     string = new nsEmbedString (XPCOM.DOMEVENT_MOUSEUP);
-    target.AddEventListener (string.getAddress (), domEventListener.getAddress (), 0);
-    string.dispose ();
+    target.AddEventListener (cast(nsAString*)string, domEventListener, 0);
+    //string.dispose ();
     string = new nsEmbedString (XPCOM.DOMEVENT_MOUSEMOVE);
-    target.AddEventListener (string.getAddress (), domEventListener.getAddress (), 0);
-    string.dispose ();
+    target.AddEventListener (cast(nsAString*)string, domEventListener, 0);
+    //string.dispose ();
     string = new nsEmbedString (XPCOM.DOMEVENT_MOUSEWHEEL);
-    target.AddEventListener (string.getAddress (), domEventListener.getAddress (), 0);
-    string.dispose ();
+    target.AddEventListener (cast(nsAString*)string, domEventListener, 0);
+    //string.dispose ();
     string = new nsEmbedString (XPCOM.DOMEVENT_MOUSEDRAG);
-    target.AddEventListener (string.getAddress (), domEventListener.getAddress (), 0);
-    string.dispose ();
+    target.AddEventListener (cast(nsAString*)string, domEventListener, 0);
+    //string.dispose ();
 
     /*
     * Only hook mouseover and mouseout if the target is a top-level frame, so that mouse moves
@@ -1918,66 +1920,70 @@
     */
     if (isTop && mozDelegate.hookEnterExit ()) {
         string = new nsEmbedString (XPCOM.DOMEVENT_MOUSEOVER);
-        target.AddEventListener (string.getAddress (), domEventListener.getAddress (), 0);
-        string.dispose ();
+        target.AddEventListener (cast(nsAString*)string, domEventListener, 0);
+        //string.dispose ();
         string = new nsEmbedString (XPCOM.DOMEVENT_MOUSEOUT);
-        target.AddEventListener (string.getAddress (), domEventListener.getAddress (), 0);
-        string.dispose ();
+        target.AddEventListener (cast(nsAString*)string, domEventListener, 0);
+        //string.dispose ();
     }
 
     string = new nsEmbedString (XPCOM.DOMEVENT_KEYDOWN);
-    target.AddEventListener (string.getAddress (), domEventListener.getAddress (), 0);
-    string.dispose ();
+    target.AddEventListener (cast(nsAString*)string, domEventListener, 0);
+    //string.dispose ();
     string = new nsEmbedString (XPCOM.DOMEVENT_KEYPRESS);
-    target.AddEventListener (string.getAddress (), domEventListener.getAddress (), 0);
-    string.dispose ();
+    target.AddEventListener (cast(nsAString*)string, domEventListener, 0);
+    //string.dispose ();
     string = new nsEmbedString (XPCOM.DOMEVENT_KEYUP);
-    target.AddEventListener (string.getAddress (), domEventListener.getAddress (), 0);
-    string.dispose ();
+    target.AddEventListener (cast(nsAString*)string, domEventListener, 0);
+    //string.dispose ();
 }
 
 void unhookDOMListeners () {
-    int /*long*/[] result = new int /*long*/[1];
-    int rc = webBrowser.GetContentDOMWindow (result);
+    //int /*long*/[] result = new int /*long*/[1];
+    nsIDOMWindow window;
+    int rc = webBrowser.GetContentDOMWindow (&window);
     if (rc !is XPCOM.NS_OK) error (rc);
-    if (result[0] is 0) error (XPCOM.NS_ERROR_NO_INTERFACE);
+    if (window is null) error (XPCOM.NS_ERROR_NO_INTERFACE);
 
-    nsIDOMWindow window = new nsIDOMWindow (result[0]);
-    result[0] = 0;
-    rc = window.QueryInterface (nsIDOMEventTarget.NS_IDOMEVENTTARGET_IID, result);
+    //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);
-    if (result[0] is 0) error (XPCOM.NS_ERROR_NO_INTERFACE);
+    if (target is null) error (XPCOM.NS_ERROR_NO_INTERFACE);
 
-    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);
+    nsIDOMWindowCollection frames;
+    rc = window.GetFrames (&frames);
     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 (frames is null) error (XPCOM.NS_ERROR_NO_INTERFACE);
+    //nsIDOMWindowCollection frames = new nsIDOMWindowCollection (result[0]);
+    //result[0] = 0;
+    PRUint32 count;
+    rc = frames.GetLength (&count); /* PRUint32 */
     if (rc !is XPCOM.NS_OK) error (rc);
-    int count = frameCount[0];
+    //int count = frameCount[0];
 
     if (count > 0) {
+        nsIDOMWindow frame;
         for (int i = 0; i < count; i++) {
-            rc = frames.Item (i, result);
+            rc = frames.Item (i, &frame);
             if (rc !is XPCOM.NS_OK) error (rc);
-            if (result[0] is 0) error (XPCOM.NS_ERROR_NO_INTERFACE);
+            if (frame is null) error (XPCOM.NS_ERROR_NO_INTERFACE);
 
-            nsIDOMWindow frame = new nsIDOMWindow (result[0]);
-            result[0] = 0;
-            rc = frame.QueryInterface (nsIDOMEventTarget.NS_IDOMEVENTTARGET_IID, result);
+            //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);
-            if (result[0] is 0) error (XPCOM.NS_ERROR_NO_INTERFACE);
+            if (target is null) error (XPCOM.NS_ERROR_NO_INTERFACE);
 
-            target = new nsIDOMEventTarget (result[0]);
-            result[0] = 0;
+            //target = new nsIDOMEventTarget (result[0]);
+            //result[0] = 0;
             unhookDOMListeners (target);
             target.Release ();
             frame.Release ();
@@ -1988,47 +1994,47 @@
 }
 
 void unhookDOMListeners (nsIDOMEventTarget target) {
-    nsEmbedString string = new nsEmbedString (XPCOM.DOMEVENT_FOCUS);
-    target.RemoveEventListener (string.getAddress (), domEventListener.getAddress (), 0);
-    string.dispose ();
+    scope auto string = new nsEmbedString (XPCOM.DOMEVENT_FOCUS);
+    target.RemoveEventListener (cast(nsAString*)string, domEventListener, 0);
+    //string.dispose ();
     string = new nsEmbedString (XPCOM.DOMEVENT_UNLOAD);
-    target.RemoveEventListener (string.getAddress (), domEventListener.getAddress (), 0);
-    string.dispose ();
+    target.RemoveEventListener (cast(nsAString*)string, domEventListener, 0);
+    //string.dispose ();
     string = new nsEmbedString (XPCOM.DOMEVENT_MOUSEDOWN);
-    target.RemoveEventListener (string.getAddress (), domEventListener.getAddress (), 0);
-    string.dispose ();
+    target.RemoveEventListener (cast(nsAString*)string, domEventListener, 0);
+    //string.dispose ();
     string = new nsEmbedString (XPCOM.DOMEVENT_MOUSEUP);
-    target.RemoveEventListener (string.getAddress (), domEventListener.getAddress (), 0);
-    string.dispose ();
+    target.RemoveEventListener (cast(nsAString*)string, domEventListener, 0);
+    //string.dispose ();
     string = new nsEmbedString (XPCOM.DOMEVENT_MOUSEMOVE);
-    target.RemoveEventListener (string.getAddress (), domEventListener.getAddress (), 0);
-    string.dispose ();
+    target.RemoveEventListener (cast(nsAString*)string, domEventListener, 0);
+    //string.dispose ();
     string = new nsEmbedString (XPCOM.DOMEVENT_MOUSEWHEEL);
-    target.RemoveEventListener (string.getAddress (), domEventListener.getAddress (), 0);
-    string.dispose ();
+    target.RemoveEventListener (cast(nsAString*)string, domEventListener, 0);
+    //string.dispose ();
     string = new nsEmbedString (XPCOM.DOMEVENT_MOUSEDRAG);
-    target.RemoveEventListener (string.getAddress (), domEventListener.getAddress (), 0);
-    string.dispose ();
+    target.RemoveEventListener (cast(nsAString*)string, domEventListener, 0);
+    //string.dispose ();
     string = new nsEmbedString (XPCOM.DOMEVENT_MOUSEOVER);
-    target.RemoveEventListener (string.getAddress (), domEventListener.getAddress (), 0);
-    string.dispose ();
+    target.RemoveEventListener (cast(nsAString*)string, domEventListener, 0);
+    //string.dispose ();
     string = new nsEmbedString (XPCOM.DOMEVENT_MOUSEOUT);
-    target.RemoveEventListener (string.getAddress (), domEventListener.getAddress (), 0);
-    string.dispose ();
+    target.RemoveEventListener (cast(nsAString*)string, domEventListener, 0);
+    //string.dispose ();
     string = new nsEmbedString (XPCOM.DOMEVENT_KEYDOWN);
-    target.RemoveEventListener (string.getAddress (), domEventListener.getAddress (), 0);
-    string.dispose ();
+    target.RemoveEventListener (cast(nsAString*)string, domEventListener, 0);
+    //string.dispose ();
     string = new nsEmbedString (XPCOM.DOMEVENT_KEYPRESS);
-    target.RemoveEventListener (string.getAddress (), domEventListener.getAddress (), 0);
-    string.dispose ();
+    target.RemoveEventListener (cast(nsAString*)string, domEventListener, 0);
+    //string.dispose ();
     string = new nsEmbedString (XPCOM.DOMEVENT_KEYUP);
-    target.RemoveEventListener (string.getAddress (), domEventListener.getAddress (), 0);
-    string.dispose ();
+    target.RemoveEventListener (cast(nsAString*)string, domEventListener., 0);
+    //string.dispose ();
 }
 
 /* nsISupports */
 
-int QueryInterface (nsID* riid, void** ppvObject) {
+nsresult QueryInterface (nsID* riid, void** ppvObject) {
     if (riid is null || ppvObject is null) return XPCOM.NS_ERROR_NO_INTERFACE;
 
     if (*riid == nsISupports.IID) {
@@ -2090,12 +2096,12 @@
     return XPCOM.NS_ERROR_NO_INTERFACE;
 }
 
-int AddRef () {
+nsrefcnt AddRef () {
     refCount++;
     return refCount;
 }
 
-int Release () {
+nsrefcnt Release () {
     refCount--;
     if (refCount is 0) return 0;
     return refCount;
@@ -2103,39 +2109,42 @@
 
 /* nsIWeakReference */  
     
-int QueryReferent (nsID* riid, void** ppvObject) {
+nsresult QueryReferent (nsID* riid, void** ppvObject) {
     return QueryInterface (riid, ppvObject);
 }
 
 /* nsIInterfaceRequestor */
 
-int GetInterface ( nsID* riid, void** 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);
+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).Equals (nsIDOMWindow.IID)) {
+        nsIDOMWindow aContentDOMWindow;
+        //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);
+        if (aContentDOMWindow is null) error (XPCOM.NS_ERROR_NO_INTERFACE);
+        *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);
+nsresult GetWeakReference (void** ppvObject) {
+    *ppvObject = cast(void*)weakReference;
+    //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) {
+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) {
             /*
@@ -2144,15 +2153,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);
+            //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);
-            if (result[0] is 0) error (XPCOM.NS_NOINTERFACE);
-            unhookedDOMWindows.addElement (new LONG (result[0]));
+            if (window is null) error (XPCOM.NS_NOINTERFACE);
+            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
@@ -2161,30 +2171,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);
+        //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);
-        if (result[0] is 0) error (XPCOM.NS_NOINTERFACE);
-        nsIDOMWindow domWindow = new nsIDOMWindow (result[0]);
+        if (domWindow is null) error (XPCOM.NS_NOINTERFACE);
+        //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);
+            nsIDOMWindow contentWindow;
+            rc = webBrowser.GetContentDOMWindow (&contentWindow);
             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;
+            if (contentWindow is null) error (XPCOM.NS_ERROR_NO_INTERFACE);
+            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);
+            if (target is null) error (XPCOM.NS_ERROR_NO_INTERFACE);
 
-            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 ();
 
@@ -2192,8 +2204,8 @@
             * 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 ();
 
@@ -2229,30 +2241,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);
+        //int /*long*/[] result = new int /*long*/[1];
+       // nsIWebProgress progress = new nsIWebProgress (aWebProgress);
+        nsIDOMWindow domWindow;
+        int rc = progress.GetDOMWindow (&domWindow);
         if (rc !is XPCOM.NS_OK) error (rc);
-        if (result[0] is 0) error (XPCOM.NS_NOINTERFACE);
-        nsIDOMWindow domWindow = new nsIDOMWindow (result[0]);
+        if (domWindow is null) error (XPCOM.NS_NOINTERFACE);
+        //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);
+            nsIDOMWindow contentWindow
+            rc = webBrowser.GetContentDOMWindow (&contentWindow);
             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;
+            if (contentWindow is null) error (XPCOM.NS_ERROR_NO_INTERFACE);
+            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);
+            if (target is null) error (XPCOM.NS_ERROR_NO_INTERFACE);
 
-            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 ();
 
@@ -2260,28 +2274,28 @@
             * 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 (domWindow);
+            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;
+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) {
+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
@@ -2291,35 +2305,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);
+    nsIDOMWindow domWindow;
+    //int /*long*/[] aDOMWindow = new int /*long*/[1];
+    int rc = webProgress.GetDOMWindow (&domWindow);
     if (rc !is XPCOM.NS_OK) error (rc);
-    if (aTop[0] is 0) error (XPCOM.NS_ERROR_NO_INTERFACE);
+    if (domWindow is null) error (XPCOM.NS_ERROR_NO_INTERFACE);
+    
+    //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);
+    if (topWindow is null) error (XPCOM.NS_ERROR_NO_INTERFACE);
     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
@@ -2327,7 +2344,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 (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 ();
@@ -2338,79 +2355,79 @@
      * (via setText()) then set it to about:blank to be consistent with IE.
      */
     if (event.location.equals (URI_FROMMEMORY)) event.location = ABOUT_BLANK;
-    event.top = aTop[0] is aDOMWindow[0];
+    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) {
+int 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 = aMessage.fromString16z.toString;
     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) {
+int OnSecurityChange (nsIWebProgress aWebProgress, nsIRequest aRequest, PRUint32 state) {
     return XPCOM.NS_OK;
 }
 
 /* nsIWebBrowserChrome */
 
-int SetStatus (int statusType, int /*long*/ status) {
+nsresult SetStatus (PRUint32 statusType, PRUinchar* 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 = status.fromString16z.toString;
     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];   
+nsresult GetWebBrowser (nsIWebBrowser* aWebBrowser) {
+    //int /*long*/[] ret = new int /*long*/[1];   
     if (webBrowser !is null) {
         webBrowser.AddRef ();
-        ret[0] = webBrowser.getAddress ();  
+        *aWebBrowser = cast(nsIWebBrowser)webBrowser;  
     }
-    XPCOM.memmove (aWebBrowser, ret, C.PTR_SIZEOF);
+    //XPCOM.memmove (aWebBrowser, ret, C.PTR_SIZEOF);
     return XPCOM.NS_OK;
 }
 
-int SetWebBrowser (int /*long*/ aWebBrowser) {
+nsresult SetWebBrowser (nsIWebBrowser aWebBrowser) {
     if (webBrowser !is null) webBrowser.Release ();
-    webBrowser = aWebBrowser !is 0 ? new nsIWebBrowser (aWebBrowser) : null;                
+    webBrowser = aWebBrowser !is null ? cast(WebBrowser)cast(void*)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 */
+nsresult GetChromeFlags (PRUint32* aChromeFlags) {
+    //int[] ret = new int[1];
+    *aChromeFlags = chromeFlags;
+    //XPCOM.memmove (aChromeFlags, ret, 4); /* PRUint32 */
     return XPCOM.NS_OK;
 }
 
-int SetChromeFlags (int aChromeFlags) {
+nsresult SetChromeFlags (PRUint32 aChromeFlags) {
     chromeFlags = aChromeFlags;
     return XPCOM.NS_OK;
 }
 
-int DestroyBrowserWindow () {
+nsresult DestroyBrowserWindow () {
     WindowEvent newEvent = new WindowEvent (browser);
     newEvent.display = browser.getDisplay ();
     newEvent.widget = browser;
@@ -2427,7 +2444,7 @@
     return XPCOM.NS_OK;
 }
     
-int SizeBrowserTo (int aCX, int aCY) {
+nsresult SizeBrowserTo (PRInt32 aCX, PRInt32 aCY) {
     size = new Point (aCX, aCY);
     bool isChrome = (chromeFlags & nsIWebBrowserChrome.CHROME_OPENAS_CHROME) !is 0;
     if (isChrome) {
@@ -2437,22 +2454,24 @@
     return XPCOM.NS_OK;
 }
 
-int ShowAsModal () {
-    int /*long*/[] result = new int /*long*/[1];
-    int rc = XPCOM.NS_GetServiceManager (result);
+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);
-    if (result[0] is 0) error (XPCOM.NS_NOINTERFACE);
+    if (serviceManager is null) error (XPCOM.NS_NOINTERFACE);
 
-    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);
+    //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, &nsIJSContextStack.IID, cast(void**)&stack);
     if (rc !is XPCOM.NS_OK) error (rc);
-    if (result[0] is 0) error (XPCOM.NS_NOINTERFACE);
+    if (stack is null) error (XPCOM.NS_NOINTERFACE);
     serviceManager.Release ();
 
-    nsIJSContextStack stack = new nsIJSContextStack (result[0]);
-    result[0] = 0;
+    //nsIJSContextStack stack = new nsIJSContextStack (result[0]);
+    //result[0] = 0;
     rc = stack.Push (0);
     if (rc !is XPCOM.NS_OK) error (rc);
 
@@ -2468,19 +2487,19 @@
     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 */
+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) {
+nsresult ExitModalEventLoop (nsresult aStatus) {
     return XPCOM.NS_OK;
 }
 
 /* nsIEmbeddingSiteWindow */ 
 
-int SetDimensions (int flags, int x, int y, int cx, int cy) {
+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);
@@ -2494,32 +2513,33 @@
     return XPCOM.NS_OK;
 }
 
-int GetDimensions (int flags, int /*long*/ x, int /*long*/ y, int /*long*/ cx, int /*long*/ cy) {
+int 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);
+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);
-    if (result[0] is 0) error (XPCOM.NS_ERROR_NO_INTERFACE);
+    if (baseWindow is null) error (XPCOM.NS_ERROR_NO_INTERFACE);
     
-    nsIBaseWindow baseWindow = new nsIBaseWindow (result[0]);
+    //nsIBaseWindow baseWindow = new nsIBaseWindow (result[0]);
     rc = baseWindow.SetFocus ();
     if (rc !is XPCOM.NS_OK) error (rc);
     baseWindow.Release ();
@@ -2532,13 +2552,14 @@
     return XPCOM.NS_OK;         
 }   
 
-int GetVisibility (int /*long*/ aVisibility) {
+nsresult GetVisibility (PRBool* aVisibility) {
     bool visible = browser.isVisible () && !browser.getShell ().getMinimized ();
-    XPCOM.memmove (aVisibility, new int[] {visible ? 1 : 0}, 4); /* PRBool */
+    *aVisible = visible ? 1 : 0;
+    //XPCOM.memmove (aVisibility, new int[] {visible ? 1 : 0}, 4); /* PRBool */
     return XPCOM.NS_OK;
 }
 
-int SetVisibility (int aVisibility) {
+nsresult SetVisibility (PRBool aVisibility) {
     if (isChild) {
         WindowEvent event = new WindowEvent (browser);
         event.display = browser.getDisplay ();
@@ -2575,11 +2596,11 @@
     return XPCOM.NS_OK;         
 }
 
-int GetTitle (int /*long*/ aTitle) {
+nsresult GetTitle (PRUnichar** aTitle) {
     return XPCOM.NS_OK;         
 }
  
-int SetTitle (int /*long*/ aTitle) {
+nsresult SetTitle (PRUnichar* aTitle) {
     if (awaitingNavigate || titleListeners.length is 0) return XPCOM.NS_OK;
     TitleEvent event = new TitleEvent (browser);
     event.display = browser.getDisplay ();
@@ -2591,9 +2612,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 = aTitle.fromString16z.toString;
     } else {
         event.title = getUrl ();
     }
@@ -2603,7 +2624,7 @@
     return XPCOM.NS_OK;         
 }
 
-int GetSiteWindow (int /*long*/ aSiteWindow) {
+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
@@ -2611,13 +2632,13 @@
     * 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 () {
+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
@@ -2633,7 +2654,7 @@
     return XPCOM.NS_OK;  
 }
 
-int FocusPrevElement () {
+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
@@ -2651,31 +2672,32 @@
 
 /* nsIContextMenuListener */
 
-int OnShowContextMenu (int aContextFlags, int /*long*/ aEvent, int /*long*/ aNode) {
+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);
+    //nsIDOMEvent domEvent = new nsIDOMEvent (aEvent);
+    //int /*long*/[] result = new int /*long*/[1];
+    nsIDOMMouseEvent domMouseEvent;
+    int rc = domEvent.QueryInterface (&nsIDOMMouseEvent.IID, cast(void**)&domMouseEvent);
     if (rc !is XPCOM.NS_OK) error (rc);
-    if (result[0] is 0) error (XPCOM.NS_NOINTERFACE);
+    if (domMouseEvent is null) error (XPCOM.NS_NOINTERFACE);
 
-    nsIDOMMouseEvent domMouseEvent = new nsIDOMMouseEvent (result[0]);
-    int[] aScreenX = new int[1], aScreenY = new int[1];
-    rc = domMouseEvent.GetScreenX (aScreenX);
+    //nsIDOMMouseEvent domMouseEvent = new nsIDOMMouseEvent (result[0]);
+    PRInt32 aScreenX, aScreenY;
+    rc = domMouseEvent.GetScreenX (&aScreenX);
     if (rc !is XPCOM.NS_OK) error (rc);
-    rc = domMouseEvent.GetScreenY (aScreenY);
+    rc = domMouseEvent.GetScreenY (&aScreenY);
     if (rc !is XPCOM.NS_OK) error (rc);
     domMouseEvent.Release ();
     
-    Event event = new Event ();
-    event.x = aScreenX[0];
-    event.y = aScreenY[0];
+    Event event;
+    event.x = aScreenX;
+    event.y = aScreenY;
     browser.notifyListeners (DWT.MenuDetect, event);
     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);
@@ -2685,23 +2707,24 @@
 
 /* nsIURIContentListener */
 
-int OnStartURIOpen (int /*long*/ aURI, int /*long*/ retval) {
+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;
+    location.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
@@ -2723,57 +2746,62 @@
             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) {
+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) {
+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 = aContentType.fromStringz;
 
         /* 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);
+            // int /*long*/[] result = new int /*long*/[1];
+            nsIServiceManager serviceManager;
+            int rc = XPCOM.NS_GetServiceManager (&serviceManager);
             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;
+            if (serviceManager is null) error (XPCOM.NS_NOINTERFACE);
+            //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, &nsIWebNavigationInfo.IID, cast(void**)&info);
             if (rc is 0) {
-                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);
+                //byte[] bytes = MozillaDelegate.wcsToMbcs (null, contentType, true);
+                scope auto typePtr = 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);
                 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);
+                //result[0] = 0;
+                nsICategoryManager categoryManager;
+                rc = serviceManager.GetService (XPCOM.NS_CATEGORYMANAGER_CID, &nsICategoryManager.IID, &categoryManager);
                 if (rc !is XPCOM.NS_OK) error (rc);
-                if (result[0] is 0) error (XPCOM.NS_NOINTERFACE);
+                if (categoryManager is null) error (XPCOM.NS_NOINTERFACE);
 
-                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;
@@ -2782,42 +2810,42 @@
         }
     }
 
-    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) {
+nsresult CanHandleContent (char* aContentType, PRBool aIsContentPreferred, char** aDesiredContentType, PRBool* retval) {
     return XPCOM.NS_ERROR_NOT_IMPLEMENTED;
 }
 
-int GetLoadCookie (int /*long*/ aLoadCookie) {
+nsresult GetLoadCookie (nsISupports* aLoadCookie) {
     return XPCOM.NS_ERROR_NOT_IMPLEMENTED;
 }
 
-int SetLoadCookie (int /*long*/ aLoadCookie) {
+nsresult SetLoadCookie (nsISupports aLoadCookie) {
     return XPCOM.NS_ERROR_NOT_IMPLEMENTED;
 }
 
-int GetParentContentListener (int /*long*/ aParentContentListener) {
+nsresult GetParentContentListener (nsIURIContentListener* aParentContentListener) {
     return XPCOM.NS_ERROR_NOT_IMPLEMENTED;
 }
     
-int SetParentContentListener (int /*long*/ aParentContentListener) {
+nsresult SetParentContentListener (nsIURIContentListener aParentContentListener) {
     return XPCOM.NS_ERROR_NOT_IMPLEMENTED;
 }
 
 /* nsITooltipListener */
 
-int OnShowTooltip (int aXCoords, int aYCoords, int /*long*/ aTipText) {
+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 = aTipText.fromString16z.toString;
     if (tip !is null && !tip.isDisposed ()) tip.dispose ();
     Display display = browser.getDisplay ();
     Shell parent = browser.getShell ();
@@ -2843,7 +2871,7 @@
     return XPCOM.NS_OK;
 }
 
-int OnHideTooltip () {
+nsresult OnHideTooltip () {
     if (tip !is null && !tip.isDisposed ()) tip.dispose ();
     tip = null;
     return XPCOM.NS_OK;
@@ -2851,26 +2879,27 @@
 
 /* nsIDOMEventListener */
 
-int HandleEvent (int /*long*/ event) {
-    nsIDOMEvent domEvent = new nsIDOMEvent (event);
+nsresult HandleEvent (nsIDOMEvent event) {
+    //nsIDOMEvent domEvent = new nsIDOMEvent (event);
 
-    int /*long*/ type = XPCOM.nsEmbedString_new ();
-    int rc = domEvent.GetType (type);
+    scope auto type = new nsEmbedString;
+    int rc = event.GetType (cast(nsAString*)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);
+    //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);
+        //int /*long*/[] result = new int /*long*/[1];
+        nsIDOMEventTarget target;
+        rc = event.GetCurrentTarget (&target);
         if (rc !is XPCOM.NS_OK) error (rc);
-        if (result[0] is 0) error (XPCOM.NS_NOINTERFACE);
+        if (target is null) error (XPCOM.NS_NOINTERFACE);
 
-        nsIDOMEventTarget target = new nsIDOMEventTarget (result[0]);
+        //nsIDOMEventTarget target = new nsIDOMEventTarget (result[0]);
         unhookDOMListeners (target);
         target.Release ();
         return XPCOM.NS_OK;
@@ -2882,17 +2911,18 @@
     }
 
     if (XPCOM.DOMEVENT_KEYDOWN.equals (typeString)) {
-        int /*long*/[] result = new int /*long*/[1];
-        rc = domEvent.QueryInterface (nsIDOMKeyEvent.NS_IDOMKEYEVENT_IID, result);
+        //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);
-        if (result[0] is 0) error (XPCOM.NS_NOINTERFACE);
-        nsIDOMKeyEvent domKeyEvent = new nsIDOMKeyEvent (result[0]);
-        result[0] = 0;
+        if (domKeyevent is null) error (XPCOM.NS_NOINTERFACE);
+        //nsIDOMKeyEvent domKeyEvent = new nsIDOMKeyEvent (result[0]);
+        //result[0] = 0;
 
-        int[] aKeyCode = new int[1]; /* PRUint32 */
-        rc = domKeyEvent.GetKeyCode (aKeyCode);
+        PRUint32 aKeyCode; /* PRUint32 */
+        rc = domKeyEvent.GetKeyCode (&aKeyCode);
         if (rc !is XPCOM.NS_OK) error (rc);
-        int keyCode = translateKey (aKeyCode[0]);
+        int keyCode = super.translateKey (aKeyCode);
 
         /*
         * if keyCode is lastKeyCode then either a repeating key like Shift
@@ -2910,25 +2940,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);
+                    PRBool aAltKey, aCtrlKey, aShiftKey, aMetaKey; /* PRBool */
+                    rc = domKeyEvent.GetAltKey (&aAltKey);
                     if (rc !is XPCOM.NS_OK) error (rc);
-                    rc = domKeyEvent.GetCtrlKey (aCtrlKey);
+                    rc = domKeyEvent.GetCtrlKey (&aCtrlKey);
                     if (rc !is XPCOM.NS_OK) error (rc);
-                    rc = domKeyEvent.GetShiftKey (aShiftKey);
+                    rc = domKeyEvent.GetShiftKey (&aShiftKey);
                     if (rc !is XPCOM.NS_OK) error (rc);
-                    rc = domKeyEvent.GetMetaKey (aMetaKey);
+                    rc = domKeyEvent.GetMetaKey (&aMetaKey);
                     if (rc !is XPCOM.NS_OK) error (rc);
 
                     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) {
-                        domEvent.PreventDefault ();
+                        event.PreventDefault ();
                     }
                     break;
                 }
@@ -2939,28 +2969,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);
+                    PRBool aMetaKey; /* 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 (aMetaKey !is 0) {
+                        PRBool aCtrlKey; /* 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 (aCtrlKey is 0) {
+                            PRBool aAltKey, aShiftKey; /* PRBool */
+                            rc = domKeyEvent.GetAltKey (&aAltKey);
                             if (rc !is XPCOM.NS_OK) error (rc);
-                            rc = domKeyEvent.GetShiftKey (aShiftKey);
+                            rc = domKeyEvent.GetShiftKey (&aShiftKey);
                             if (rc !is XPCOM.NS_OK) error (rc);
 
                             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) {
-                                domEvent.PreventDefault ();
+                                event.PreventDefault ();
                             }
                         }
                     }
@@ -2990,28 +3020,29 @@
             case DWT.SCROLL_LOCK: return XPCOM.NS_OK;
         }
 
-        int /*long*/[] result = new int /*long*/[1];
-        rc = domEvent.QueryInterface (nsIDOMKeyEvent.NS_IDOMKEYEVENT_IID, result);
+        //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);
-        if (result[0] is 0) error (XPCOM.NS_NOINTERFACE);
-        nsIDOMKeyEvent domKeyEvent = new nsIDOMKeyEvent (result[0]);
-        result[0] = 0;
+        if (domKeyEvent is null) error (XPCOM.NS_NOINTERFACE);
+        //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);
+        PRBool aAltKey, aCtrlKey, aShiftKey, aMetaKey; /* PRBool */
+        rc = domKeyEvent.GetAltKey (&aAltKey);
         if (rc !is XPCOM.NS_OK) error (rc);
-        rc = domKeyEvent.GetCtrlKey (aCtrlKey);
+        rc = domKeyEvent.GetCtrlKey (&aCtrlKey);
         if (rc !is XPCOM.NS_OK) error (rc);
-        rc = domKeyEvent.GetShiftKey (aShiftKey);
+        rc = domKeyEvent.GetShiftKey (&aShiftKey);
         if (rc !is XPCOM.NS_OK) error (rc);
-        rc = domKeyEvent.GetMetaKey (aMetaKey);
+        rc = domKeyEvent.GetMetaKey (&aMetaKey);
         if (rc !is XPCOM.NS_OK) error (rc);
         domKeyEvent.Release ();
 
-        int[] aCharCode = new int[1]; /* PRUint32 */
-        rc = domKeyEvent.GetCharCode (aCharCode);
+        PRUint32 aCharCode; /* PRUint32 */
+        rc = domKeyEvent.GetCharCode (&aCharCode);
         if (rc !is XPCOM.NS_OK) error (rc);
-        lastCharCode = aCharCode[0];
+        lastCharCode = aCharCode;
         if (lastCharCode is 0) {
             switch (lastKeyCode) {
                 case DWT.TAB: lastCharCode = DWT.TAB; break;
@@ -3021,7 +3052,7 @@
                 case DWT.DEL: lastCharCode = DWT.DEL; 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;
         }
@@ -3030,27 +3061,28 @@
         keyEvent.widget = browser;
         keyEvent.type = DWT.KeyDown;
         keyEvent.keyCode = lastKeyCode;
-        keyEvent.character = (char)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.character = cast(wchar)lastCharCode;
+        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) {
-            domEvent.PreventDefault ();
+            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);
+        //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);
-        if (result[0] is 0) error (XPCOM.NS_NOINTERFACE);
-        nsIDOMKeyEvent domKeyEvent = new nsIDOMKeyEvent (result[0]);
-        result[0] = 0;
+        if (domKeyEvent is null) error (XPCOM.NS_NOINTERFACE);
+        //nsIDOMKeyEvent domKeyEvent = new nsIDOMKeyEvent (result[0]);
+        //result[0] = 0;
 
-        int[] aKeyCode = new int[1]; /* PRUint32 */
-        rc = domKeyEvent.GetKeyCode (aKeyCode);
+        PRUint32 aKeyCode; /* PRUint32 */
+        rc = domKeyEvent.GetKeyCode (&aKeyCode);
         if (rc !is XPCOM.NS_OK) error (rc);
-        int keyCode = translateKey (aKeyCode[0]);
+        int keyCode = super.translateKey (aKeyCode);
         if (keyCode is 0) {
             /* indicates a key for which key events are not sent */
             domKeyEvent.Release ();
@@ -3062,14 +3094,14 @@
             lastCharCode = 0;
         }
 
-        int[] aAltKey = new int[1], aCtrlKey = new int[1], aShiftKey = new int[1], aMetaKey = new int[1]; /* PRBool */
-        rc = domKeyEvent.GetAltKey (aAltKey);
+        PRBool aAltKey, aCtrlKey, aShiftKey, aMetaKey; /* PRBool */
+        rc = domKeyEvent.GetAltKey (&aAltKey);
         if (rc !is XPCOM.NS_OK) error (rc);
-        rc = domKeyEvent.GetCtrlKey (aCtrlKey);
+        rc = domKeyEvent.GetCtrlKey (&aCtrlKey);
         if (rc !is XPCOM.NS_OK) error (rc);
-        rc = domKeyEvent.GetShiftKey (aShiftKey);
+        rc = domKeyEvent.GetShiftKey (&aShiftKey);
         if (rc !is XPCOM.NS_OK) error (rc);
-        rc = domKeyEvent.GetMetaKey (aMetaKey);
+        rc = domKeyEvent.GetMetaKey (&aMetaKey);
         if (rc !is XPCOM.NS_OK) error (rc);
         domKeyEvent.Release ();
 
@@ -3077,8 +3109,8 @@
         keyEvent.widget = browser;
         keyEvent.type = DWT.KeyUp;
         keyEvent.keyCode = lastKeyCode;
-        keyEvent.character = (char)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.character = cast(wchar)lastCharCode;
+        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:
@@ -3089,7 +3121,7 @@
         }
         browser.notifyListeners (keyEvent.type, keyEvent);
         if (!keyEvent.doit) {
-            domEvent.PreventDefault ();
+            event.PreventDefault ();
         }
         lastKeyCode = lastCharCode = 0;
         return XPCOM.NS_OK;
@@ -3097,12 +3129,13 @@
 
     /* mouse event */
 
-    int /*long*/[] result = new int /*long*/[1];
-    rc = domEvent.QueryInterface (nsIDOMMouseEvent.NS_IDOMMOUSEEVENT_IID, result);
+    //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);
-    if (result[0] is 0) error (XPCOM.NS_NOINTERFACE);
-    nsIDOMMouseEvent domMouseEvent = new nsIDOMMouseEvent (result[0]);
-    result[0] = 0;
+    if (domMouseEvent is null) error (XPCOM.NS_NOINTERFACE);
+    //nsIDOMMouseEvent domMouseEvent = new nsIDOMMouseEvent (result[0]);
+    //result[0] = 0;
 
     /*
      * MouseOver and MouseOut events are fired any time the mouse enters or exits
@@ -3112,45 +3145,46 @@
      * is within the Browser.
      */
     if (XPCOM.DOMEVENT_MOUSEOVER.equals (typeString) || XPCOM.DOMEVENT_MOUSEOUT.equals (typeString)) {
-        rc = domMouseEvent.GetRelatedTarget (result);
+        nsIDOMEventTarget eventTarget;
+        rc = domMouseEvent.GetRelatedTarget (&eventTarget);
         if (rc !is XPCOM.NS_OK) error (rc);
-        if (result[0] !is 0) {
+        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);
+    PRInt32 aClientX, aClientY, aDetail; /* PRInt32 */
+    rc = domMouseEvent.GetClientX (&aClientX);
     if (rc !is XPCOM.NS_OK) error (rc);
-    rc = domMouseEvent.GetClientY (aClientY);
+    rc = domMouseEvent.GetClientY (&aClientY);
     if (rc !is XPCOM.NS_OK) error (rc);
-    rc = domMouseEvent.GetDetail (aDetail);
+    rc = domMouseEvent.GetDetail (&aDetail);
     if (rc !is XPCOM.NS_OK) error (rc);
-    short[] aButton = new short[1]; /* PRUint16 */
-    rc = domMouseEvent.GetButton (aButton);
+    PRUint16 aButton; /* 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);
+    PRBool aAltKey, aCtrlKey, aShiftKey, aMetaKey; /* PRBool */
+    rc = domMouseEvent.GetAltKey (&aAltKey);
     if (rc !is XPCOM.NS_OK) error (rc);
-    rc = domMouseEvent.GetCtrlKey (aCtrlKey);
+    rc = domMouseEvent.GetCtrlKey (&aCtrlKey);
     if (rc !is XPCOM.NS_OK) error (rc);
-    rc = domMouseEvent.GetShiftKey (aShiftKey);
+    rc = domMouseEvent.GetShiftKey (&aShiftKey);
     if (rc !is XPCOM.NS_OK) error (rc);
-    rc = domMouseEvent.GetMetaKey (aMetaKey);
+    rc = domMouseEvent.GetMetaKey (&aMetaKey);
     if (rc !is XPCOM.NS_OK) error (rc);
     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)) {
         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
@@ -3159,8 +3193,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;
@@ -3169,14 +3203,14 @@
         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;
@@ -3187,14 +3221,14 @@
     }
 
     browser.notifyListeners (mouseEvent.type, mouseEvent);
-    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;
--- a/dwt/dwthelper/utils.d	Thu Oct 23 21:32:32 2008 -0700
+++ b/dwt/dwthelper/utils.d	Sat Oct 25 21:01:54 2008 -0700
@@ -1224,6 +1224,17 @@
     return res;
 }
 
+T[] arrayIndexRemove(T)(T[] arr, uint index) {
+    if (n is 0)
+        return arr[1..$];
+    if (n > arr.length)
+        return arr;
+    if (n is arr.length-1)
+        return arr[0..n-1];
+    // else
+    return arr[0..n] ~ arr[n+1..$];
+}
+ 
 // int seqIndexOf( tango.util.collection.model.Seq.Seq!(Object) seq, Object v ){
 //     int res = -1;
 //     int idx = 0;