Bug 410156 - r=bsmedberg, approval1.9=beltzner, blocking-firefox3=beltzner
authorrob_strong@exchangecode.com
Thu, 17 Apr 2008 15:20:19 -0700
changeset 14435 fa2f9d66bdc4379c7a5957c153702eec33975418
parent 14434 c5a7b03b7ed45865b96fc56fd98e95eac89c76f6
child 14436 dabf1468a101807c8e732fa25a38356edd5843b0
push id1
push userroot
push dateTue, 26 Apr 2011 22:38:44 +0000
treeherdermozilla-beta@bfdb6e623a36 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersbsmedberg
bugs410156
milestone1.9pre
Bug 410156 - r=bsmedberg, approval1.9=beltzner, blocking-firefox3=beltzner
toolkit/components/commandlines/src/nsCommandLine.cpp
toolkit/components/commandlines/test/Makefile.in
toolkit/components/commandlines/test/unit/data/test_bug410156.desktop
toolkit/components/commandlines/test/unit/data/test_bug410156.url
toolkit/components/commandlines/test/unit/test_bug410156.js.in
--- a/toolkit/components/commandlines/src/nsCommandLine.cpp
+++ b/toolkit/components/commandlines/src/nsCommandLine.cpp
@@ -90,16 +90,17 @@ protected:
   typedef nsresult (*EnumerateHandlersCallback)(nsICommandLineHandler* aHandler,
 					nsICommandLine* aThis,
 					void *aClosure);
   typedef nsresult (*EnumerateValidatorsCallback)(nsICommandLineValidator* aValidator,
 					nsICommandLine* aThis,
 					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);
 
   nsStringArray     mArgs;
   PRUint32          mState;
   nsCOMPtr<nsIFile> mWorkingDir;
   nsCOMPtr<nsIDOMWindow> mWindowContext;
   PRBool            mPreventDefault;
@@ -437,26 +438,36 @@ nsCommandLine::ResolveURI(const nsAStrin
   nsresult rv;
 
   // First, we try to init the argument as an absolute file path. If this doesn't
   // work, it is an absolute or relative URI.
 
   nsCOMPtr<nsIIOService> io = do_GetIOService();
   NS_ENSURE_TRUE(io, NS_ERROR_OUT_OF_MEMORY);
 
+  nsCOMPtr<nsIURI> workingDirURI;
+  if (mWorkingDir) {
+    io->NewFileURI(mWorkingDir, getter_AddRefs(workingDirURI));
+  }
+
   nsCOMPtr<nsILocalFile> 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<nsIURI> workingDirURI;
-  if (mWorkingDir) {
-    io->NewFileURI(mWorkingDir, getter_AddRefs(workingDirURI));
+    return io->NewFileURI(lf, aResult);
   }
 
   return io->NewURI(NS_ConvertUTF16toUTF8(aArgument),
                     nsnull,
                     workingDirURI,
                     aResult);
 }
 
@@ -472,16 +483,32 @@ nsCommandLine::appendArg(const char* arg
   CopyUTF8toUTF16(nsDependentCString(arg), warg);
 #else
   NS_CopyNativeToUnicode(nsDependentCString(arg), warg);
 #endif
 
   mArgs.AppendString(warg);
 }
 
+void
+nsCommandLine::resolveShortcutURL(nsILocalFile* aFile, nsACString& outURL)
+{
+  nsCOMPtr<nsIFileProtocolHandler> fph;
+  nsresult rv = NS_GetFileProtocolHandler(getter_AddRefs(fph));
+  if (NS_FAILED(rv))
+    return;
+
+  nsCOMPtr<nsIURI> 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)
 {
   NS_ENSURE_ARG_MIN(aState, 0);
   NS_ENSURE_ARG_MAX(aState, 2);
 
   PRInt32 i;
--- a/toolkit/components/commandlines/test/Makefile.in
+++ b/toolkit/components/commandlines/test/Makefile.in
@@ -40,14 +40,19 @@
 DEPTH		= ../../../..
 topsrcdir	= @top_srcdir@
 srcdir		= @srcdir@
 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
new file mode 100644
--- /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
new file mode 100644
--- /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/
new file mode 100644
--- /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 <robert_bugzila@gmail.com>.
+ * 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
+}