Attached is a patch that adds support for a new "-server" command-line 
switch for Win32.  It will suppress opening the initial window (but not 
profile manager so it really only works properly if you have a single 
profile and don't normally see the profile manager dialog at startup).

Launching Mozilla again will simply open a new window.  There's a patch 
to the DDE server code to support that better; thanks to Brian 
([EMAIL PROTECTED]) who provided that code for bug 50424.

Opening the first navigator window takes 6-7 sec with mozilla already 
running in "server mode."  That's versus 10-11 seconds starting from 
scratch.

Subsequent windows take 2-3 seconds (once mozilla is running with a 
Navigator window open; "server mode" or not).

We need to figure out what other services/libraries to load initially 
and figure out how to do that.

This code might support the Mac without too much work.  Linux is another 
story because it doesn't have any ipc mechanism for a second instance of 
the app to talk to the already running "server."

Bill Law

Chris McAfee wrote:

> Sky wrote:
> 
>> Saw this in a forum somewhere
>> 
>> "I don't know all that much about coding myself, but I think that it 
>> would
>> be interesting if someone were to create an optional preloader for 
>> Mozilla
>> that ran when you started up Windows that loaded up
>> some of the, uh, core files and stuff so that there wouldn't be so 
>> much of a
>> wait every time you load Moz for the first time (not that it's the WORST
>> wait in the world, I'm just saying there is room for
>> improvement still, right?)
>> "
> 
> 
> Yes, we have been thinking about this.  CC-ing .performance.
> 
> -Chris

Index: appshell/public/nsINativeAppSupport.h
===================================================================
RCS file: /cvsroot/mozilla/xpfe/appshell/public/nsINativeAppSupport.h,v
retrieving revision 1.1
diff -u -r1.1 nsINativeAppSupport.h
--- nsINativeAppSupport.h       2000/05/03 23:14:59     1.1
+++ nsINativeAppSupport.h       2001/02/27 04:35:31
@@ -137,6 +137,9 @@
     NS_IMETHOD ShowSplashScreen() = 0;
     NS_IMETHOD HideSplashScreen() = 0;
 
+    // Server mode.
+    NS_IMETHOD GetIsServerMode( PRBool *pResult ) = 0;
+    NS_IMETHOD SetIsServerMode( PRBool  pServerMode ) = 0;
 }; // class nsINativeAppSupport
 
 #endif // nsINativeAppSupport_h__
Index: bootstrap/nsAppRunner.cpp
===================================================================
RCS file: /cvsroot/mozilla/xpfe/bootstrap/nsAppRunner.cpp,v
retrieving revision 1.265
diff -u -r1.265 nsAppRunner.cpp
--- nsAppRunner.cpp     2001/02/26 00:31:44     1.265
+++ nsAppRunner.cpp     2001/02/27 04:35:31
@@ -63,6 +63,7 @@
 #include "nsBuildID.h"
 #include "nsWindowCreator.h"
 #include "nsIWindowWatcher.h"
+#include "nsIBookmarksService.h"
 
 // Interfaces Needed
 #include "nsIXULWindow.h"
@@ -681,6 +682,24 @@
   if (NS_FAILED(rv))
     return rv;
 
+  // If native app in server mode, we don't need any windows.
+  nsCOMPtr<nsIAppShellService> appShellService(do_GetService(kAppShellServiceCID));
+  if (appShellService)
+  {
+      nsCOMPtr<nsINativeAppSupport> nativeApp;
+      appShellService->GetNativeAppSupport(getter_AddRefs(nativeApp));
+      if (nativeApp)
+      {
+          PRBool serverMode = PR_FALSE;
+          if (NS_SUCCEEDED(nativeApp->GetIsServerMode(&serverMode))&&serverMode)
+          {
+              // Force bookmarks to load in this sceanario.
+              nsCOMPtr<nsIBookmarksService> 
+bookmarks(do_GetService(NS_BOOKMARKS_SERVICE_CONTRACTID));
+              return NS_OK;
+          }
+      }
+  }
+
   nsCOMPtr<nsISimpleEnumerator> windowEnumerator;
 
   if (NS_SUCCEEDED(windowMediator->GetEnumerator(nsnull, 
getter_AddRefs(windowEnumerator))))
Index: bootstrap/nsNativeAppSupportBase.h
===================================================================
RCS file: /cvsroot/mozilla/xpfe/bootstrap/nsNativeAppSupportBase.h,v
retrieving revision 1.1
diff -u -r1.1 nsNativeAppSupportBase.h
--- nsNativeAppSupportBase.h    2000/05/10 22:05:43     1.1
+++ nsNativeAppSupportBase.h    2001/02/27 04:35:31
@@ -45,6 +45,17 @@
     NS_IMETHOD ShowSplashScreen();
     NS_IMETHOD HideSplashScreen();
 
+    NS_IMETHOD GetIsServerMode( PRBool *pResult ) {
+        NS_ENSURE_ARG( pResult );
+        *pResult = mIsServerMode;
+        return NS_OK;
+    }
+
+    NS_IMETHOD SetIsServerMode( PRBool serverMode ) {
+        mIsServerMode = serverMode;
+        return NS_OK;
+    }
+
     NS_IMETHOD CreateSplashScreen( nsISplashScreen **splash );
 
     // nsISupports methods
@@ -54,5 +65,6 @@
 
     nsrefcnt mRefCnt;
     nsISplashScreen *mSplash;
+    PRBool mIsServerMode;
 }; // class nsSplashScreenWin
 
Index: bootstrap/nsNativeAppSupportWin.cpp
===================================================================
RCS file: /cvsroot/mozilla/xpfe/bootstrap/nsNativeAppSupportWin.cpp,v
retrieving revision 1.16
diff -u -r1.16 nsNativeAppSupportWin.cpp
--- nsNativeAppSupportWin.cpp   2000/10/28 22:17:32     1.16
+++ nsNativeAppSupportWin.cpp   2001/02/27 04:35:31
@@ -228,7 +228,7 @@
     // Utility function to handle a Win32-specific command line
     // option: "-console", which dynamically creates a Windows
     // console.
-    static void CheckConsole();
+    void CheckConsole();
 
 private:
     static HDDEDATA CALLBACK HandleDDENotification( UINT     uType,
@@ -470,6 +470,14 @@
             }
             // Don't bother doing this more than once.
             break;
+        } else if ( strcmp( "-server", __argv[i] ) == 0
+                    ||
+                    strcmp( "/server", __argv[i] ) == 0 ) {
+            // Start in server mode (and suppress splash screen).
+            SetIsServerMode( PR_TRUE );
+            __argv[i] = "-nosplash"; // Hack, but it works!
+            // Ignore other args.
+            break;
         }
     }
     return;
@@ -479,8 +487,9 @@
 // Create and return an instance of class nsNativeAppSupportWin.
 nsresult
 NS_CreateNativeAppSupport( nsINativeAppSupport **aResult ) {
+    nsNativeAppSupportWin *native = 0;
     if ( aResult ) {
-        *aResult = new nsNativeAppSupportWin;
+        *aResult = native = new nsNativeAppSupportWin;
         if ( *aResult ) {
             NS_ADDREF( *aResult );
         } else {
@@ -491,7 +500,7 @@
     }
 
     // Check for dynamic console creation request.
-    nsNativeAppSupportWin::CheckConsole();
+    native->CheckConsole();
     return NS_OK;
 }
 
@@ -847,6 +856,8 @@
             #if MOZ_DEBUG_DDE
             printf( "Unknown request [%s]\n", (char*) request );
             #endif
+            // If all else fails, open new browser window.
+            (void)OpenWindow( "chrome://navigator/content/", 0 );
         }
     
     }
@@ -1020,20 +1031,33 @@
                                                            &jsContext );
         if ( NS_SUCCEEDED( rv ) ) {
             void *stackPtr;
-            jsval *argv = JS_PushArguments( jsContext,
-                                            &stackPtr,
-                                            "ssss",
-                                            urlstr,
-                                            "_blank",
-                                            "chrome,dialog=no,all",
-                                            args );
+            jsval *argv;
+            if (args) {
+                argv = JS_PushArguments( jsContext,
+                                         &stackPtr,
+                                         "ssss",
+                                         urlstr,
+                                         "_blank",
+                                         "chrome,dialog=no,all",
+                                         args );
+            } else {
+                argv = JS_PushArguments( jsContext,
+                                         &stackPtr,
+                                         "sss",
+                                         urlstr,
+                                         "_blank",
+                                         "chrome,dialog=no,all" );
+            }
             if( argv ) {
                 nsCOMPtr<nsIDOMWindowInternal> newWindow;
                 rv = hiddenWindow->OpenDialog( jsContext,
                                                argv,
-                                               4,
+                                               args ? 4 : 3,
                                                getter_AddRefs( newWindow ) );
                 JS_PopArguments( jsContext, stackPtr );
+                #ifdef MOZ_DEBUG_DDE
+                printf( "OpenDialog %s for [%s] returned rv=0x%08X\n", urlstr, args ? 
+args : "", (int)rv );
+                #endif
             }
         } else {
             #ifdef MOZ_DEBUG_DDE

Reply via email to