diff --git a/toolkit/components/commandlines/src/nsCommandLine.cpp b/toolkit/components/commandlines/src/nsCommandLine.cpp index 70e34dcf455..c4b79330150 100644 --- a/toolkit/components/commandlines/src/nsCommandLine.cpp +++ b/toolkit/components/commandlines/src/nsCommandLine.cpp @@ -95,6 +95,7 @@ protected: void *aClosure); void appendArg(const char* arg); + void resolveShortcutURL(nsILocalFile* aFile, nsACString& outURL); nsresult EnumerateHandlers(EnumerateHandlersCallback aCallback, void *aClosure); nsresult EnumerateValidators(EnumerateValidatorsCallback aCallback, void *aClosure); @@ -442,16 +443,26 @@ nsCommandLine::ResolveURI(const nsAString& aArgument, nsIURI* *aResult) nsCOMPtr io = do_GetIOService(); NS_ENSURE_TRUE(io, NS_ERROR_OUT_OF_MEMORY); + nsCOMPtr workingDirURI; + if (mWorkingDir) { + io->NewFileURI(mWorkingDir, getter_AddRefs(workingDirURI)); + } + nsCOMPtr lf (do_CreateInstance(NS_LOCAL_FILE_CONTRACTID)); rv = lf->InitWithPath(aArgument); if (NS_SUCCEEDED(rv)) { lf->Normalize(); - return io->NewFileURI(lf, aResult); - } + nsCAutoString url; + // Try to resolve the url for .url files. + resolveShortcutURL(lf, url); + if (!url.IsEmpty()) { + return io->NewURI(url, + nsnull, + workingDirURI, + aResult); + } - nsCOMPtr workingDirURI; - if (mWorkingDir) { - io->NewFileURI(mWorkingDir, getter_AddRefs(workingDirURI)); + return io->NewFileURI(lf, aResult); } return io->NewURI(NS_ConvertUTF16toUTF8(aArgument), @@ -477,6 +488,22 @@ nsCommandLine::appendArg(const char* arg) mArgs.AppendString(warg); } +void +nsCommandLine::resolveShortcutURL(nsILocalFile* aFile, nsACString& outURL) +{ + nsCOMPtr fph; + nsresult rv = NS_GetFileProtocolHandler(getter_AddRefs(fph)); + if (NS_FAILED(rv)) + return; + + nsCOMPtr uri; + rv = fph->ReadURLFile(aFile, getter_AddRefs(uri)); + if (NS_FAILED(rv)) + return; + + uri->GetSpec(outURL); +} + NS_IMETHODIMP nsCommandLine::Init(PRInt32 argc, char** argv, nsIFile* aWorkingDir, PRUint32 aState) diff --git a/toolkit/components/commandlines/test/Makefile.in b/toolkit/components/commandlines/test/Makefile.in index 1e2e001845e..224b4f57610 100644 --- a/toolkit/components/commandlines/test/Makefile.in +++ b/toolkit/components/commandlines/test/Makefile.in @@ -45,9 +45,14 @@ VPATH = @srcdir@ include $(DEPTH)/config/autoconf.mk MODULE = test_harness_commandlines +TESTROOT = $(shell cd $(DEPTH) && pwd)/_tests/xpcshell-simple/$(MODULE) XPCSHELL_TESTS = \ unit \ $(NULL) include $(topsrcdir)/config/rules.mk + +# Hack to allow preprocessing of test_bug410156.js +libs:: unit/test_bug410156.js.in + $(PYTHON) $(MOZILLA_DIR)/config/Preprocessor.py $(DEFINES) $(ACDEFINES) $^ > $(TESTROOT)/unit/test_bug410156.js diff --git a/toolkit/components/commandlines/test/unit/data/test_bug410156.desktop b/toolkit/components/commandlines/test/unit/data/test_bug410156.desktop new file mode 100644 index 00000000000..1847cdd98e2 --- /dev/null +++ b/toolkit/components/commandlines/test/unit/data/test_bug410156.desktop @@ -0,0 +1,7 @@ +[Desktop Entry] +Version=1.0 +Encoding=UTF-8 +Name=test_bug410156 +Type=Link +URL=http://www.bug410156.com/ +Icon=gnome-fs-bookmark diff --git a/toolkit/components/commandlines/test/unit/data/test_bug410156.url b/toolkit/components/commandlines/test/unit/data/test_bug410156.url new file mode 100644 index 00000000000..6920e1f774e --- /dev/null +++ b/toolkit/components/commandlines/test/unit/data/test_bug410156.url @@ -0,0 +1,9 @@ +[InternetShortcut] +URL=http://www.bug410156.com/ +IDList= +HotKey=0 +[{000214A0-0000-0000-C000-000000000046}] +Prop3=19,2 +[InternetShortcut.A] +[InternetShortcut.W] +URL=http://www.bug410156.com/ diff --git a/toolkit/components/commandlines/test/unit/test_bug410156.js.in b/toolkit/components/commandlines/test/unit/test_bug410156.js.in new file mode 100644 index 00000000000..f9dc722ed2a --- /dev/null +++ b/toolkit/components/commandlines/test/unit/test_bug410156.js.in @@ -0,0 +1,55 @@ +/* ***** 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 Command Line tests. + * + * The Initial Developer of the Original Code is + * Robert Strong . + * Portions created by the Initial Developer are Copyright (C) 2007 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * 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 ***** */ + +function run_test() { + const Cc = Components.classes; + var clClass = Cc["@mozilla.org/toolkit/command-line;1"]; + var commandLine = clClass.createInstance(); + +#ifdef XP_WIN + var urlFile = do_get_file("toolkit/components/commandlines/test/unit/data/test_bug410156.url"); + var uri = commandLine.resolveURI(urlFile.path); + do_check_eq(uri.spec, "http://www.bug410156.com/"); +#endif + +#ifdef XP_UNIX +#ifndef XP_MACOSX + var urlFile = do_get_file("toolkit/components/commandlines/test/unit/data/test_bug410156.desktop"); + var uri = commandLine.resolveURI(urlFile.path); + do_check_eq(uri.spec, "http://www.bug410156.com/"); +#endif +#endif +}