зеркало из https://github.com/mozilla/pjs.git
First part of fix for web-based protocol handlers failing in certain situations (bug 394483); r=biesi, sr=sicking
This commit is contained in:
Родитель
87b02e0c5b
Коммит
fd47266c07
|
@ -108,7 +108,7 @@ NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsPrefetchService, Init)
|
||||||
NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(nsOfflineCacheUpdateService,
|
NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(nsOfflineCacheUpdateService,
|
||||||
nsOfflineCacheUpdateService::GetInstance)
|
nsOfflineCacheUpdateService::GetInstance)
|
||||||
NS_GENERIC_FACTORY_CONSTRUCTOR(nsOfflineCacheUpdate)
|
NS_GENERIC_FACTORY_CONSTRUCTOR(nsOfflineCacheUpdate)
|
||||||
NS_GENERIC_FACTORY_CONSTRUCTOR(nsLocalHandlerApp)
|
NS_GENERIC_FACTORY_CONSTRUCTOR(PlatformLocalHandlerApp_t)
|
||||||
|
|
||||||
#if defined(XP_MAC) || defined(XP_MACOSX)
|
#if defined(XP_MAC) || defined(XP_MACOSX)
|
||||||
#include "nsInternetConfigService.h"
|
#include "nsInternetConfigService.h"
|
||||||
|
@ -218,7 +218,8 @@ static const nsModuleComponentInfo gDocShellModuleInfo[] = {
|
||||||
{ NS_OFFLINECACHEUPDATE_CLASSNAME, NS_OFFLINECACHEUPDATE_CID, NS_OFFLINECACHEUPDATE_CONTRACTID,
|
{ NS_OFFLINECACHEUPDATE_CLASSNAME, NS_OFFLINECACHEUPDATE_CID, NS_OFFLINECACHEUPDATE_CONTRACTID,
|
||||||
nsOfflineCacheUpdateConstructor, },
|
nsOfflineCacheUpdateConstructor, },
|
||||||
{ "Local Application Handler App", NS_LOCALHANDLERAPP_CID,
|
{ "Local Application Handler App", NS_LOCALHANDLERAPP_CID,
|
||||||
NS_LOCALHANDLERAPP_CONTRACTID, nsLocalHandlerAppConstructor, },
|
NS_LOCALHANDLERAPP_CONTRACTID, PlatformLocalHandlerApp_tConstructor, },
|
||||||
|
|
||||||
#if defined(XP_MAC) || defined(XP_MACOSX)
|
#if defined(XP_MAC) || defined(XP_MACOSX)
|
||||||
{ "Internet Config Service", NS_INTERNETCONFIGSERVICE_CID, NS_INTERNETCONFIGSERVICE_CONTRACTID,
|
{ "Internet Config Service", NS_INTERNETCONFIGSERVICE_CID, NS_INTERNETCONFIGSERVICE_CONTRACTID,
|
||||||
nsInternetConfigServiceConstructor, },
|
nsInternetConfigServiceConstructor, },
|
||||||
|
|
|
@ -52,7 +52,7 @@ typedef long nsHandlerInfoAction;
|
||||||
* nsIHandlerInfo gives access to the information about how a given protocol
|
* nsIHandlerInfo gives access to the information about how a given protocol
|
||||||
* scheme or MIME-type is handled.
|
* scheme or MIME-type is handled.
|
||||||
*/
|
*/
|
||||||
[scriptable, uuid(325e56a7-3762-4312-aec7-f1fcf84b4145)]
|
[scriptable, uuid(325e56a7-3762-4312-aec7-f1fcf84b4145)]
|
||||||
interface nsIHandlerInfo : nsISupports {
|
interface nsIHandlerInfo : nsISupports {
|
||||||
/**
|
/**
|
||||||
* The type of this handler info. For MIME handlers, this is the MIME type.
|
* The type of this handler info. For MIME handlers, this is the MIME type.
|
||||||
|
@ -239,7 +239,7 @@ interface nsIMIMEInfo : nsIHandlerInfo {
|
||||||
* we should also try to make nsIWebContentHandlerInfo inherit from or possibly
|
* we should also try to make nsIWebContentHandlerInfo inherit from or possibly
|
||||||
* be replaced by nsIWebHandlerApp (bug 394710).
|
* be replaced by nsIWebHandlerApp (bug 394710).
|
||||||
*/
|
*/
|
||||||
[scriptable, uuid(b504f39e-d88a-4435-8e0d-e13f1070f7e7)]
|
[scriptable, uuid(8d298761-0963-4c90-99e2-6ea498825e82)]
|
||||||
interface nsIHandlerApp : nsISupports {
|
interface nsIHandlerApp : nsISupports {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -259,6 +259,21 @@ interface nsIHandlerApp : nsISupports {
|
||||||
* @returns true if the two are logically equivalent, false otherwise
|
* @returns true if the two are logically equivalent, false otherwise
|
||||||
*/
|
*/
|
||||||
boolean equals(in nsIHandlerApp aHandlerApp);
|
boolean equals(in nsIHandlerApp aHandlerApp);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Launches the application with the specified URI.
|
||||||
|
*
|
||||||
|
* @param aURI
|
||||||
|
* The URI to launch this application with
|
||||||
|
*
|
||||||
|
* @param aWindowContext
|
||||||
|
* Required for web handlers; is passed through to
|
||||||
|
* nsIURILoader.openURI, but see bug 394483 for info on
|
||||||
|
* how this needs to evolve.
|
||||||
|
*/
|
||||||
|
void launchWithURI(in nsIURI aURI,
|
||||||
|
[optional] in nsIInterfaceRequestor aWindowContext);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -367,6 +367,7 @@ MAKEFILES_uriloader="
|
||||||
uriloader/base/Makefile
|
uriloader/base/Makefile
|
||||||
uriloader/exthandler/Makefile
|
uriloader/exthandler/Makefile
|
||||||
uriloader/exthandler/tests/Makefile
|
uriloader/exthandler/tests/Makefile
|
||||||
|
uriloader/exthandler/tests/browser/Makefile
|
||||||
"
|
"
|
||||||
|
|
||||||
MAKEFILES_profile="
|
MAKEFILES_profile="
|
||||||
|
|
|
@ -103,6 +103,7 @@ ifneq (,$(filter mac cocoa,$(MOZ_WIDGET_TOOLKIT)))
|
||||||
OSHELPER += nsInternetConfig.cpp \
|
OSHELPER += nsInternetConfig.cpp \
|
||||||
nsInternetConfigService.cpp \
|
nsInternetConfigService.cpp \
|
||||||
nsMIMEInfoMac.cpp \
|
nsMIMEInfoMac.cpp \
|
||||||
|
nsLocalHandlerAppMac.cpp \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,95 @@
|
||||||
|
/* ***** BEGIN LICENSE BLOCK *****
|
||||||
|
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||||
|
*
|
||||||
|
* The contents of this file are subject to the Mozilla Public License Version
|
||||||
|
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||||
|
* the License. You may obtain a copy of the License at
|
||||||
|
* http://www.mozilla.org/MPL/
|
||||||
|
*
|
||||||
|
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||||
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||||
|
* for the specific language governing rights and limitations under the
|
||||||
|
* License.
|
||||||
|
*
|
||||||
|
* The Original Code is Mozilla code.
|
||||||
|
*
|
||||||
|
* The Initial Developer of the Original Code is
|
||||||
|
* the Mozilla Foundation.
|
||||||
|
* Portions created by the Initial Developer are Copyright (C) 2007
|
||||||
|
* the Initial Developer. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
* Dan Mosedale <dmose@mozilla.org>
|
||||||
|
*
|
||||||
|
* Alternatively, the contents of this file may be used under the terms of
|
||||||
|
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||||
|
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||||
|
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||||
|
* of those above. If you wish to allow use of your version of this file only
|
||||||
|
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||||
|
* use your version of this file under the terms of the MPL, indicate your
|
||||||
|
* decision by deleting the provisions above and replace them with the notice
|
||||||
|
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||||
|
* the provisions above, a recipient may use your version of this file under
|
||||||
|
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||||
|
*
|
||||||
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
|
#include <LaunchServices.h>
|
||||||
|
|
||||||
|
#include "nsLocalHandlerAppMac.h"
|
||||||
|
#include "nsILocalFileMac.h"
|
||||||
|
#include "nsIURI.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* mostly copy/pasted from nsMacShellService.cpp (which is in browser/,
|
||||||
|
* so we can't depend on it here). This code probably really wants to live
|
||||||
|
* somewhere more central (see bug 389922).
|
||||||
|
*/
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsLocalHandlerAppMac::LaunchWithURI(nsIURI *aURI,
|
||||||
|
nsIInterfaceRequestor *aWindowContext)
|
||||||
|
{
|
||||||
|
nsresult rv;
|
||||||
|
nsCOMPtr<nsILocalFileMac> lfm(do_QueryInterface(mExecutable, &rv));
|
||||||
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
|
||||||
|
CFURLRef appURL;
|
||||||
|
rv = lfm->GetCFURL(&appURL);
|
||||||
|
if (NS_FAILED(rv))
|
||||||
|
return rv;
|
||||||
|
|
||||||
|
nsCAutoString uriSpec;
|
||||||
|
aURI->GetSpec(uriSpec);
|
||||||
|
|
||||||
|
const UInt8* uriString = reinterpret_cast<const UInt8*>(uriSpec.get());
|
||||||
|
CFURLRef uri = ::CFURLCreateWithBytes(NULL, uriString, uriSpec.Length(),
|
||||||
|
kCFStringEncodingUTF8, NULL);
|
||||||
|
if (!uri) {
|
||||||
|
::CFRelease(appURL);
|
||||||
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
CFArrayRef uris = ::CFArrayCreate(NULL, reinterpret_cast<const void**>(&uri),
|
||||||
|
1, NULL);
|
||||||
|
if (!uris) {
|
||||||
|
::CFRelease(uri);
|
||||||
|
::CFRelease(appURL);
|
||||||
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
LSLaunchURLSpec launchSpec;
|
||||||
|
launchSpec.appURL = appURL;
|
||||||
|
launchSpec.itemURLs = uris;
|
||||||
|
launchSpec.passThruParams = NULL;
|
||||||
|
launchSpec.launchFlags = kLSLaunchDefaults;
|
||||||
|
launchSpec.asyncRefCon = NULL;
|
||||||
|
|
||||||
|
OSErr err = ::LSOpenFromURLSpec(&launchSpec, NULL);
|
||||||
|
|
||||||
|
::CFRelease(uris);
|
||||||
|
::CFRelease(uri);
|
||||||
|
::CFRelease(appURL);
|
||||||
|
|
||||||
|
return err != noErr ? NS_ERROR_FAILURE : NS_OK;
|
||||||
|
}
|
|
@ -0,0 +1,59 @@
|
||||||
|
/* ***** BEGIN LICENSE BLOCK *****
|
||||||
|
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||||
|
*
|
||||||
|
* The contents of this file are subject to the Mozilla Public License Version
|
||||||
|
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||||
|
* the License. You may obtain a copy of the License at
|
||||||
|
* http://www.mozilla.org/MPL/
|
||||||
|
*
|
||||||
|
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||||
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||||
|
* for the specific language governing rights and limitations under the
|
||||||
|
* License.
|
||||||
|
*
|
||||||
|
* The Original Code is Mozilla code.
|
||||||
|
*
|
||||||
|
* The Initial Developer of the Original Code is
|
||||||
|
* the Mozilla Foundation.
|
||||||
|
* Portions created by the Initial Developer are Copyright (C) 2007
|
||||||
|
* the Initial Developer. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
* Dan Mosedale <dmose@mozilla.org>
|
||||||
|
*
|
||||||
|
* Alternatively, the contents of this file may be used under the terms of
|
||||||
|
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||||
|
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||||
|
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||||
|
* of those above. If you wish to allow use of your version of this file only
|
||||||
|
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||||
|
* use your version of this file under the terms of the MPL, indicate your
|
||||||
|
* decision by deleting the provisions above and replace them with the notice
|
||||||
|
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||||
|
* the provisions above, a recipient may use your version of this file under
|
||||||
|
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||||
|
*
|
||||||
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
|
#ifndef NSLOCALHANDLERAPPMAC_H_
|
||||||
|
#define NSLOCALHANDLERAPPMAC_H_
|
||||||
|
|
||||||
|
#include "nsLocalHandlerApp.h"
|
||||||
|
|
||||||
|
class nsLocalHandlerAppMac : public nsLocalHandlerApp {
|
||||||
|
|
||||||
|
public:
|
||||||
|
nsLocalHandlerAppMac() { }
|
||||||
|
|
||||||
|
nsLocalHandlerAppMac(const PRUnichar *aName, nsIFile *aExecutable)
|
||||||
|
: nsLocalHandlerApp(aName, aExecutable) {}
|
||||||
|
|
||||||
|
nsLocalHandlerAppMac(const nsAString & aName, nsIFile *aExecutable)
|
||||||
|
: nsLocalHandlerApp(aName, aExecutable) {}
|
||||||
|
virtual ~nsLocalHandlerAppMac() { }
|
||||||
|
|
||||||
|
NS_IMETHOD LaunchWithURI(nsIURI* aURI,
|
||||||
|
nsIInterfaceRequestor* aWindowContext);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /*NSLOCALHANDLERAPPMAC_H_*/
|
|
@ -99,49 +99,6 @@ nsMIMEInfoMac::LaunchWithFile(nsIFile *aFile)
|
||||||
return app->LaunchWithDoc(localFile, PR_FALSE);
|
return app->LaunchWithDoc(localFile, PR_FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsMIMEInfoMac::LaunchWithURI(nsIURI* aURI,
|
|
||||||
nsIInterfaceRequestor* aWindowContext)
|
|
||||||
{
|
|
||||||
nsCOMPtr<nsIFile> application;
|
|
||||||
nsresult rv;
|
|
||||||
|
|
||||||
// for now, this is only being called with protocol handlers; that
|
|
||||||
// will change once we get to more general registerContentHandler
|
|
||||||
// support
|
|
||||||
NS_ASSERTION(mClass == eProtocolInfo,
|
|
||||||
"nsMIMEInfoBase should be a protocol handler");
|
|
||||||
|
|
||||||
if (mPreferredAction == useHelperApp) {
|
|
||||||
|
|
||||||
// check for and launch with web handler app
|
|
||||||
nsCOMPtr<nsIWebHandlerApp> webHandlerApp =
|
|
||||||
do_QueryInterface(mPreferredApplication, &rv);
|
|
||||||
if (NS_SUCCEEDED(rv)) {
|
|
||||||
return LaunchWithWebHandler(webHandlerApp, aURI, aWindowContext);
|
|
||||||
}
|
|
||||||
|
|
||||||
// otherwise, get the application executable from the handler
|
|
||||||
nsCOMPtr<nsILocalHandlerApp> localHandlerApp =
|
|
||||||
do_QueryInterface(mPreferredApplication, &rv);
|
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
|
||||||
|
|
||||||
rv = localHandlerApp->GetExecutable(getter_AddRefs(application));
|
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
|
||||||
|
|
||||||
// pass the entire URI to the handler.
|
|
||||||
nsCAutoString spec;
|
|
||||||
aURI->GetSpec(spec);
|
|
||||||
return OpenApplicationWithURI(application, spec);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mPreferredAction == useSystemDefault) {
|
|
||||||
return LoadUriInternal(aURI);
|
|
||||||
}
|
|
||||||
|
|
||||||
return NS_ERROR_INVALID_ARG;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsresult
|
nsresult
|
||||||
nsMIMEInfoMac::LoadUriInternal(nsIURI *aURI)
|
nsMIMEInfoMac::LoadUriInternal(nsIURI *aURI)
|
||||||
{
|
{
|
||||||
|
@ -167,51 +124,3 @@ nsMIMEInfoMac::GetHasDefaultHandler(PRBool *_retval)
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* static; mostly copy/pasted from nsMacShellService.cpp (which is in browser/,
|
|
||||||
* so we can't depend on it here). This code probably really wants to live
|
|
||||||
* somewhere more central; see bug 389922.
|
|
||||||
*/
|
|
||||||
nsresult
|
|
||||||
nsMIMEInfoMac::OpenApplicationWithURI(nsIFile* aApplication,
|
|
||||||
const nsCString& aURI)
|
|
||||||
{
|
|
||||||
nsresult rv;
|
|
||||||
nsCOMPtr<nsILocalFileMac> lfm(do_QueryInterface(aApplication, &rv));
|
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
|
||||||
|
|
||||||
CFURLRef appURL;
|
|
||||||
rv = lfm->GetCFURL(&appURL);
|
|
||||||
if (NS_FAILED(rv))
|
|
||||||
return rv;
|
|
||||||
|
|
||||||
const UInt8* uriString = (const UInt8*)aURI.get();
|
|
||||||
CFURLRef uri = ::CFURLCreateWithBytes(NULL, uriString, aURI.Length(),
|
|
||||||
kCFStringEncodingUTF8, NULL);
|
|
||||||
if (!uri) {
|
|
||||||
::CFRelease(appURL);
|
|
||||||
return NS_ERROR_OUT_OF_MEMORY;
|
|
||||||
}
|
|
||||||
|
|
||||||
CFArrayRef uris = ::CFArrayCreate(NULL, (const void**)&uri, 1, NULL);
|
|
||||||
if (!uris) {
|
|
||||||
::CFRelease(uri);
|
|
||||||
::CFRelease(appURL);
|
|
||||||
return NS_ERROR_OUT_OF_MEMORY;
|
|
||||||
}
|
|
||||||
|
|
||||||
LSLaunchURLSpec launchSpec;
|
|
||||||
launchSpec.appURL = appURL;
|
|
||||||
launchSpec.itemURLs = uris;
|
|
||||||
launchSpec.passThruParams = NULL;
|
|
||||||
launchSpec.launchFlags = kLSLaunchDefaults;
|
|
||||||
launchSpec.asyncRefCon = NULL;
|
|
||||||
|
|
||||||
OSErr err = ::LSOpenFromURLSpec(&launchSpec, NULL);
|
|
||||||
|
|
||||||
::CFRelease(uris);
|
|
||||||
::CFRelease(uri);
|
|
||||||
::CFRelease(appURL);
|
|
||||||
|
|
||||||
return err != noErr ? NS_ERROR_FAILURE : NS_OK;
|
|
||||||
}
|
|
||||||
|
|
|
@ -46,8 +46,6 @@ class nsMIMEInfoMac : public nsMIMEInfoImpl {
|
||||||
nsMIMEInfoMac(const nsACString& aType, HandlerClass aClass) :
|
nsMIMEInfoMac(const nsACString& aType, HandlerClass aClass) :
|
||||||
nsMIMEInfoImpl(aType, aClass) {}
|
nsMIMEInfoImpl(aType, aClass) {}
|
||||||
|
|
||||||
NS_IMETHOD LaunchWithURI(nsIURI* aURI,
|
|
||||||
nsIInterfaceRequestor* aWindowContext);
|
|
||||||
NS_IMETHOD LaunchWithFile(nsIFile* aFile);
|
NS_IMETHOD LaunchWithFile(nsIFile* aFile);
|
||||||
NS_IMETHOD GetHasDefaultHandler(PRBool *_retval);
|
NS_IMETHOD GetHasDefaultHandler(PRBool *_retval);
|
||||||
protected:
|
protected:
|
||||||
|
|
|
@ -2030,7 +2030,6 @@ nsresult nsExternalAppHandler::OpenWithApplication()
|
||||||
// perform launch with application. That won't happen until we are done downloading
|
// perform launch with application. That won't happen until we are done downloading
|
||||||
// the content and are sure we've showna progress dialog. This was done to simplify the
|
// the content and are sure we've showna progress dialog. This was done to simplify the
|
||||||
// logic that was showing up in this method.
|
// logic that was showing up in this method.
|
||||||
|
|
||||||
NS_IMETHODIMP nsExternalAppHandler::LaunchWithApplication(nsIFile * aApplication, PRBool aRememberThisPreference)
|
NS_IMETHODIMP nsExternalAppHandler::LaunchWithApplication(nsIFile * aApplication, PRBool aRememberThisPreference)
|
||||||
{
|
{
|
||||||
if (mCanceled)
|
if (mCanceled)
|
||||||
|
@ -2041,8 +2040,8 @@ NS_IMETHODIMP nsExternalAppHandler::LaunchWithApplication(nsIFile * aApplication
|
||||||
|
|
||||||
mReceivedDispositionInfo = PR_TRUE;
|
mReceivedDispositionInfo = PR_TRUE;
|
||||||
if (mMimeInfo && aApplication) {
|
if (mMimeInfo && aApplication) {
|
||||||
nsLocalHandlerApp *handlerApp(new nsLocalHandlerApp(EmptyString(),
|
PlatformLocalHandlerApp_t *handlerApp =
|
||||||
aApplication));
|
new PlatformLocalHandlerApp_t(EmptyString(), aApplication);
|
||||||
mMimeInfo->SetPreferredApplicationHandler(handlerApp);
|
mMimeInfo->SetPreferredApplicationHandler(handlerApp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -39,6 +39,8 @@
|
||||||
* ***** END LICENSE BLOCK ***** */
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
#include "nsLocalHandlerApp.h"
|
#include "nsLocalHandlerApp.h"
|
||||||
|
#include "nsIURI.h"
|
||||||
|
#include "nsIProcess.h"
|
||||||
|
|
||||||
// XXX why does nsMIMEInfoImpl have a threadsafe nsISupports? do we need one
|
// XXX why does nsMIMEInfoImpl have a threadsafe nsISupports? do we need one
|
||||||
// here too?
|
// here too?
|
||||||
|
@ -91,6 +93,32 @@ nsLocalHandlerApp::Equals(nsIHandlerApp *aHandlerApp, PRBool *_retval)
|
||||||
return executable->Equals(mExecutable, _retval);
|
return executable->Equals(mExecutable, _retval);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsLocalHandlerApp::LaunchWithURI(nsIURI *aURI,
|
||||||
|
nsIInterfaceRequestor *aWindowContext)
|
||||||
|
{
|
||||||
|
// pass the entire URI to the handler.
|
||||||
|
nsCAutoString spec;
|
||||||
|
aURI->GetSpec(spec);
|
||||||
|
return LaunchWithIProcess(spec);
|
||||||
|
}
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
nsLocalHandlerApp::LaunchWithIProcess(const nsCString& aArg)
|
||||||
|
{
|
||||||
|
nsresult rv;
|
||||||
|
nsCOMPtr<nsIProcess> process = do_CreateInstance(NS_PROCESS_CONTRACTID, &rv);
|
||||||
|
if (NS_FAILED(rv))
|
||||||
|
return rv;
|
||||||
|
|
||||||
|
if (NS_FAILED(rv = process->Init(mExecutable)))
|
||||||
|
return rv;
|
||||||
|
|
||||||
|
const char *string = aArg.get();
|
||||||
|
|
||||||
|
PRUint32 pid;
|
||||||
|
return process->Run(PR_FALSE, &string, 1, &pid);
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
//// nsILocalHandlerApp
|
//// nsILocalHandlerApp
|
||||||
|
|
|
@ -63,6 +63,28 @@ public:
|
||||||
protected:
|
protected:
|
||||||
nsString mName;
|
nsString mName;
|
||||||
nsCOMPtr<nsIFile> mExecutable;
|
nsCOMPtr<nsIFile> mExecutable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Launches this application with a single argument (typically either
|
||||||
|
* a file path or a URI spec). This is meant as a helper method for
|
||||||
|
* implementations of (e.g.) LaunchWithURI.
|
||||||
|
*
|
||||||
|
* @param aApp The application to launch (may not be null)
|
||||||
|
* @param aArg The argument to pass on the command line
|
||||||
|
*/
|
||||||
|
NS_HIDDEN_(nsresult) LaunchWithIProcess(const nsCString &aArg);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// any platforms that need a platform-specific class instead of just
|
||||||
|
// using nsLocalHandlerApp need to add an include and a typedef here.
|
||||||
|
#ifdef XP_MACOSX
|
||||||
|
# ifndef NSLOCALHANDLERAPPMAC_H_
|
||||||
|
# include "mac/nsLocalHandlerAppMac.h"
|
||||||
|
typedef nsLocalHandlerAppMac PlatformLocalHandlerApp_t;
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
typedef nsLocalHandlerApp PlatformLocalHandlerApp_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif // __nsLocalHandlerAppImpl_h__
|
#endif // __nsLocalHandlerAppImpl_h__
|
||||||
|
|
|
@ -387,8 +387,6 @@ NS_IMETHODIMP
|
||||||
nsMIMEInfoBase::LaunchWithURI(nsIURI* aURI,
|
nsMIMEInfoBase::LaunchWithURI(nsIURI* aURI,
|
||||||
nsIInterfaceRequestor* aWindowContext)
|
nsIInterfaceRequestor* aWindowContext)
|
||||||
{
|
{
|
||||||
nsresult rv;
|
|
||||||
|
|
||||||
// for now, this is only being called with protocol handlers; that
|
// for now, this is only being called with protocol handlers; that
|
||||||
// will change once we get to more general registerContentHandler
|
// will change once we get to more general registerContentHandler
|
||||||
// support
|
// support
|
||||||
|
@ -403,26 +401,7 @@ nsMIMEInfoBase::LaunchWithURI(nsIURI* aURI,
|
||||||
if (!mPreferredApplication)
|
if (!mPreferredApplication)
|
||||||
return NS_ERROR_FILE_NOT_FOUND;
|
return NS_ERROR_FILE_NOT_FOUND;
|
||||||
|
|
||||||
// check for and possibly launch with web application
|
return mPreferredApplication->LaunchWithURI(aURI, aWindowContext);
|
||||||
nsCOMPtr<nsIWebHandlerApp> webHandler =
|
|
||||||
do_QueryInterface(mPreferredApplication, &rv);
|
|
||||||
if (NS_SUCCEEDED(rv)) {
|
|
||||||
return LaunchWithWebHandler(webHandler, aURI, aWindowContext);
|
|
||||||
}
|
|
||||||
|
|
||||||
// ok, we must have a local handler app
|
|
||||||
nsCOMPtr<nsILocalHandlerApp> localHandler =
|
|
||||||
do_QueryInterface(mPreferredApplication, &rv);
|
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
|
||||||
|
|
||||||
nsCOMPtr<nsIFile> executable;
|
|
||||||
rv = localHandler->GetExecutable(getter_AddRefs(executable));
|
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
|
||||||
|
|
||||||
// pass the entire URI to the handler.
|
|
||||||
nsCAutoString spec;
|
|
||||||
aURI->GetSpec(spec);
|
|
||||||
return LaunchWithIProcess(executable, spec);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return NS_ERROR_INVALID_ARG;
|
return NS_ERROR_INVALID_ARG;
|
||||||
|
@ -459,70 +438,6 @@ nsMIMEInfoBase::LaunchWithIProcess(nsIFile* aApp, const nsCString& aArg)
|
||||||
return process->Run(PR_FALSE, &string, 1, &pid);
|
return process->Run(PR_FALSE, &string, 1, &pid);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* static */
|
|
||||||
nsresult
|
|
||||||
nsMIMEInfoBase::LaunchWithWebHandler(nsIWebHandlerApp *aApp, nsIURI *aURI,
|
|
||||||
nsIInterfaceRequestor *aWindowContext)
|
|
||||||
{
|
|
||||||
|
|
||||||
nsCAutoString uriTemplate;
|
|
||||||
nsresult rv = aApp->GetUriTemplate(uriTemplate);
|
|
||||||
if (NS_FAILED(rv)) {
|
|
||||||
return NS_ERROR_INVALID_ARG;
|
|
||||||
}
|
|
||||||
|
|
||||||
// get the URI spec so we can escape it for insertion into the template
|
|
||||||
nsCAutoString uriSpecToHandle;
|
|
||||||
rv = aURI->GetSpec(uriSpecToHandle);
|
|
||||||
if (NS_FAILED(rv)) {
|
|
||||||
return NS_ERROR_INVALID_ARG;
|
|
||||||
}
|
|
||||||
|
|
||||||
// XXX need to strip passwd & username from URI to handle, as per the
|
|
||||||
// WhatWG HTML5 draft. nsSimpleURL, which is what we're going to get,
|
|
||||||
// can't do this directly. Ideally, we'd fix nsStandardURL to make it
|
|
||||||
// possible to turn off all of its quirks handling, and use that...
|
|
||||||
|
|
||||||
// XXX this doesn't exactly match how the HTML5 draft is requesting us to
|
|
||||||
// escape; at the very least, it should be escaping @ signs, and there
|
|
||||||
// may well be more issues (bug 382019).
|
|
||||||
nsCAutoString escapedUriSpecToHandle;
|
|
||||||
NS_EscapeURL(uriSpecToHandle, esc_Minimal | esc_Forced | esc_Colon,
|
|
||||||
escapedUriSpecToHandle);
|
|
||||||
|
|
||||||
// XXX note that this replace all occurrences of %s with the URL to be
|
|
||||||
// handled, instead of just the first, as specified by the current draft
|
|
||||||
// of the spec. Bug 394476 filed to track this.
|
|
||||||
uriTemplate.ReplaceSubstring(NS_LITERAL_CSTRING("%s"),
|
|
||||||
escapedUriSpecToHandle);
|
|
||||||
|
|
||||||
// convert spec to URI; no original charset needed since there's no way
|
|
||||||
// to communicate that information to any handler
|
|
||||||
nsCOMPtr<nsIURI> uriToSend;
|
|
||||||
rv = NS_NewURI(getter_AddRefs(uriToSend), uriTemplate);
|
|
||||||
if (NS_FAILED(rv))
|
|
||||||
return rv;
|
|
||||||
|
|
||||||
// create a channel
|
|
||||||
nsCOMPtr<nsIChannel> newChannel;
|
|
||||||
rv = NS_NewChannel(getter_AddRefs(newChannel), uriToSend, nsnull, nsnull,
|
|
||||||
nsnull, nsIChannel::LOAD_DOCUMENT_URI);
|
|
||||||
if (NS_FAILED(rv))
|
|
||||||
return rv;
|
|
||||||
|
|
||||||
// load the URI
|
|
||||||
nsCOMPtr<nsIURILoader> uriLoader = do_GetService(NS_URI_LOADER_CONTRACTID,
|
|
||||||
&rv);
|
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
|
||||||
|
|
||||||
// XXX ideally, aIsContentPreferred (the second param) should really be
|
|
||||||
// passed in from above. Practically, PR_TRUE is probably a reasonable
|
|
||||||
// default since browsers don't care much, and link click is likely to be
|
|
||||||
// the more interesting case for non-browser apps. See
|
|
||||||
// <https://bugzilla.mozilla.org/show_bug.cgi?id=392957#c9> for details.
|
|
||||||
return uriLoader->OpenURI(newChannel, PR_TRUE, aWindowContext);
|
|
||||||
}
|
|
||||||
|
|
||||||
// nsMIMEInfoImpl implementation
|
// nsMIMEInfoImpl implementation
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsMIMEInfoImpl::GetDefaultDescription(nsAString& aDefaultDescription)
|
nsMIMEInfoImpl::GetDefaultDescription(nsAString& aDefaultDescription)
|
||||||
|
|
|
@ -155,24 +155,6 @@ class nsMIMEInfoBase : public nsIMIMEInfo {
|
||||||
static NS_HIDDEN_(nsresult) LaunchWithIProcess(nsIFile* aApp,
|
static NS_HIDDEN_(nsresult) LaunchWithIProcess(nsIFile* aApp,
|
||||||
const nsCString &aArg);
|
const nsCString &aArg);
|
||||||
|
|
||||||
/**
|
|
||||||
* Used to launch a web-based handler with this URI.
|
|
||||||
*
|
|
||||||
* @param aURI The URI to launch with.
|
|
||||||
*
|
|
||||||
* @param aWindowContext
|
|
||||||
* The window to parent the dialog against, and, if a web handler
|
|
||||||
* is chosen, it is loaded in this window as well. This parameter
|
|
||||||
* may be ultimately passed nsIURILoader.openURI in the case of a
|
|
||||||
* web handler, and aWindowContext is null or not present, web
|
|
||||||
* handlers will fail. We need to do better than that; bug 394483
|
|
||||||
* filed in order to track.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
static NS_HIDDEN_(nsresult)
|
|
||||||
LaunchWithWebHandler(nsIWebHandlerApp *aApp, nsIURI *aURI,
|
|
||||||
nsIInterfaceRequestor *aWindowContext);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Given a file: nsIURI, return the associated nsILocalFile
|
* Given a file: nsIURI, return the associated nsILocalFile
|
||||||
*
|
*
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
* Contributor(s):
|
* Contributor(s):
|
||||||
* Shawn Wilsher <me@shawnwilsher.com>
|
* Shawn Wilsher <me@shawnwilsher.com>
|
||||||
* Myk Melez <myk@mozilla.org>
|
* Myk Melez <myk@mozilla.org>
|
||||||
|
* Dan Mosedale <dmose@mozilla.org>
|
||||||
*
|
*
|
||||||
* Alternatively, the contents of this file may be used under the terms of
|
* Alternatively, the contents of this file may be used under the terms of
|
||||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||||
|
@ -84,6 +85,38 @@ nsWebHandlerApp.prototype = {
|
||||||
return false;
|
return false;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
launchWithURI: function nWHA__launchWithURI(aURI, aWindowContext) {
|
||||||
|
|
||||||
|
// XXX need to strip passwd & username from URI to handle, as per the
|
||||||
|
// WhatWG HTML5 draft. nsSimpleURL, which is what we're going to get,
|
||||||
|
// can't do this directly. Ideally, we'd fix nsStandardURL to make it
|
||||||
|
// possible to turn off all of its quirks handling, and use that...
|
||||||
|
|
||||||
|
// encode the URI to be handled
|
||||||
|
var escapedUriSpecToHandle = encodeURIComponent(aURI.spec);
|
||||||
|
|
||||||
|
// insert the encoded URI
|
||||||
|
var uriToSend = this.uriTemplate.replace("%s", escapedUriSpecToHandle);
|
||||||
|
|
||||||
|
// create a channel from this URI
|
||||||
|
var ioService = Components.classes["@mozilla.org/network/io-service;1"].
|
||||||
|
getService(Components.interfaces.nsIIOService);
|
||||||
|
var channel = ioService.newChannel(uriToSend, null, null);
|
||||||
|
channel.loadFlags = Components.interfaces.nsIChannel.LOAD_DOCUMENT_URI;
|
||||||
|
|
||||||
|
// load the channel
|
||||||
|
var uriLoader = Components.classes["@mozilla.org/uriloader;1"].
|
||||||
|
getService(Components.interfaces.nsIURILoader);
|
||||||
|
// XXX ideally, aIsContentPreferred (the second param) should really be
|
||||||
|
// passed in from above. Practically, true is probably a reasonable
|
||||||
|
// default since browsers don't care much, and link click is likely to be
|
||||||
|
// the more interesting case for non-browser apps. See
|
||||||
|
// <https://bugzilla.mozilla.org/show_bug.cgi?id=392957#c9> for details.
|
||||||
|
uriLoader.openURI(channel, true, aWindowContext);
|
||||||
|
|
||||||
|
return;
|
||||||
|
},
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
//// nsIWebHandlerApp
|
//// nsIWebHandlerApp
|
||||||
|
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
#
|
#
|
||||||
# Contributor(s):
|
# Contributor(s):
|
||||||
# Myk Melez <myk@mozilla.org>
|
# Myk Melez <myk@mozilla.org>
|
||||||
|
# Dan Mosedale <dmose@mozilla.org>
|
||||||
#
|
#
|
||||||
# Alternatively, the contents of this file may be used under the terms of
|
# Alternatively, the contents of this file may be used under the terms of
|
||||||
# either of the GNU General Public License Version 2 or later (the "GPL"),
|
# either of the GNU General Public License Version 2 or later (the "GPL"),
|
||||||
|
@ -40,6 +41,9 @@ topsrcdir = @top_srcdir@
|
||||||
srcdir = @srcdir@
|
srcdir = @srcdir@
|
||||||
VPATH = @srcdir@
|
VPATH = @srcdir@
|
||||||
|
|
||||||
|
DIRS += mochitest \
|
||||||
|
$(NULL)
|
||||||
|
|
||||||
include $(DEPTH)/config/autoconf.mk
|
include $(DEPTH)/config/autoconf.mk
|
||||||
|
|
||||||
MODULE = test_uriloader_exthandler
|
MODULE = test_uriloader_exthandler
|
||||||
|
|
|
@ -0,0 +1,54 @@
|
||||||
|
# ***** BEGIN LICENSE BLOCK *****
|
||||||
|
# Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||||
|
#
|
||||||
|
# The contents of this file are subject to the Mozilla Public License Version
|
||||||
|
# 1.1 (the "License"); you may not use this file except in compliance with
|
||||||
|
# the License. You may obtain a copy of the License at
|
||||||
|
# http://www.mozilla.org/MPL/
|
||||||
|
#
|
||||||
|
# Software distributed under the License is distributed on an "AS IS" basis,
|
||||||
|
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||||
|
# for the specific language governing rights and limitations under the
|
||||||
|
# License.
|
||||||
|
#
|
||||||
|
# The Original Code is mozilla.org code.
|
||||||
|
#
|
||||||
|
# The Initial Developer of the Original Code is
|
||||||
|
# Mozilla Foundation.
|
||||||
|
# Portions created by the Initial Developer are Copyright (C) 2007
|
||||||
|
# the Initial Developer. All Rights Reserved.
|
||||||
|
#
|
||||||
|
# Contributor(s):
|
||||||
|
# Dan Mosedale <dmose@mozilla.org>
|
||||||
|
#
|
||||||
|
# Alternatively, the contents of this file may be used under the terms of
|
||||||
|
# either of the GNU General Public License Version 2 or later (the "GPL"),
|
||||||
|
# or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||||
|
# in which case the provisions of the GPL or the LGPL are applicable instead
|
||||||
|
# of those above. If you wish to allow use of your version of this file only
|
||||||
|
# under the terms of either the GPL or the LGPL, and not to allow others to
|
||||||
|
# use your version of this file under the terms of the MPL, indicate your
|
||||||
|
# decision by deleting the provisions above and replace them with the notice
|
||||||
|
# and other provisions required by the GPL or the LGPL. If you do not delete
|
||||||
|
# the provisions above, a recipient may use your version of this file under
|
||||||
|
# the terms of any one of the MPL, the GPL or the LGPL.
|
||||||
|
#
|
||||||
|
# ***** END LICENSE BLOCK *****
|
||||||
|
|
||||||
|
DEPTH = ../../../..
|
||||||
|
topsrcdir = @top_srcdir@
|
||||||
|
srcdir = @srcdir@
|
||||||
|
VPATH = @srcdir@
|
||||||
|
relativesrcdir = uriloader/exthandler/tests/mochitest
|
||||||
|
|
||||||
|
include $(DEPTH)/config/autoconf.mk
|
||||||
|
include $(topsrcdir)/config/rules.mk
|
||||||
|
|
||||||
|
_TEST_FILES = \
|
||||||
|
test_handlerApps.xhtml \
|
||||||
|
handlerApps.js \
|
||||||
|
handlerApp.xhtml \
|
||||||
|
$(NULL)
|
||||||
|
|
||||||
|
libs:: $(_TEST_FILES)
|
||||||
|
$(INSTALL) $(foreach f,$^,"$f") $(DEPTH)/_tests/testing/mochitest/tests/$(relativesrcdir)
|
|
@ -0,0 +1,27 @@
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
|
<head>
|
||||||
|
<title>Pseudo Web Handler App</title>
|
||||||
|
<script type="text/javascript" src="/MochiKit/packed.js"></script>
|
||||||
|
<script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
|
||||||
|
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
|
||||||
|
</head>
|
||||||
|
<body onload="onLoad()">
|
||||||
|
Pseudo Web Handler App
|
||||||
|
|
||||||
|
<script class="testbody" type="text/javascript">
|
||||||
|
<![CDATA[
|
||||||
|
function onLoad() {
|
||||||
|
|
||||||
|
var originalUriToHandle = encodeURIComponent(window.opener.testURI);
|
||||||
|
|
||||||
|
window.opener.is(location.search, "?uri=" + originalUriToHandle,
|
||||||
|
"uri passed to web-handler app");
|
||||||
|
window.opener.SimpleTest.finish()
|
||||||
|
window.close();
|
||||||
|
}
|
||||||
|
]]>
|
||||||
|
</script>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
|
@ -0,0 +1,128 @@
|
||||||
|
/* ***** BEGIN LICENSE BLOCK *****
|
||||||
|
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||||
|
*
|
||||||
|
* The contents of this file are subject to the Mozilla Public License Version
|
||||||
|
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||||
|
* the License. You may obtain a copy of the License at
|
||||||
|
* http://www.mozilla.org/MPL/
|
||||||
|
*
|
||||||
|
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||||
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||||
|
* for the specific language governing rights and limitations under the
|
||||||
|
* License.
|
||||||
|
*
|
||||||
|
* The Original Code is Mozilla code.
|
||||||
|
*
|
||||||
|
* The Initial Developer of the Original Code is
|
||||||
|
* the Mozilla Foundation.
|
||||||
|
* Portions created by the Initial Developer are Copyright (C) 2007
|
||||||
|
* the Initial Developer. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
* Dan Mosedale <dmose@mozilla.org>
|
||||||
|
*
|
||||||
|
* Alternatively, the contents of this file may be used under the terms of
|
||||||
|
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||||
|
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||||
|
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||||
|
* of those above. If you wish to allow use of your version of this file only
|
||||||
|
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||||
|
* use your version of this file under the terms of the MPL, indicate your
|
||||||
|
* decision by deleting the provisions above and replace them with the notice
|
||||||
|
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||||
|
* the provisions above, a recipient may use your version of this file under
|
||||||
|
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||||
|
*
|
||||||
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
|
// handlerApp.xhtml grabs this for verification purposes via window.opener
|
||||||
|
var testURI = "webcal://127.0.0.1/rheeeeet.html";
|
||||||
|
|
||||||
|
function test() {
|
||||||
|
|
||||||
|
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
|
||||||
|
|
||||||
|
// set up the web handler object
|
||||||
|
var webHandler =
|
||||||
|
Components.classes["@mozilla.org/uriloader/web-handler-app;1"].
|
||||||
|
createInstance(Components.interfaces.nsIWebHandlerApp);
|
||||||
|
webHandler.name = "Test Web Handler App";
|
||||||
|
webHandler.uriTemplate =
|
||||||
|
"http://localhost:8888/tests/uriloader/exthandler/tests/mochitest/" +
|
||||||
|
"handlerApp.xhtml?uri=%s";
|
||||||
|
|
||||||
|
// set up the uri to test with
|
||||||
|
var ioService = Components.classes["@mozilla.org/network/io-service;1"].
|
||||||
|
getService(Components.interfaces.nsIIOService);
|
||||||
|
var uri = ioService.newURI(testURI, null, null);
|
||||||
|
|
||||||
|
// create a window, and launch the handler in it
|
||||||
|
var newWindow = window.open("", "handlerWindow", "height=300,width=300");
|
||||||
|
var windowContext =
|
||||||
|
newWindow.QueryInterface(Components.interfaces.nsIInterfaceRequestor).
|
||||||
|
getInterface(Components.interfaces.nsIWebNavigation).
|
||||||
|
QueryInterface(Components.interfaces.nsIDocShell);
|
||||||
|
|
||||||
|
webHandler.launchWithURI(uri, windowContext);
|
||||||
|
|
||||||
|
// if we get this far without an exception, we've passed
|
||||||
|
ok(true, "webHandler launchWithURI test");
|
||||||
|
|
||||||
|
|
||||||
|
// set up the local handler object
|
||||||
|
var localHandler =
|
||||||
|
Components.classes["@mozilla.org/uriloader/local-handler-app;1"].
|
||||||
|
createInstance(Components.interfaces.nsILocalHandlerApp);
|
||||||
|
localHandler.name = "Test Local Handler App";
|
||||||
|
|
||||||
|
// get a local app that we know will be there and do something sane
|
||||||
|
var osString = Components.classes["@mozilla.org/xre/app-info;1"].
|
||||||
|
getService(Components.interfaces.nsIXULRuntime).OS;
|
||||||
|
|
||||||
|
var dirSvc = Components.classes["@mozilla.org/file/directory_service;1"].
|
||||||
|
getService(Components.interfaces.nsIDirectoryServiceProvider);
|
||||||
|
if (osString == "WINNT") {
|
||||||
|
var windowsDir = dirSvc.getFile("WinD", {});
|
||||||
|
var exe = windowsDir.clone();
|
||||||
|
exe.appendRelativePath("SYSTEM32\\HOSTNAME.EXE");
|
||||||
|
|
||||||
|
} else if (osString == "Darwin") {
|
||||||
|
var localAppsDir = dirSvc.getFile("LocApp", {});
|
||||||
|
exe = localAppsDir.clone();
|
||||||
|
exe.append("iCal.app"); // lingers after the tests finish, but this seems
|
||||||
|
// seems better than explicitly killing it, since
|
||||||
|
// developers who run the tests locally may well
|
||||||
|
// information in their running copy of iCal
|
||||||
|
} else {
|
||||||
|
// assume a generic UNIX variant
|
||||||
|
exe = Components.classes["@mozilla.org/file/local;1"].
|
||||||
|
createInstance(Components.interfaces.nsILocalFile);
|
||||||
|
exe.initWithPath("/bin/test");
|
||||||
|
}
|
||||||
|
|
||||||
|
localHandler.executable = exe;
|
||||||
|
localHandler.launchWithURI(ioService.newURI(testURI, null, null));
|
||||||
|
|
||||||
|
// if we get this far without an exception, we've passed
|
||||||
|
ok(true, "localHandler launchWithURI test");
|
||||||
|
|
||||||
|
// if we ever decide that killing iCal is the right thing to do, change
|
||||||
|
// the if statement below from "NOTDarwin" to "Darwin"
|
||||||
|
if (osString == "NOTDarwin") {
|
||||||
|
|
||||||
|
var killall = Components.classes["@mozilla.org/file/local;1"].
|
||||||
|
createInstance(Components.interfaces.nsILocalFile);
|
||||||
|
killall.initWithPath("/usr/bin/killall");
|
||||||
|
|
||||||
|
var process = Components.classes["@mozilla.org/process/util;1"].
|
||||||
|
createInstance(Components.interfaces.nsIProcess);
|
||||||
|
process.init(killall);
|
||||||
|
|
||||||
|
var args = ['iCal'];
|
||||||
|
process.run(false, args, args.length);
|
||||||
|
}
|
||||||
|
|
||||||
|
SimpleTest.waitForExplicitFinish();
|
||||||
|
}
|
||||||
|
|
||||||
|
test();
|
|
@ -0,0 +1,13 @@
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
|
<head>
|
||||||
|
<title>Test for Handler Apps </title>
|
||||||
|
<script type="text/javascript" src="/MochiKit/packed.js"></script>
|
||||||
|
<script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
|
||||||
|
<script type="text/javascript" src="handlerApps.js"/>
|
||||||
|
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<p id="display"></p>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
Загрузка…
Ссылка в новой задаче