Mercurial > projects > dwt-mac
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;