/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* vim: set sw=4 ts=8 et tw=80 : */ /* 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/. */ #ifndef mozilla_dom_ContentParent_h #define mozilla_dom_ContentParent_h #include "base/waitable_event_watcher.h" #include "mozilla/dom/PContentParent.h" #include "mozilla/dom/PMemoryReportRequestParent.h" #include "mozilla/dom/TabContext.h" #include "mozilla/ipc/GeckoChildProcessHost.h" #include "mozilla/dom/ipc/Blob.h" #include "mozilla/Attributes.h" #include "nsFrameMessageManager.h" #include "nsIObserver.h" #include "nsIThreadInternal.h" #include "nsNetUtil.h" #include "nsIPermissionManager.h" #include "nsIDOMGeoPositionCallback.h" #include "nsIMemoryReporter.h" #include "nsCOMArray.h" #include "nsDataHashtable.h" #include "nsHashKeys.h" #define CHILD_PROCESS_SHUTDOWN_MESSAGE NS_LITERAL_STRING("child-process-shutdown") class mozIApplication; class nsConsoleService; class nsIDOMBlob; namespace mozilla { namespace ipc { class OptionalURIParams; class URIParams; class TestShellParent; } // namespace ipc namespace layers { class PCompositorParent; } // namespace layers namespace dom { class TabParent; class PStorageParent; class ClonedMessageData; class ContentParent : public PContentParent , public nsIObserver , public nsIThreadObserver , public nsIDOMGeoPositionCallback , public mozilla::dom::ipc::MessageManagerCallback { typedef mozilla::ipc::GeckoChildProcessHost GeckoChildProcessHost; typedef mozilla::ipc::OptionalURIParams OptionalURIParams; typedef mozilla::ipc::TestShellParent TestShellParent; typedef mozilla::ipc::URIParams URIParams; typedef mozilla::dom::ClonedMessageData ClonedMessageData; public: /** * Start up the content-process machinery. This might include * scheduling pre-launch tasks. */ static void StartUp(); /** Shut down the content-process machinery. */ static void ShutDown(); static ContentParent* GetNewOrUsed(bool aForBrowserElement = false); /** * Get or create a content process for the given TabContext. */ static TabParent* CreateBrowserOrApp(const TabContext& aContext); static void GetAll(nsTArray& aArray); NS_DECL_ISUPPORTS NS_DECL_NSIOBSERVER NS_DECL_NSITHREADOBSERVER NS_DECL_NSIDOMGEOPOSITIONCALLBACK /** * MessageManagerCallback methods that we override. */ virtual bool DoSendAsyncMessage(const nsAString& aMessage, const mozilla::dom::StructuredCloneData& aData); virtual bool CheckPermission(const nsAString& aPermission); /** Notify that a tab was destroyed during normal operation. */ void NotifyTabDestroyed(PBrowserParent* aTab); TestShellParent* CreateTestShell(); bool DestroyTestShell(TestShellParent* aTestShell); TestShellParent* GetTestShellSingleton(); void ReportChildAlreadyBlocked(); bool RequestRunToCompletion(); bool IsAlive(); bool IsForApp(); void SetChildMemoryReporters(const InfallibleTArray& report); GeckoChildProcessHost* Process() { return mSubprocess; } bool NeedsPermissionsUpdate() { return mSendPermissionUpdates; } BlobParent* GetOrCreateActorForBlob(nsIDOMBlob* aBlob); /** * Kill our subprocess and make sure it dies. Should only be used * in emergency situations since it bypasses the normal shutdown * process. */ void KillHard(); protected: void OnChannelConnected(int32_t pid); virtual void ActorDestroy(ActorDestroyReason why); private: typedef base::ChildPrivileges ChildOSPrivileges; static nsDataHashtable *gAppContentParents; static nsTArray* gNonAppContentParents; static nsTArray* gPrivateContent; static void PreallocateAppProcess(); static void DelayedPreallocateAppProcess(); static void ScheduleDelayedPreallocateAppProcess(); static already_AddRefed MaybeTakePreallocatedAppProcess(); static void FirstIdle(); // Hide the raw constructor methods since we don't want client code // using them. using PContentParent::SendPBrowserConstructor; using PContentParent::SendPTestShellConstructor; ContentParent(const nsAString& aAppManifestURL, bool aIsForBrowser, ChildOSPrivileges aOSPrivileges = base::PRIVILEGES_DEFAULT); virtual ~ContentParent(); void Init(); // Transform a pre-allocated app process into a "real" app // process, for the specified manifest URL. void SetManifestFromPreallocated(const nsAString& aAppManifestURL); /** * Mark this ContentParent as dead for the purposes of Get*(). * This method is idempotent. */ void MarkAsDead(); /** * Exit the subprocess and vamoose. After this call IsAlive() * will return false and this ContentParent will not be returned * by the Get*() funtions. However, the shutdown sequence itself * may be asynchronous. */ void ShutDownProcess(); PCompositorParent* AllocPCompositor(mozilla::ipc::Transport* aTransport, base::ProcessId aOtherProcess) MOZ_OVERRIDE; PImageBridgeParent* AllocPImageBridge(mozilla::ipc::Transport* aTransport, base::ProcessId aOtherProcess) MOZ_OVERRIDE; virtual bool RecvGetProcessAttributes(uint64_t* aId, bool* aStartBackground, bool* aIsForApp, bool* aIsForBrowser) MOZ_OVERRIDE; virtual bool RecvGetXPCOMProcessAttributes(bool* aIsOffline) MOZ_OVERRIDE; virtual PBrowserParent* AllocPBrowser(const IPCTabContext& aContext, const uint32_t& aChromeFlags); virtual bool DeallocPBrowser(PBrowserParent* frame); virtual PDeviceStorageRequestParent* AllocPDeviceStorageRequest(const DeviceStorageParams&); virtual bool DeallocPDeviceStorageRequest(PDeviceStorageRequestParent*); virtual PBlobParent* AllocPBlob(const BlobConstructorParams& aParams); virtual bool DeallocPBlob(PBlobParent*); virtual PCrashReporterParent* AllocPCrashReporter(const NativeThreadId& tid, const uint32_t& processType); virtual bool DeallocPCrashReporter(PCrashReporterParent* crashreporter); virtual bool RecvPCrashReporterConstructor(PCrashReporterParent* actor, const NativeThreadId& tid, const uint32_t& processType); virtual PHalParent* AllocPHal() MOZ_OVERRIDE; virtual bool DeallocPHal(PHalParent*) MOZ_OVERRIDE; virtual PIndexedDBParent* AllocPIndexedDB(); virtual bool DeallocPIndexedDB(PIndexedDBParent* aActor); virtual bool RecvPIndexedDBConstructor(PIndexedDBParent* aActor); virtual PMemoryReportRequestParent* AllocPMemoryReportRequest(); virtual bool DeallocPMemoryReportRequest(PMemoryReportRequestParent* actor); virtual PTestShellParent* AllocPTestShell(); virtual bool DeallocPTestShell(PTestShellParent* shell); virtual PNeckoParent* AllocPNecko(); virtual bool DeallocPNecko(PNeckoParent* necko); virtual PExternalHelperAppParent* AllocPExternalHelperApp( const OptionalURIParams& aUri, const nsCString& aMimeContentType, const nsCString& aContentDisposition, const bool& aForceSave, const int64_t& aContentLength, const OptionalURIParams& aReferrer); virtual bool DeallocPExternalHelperApp(PExternalHelperAppParent* aService); virtual PSmsParent* AllocPSms(); virtual bool DeallocPSms(PSmsParent*); virtual PStorageParent* AllocPStorage(const StorageConstructData& aData); virtual bool DeallocPStorage(PStorageParent* aActor); virtual PBluetoothParent* AllocPBluetooth(); virtual bool DeallocPBluetooth(PBluetoothParent* aActor); virtual bool RecvPBluetoothConstructor(PBluetoothParent* aActor); virtual bool RecvReadPrefsArray(InfallibleTArray* aPrefs); virtual bool RecvReadFontList(InfallibleTArray* retValue); virtual bool RecvReadPermissions(InfallibleTArray* aPermissions); virtual bool RecvSetClipboardText(const nsString& text, const bool& isPrivateData, const int32_t& whichClipboard); virtual bool RecvGetClipboardText(const int32_t& whichClipboard, nsString* text); virtual bool RecvEmptyClipboard(); virtual bool RecvClipboardHasText(bool* hasText); virtual bool RecvGetSystemColors(const uint32_t& colorsCount, InfallibleTArray* colors); virtual bool RecvGetIconForExtension(const nsCString& aFileExt, const uint32_t& aIconSize, InfallibleTArray* bits); virtual bool RecvGetShowPasswordSetting(bool* showPassword); virtual bool RecvStartVisitedQuery(const URIParams& uri); virtual bool RecvVisitURI(const URIParams& uri, const OptionalURIParams& referrer, const uint32_t& flags); virtual bool RecvSetURITitle(const URIParams& uri, const nsString& title); virtual bool RecvShowFilePicker(const int16_t& mode, const int16_t& selectedType, const bool& addToRecentDocs, const nsString& title, const nsString& defaultFile, const nsString& defaultExtension, const InfallibleTArray& filters, const InfallibleTArray& filterNames, InfallibleTArray* files, int16_t* retValue, nsresult* result); virtual bool RecvShowAlertNotification(const nsString& aImageUrl, const nsString& aTitle, const nsString& aText, const bool& aTextClickable, const nsString& aCookie, const nsString& aName); virtual bool RecvLoadURIExternal(const URIParams& uri); virtual bool RecvSyncMessage(const nsString& aMsg, const ClonedMessageData& aData, InfallibleTArray* aRetvals); virtual bool RecvAsyncMessage(const nsString& aMsg, const ClonedMessageData& aData); virtual bool RecvAddGeolocationListener(); virtual bool RecvRemoveGeolocationListener(); virtual bool RecvConsoleMessage(const nsString& aMessage); virtual bool RecvScriptError(const nsString& aMessage, const nsString& aSourceName, const nsString& aSourceLine, const uint32_t& aLineNumber, const uint32_t& aColNumber, const uint32_t& aFlags, const nsCString& aCategory); virtual bool RecvPrivateDocShellsExist(const bool& aExist); virtual bool RecvFirstIdle(); virtual bool RecvAudioChannelGetMuted(const AudioChannelType& aType, const bool& aMozHidden, bool* aValue); virtual bool RecvAudioChannelRegisterType(const AudioChannelType& aType); virtual bool RecvAudioChannelUnregisterType(const AudioChannelType& aType); virtual void ProcessingError(Result what) MOZ_OVERRIDE; GeckoChildProcessHost* mSubprocess; ChildOSPrivileges mOSPrivileges; uint64_t mChildID; int32_t mGeolocationWatchID; int mRunToCompletionDepth; bool mShouldCallUnblockChild; // This is a cache of all of the memory reporters // registered in the child process. To update this, one // can broadcast the topic "child-memory-reporter-request" using // the nsIObserverService. nsCOMArray mMemoryReporters; const nsString mAppManifestURL; nsRefPtr mMessageManager; // True only while this is ready to be used to host remote tabs. // This must not be used for new purposes after mIsAlive goes to // false, but some previously scheduled IPC traffic may still pass // through. bool mIsAlive; // True after the OS-level shutdown sequence has been initiated. // After going true, any use of this at all, including lingering // IPC traffic passing through, will cause assertions to fail. bool mIsDestroyed; bool mSendPermissionUpdates; bool mIsForBrowser; friend class CrashReporterParent; nsRefPtr mConsoleService; nsConsoleService* GetConsoleService(); }; } // namespace dom } // namespace mozilla #endif