Bug 353089 - Fix / remove ddeexec hack. r=bsmedberg
This commit is contained in:
@@ -145,11 +145,12 @@ OpenKeyForWriting(const char* aKeyName, HKEY* aKey, PRBool aForAllUsers, PRBool
|
|||||||
// are mapped like so:
|
// are mapped like so:
|
||||||
//
|
//
|
||||||
// HKCU\SOFTWARE\Classes\<protocol>\
|
// HKCU\SOFTWARE\Classes\<protocol>\
|
||||||
// DefaultIcon (default) REG_SZ <appname>,1
|
// DefaultIcon (default) REG_SZ <appname>,0
|
||||||
// shell\open\command (default) REG_SZ <appname> -url "%1"
|
// shell\open\command (default) REG_SZ <appname> -url "%1"
|
||||||
// shell\open\ddeexec (default) REG_SZ "%1",,-1,0,,,,
|
// shell\open\ddeexec (default) REG_SZ "%1",,0,0,,,,
|
||||||
// shell\open\ddeexec NoActivateHandler REG_SZ
|
// shell\open\ddeexec NoActivateHandler REG_SZ
|
||||||
// \application (default) REG_SZ Firefox
|
// \application (default) REG_SZ Firefox
|
||||||
|
// \ifexec (default) REG_SZ ,,0,0,,,,
|
||||||
// \topic (default) REG_SZ WWW_OpenURL
|
// \topic (default) REG_SZ WWW_OpenURL
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
@@ -193,10 +194,12 @@ typedef struct {
|
|||||||
#define DDE "\\shell\\open\\ddeexec\\"
|
#define DDE "\\shell\\open\\ddeexec\\"
|
||||||
#define DDE_NAME "Firefox" // This must be kept in sync with ID_DDE_APPLICATION_NAME as defined in splash.rc
|
#define DDE_NAME "Firefox" // This must be kept in sync with ID_DDE_APPLICATION_NAME as defined in splash.rc
|
||||||
#define DDE_COMMAND "\"%1\",,0,0,,,,"
|
#define DDE_COMMAND "\"%1\",,0,0,,,,"
|
||||||
|
#define DDE_IFEXEC ",,0,0,,,,"
|
||||||
#define EXE "firefox.exe"
|
#define EXE "firefox.exe"
|
||||||
|
|
||||||
#define CLS_HTML "FirefoxHTML"
|
#define CLS_HTML "FirefoxHTML"
|
||||||
#define VAL_ICON "%APPPATH%,1"
|
#define VAL_URL_ICON "%APPPATH%,0"
|
||||||
|
#define VAL_FILE_ICON "%APPPATH%,1"
|
||||||
#define VAL_OPEN "%APPPATH% -url \"%1\""
|
#define VAL_OPEN "%APPPATH% -url \"%1\""
|
||||||
|
|
||||||
#define MAKE_KEY_NAME1(PREFIX, MID) \
|
#define MAKE_KEY_NAME1(PREFIX, MID) \
|
||||||
@@ -223,21 +226,43 @@ static SETTING gSettings[] = {
|
|||||||
{ MAKE_KEY_NAME1(CLS, ".xhtml"), "", CLS_HTML, NO_SUBSTITUTION | NON_ESSENTIAL },
|
{ MAKE_KEY_NAME1(CLS, ".xhtml"), "", CLS_HTML, NO_SUBSTITUTION | NON_ESSENTIAL },
|
||||||
|
|
||||||
// File Extension Class
|
// File Extension Class
|
||||||
{ MAKE_KEY_NAME2(CLS, CLS_HTML, DI), "", VAL_ICON, PATH_SUBSTITUTION | NON_ESSENTIAL },
|
{ MAKE_KEY_NAME2(CLS, CLS_HTML, DI), "", VAL_FILE_ICON, PATH_SUBSTITUTION | NON_ESSENTIAL },
|
||||||
{ MAKE_KEY_NAME2(CLS, CLS_HTML, SOP), "", VAL_OPEN, PATH_SUBSTITUTION | NON_ESSENTIAL },
|
{ MAKE_KEY_NAME2(CLS, CLS_HTML, SOP), "", VAL_OPEN, PATH_SUBSTITUTION | NON_ESSENTIAL },
|
||||||
|
|
||||||
// Protocol Handlers
|
// Protocol Handlers
|
||||||
{ MAKE_KEY_NAME2(CLS, "HTTP", DI), "", VAL_ICON, PATH_SUBSTITUTION },
|
{ MAKE_KEY_NAME2(CLS, "HTTP", DI), "", VAL_URL_ICON, PATH_SUBSTITUTION },
|
||||||
{ MAKE_KEY_NAME2(CLS, "HTTP", SOP), "", VAL_OPEN, PATH_SUBSTITUTION },
|
{ MAKE_KEY_NAME2(CLS, "HTTP", SOP), "", VAL_OPEN, PATH_SUBSTITUTION },
|
||||||
{ MAKE_KEY_NAME2(CLS, "HTTPS", DI), "", VAL_ICON, PATH_SUBSTITUTION },
|
{ MAKE_KEY_NAME2(CLS, "HTTPS", DI), "", VAL_URL_ICON, PATH_SUBSTITUTION },
|
||||||
{ MAKE_KEY_NAME2(CLS, "HTTPS", SOP), "", VAL_OPEN, PATH_SUBSTITUTION },
|
{ MAKE_KEY_NAME2(CLS, "HTTPS", SOP), "", VAL_OPEN, PATH_SUBSTITUTION },
|
||||||
{ MAKE_KEY_NAME2(CLS, "FTP", DI), "", VAL_ICON, PATH_SUBSTITUTION | NON_ESSENTIAL },
|
{ MAKE_KEY_NAME2(CLS, "FTP", DI), "", VAL_URL_ICON, PATH_SUBSTITUTION | NON_ESSENTIAL },
|
||||||
{ MAKE_KEY_NAME2(CLS, "FTP", SOP), "", VAL_OPEN, PATH_SUBSTITUTION | NON_ESSENTIAL },
|
{ MAKE_KEY_NAME2(CLS, "FTP", SOP), "", VAL_OPEN, PATH_SUBSTITUTION | NON_ESSENTIAL },
|
||||||
{ MAKE_KEY_NAME2(CLS, "GOPHER", DI), "", VAL_ICON, PATH_SUBSTITUTION | NON_ESSENTIAL },
|
{ MAKE_KEY_NAME2(CLS, "GOPHER", DI), "", VAL_URL_ICON, PATH_SUBSTITUTION | NON_ESSENTIAL },
|
||||||
{ MAKE_KEY_NAME2(CLS, "GOPHER", SOP), "", VAL_OPEN, PATH_SUBSTITUTION | NON_ESSENTIAL },
|
{ MAKE_KEY_NAME2(CLS, "GOPHER", SOP), "", VAL_OPEN, PATH_SUBSTITUTION | NON_ESSENTIAL },
|
||||||
{ MAKE_KEY_NAME2(CLS, "CHROME", DI), "", VAL_ICON, PATH_SUBSTITUTION | NON_ESSENTIAL },
|
{ MAKE_KEY_NAME2(CLS, "CHROME", DI), "", VAL_URL_ICON, PATH_SUBSTITUTION | NON_ESSENTIAL },
|
||||||
{ MAKE_KEY_NAME2(CLS, "CHROME", SOP), "", VAL_OPEN, PATH_SUBSTITUTION | NON_ESSENTIAL },
|
{ MAKE_KEY_NAME2(CLS, "CHROME", SOP), "", VAL_OPEN, PATH_SUBSTITUTION | NON_ESSENTIAL },
|
||||||
|
|
||||||
|
// DDE settings
|
||||||
|
{ MAKE_KEY_NAME2(CLS, "HTTP", DDE), "", DDE_COMMAND, NO_SUBSTITUTION },
|
||||||
|
{ MAKE_KEY_NAME3(CLS, "HTTP", DDE, "Application"), "", DDE_NAME, NO_SUBSTITUTION },
|
||||||
|
{ MAKE_KEY_NAME3(CLS, "HTTP", DDE, "Topic"), "", "WWW_OpenURL", NO_SUBSTITUTION },
|
||||||
|
{ MAKE_KEY_NAME3(CLS, "HTTP", DDE, "ifexec"), "", DDE_IFEXEC, NO_SUBSTITUTION },
|
||||||
|
{ MAKE_KEY_NAME2(CLS, "HTTPS", DDE), "", DDE_COMMAND, NO_SUBSTITUTION },
|
||||||
|
{ MAKE_KEY_NAME3(CLS, "HTTPS", DDE, "Application"), "", DDE_NAME, NO_SUBSTITUTION },
|
||||||
|
{ MAKE_KEY_NAME3(CLS, "HTTPS", DDE, "Topic"), "", "WWW_OpenURL", NO_SUBSTITUTION },
|
||||||
|
{ MAKE_KEY_NAME3(CLS, "HTTPS", DDE, "ifexec"), "", DDE_IFEXEC, NO_SUBSTITUTION },
|
||||||
|
{ MAKE_KEY_NAME2(CLS, "FTP", DDE), "", DDE_COMMAND, NO_SUBSTITUTION },
|
||||||
|
{ MAKE_KEY_NAME3(CLS, "FTP", DDE, "Application"), "", DDE_NAME, NO_SUBSTITUTION },
|
||||||
|
{ MAKE_KEY_NAME3(CLS, "FTP", DDE, "Topic"), "", "WWW_OpenURL", NO_SUBSTITUTION },
|
||||||
|
{ MAKE_KEY_NAME3(CLS, "FTP", DDE, "ifexec"), "", DDE_IFEXEC, NO_SUBSTITUTION },
|
||||||
|
{ MAKE_KEY_NAME2(CLS, "GOPHER", DDE), "", DDE_COMMAND, NO_SUBSTITUTION | NON_ESSENTIAL },
|
||||||
|
{ MAKE_KEY_NAME3(CLS, "GOPHER", DDE, "Application"), "", DDE_NAME, NO_SUBSTITUTION | NON_ESSENTIAL },
|
||||||
|
{ MAKE_KEY_NAME3(CLS, "GOPHER", DDE, "Topic"), "", "WWW_OpenURL", NO_SUBSTITUTION | NON_ESSENTIAL },
|
||||||
|
{ MAKE_KEY_NAME3(CLS, "GOPHER", DDE, "ifexec"), "", DDE_IFEXEC, NO_SUBSTITUTION },
|
||||||
|
{ MAKE_KEY_NAME2(CLS, "CHROME", DDE), "", DDE_COMMAND, NO_SUBSTITUTION | NON_ESSENTIAL },
|
||||||
|
{ MAKE_KEY_NAME3(CLS, "CHROME", DDE, "Application"), "", DDE_NAME, NO_SUBSTITUTION | NON_ESSENTIAL },
|
||||||
|
{ MAKE_KEY_NAME3(CLS, "CHROME", DDE, "Topic"), "", "WWW_OpenURL", NO_SUBSTITUTION | NON_ESSENTIAL },
|
||||||
|
{ MAKE_KEY_NAME3(CLS, "CHROME", DDE, "ifexec"), "", DDE_IFEXEC, NO_SUBSTITUTION },
|
||||||
|
|
||||||
// Windows XP Start Menu
|
// Windows XP Start Menu
|
||||||
{ MAKE_KEY_NAME2(SMI, "%APPEXE%", DI),
|
{ MAKE_KEY_NAME2(SMI, "%APPEXE%", DI),
|
||||||
"",
|
"",
|
||||||
@@ -261,29 +286,6 @@ static SETTING gSettings[] = {
|
|||||||
// firefox.exe\shell\safemode (default) REG_SZ Firefox &Safe Mode
|
// firefox.exe\shell\safemode (default) REG_SZ Firefox &Safe Mode
|
||||||
};
|
};
|
||||||
|
|
||||||
static SETTING gDDESettings[] = {
|
|
||||||
{ MAKE_KEY_NAME2(CLS, "HTTP", DDE), "", DDE_COMMAND, NO_SUBSTITUTION },
|
|
||||||
{ MAKE_KEY_NAME2(CLS, "HTTP", DDE), "NoActivateHandler", "", NO_SUBSTITUTION },
|
|
||||||
{ MAKE_KEY_NAME3(CLS, "HTTP", DDE, "Application"), "", DDE_NAME, NO_SUBSTITUTION },
|
|
||||||
{ MAKE_KEY_NAME3(CLS, "HTTP", DDE, "Topic"), "", "WWW_OpenURL", NO_SUBSTITUTION },
|
|
||||||
{ MAKE_KEY_NAME2(CLS, "HTTPS", DDE), "", DDE_COMMAND, NO_SUBSTITUTION },
|
|
||||||
{ MAKE_KEY_NAME2(CLS, "HTTPS", DDE), "NoActivateHandler", "", NO_SUBSTITUTION },
|
|
||||||
{ MAKE_KEY_NAME3(CLS, "HTTPS", DDE, "Application"), "", DDE_NAME, NO_SUBSTITUTION },
|
|
||||||
{ MAKE_KEY_NAME3(CLS, "HTTPS", DDE, "Topic"), "", "WWW_OpenURL", NO_SUBSTITUTION },
|
|
||||||
{ MAKE_KEY_NAME2(CLS, "FTP", DDE), "", DDE_COMMAND, NO_SUBSTITUTION },
|
|
||||||
{ MAKE_KEY_NAME2(CLS, "FTP", DDE), "NoActivateHandler", "", NO_SUBSTITUTION },
|
|
||||||
{ MAKE_KEY_NAME3(CLS, "FTP", DDE, "Application"), "", DDE_NAME, NO_SUBSTITUTION },
|
|
||||||
{ MAKE_KEY_NAME3(CLS, "FTP", DDE, "Topic"), "", "WWW_OpenURL", NO_SUBSTITUTION },
|
|
||||||
{ MAKE_KEY_NAME2(CLS, "GOPHER", DDE), "", DDE_COMMAND, NO_SUBSTITUTION },
|
|
||||||
{ MAKE_KEY_NAME2(CLS, "GOPHER", DDE), "NoActivateHandler", "", NO_SUBSTITUTION },
|
|
||||||
{ MAKE_KEY_NAME3(CLS, "GOPHER", DDE, "Application"), "", DDE_NAME, NO_SUBSTITUTION },
|
|
||||||
{ MAKE_KEY_NAME3(CLS, "GOPHER", DDE, "Topic"), "", "WWW_OpenURL", NO_SUBSTITUTION },
|
|
||||||
{ MAKE_KEY_NAME2(CLS, "CHROME", DDE), "", DDE_COMMAND, NO_SUBSTITUTION },
|
|
||||||
{ MAKE_KEY_NAME2(CLS, "CHROME", DDE), "NoActivateHandler", "", NO_SUBSTITUTION },
|
|
||||||
{ MAKE_KEY_NAME3(CLS, "CHROME", DDE, "Application"), "", DDE_NAME, NO_SUBSTITUTION },
|
|
||||||
{ MAKE_KEY_NAME3(CLS, "CHROME", DDE, "Topic"), "", "WWW_OpenURL", NO_SUBSTITUTION }
|
|
||||||
};
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsWindowsShellService::Register(nsIComponentManager *aCompMgr, nsIFile *aPath, const char *registryLocation,
|
nsWindowsShellService::Register(nsIComponentManager *aCompMgr, nsIFile *aPath, const char *registryLocation,
|
||||||
const char *componentType, const nsModuleComponentInfo *info)
|
const char *componentType, const nsModuleComponentInfo *info)
|
||||||
@@ -302,31 +304,6 @@ nsWindowsShellService::nsWindowsShellService()
|
|||||||
obsServ->AddObserver(this, "quit-application", PR_FALSE);
|
obsServ->AddObserver(this, "quit-application", PR_FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
nsresult
|
|
||||||
nsWindowsShellService::RegisterDDESupport()
|
|
||||||
{
|
|
||||||
SETTING* end = gDDESettings + sizeof(gDDESettings)/sizeof(SETTING);
|
|
||||||
for (SETTING* settings = gDDESettings; settings < end; ++settings) {
|
|
||||||
nsCAutoString key(settings->keyName);
|
|
||||||
nsCAutoString data(settings->valueData);
|
|
||||||
|
|
||||||
SetRegKey(key.get(), settings->valueName, data.get(),
|
|
||||||
PR_FALSE, 0, PR_TRUE, PR_TRUE);
|
|
||||||
}
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsresult
|
|
||||||
nsWindowsShellService::UnregisterDDESupport()
|
|
||||||
{
|
|
||||||
DeleteRegKey(HKEY_CLASSES_ROOT, "HTTP\\shell\\open\\ddeexec");
|
|
||||||
DeleteRegKey(HKEY_CLASSES_ROOT, "HTTPS\\shell\\open\\ddeexec");
|
|
||||||
DeleteRegKey(HKEY_CLASSES_ROOT, "FTP\\shell\\open\\ddeexec");
|
|
||||||
DeleteRegKey(HKEY_CLASSES_ROOT, "CHROME\\shell\\open\\ddeexec");
|
|
||||||
DeleteRegKey(HKEY_CLASSES_ROOT, "GOPHER\\shell\\open\\ddeexec");
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsWindowsShellService::IsDefaultBrowser(PRBool aStartupCheck, PRBool* aIsDefaultBrowser)
|
nsWindowsShellService::IsDefaultBrowser(PRBool aStartupCheck, PRBool* aIsDefaultBrowser)
|
||||||
{
|
{
|
||||||
@@ -501,9 +478,6 @@ nsWindowsShellService::SetDefaultBrowser(PRBool aClaimAllTypes, PRBool aForAllUs
|
|||||||
// Close the key we opened.
|
// Close the key we opened.
|
||||||
::RegCloseKey(backupKey);
|
::RegCloseKey(backupKey);
|
||||||
|
|
||||||
// We need to reregister DDE support
|
|
||||||
RegisterDDESupport();
|
|
||||||
|
|
||||||
// Refresh the Shell
|
// Refresh the Shell
|
||||||
::SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, NULL,
|
::SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, NULL,
|
||||||
(LPARAM)"SOFTWARE\\Clients\\StartMenuInternet",
|
(LPARAM)"SOFTWARE\\Clients\\StartMenuInternet",
|
||||||
@@ -556,43 +530,6 @@ nsWindowsShellService::RestoreFileSettings(PRBool aForAllUsers)
|
|||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Utility function to delete a registry subkey.
|
|
||||||
DWORD
|
|
||||||
nsWindowsShellService::DeleteRegKey(HKEY baseKey, const char *keyName)
|
|
||||||
{
|
|
||||||
// Make sure input subkey isn't null.
|
|
||||||
if (!keyName || !::strlen(keyName))
|
|
||||||
return ERROR_BADKEY;
|
|
||||||
|
|
||||||
DWORD rc;
|
|
||||||
// Open subkey.
|
|
||||||
HKEY key;
|
|
||||||
rc = ::RegOpenKeyEx(baseKey, keyName, 0, KEY_ENUMERATE_SUB_KEYS | DELETE, &key);
|
|
||||||
|
|
||||||
// Continue till we get an error or are done.
|
|
||||||
while (rc == ERROR_SUCCESS) {
|
|
||||||
char subkeyName[_MAX_PATH];
|
|
||||||
DWORD len = sizeof subkeyName;
|
|
||||||
// Get first subkey name. Note that we always get the
|
|
||||||
// first one, then delete it. So we need to get
|
|
||||||
// the first one next time, also.
|
|
||||||
rc = ::RegEnumKeyEx(key, 0, subkeyName, &len, 0, 0, 0, 0);
|
|
||||||
if (rc == ERROR_NO_MORE_ITEMS) {
|
|
||||||
// No more subkeys. Delete the main one.
|
|
||||||
rc = ::RegDeleteKey(baseKey, keyName);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (rc == ERROR_SUCCESS) {
|
|
||||||
// Another subkey, delete it, recursively.
|
|
||||||
rc = DeleteRegKey(key, subkeyName);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Close the key we opened.
|
|
||||||
::RegCloseKey(key);
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
nsWindowsShellService::SetRegKey(const char* aKeyName, const char* aValueName,
|
nsWindowsShellService::SetRegKey(const char* aKeyName, const char* aValueName,
|
||||||
const char* aValue, PRBool aBackup,
|
const char* aValue, PRBool aBackup,
|
||||||
@@ -1062,8 +999,6 @@ nsWindowsShellService::Observe(nsISupports* aObject, const char* aTopic, const P
|
|||||||
IsDefaultBrowser(PR_FALSE, &isDefault);
|
IsDefaultBrowser(PR_FALSE, &isDefault);
|
||||||
if (!isDefault)
|
if (!isDefault)
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
|
|
||||||
return RegisterDDESupport();
|
|
||||||
}
|
}
|
||||||
else if (!nsCRT::strcmp("quit-application", aTopic)) {
|
else if (!nsCRT::strcmp("quit-application", aTopic)) {
|
||||||
PRBool isDefault;
|
PRBool isDefault;
|
||||||
@@ -1073,8 +1008,6 @@ nsWindowsShellService::Observe(nsISupports* aObject, const char* aTopic, const P
|
|||||||
|
|
||||||
nsCOMPtr<nsIObserverService> os(do_GetService("@mozilla.org/observer-service;1"));
|
nsCOMPtr<nsIObserverService> os(do_GetService("@mozilla.org/observer-service;1"));
|
||||||
os->RemoveObserver(this, "quit-application");
|
os->RemoveObserver(this, "quit-application");
|
||||||
|
|
||||||
return UnregisterDDESupport();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
|
|||||||
@@ -66,10 +66,6 @@ protected:
|
|||||||
void SetRegKey(const char* aKeyName, const char* aValueName,
|
void SetRegKey(const char* aKeyName, const char* aValueName,
|
||||||
const char* aValue, PRBool aBackup, HKEY aBackupKey,
|
const char* aValue, PRBool aBackup, HKEY aBackupKey,
|
||||||
PRBool aReplaceExisting, PRBool aForAllUsers);
|
PRBool aReplaceExisting, PRBool aForAllUsers);
|
||||||
DWORD DeleteRegKey(HKEY baseKey, const char *keyName);
|
|
||||||
|
|
||||||
nsresult RegisterDDESupport();
|
|
||||||
nsresult UnregisterDDESupport();
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
PRBool mCheckedThisSession;
|
PRBool mCheckedThisSession;
|
||||||
|
|||||||
@@ -256,6 +256,47 @@ private:
|
|||||||
* whether Mozilla is already running.
|
* whether Mozilla is already running.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/* Update 2006 September
|
||||||
|
*
|
||||||
|
* A change in behavior was implemented in July 2004 which made the
|
||||||
|
* application add on launch and remove on quit the ddexec registry key.
|
||||||
|
* See bug 246078.
|
||||||
|
* Windows Vista has changed the methods used to set an application as default
|
||||||
|
* and the new methods are incompatible with removing the ddeexec registry key.
|
||||||
|
* See bug 353089.
|
||||||
|
*
|
||||||
|
* OS DDE Sequence:
|
||||||
|
* 1. OS checks if the dde name is registered.
|
||||||
|
* 2. If it is registered the OS sends a DDE request with the WWW_OpenURL topic
|
||||||
|
* and the params as specified in the default value of the ddeexec registry
|
||||||
|
* key for the verb (e.g. open).
|
||||||
|
* 3. If it isn't registered the OS launches the executable defined in the
|
||||||
|
* verb's (e.g. open) command registry key.
|
||||||
|
* 4. If the ifexec registry key is not present the OS sends a DDE request with
|
||||||
|
* the WWW_OpenURL topic and the params as specified in the default value of
|
||||||
|
* the ddeexec registry key for the verb (e.g. open).
|
||||||
|
* 5. If the ifexec registry key is present the OS sends a DDE request with the
|
||||||
|
* WWW_OpenURL topic and the params as specified in the ifexec registry key
|
||||||
|
* for the verb (e.g. open).
|
||||||
|
*
|
||||||
|
* Application DDE Sequence:
|
||||||
|
* 1. If the application is running a DDE request is received DDE with the
|
||||||
|
* WWW_OpenURL topic and the params as specified in the default value of the
|
||||||
|
* ddeexec registry key (e.g. "%1",,0,0,,,, where '%1' is the url to open)
|
||||||
|
* for the verb (e.g. open).
|
||||||
|
* 2. If the application is not running it is launched with the -url argument.
|
||||||
|
*
|
||||||
|
* Note: Typically the application should use the DDE request to open the page
|
||||||
|
* instead of using a command line argument. The command line argument is
|
||||||
|
* used to work around when the DDE queue is hung by a different
|
||||||
|
* application. See bug 53952.
|
||||||
|
*
|
||||||
|
* 3. The application receives a DDE request with the WWW_OpenURL topic and the
|
||||||
|
* params from the ifexec key without the url (e.g. ,,0,0,,,,). The
|
||||||
|
* application treats this request as a noop internally and returns the
|
||||||
|
* correct values for the DDE request to the OS.
|
||||||
|
*/
|
||||||
|
|
||||||
class nsNativeAppSupportWin : public nsNativeAppSupportBase,
|
class nsNativeAppSupportWin : public nsNativeAppSupportBase,
|
||||||
public nsIObserver
|
public nsIObserver
|
||||||
{
|
{
|
||||||
@@ -976,23 +1017,26 @@ nsNativeAppSupportWin::HandleDDENotification( UINT uType, // transaction t
|
|||||||
nsCAutoString url;
|
nsCAutoString url;
|
||||||
ParseDDEArg(hsz2, 0, url);
|
ParseDDEArg(hsz2, 0, url);
|
||||||
|
|
||||||
// Read the 3rd argument in the command to determine if a
|
if ( !url.Equals( "" ) ) {
|
||||||
// new window is to be used.
|
// Read the 3rd argument in the command to determine if a
|
||||||
nsCAutoString windowID;
|
// new window is to be used.
|
||||||
ParseDDEArg(hsz2, 2, windowID);
|
nsCAutoString windowID;
|
||||||
// "" means to open the URL in a new window.
|
ParseDDEArg(hsz2, 2, windowID);
|
||||||
if ( windowID.Equals( "" ) ) {
|
// "" means to open the URL in a new window.
|
||||||
url.Insert("mozilla -new-window ", 0);
|
if ( windowID.Equals( "" ) ) {
|
||||||
}
|
url.Insert("mozilla -new-window ", 0);
|
||||||
else {
|
}
|
||||||
url.Insert("mozilla -url ", 0);
|
else {
|
||||||
}
|
url.Insert("mozilla -url ", 0);
|
||||||
|
}
|
||||||
|
|
||||||
#if MOZ_DEBUG_DDE
|
#if MOZ_DEBUG_DDE
|
||||||
printf( "Handling dde XTYP_REQUEST request: [%s]...\n", url.get() );
|
printf( "Handling dde XTYP_REQUEST request: [%s]...\n", url.get() );
|
||||||
#endif
|
#endif
|
||||||
// Now handle it.
|
// Now handle it.
|
||||||
HandleCommandLine(url.get(), nsnull, nsICommandLine::STATE_REMOTE_EXPLICIT);
|
HandleCommandLine(url.get(), nsnull, nsICommandLine::STATE_REMOTE_EXPLICIT);
|
||||||
|
}
|
||||||
|
|
||||||
// Return pseudo window ID.
|
// Return pseudo window ID.
|
||||||
result = CreateDDEData( 1 );
|
result = CreateDDEData( 1 );
|
||||||
break;
|
break;
|
||||||
@@ -1146,23 +1190,25 @@ nsNativeAppSupportWin::HandleDDENotification( UINT uType, // transaction t
|
|||||||
nsCAutoString url;
|
nsCAutoString url;
|
||||||
ParseDDEArg((const char*) request, 0, url);
|
ParseDDEArg((const char*) request, 0, url);
|
||||||
|
|
||||||
// Read the 3rd argument in the command to determine if a
|
if ( !url.Equals( "" ) ) {
|
||||||
// new window is to be used.
|
// Read the 3rd argument in the command to determine if a
|
||||||
nsCAutoString windowID;
|
// new window is to be used.
|
||||||
ParseDDEArg((const char*) request, 2, windowID);
|
nsCAutoString windowID;
|
||||||
|
ParseDDEArg((const char*) request, 2, windowID);
|
||||||
|
|
||||||
// "" means to open the URL in a new window.
|
// "" means to open the URL in a new window.
|
||||||
if ( windowID.Equals( "" ) ) {
|
if ( windowID.Equals( "" ) ) {
|
||||||
url.Insert("mozilla -new-window ", 0);
|
url.Insert("mozilla -new-window ", 0);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
url.Insert("mozilla -url ", 0);
|
url.Insert("mozilla -url ", 0);
|
||||||
}
|
}
|
||||||
#if MOZ_DEBUG_DDE
|
#if MOZ_DEBUG_DDE
|
||||||
printf( "Handling dde XTYP_REQUEST request: [%s]...\n", url.get() );
|
printf( "Handling dde XTYP_REQUEST request: [%s]...\n", url.get() );
|
||||||
#endif
|
#endif
|
||||||
// Now handle it.
|
// Now handle it.
|
||||||
HandleCommandLine(url.get(), nsnull, nsICommandLine::STATE_REMOTE_EXPLICIT);
|
HandleCommandLine(url.get(), nsnull, nsICommandLine::STATE_REMOTE_EXPLICIT);
|
||||||
|
}
|
||||||
|
|
||||||
// Release the data.
|
// Release the data.
|
||||||
DdeUnaccessData( hdata );
|
DdeUnaccessData( hdata );
|
||||||
|
|||||||
Reference in New Issue
Block a user