gecko/toolkit/xre/MacLaunchHelper.mm
Ehsan Akhgari 904efc4f7a Bug 307181 - Stage Firefox updates in the background after they're downloaded, and replace the application directory on restart; r=rstrong,bbondy
When Firefox downloads an update, it previously kept the update around to apply
it on the next restart.  This patch changes this so that the updater program
is launched in the background as soon as the update has finished downloading
in order to stage the updated version of the application by copying the
existing installation directory to a temporary location and applying the update
on top of it, and replace the existing installation directory with the staged
directory on the next restart.

Because the replacing step is typically very fast, this patch eliminates the
wait for the update to be applied on restart, making it unnecessary to show a
progress dialog when restarting.

--HG--
rename : toolkit/mozapps/update/test/chrome/test_0092_finishedBackground.xul => toolkit/mozapps/update/test/chrome/test_0093_stagedBackground.xul
rename : toolkit/mozapps/update/test/unit/test_0110_general.js => toolkit/mozapps/update/test/unit/test_0113_general.js
rename : toolkit/mozapps/update/test/unit/test_0111_general.js => toolkit/mozapps/update/test/unit/test_0114_general.js
rename : toolkit/mozapps/update/test/unit/test_0112_general.js => toolkit/mozapps/update/test/unit/test_0115_general.js
rename : toolkit/mozapps/update/test/unit/test_0170_fileLocked_xp_win_complete.js => toolkit/mozapps/update/test/unit/test_0172_fileLocked_xp_win_complete.js
rename : toolkit/mozapps/update/test/unit/test_0171_fileLocked_xp_win_partial.js => toolkit/mozapps/update/test/unit/test_0173_fileLocked_xp_win_partial.js
rename : toolkit/mozapps/update/test/unit/test_0110_general.js => toolkit/mozapps/update/test_svc/unit/test_0113_general_svc.js
rename : toolkit/mozapps/update/test/unit/test_0111_general.js => toolkit/mozapps/update/test_svc/unit/test_0114_general_svc.js
rename : toolkit/mozapps/update/test/unit/test_0112_general.js => toolkit/mozapps/update/test_svc/unit/test_0115_general_svc.js
rename : toolkit/mozapps/update/test/unit/test_0170_fileLocked_xp_win_complete.js => toolkit/mozapps/update/test_svc/unit/test_0172_fileLocked_xp_win_complete_svc.js
rename : toolkit/mozapps/update/test/unit/test_0171_fileLocked_xp_win_partial.js => toolkit/mozapps/update/test_svc/unit/test_0173_fileLocked_xp_win_partial_svc.js
2012-05-22 10:50:04 -04:00

94 lines
2.7 KiB
Plaintext

/* -*- Mode: C++; tab-width: 2; 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 "mozilla/Util.h"
#include "prtypes.h"
#include "MacLaunchHelper.h"
#include "nsMemory.h"
#include "nsAutoPtr.h"
#include "nsIAppStartup.h"
#include <stdio.h>
#include <spawn.h>
#include <crt_externs.h>
using namespace mozilla;
namespace {
cpu_type_t pref_cpu_types[2] = {
#if defined(__i386__)
CPU_TYPE_X86,
#elif defined(__x86_64__)
CPU_TYPE_X86_64,
#elif defined(__ppc__)
CPU_TYPE_POWERPC,
#endif
CPU_TYPE_ANY };
cpu_type_t cpu_i386_types[2] = {
CPU_TYPE_X86,
CPU_TYPE_ANY };
cpu_type_t cpu_x64_86_types[2] = {
CPU_TYPE_X86_64,
CPU_TYPE_ANY };
}
void LaunchChildMac(int aArgc, char** aArgv,
PRUint32 aRestartType, pid_t *pid)
{
// "posix_spawnp" uses null termination for arguments rather than a count.
// Note that we are not duplicating the argument strings themselves.
nsAutoArrayPtr<char*> argv_copy(new char*[aArgc + 1]);
for (int i = 0; i < aArgc; i++) {
argv_copy[i] = aArgv[i];
}
argv_copy[aArgc] = NULL;
// Initialize spawn attributes.
posix_spawnattr_t spawnattr;
if (posix_spawnattr_init(&spawnattr) != 0) {
printf("Failed to init posix spawn attribute.");
return;
}
cpu_type_t *wanted_type = pref_cpu_types;
size_t attr_count = ArrayLength(pref_cpu_types);
if (aRestartType & nsIAppStartup::eRestarti386) {
wanted_type = cpu_i386_types;
attr_count = ArrayLength(cpu_i386_types);
} else if (aRestartType & nsIAppStartup::eRestartx86_64) {
wanted_type = cpu_x64_86_types;
attr_count = ArrayLength(cpu_x64_86_types);
}
// Set spawn attributes.
size_t attr_ocount = 0;
if (posix_spawnattr_setbinpref_np(&spawnattr, attr_count, wanted_type, &attr_ocount) != 0 ||
attr_ocount != attr_count) {
printf("Failed to set binary preference on posix spawn attribute.");
posix_spawnattr_destroy(&spawnattr);
return;
}
// Pass along our environment.
char** envp = NULL;
char*** cocoaEnvironment = _NSGetEnviron();
if (cocoaEnvironment) {
envp = *cocoaEnvironment;
}
int result = posix_spawnp(pid, argv_copy[0], NULL, &spawnattr, argv_copy, envp);
posix_spawnattr_destroy(&spawnattr);
if (result != 0) {
printf("Process spawn failed with code %d!", result);
}
}