summaryrefslogtreecommitdiffstats
path: root/toolkit/xre/nsCommandLineServiceMac.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/xre/nsCommandLineServiceMac.cpp')
-rw-r--r--toolkit/xre/nsCommandLineServiceMac.cpp102
1 files changed, 102 insertions, 0 deletions
diff --git a/toolkit/xre/nsCommandLineServiceMac.cpp b/toolkit/xre/nsCommandLineServiceMac.cpp
new file mode 100644
index 000000000..f5964bfe3
--- /dev/null
+++ b/toolkit/xre/nsCommandLineServiceMac.cpp
@@ -0,0 +1,102 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "nsCommandLineServiceMac.h"
+#include "MacApplicationDelegate.h"
+
+#include <CoreFoundation/CoreFoundation.h>
+#include <Carbon/Carbon.h>
+
+namespace CommandLineServiceMac {
+
+static const int kArgsGrowSize = 20;
+
+static char** sArgs = nullptr;
+static int sArgsAllocated = 0;
+static int sArgsUsed = 0;
+
+static bool sBuildingCommandLine = false;
+
+void AddToCommandLine(const char* inArgText)
+{
+ if (sArgsUsed >= sArgsAllocated - 1) {
+ // realloc does not free the given pointer if allocation fails
+ char **temp = static_cast<char**>(realloc(sArgs, (sArgsAllocated + kArgsGrowSize) * sizeof(char*)));
+ if (!temp)
+ return;
+ sArgs = temp;
+ sArgsAllocated += kArgsGrowSize;
+ }
+
+ char *temp2 = strdup(inArgText);
+ if (!temp2)
+ return;
+
+ sArgs[sArgsUsed++] = temp2;
+ sArgs[sArgsUsed] = nullptr;
+
+ return;
+}
+
+void SetupMacCommandLine(int& argc, char**& argv, bool forRestart)
+{
+ sArgs = static_cast<char **>(malloc(kArgsGrowSize * sizeof(char*)));
+ if (!sArgs)
+ return;
+ sArgsAllocated = kArgsGrowSize;
+ sArgs[0] = nullptr;
+ sArgsUsed = 0;
+
+ sBuildingCommandLine = true;
+
+ // Copy args, stripping anything we don't want.
+ for (int arg = 0; arg < argc; arg++) {
+ char* flag = argv[arg];
+ // Don't pass on the psn (Process Serial Number) flag from the OS, or
+ // the "-foreground" flag since it will be set below if necessary.
+ if (strncmp(flag, "-psn_", 5) != 0 &&
+ strncmp(flag, "-foreground", 11) != 0)
+ AddToCommandLine(flag);
+ }
+
+ // Force processing of any pending Apple GetURL Events while we're building
+ // the command line. The handlers will append to the command line rather than
+ // act directly so there is no chance we'll process them during a XUL window
+ // load and accidentally open unnecessary windows and home pages.
+ ProcessPendingGetURLAppleEvents();
+
+ // If the process will be relaunched, the child should be in the foreground
+ // if the parent is in the foreground. This will be communicated in a
+ // command-line argument to the child.
+ if (forRestart) {
+ Boolean isForeground = false;
+ ProcessSerialNumber psnSelf, psnFront;
+ if (::GetCurrentProcess(&psnSelf) == noErr &&
+ ::GetFrontProcess(&psnFront) == noErr &&
+ ::SameProcess(&psnSelf, &psnFront, &isForeground) == noErr &&
+ isForeground) {
+ AddToCommandLine("-foreground");
+ }
+ }
+
+ sBuildingCommandLine = false;
+
+ argc = sArgsUsed;
+ argv = sArgs;
+}
+
+bool AddURLToCurrentCommandLine(const char* aURL)
+{
+ if (!sBuildingCommandLine) {
+ return false;
+ }
+
+ AddToCommandLine("-url");
+ AddToCommandLine(aURL);
+
+ return true;
+}
+
+} // namespace CommandLineServiceMac