mirror of
https://github.com/roytam1/palemoon27.git
synced 2026-05-27 03:29:05 +00:00
233e146e94
- spaces (1978675795)
- Bug 1176620 - Use absolute_import in mach; r=ahal (4cb6d9188f)
- Bug 1163112 - [mach core] Consolidate functionality between Main._run and Registrar.dispatch, r=gps (9f02ab04aa)
- Bug 1182677 - Support calling a function during mach command dispatch; r=smacleod (4a6511624e)
- put back some windows, crash and other details (9afa0117e0)
- Bug 1176698 - Use fallible allocator for attribute values in the HTML parser. r=wchen. (4da29e3a8a)
- Bug 1194023 - Part 1: Filter out warnings about sort operations on CREATE INDEX statements. r=mak (b221de9e96)
- Bug 1194023 - Part 2: Only check for sort operations if mozStorage logging is enabled. r=mak (be53dfc219)
- Bug 1205111 - return a transient error on 401 fetching info/collections using FxA. r=rnewman (1766c092b7)
- Bug 1188760 - Added a regex check to execute and executeCached of Sqlite.jsm. r=mak (ce509ec9a7)
- Bug 1199434 - Send printer error messages to the parent process to report to the user. r=Mossop (4e402ba484)
- bug 1207862 - Add DocManager::TopLevelRemoteDocs() r=davidb (6f919ad9db)
- bug 1201395 - call ProxyCreated with the correct interfaces when creating top level documents r=davidb (97713189cd)
- bug 1159722 - make atk expose more interfaces for proxied accessibles (529e246a13)
- bug 1162654 - allow proxies to implement the document interface r=davidb (33fd1a5ed2)
- Bug 1192023 - Use enum class instead of CheckpointMode_ prefix. r=khuey (5e922429ca)
- Bug 1203386 - Fix two implicit constructors in ActorsChild.h; r=baku (57cb7fafaf)
- Bug 1068975 - Remove FileInfo from File; r=baku (4b3ceb3bd8)
- Bug 1192023 - Make UpdateType an enum class. r=khuey (5a1908fa73)
- Bug 1184410: Track whether or not the transaction has been active on the connection thread. r=janv (44efc2f663)
- Bug 1184667 - Remove some unnecessary const_casts from ActorsParent.cpp. r=janv (1dcc45534b)
- Bug 1192023 - Use enum class instead of MaintenanceAction_ prefix. r=khuey (e2f6c8b0e5)
- Bug 1130775 followup: Add 'override' keyword to macro-provided AddRef/Release methods for QuotaClient::GetDirectoryLockListener. rs=ehsan (bf871fd57a)
- Bug 1185836: Replace several EnumerateRead calls with the new hashtable iterators. r=baku (dbfdaba7b8)
- Bug 1192023 - Flatten away AppId enum. r=khuey (78522f8547)
- missingbit of Bug 871846 (d8330545a0)
- try to fix some misspatch (29a6a9f63f)
- bug 1109891 - part 3 - remove mGeckoTextAccessible r=tbsaunde (147c7ace9d)
- Bug 1171995 - Part 6: Handle proxies in mozAccessible accessibilityHitTest and accessibilityFocusedUIElement r=tbsaunde (636508c113)
- Bug 1171995 - Part 7: Check for proxy in accessibilityIsIgnored for mozButtonAccessible and mozTextAccessible r=tbsaunde (ffb5d84e85)
- Bug 1187413 - Check for ProxyAccessible in mozAccessible childAt r=tbsaunde (fc06b79804)
- Bug 1187417 - (Part 1) Check for ProxyAccessible in mozAccessible position r=tbsaunde (2fc3c196aa)
- Bug 1187417 - (Part 2) Check for ProxyAccessible in mozAccessible size r=tbsaunde (7c7bcd9e10)
- Bug 1137748 - Expose correct roles, subroles, and roledescriptions for various WAI-ARIA roles on OS X, r=surkov (d522b4b7fc)
- Bug 1178018 - Add and adjust more roles, subroles, and role descriptions on OS X to match Webkit and Blink, r=surkov (d900416342)
- Bug 1187609 - Check for proxies in mozAccessible role, subrole r=tbsaunde (c29076091e)
- Bug 1187995 - Add proxy handling to mozTextAccessible r=tbsaunde (f6d1014aca)
- Bug 1187742 - Handle proxies in mozAccessible {isEnabled,title,value,help,isExpired} r=tbsaunde (c977aa1320)
- Bug 1187739 - (Part 1) Handle proxies in mozActionElements r=tbsaunde (b077cb6964)
- Bug 1187739 - (Part 2) Handle proxies in mozActionElements click, value r=tbsaunde (ac604e762c)
- Bug 1185836: Fix warnings r=me. (19a8596eea)
- Bug 1185836. Nuke warnings from orbit. r=me (70930b2239)
- bug 1191433 - add methods to downcast ProxyAccessible to DocAccessibleParent r=lsocks (9063e95d4a)
- bug 1191433 - add ProxyAccessible::Document r=lsock (88e4eb64c4)
- bug 1195471 - make getChildCountCB work with proxies r=davidb (86bfb6b5c4)
- Bug 1187740 - Handle proxies in mozHTMLAccessible r=tbsaunde (ee018fce11)
- misspatch (6e0ab73997)
- Bug 1199785 - Make atk methods in nsMaiInterfaceComponent.cpp to work with ipc proxies, r=tbsaunde (173a4460ef)
- Bug 1169701 - Add wrapper to get mozAccessibles from ProxyAccessibles r=tbsaunde (79e11612f1)
- Bug 1172946 - (part 1) Add mozilla a11y namespace to mozAccessible.h r=tbsaunde (ce796e8af9)
- Bug 1172946 - (part 2) Add handling for proxies in mozAccessible parent r=tbsaunde (a03158b8eb)
- Bug 1172946 - (part 3) Add handling for proxies in mozAccessible children r=tbsaunde (c72aefa608)
- Bug 1198291 - Remove exposure of the NSAccessibilityDescription attribute to guarantee we always expose AccName and AccDescription correctly, r=davidb, r=surkov (56daff1c4a)
- Bug 1179147 - merror and mstyle should be exposed as AXMathRow. r=MarcoZ (b107c9fba6)
- Bug 1187611 - (part 1) Handle ProxyAccessibles in mozAccessible focus r=tbsaunde (ba2524a2db)
- Bug 1187611 - (part 2) Handle ProxyAccessibles in mozAccessible window r=tbsaunde (05024ee697)
- Bug 1187611 - (part 3) Handle ProxyAccessibles in mozAccessible canBeFocused r=tbsaunde (93cb5e4dbb)
299 lines
9.1 KiB
C++
299 lines
9.1 KiB
C++
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
|
/* 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 "nsNativeAppSupportBase.h"
|
|
#include "nsCOMPtr.h"
|
|
#include "nsXPCOM.h"
|
|
#include "nsISupportsPrimitives.h"
|
|
#include "nsIObserverService.h"
|
|
#include "nsIAppStartup.h"
|
|
#include "nsServiceManagerUtils.h"
|
|
#include "prlink.h"
|
|
#include "nsXREDirProvider.h"
|
|
#include "nsReadableUtils.h"
|
|
|
|
#include "nsIFile.h"
|
|
#include "nsDirectoryServiceDefs.h"
|
|
#include "nsICommandLineRunner.h"
|
|
#include "nsIWindowMediator.h"
|
|
#include "nsPIDOMWindow.h"
|
|
#include "nsIDocShell.h"
|
|
#include "nsIBaseWindow.h"
|
|
#include "nsIWidget.h"
|
|
#include "nsIWritablePropertyBag2.h"
|
|
#include "nsIPrefService.h"
|
|
#include "mozilla/Services.h"
|
|
|
|
#include <stdlib.h>
|
|
#include <glib.h>
|
|
#include <glib-object.h>
|
|
#include <gtk/gtk.h>
|
|
|
|
#ifdef MOZ_X11
|
|
#include <gdk/gdkx.h>
|
|
#include <X11/Xatom.h>
|
|
#endif
|
|
|
|
#ifdef MOZ_ENABLE_DBUS
|
|
#include <dbus/dbus.h>
|
|
#endif
|
|
|
|
#define MIN_GTK_MAJOR_VERSION 2
|
|
#define MIN_GTK_MINOR_VERSION 10
|
|
#define UNSUPPORTED_GTK_MSG "We're sorry, this application requires a version of the GTK+ library that is not installed on your computer.\n\n\
|
|
You have GTK+ %d.%d.\nThis application requires GTK+ %d.%d or newer.\n\n\
|
|
Please upgrade your GTK+ library if you wish to use this application."
|
|
|
|
typedef struct _GnomeProgram GnomeProgram;
|
|
typedef struct _GnomeModuleInfo GnomeModuleInfo;
|
|
typedef struct _GnomeClient GnomeClient;
|
|
|
|
typedef enum {
|
|
GNOME_SAVE_GLOBAL,
|
|
GNOME_SAVE_LOCAL,
|
|
GNOME_SAVE_BOTH
|
|
} GnomeSaveStyle;
|
|
|
|
typedef enum {
|
|
GNOME_INTERACT_NONE,
|
|
GNOME_INTERACT_ERRORS,
|
|
GNOME_INTERACT_ANY
|
|
} GnomeInteractStyle;
|
|
|
|
typedef enum {
|
|
GNOME_DIALOG_ERROR,
|
|
GNOME_DIALOG_NORMAL
|
|
} GnomeDialogType;
|
|
|
|
#if defined(MOZ_X11) && (MOZ_WIDGET_GTK == 2)
|
|
typedef GnomeProgram * (*_gnome_program_init_fn)(const char *, const char *,
|
|
const GnomeModuleInfo *, int,
|
|
char **, const char *, ...);
|
|
typedef GnomeProgram * (*_gnome_program_get_fn)(void);
|
|
typedef const GnomeModuleInfo * (*_libgnomeui_module_info_get_fn)();
|
|
typedef GnomeClient * (*_gnome_master_client_fn)(void);
|
|
typedef void (*_gnome_client_set_restart_command_fn)(GnomeClient*, gint, gchar*[]);
|
|
|
|
static _gnome_client_set_restart_command_fn gnome_client_set_restart_command;
|
|
#endif
|
|
|
|
gboolean save_yourself_cb(GnomeClient *client, gint phase,
|
|
GnomeSaveStyle style, gboolean shutdown,
|
|
GnomeInteractStyle interact, gboolean fast,
|
|
gpointer user_data)
|
|
{
|
|
nsCOMPtr<nsIObserverService> obsServ =
|
|
mozilla::services::GetObserverService();
|
|
|
|
nsCOMPtr<nsISupportsPRBool> didSaveSession =
|
|
do_CreateInstance(NS_SUPPORTS_PRBOOL_CONTRACTID);
|
|
|
|
if (!obsServ || !didSaveSession)
|
|
return TRUE; // OOM
|
|
|
|
// Notify observers to save the session state
|
|
didSaveSession->SetData(false);
|
|
obsServ->NotifyObservers(didSaveSession, "session-save", nullptr);
|
|
|
|
bool status;
|
|
didSaveSession->GetData(&status);
|
|
|
|
// If there was no session saved and the save_yourself request is
|
|
// caused by upcoming shutdown we like to prepare for it
|
|
if (!status && shutdown) {
|
|
nsCOMPtr<nsISupportsPRBool> cancelQuit =
|
|
do_CreateInstance(NS_SUPPORTS_PRBOOL_CONTRACTID);
|
|
|
|
cancelQuit->SetData(false);
|
|
obsServ->NotifyObservers(cancelQuit, "quit-application-requested", nullptr);
|
|
|
|
bool abortQuit;
|
|
cancelQuit->GetData(&abortQuit);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
void die_cb(GnomeClient *client, gpointer user_data)
|
|
{
|
|
nsCOMPtr<nsIAppStartup> appService =
|
|
do_GetService("@mozilla.org/toolkit/app-startup;1");
|
|
|
|
if (appService)
|
|
appService->Quit(nsIAppStartup::eForceQuit);
|
|
}
|
|
|
|
class nsNativeAppSupportUnix : public nsNativeAppSupportBase
|
|
{
|
|
public:
|
|
NS_IMETHOD Start(bool* aRetVal);
|
|
NS_IMETHOD Stop(bool *aResult);
|
|
NS_IMETHOD Enable();
|
|
|
|
private:
|
|
};
|
|
|
|
NS_IMETHODIMP
|
|
nsNativeAppSupportUnix::Start(bool *aRetVal)
|
|
{
|
|
NS_ASSERTION(gAppData, "gAppData must not be null.");
|
|
|
|
// The dbus library is used by both nsWifiScannerDBus and BluetoothDBusService,
|
|
// from diffrent threads. This could lead to race conditions if the dbus is not
|
|
// initialized before making any other library calls.
|
|
#ifdef MOZ_ENABLE_DBUS
|
|
dbus_threads_init_default();
|
|
#endif
|
|
|
|
#if (MOZ_WIDGET_GTK == 2)
|
|
if (gtk_major_version < MIN_GTK_MAJOR_VERSION ||
|
|
(gtk_major_version == MIN_GTK_MAJOR_VERSION && gtk_minor_version < MIN_GTK_MINOR_VERSION)) {
|
|
GtkWidget* versionErrDialog = gtk_message_dialog_new(nullptr,
|
|
GtkDialogFlags(GTK_DIALOG_MODAL |
|
|
GTK_DIALOG_DESTROY_WITH_PARENT),
|
|
GTK_MESSAGE_ERROR,
|
|
GTK_BUTTONS_OK,
|
|
UNSUPPORTED_GTK_MSG,
|
|
gtk_major_version,
|
|
gtk_minor_version,
|
|
MIN_GTK_MAJOR_VERSION,
|
|
MIN_GTK_MINOR_VERSION);
|
|
gtk_dialog_run(GTK_DIALOG(versionErrDialog));
|
|
gtk_widget_destroy(versionErrDialog);
|
|
exit(0);
|
|
}
|
|
#endif
|
|
|
|
*aRetVal = true;
|
|
|
|
#if defined(MOZ_X11) && (MOZ_WIDGET_GTK == 2)
|
|
|
|
PRLibrary *gnomeuiLib = PR_LoadLibrary("libgnomeui-2.so.0");
|
|
if (!gnomeuiLib)
|
|
return NS_OK;
|
|
|
|
PRLibrary *gnomeLib = PR_LoadLibrary("libgnome-2.so.0");
|
|
if (!gnomeLib) {
|
|
PR_UnloadLibrary(gnomeuiLib);
|
|
return NS_OK;
|
|
}
|
|
|
|
_gnome_program_init_fn gnome_program_init =
|
|
(_gnome_program_init_fn)PR_FindFunctionSymbol(gnomeLib, "gnome_program_init");
|
|
_gnome_program_get_fn gnome_program_get =
|
|
(_gnome_program_get_fn)PR_FindFunctionSymbol(gnomeLib, "gnome_program_get");
|
|
_libgnomeui_module_info_get_fn libgnomeui_module_info_get = (_libgnomeui_module_info_get_fn)PR_FindFunctionSymbol(gnomeuiLib, "libgnomeui_module_info_get");
|
|
if (!gnome_program_init || !gnome_program_get || !libgnomeui_module_info_get) {
|
|
PR_UnloadLibrary(gnomeuiLib);
|
|
PR_UnloadLibrary(gnomeLib);
|
|
return NS_OK;
|
|
}
|
|
|
|
#endif /* MOZ_X11 && (MOZ_WIDGET_GTK == 2) */
|
|
|
|
#ifdef ACCESSIBILITY
|
|
// We will load gail, atk-bridge by ourself later
|
|
// We can't run atk-bridge init here, because gail get the control
|
|
// Set GNOME_ACCESSIBILITY to 0 can avoid this
|
|
static const char *accEnv = "GNOME_ACCESSIBILITY";
|
|
const char *accOldValue = getenv(accEnv);
|
|
setenv(accEnv, "0", 1);
|
|
#endif
|
|
|
|
#if defined(MOZ_X11) && (MOZ_WIDGET_GTK == 2)
|
|
if (!gnome_program_get()) {
|
|
gnome_program_init("Gecko", "1.0", libgnomeui_module_info_get(),
|
|
gArgc, gArgv, nullptr);
|
|
}
|
|
#endif /* MOZ_X11 && (MOZ_WIDGET_GTK == 2) */
|
|
|
|
#ifdef ACCESSIBILITY
|
|
if (accOldValue) {
|
|
setenv(accEnv, accOldValue, 1);
|
|
} else {
|
|
unsetenv(accEnv);
|
|
}
|
|
#endif
|
|
|
|
// Careful! These libraries cannot be unloaded after this point because
|
|
// gnome_program_init causes atexit handlers to be registered. Strange
|
|
// crashes will occur if these libraries are unloaded.
|
|
|
|
// TODO GTK3 - see Bug 694570 - Stop using libgnome and libgnomeui on Linux
|
|
#if defined(MOZ_X11) && (MOZ_WIDGET_GTK == 2)
|
|
gnome_client_set_restart_command = (_gnome_client_set_restart_command_fn)
|
|
PR_FindFunctionSymbol(gnomeuiLib, "gnome_client_set_restart_command");
|
|
|
|
_gnome_master_client_fn gnome_master_client = (_gnome_master_client_fn)
|
|
PR_FindFunctionSymbol(gnomeuiLib, "gnome_master_client");
|
|
|
|
GnomeClient *client = gnome_master_client();
|
|
g_signal_connect(client, "save-yourself", G_CALLBACK(save_yourself_cb), nullptr);
|
|
g_signal_connect(client, "die", G_CALLBACK(die_cb), nullptr);
|
|
|
|
// Set the correct/requested restart command in any case.
|
|
|
|
// Is there a request to suppress default binary launcher?
|
|
nsAutoCString path;
|
|
char* argv1 = getenv("MOZ_APP_LAUNCHER");
|
|
|
|
if(!argv1) {
|
|
// Tell the desktop the command for restarting us so that we can be part of XSMP session restore
|
|
NS_ASSERTION(gDirServiceProvider, "gDirServiceProvider is NULL! This shouldn't happen!");
|
|
nsCOMPtr<nsIFile> executablePath;
|
|
nsresult rv;
|
|
|
|
bool dummy;
|
|
rv = gDirServiceProvider->GetFile(XRE_EXECUTABLE_FILE, &dummy, getter_AddRefs(executablePath));
|
|
|
|
if (NS_SUCCEEDED(rv)) {
|
|
// Strip off the -bin suffix to get the shell script we should run; this is what Breakpad does
|
|
nsAutoCString leafName;
|
|
rv = executablePath->GetNativeLeafName(leafName);
|
|
if (NS_SUCCEEDED(rv) && StringEndsWith(leafName, NS_LITERAL_CSTRING("-bin"))) {
|
|
leafName.SetLength(leafName.Length() - strlen("-bin"));
|
|
executablePath->SetNativeLeafName(leafName);
|
|
}
|
|
|
|
executablePath->GetNativePath(path);
|
|
argv1 = (char*)(path.get());
|
|
}
|
|
}
|
|
|
|
if (argv1) {
|
|
gnome_client_set_restart_command(client, 1, &argv1);
|
|
}
|
|
#endif /* MOZ_X11 && (MOZ_WIDGET_GTK == 2) */
|
|
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
nsNativeAppSupportUnix::Stop(bool *aResult)
|
|
{
|
|
NS_ENSURE_ARG(aResult);
|
|
*aResult = true;
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
nsNativeAppSupportUnix::Enable()
|
|
{
|
|
return NS_OK;
|
|
}
|
|
|
|
nsresult
|
|
NS_CreateNativeAppSupport(nsINativeAppSupport **aResult)
|
|
{
|
|
nsNativeAppSupportBase* native = new nsNativeAppSupportUnix();
|
|
if (!native)
|
|
return NS_ERROR_OUT_OF_MEMORY;
|
|
|
|
*aResult = native;
|
|
NS_ADDREF(*aResult);
|
|
|
|
return NS_OK;
|
|
}
|