gecko-dev/toolkit/xre/Bootstrap.h
Jim Chen 53a1107cd1 Bug 1343075 - Use GeckoEditableSupport from PuppetWidget; r=masayuki r=rbarker r=snorp r=esawin
Bug 1343075 - 1a. Add TextEventDispatcherListener::GetIMEUpdatePreference; r=masayuki

Add a GetIMEUpdatePreference method to TextEventDispatcherListener to
optionally control which IME notifications are received by NotifyIME.
This patch also makes nsBaseWidget forward its GetIMEUpdatePreference
call to the widget's native TextEventDispatcherListener.

Bug 1343075 - 1b. Implement GetIMEUpdatePreference for all TextEventDispatcherListener; r=masayuki

This patch implements GetIMEUpdatePreference for all
TextEventDispatcherListener implementations, by moving previous
implementations of nsIWidget::GetIMEUpdatePreference.

Bug 1343075 - 2. Allow setting a PuppetWidget's native TextEventDispatcherListener; r=masayuki

In PuppetWidget, add getter and setter for the widget's native
TextEventDispatcherListener. This allows overriding of PuppetWidget's
default IME handling. For example, on Android, the PuppetWidget's native
TextEventDispatcherListener will communicate directly with Java IME code
in the main process.

Bug 1343075 - 3. Add AIDL interface for main process; r=rbarker

Add AIDL definition and implementation for an interface for the main
process that child processes can access.

Bug 1343075 - 4. Set Gecko thread JNIEnv for child process; r=snorp

Add a JNIEnv* parameter to XRE_SetAndroidChildFds, which is used to set
the Gecko thread JNIEnv for child processes. XRE_SetAndroidChildFds is
the only Android-specific entry point for child processes, so I think
it's the most logical place to initialize JNI.

Bug 1343075 - 5. Support multiple remote GeckoEditableChild; r=esawin

Support remote GeckoEditableChild instances that are created in the
content processes and connect to the parent process GeckoEditableParent
through binders.

Support having multiple GeckoEditableChild instances in GeckoEditable by
keeping track of which child is currently focused, and only allow
calls to/from the focused child by using access tokens.

Bug 1343075 - 6. Add method to get GeckoEditableParent instance; r=esawin

Add IProcessManager.getEditableParent, which a content process can call
to get the GeckoEditableParent instance that corresponds to a given
content process tab, from the main process.

Bug 1343075 - 7. Support GeckoEditableSupport in content processes; r=esawin

Support creating and running GeckoEditableSupport attached to a
PuppetWidget in content processes.

Because we don't know PuppetWidget's lifetime as well as nsWindow's,
when attached to PuppetWidget, we need to attach/detach our native
object on focus/blur, respectively.

Bug 1343075 - 8. Connect GeckoEditableSupport on PuppetWidget creation; r=esawin

Listen to the "tab-child-created" notification and attach our content
process GeckoEditableSupport to the new PuppetWidget.

Bug 1343075 - 9. Update auto-generated bindings; r=me
2017-03-07 22:34:39 -05:00

153 lines
4.3 KiB
C++

/* -*- Mode: C++; tab-width: 8; 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/. */
/**
* This file represents the only external interface exposed from libxul. It
* is used by the various stub binaries (nsBrowserApp, xpcshell,
* plugin-container) to initialize XPCOM and start their main loop.
*/
#ifndef mozilla_Bootstrap_h
#define mozilla_Bootstrap_h
#include "mozilla/UniquePtr.h"
#include "nscore.h"
#include "nsXULAppAPI.h"
#ifdef MOZ_WIDGET_ANDROID
#include "jni.h"
extern "C" NS_EXPORT
void GeckoStart(JNIEnv* aEnv, char** argv, int argc, const mozilla::StaticXREAppData& aAppData);
#endif
#if defined(XP_WIN) && defined(MOZ_SANDBOX)
namespace sandbox {
class BrokerServices;
}
#endif
namespace mozilla {
#if defined(XP_WIN) && defined(MOZ_SANDBOX)
namespace sandboxing {
class PermissionsService;
}
#endif
struct BootstrapConfig
{
#if defined(XP_WIN) && defined(MOZ_SANDBOX)
/* Chromium sandbox BrokerServices. */
sandbox::BrokerServices* sandboxBrokerServices;
sandboxing::PermissionsService* sandboxPermissionsService;
#endif
/* Pointer to static XRE AppData from application.ini.h */
const StaticXREAppData* appData;
/* When the pointer above is null, points to the (string) path of an
* application.ini file to open and parse.
* When the pointer above is non-null, may indicate the directory where
* application files are, relative to the XRE. */
const char* appDataPath;
};
/**
* This class is virtual abstract so that using it does not require linking
* any symbols. The singleton instance of this class is obtained from the
* exported method XRE_GetBootstrap.
*/
class Bootstrap
{
protected:
Bootstrap() { }
// Because of allocator mismatches, code outside libxul shouldn't delete a
// Bootstrap instance. Use Dispose().
virtual ~Bootstrap() { }
/**
* Destroy and deallocate this Bootstrap instance.
*/
virtual void Dispose() = 0;
/**
* Helper class to use with UniquePtr.
*/
class BootstrapDelete
{
public:
constexpr BootstrapDelete() { }
void operator()(Bootstrap* aPtr) const
{
aPtr->Dispose();
}
};
public:
typedef mozilla::UniquePtr<Bootstrap, BootstrapDelete> UniquePtr;
virtual void NS_LogInit() = 0;
virtual void NS_LogTerm() = 0;
virtual void XRE_TelemetryAccumulate(int aID, uint32_t aSample) = 0;
virtual void XRE_StartupTimelineRecord(int aEvent, mozilla::TimeStamp aWhen) = 0;
virtual int XRE_main(int argc, char* argv[], const BootstrapConfig& aConfig) = 0;
virtual void XRE_StopLateWriteChecks() = 0;
virtual int XRE_XPCShellMain(int argc, char** argv, char** envp, const XREShellData* aShellData) = 0;
virtual GeckoProcessType XRE_GetProcessType() = 0;
virtual void XRE_SetProcessType(const char* aProcessTypeString) = 0;
virtual nsresult XRE_InitChildProcess(int argc, char* argv[], const XREChildData* aChildData) = 0;
virtual void XRE_EnableSameExecutableForContentProc() = 0;
#ifdef MOZ_WIDGET_ANDROID
virtual void GeckoStart(JNIEnv* aEnv, char** argv, int argc, const StaticXREAppData& aAppData) = 0;
virtual void XRE_SetAndroidChildFds(JNIEnv* aEnv, int aCrashFd, int aIPCFd) = 0;
#endif
#ifdef LIBFUZZER
virtual void XRE_LibFuzzerSetDriver(LibFuzzerDriver aDriver) = 0;
#endif
#ifdef MOZ_IPDL_TESTS
virtual int XRE_RunIPDLTest(int argc, char **argv) = 0;
#endif
};
/**
* Creates and returns the singleton instnace of the bootstrap object.
* @param `b` is an outparam. We use a parameter and not a return value
* because MSVC doesn't let us return a c++ class from a function with
* "C" linkage. On failure this will be null.
* @note This function may only be called once and will crash if called again.
*/
#ifdef XPCOM_GLUE
typedef void (*GetBootstrapType)(Bootstrap::UniquePtr&);
Bootstrap::UniquePtr GetBootstrap(const char* aXPCOMFile=nullptr);
#else
extern "C" NS_EXPORT void NS_FROZENCALL
XRE_GetBootstrap(Bootstrap::UniquePtr& b);
inline Bootstrap::UniquePtr
GetBootstrap(const char* aXPCOMFile=nullptr) {
Bootstrap::UniquePtr bootstrap;
XRE_GetBootstrap(bootstrap);
return bootstrap;
}
#endif
} // namespace mozilla
#endif // mozilla_Bootstrap_h