/* -*- Mode: C++; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 8 -*- */ /* vim: set sw=4 ts=8 et tw=80 ft=cpp : */ /* 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 protocol PAsmJSCacheEntry; include protocol PBackground; include protocol PBlob; include protocol PBluetooth; include protocol PBrowser; include protocol PCellBroadcast; include protocol PCompositor; include protocol PContentBridge; include protocol PCycleCollectWithLogs; include protocol PCrashReporter; include protocol PDocAccessible; include protocol PExternalHelperApp; include protocol PDeviceStorageRequest; include protocol PFileDescriptorSet; include protocol PFMRadio; include protocol PFileSystemRequest; include protocol PHal; include protocol PProcessHangMonitor; include protocol PImageBridge; include protocol PMemoryReportRequest; include protocol PMobileConnection; include protocol PNecko; include protocol PPluginModule; include protocol PPrinting; include protocol POfflineCacheUpdate; include protocol PScreenManager; include protocol PSharedBufferManager; include protocol PSms; include protocol PSpeechSynthesis; include protocol PStorage; include protocol PTelephony; include protocol PTestShell; include protocol PVoicemail; include protocol PJavaScript; include protocol PRemoteSpellcheckEngine; include DOMTypes; include JavaScriptTypes; include InputStreamParams; include PTabContext; include URIParams; include PluginTypes; include ProtocolTypes; // Workaround to prevent error if PContentChild.cpp & PContentBridgeParent.cpp // are put into different UnifiedProtocolsXX.cpp files. // XXX Remove this once bug 1069073 is fixed include "mozilla/dom/PContentBridgeParent.h"; include "mozilla/dom/indexedDB/SerializationHelpers.h"; using GeoPosition from "nsGeoPositionIPCSerialiser.h"; using struct ChromePackage from "mozilla/chrome/RegistryMessageUtils.h"; using struct ResourceMapping from "mozilla/chrome/RegistryMessageUtils.h"; using struct OverrideMapping from "mozilla/chrome/RegistryMessageUtils.h"; using base::ChildPrivileges from "base/process_util.h"; using base::ProcessId from "base/process.h"; using struct IPC::Permission from "mozilla/net/NeckoMessageUtils.h"; using class IPC::Principal from "mozilla/dom/PermissionMessageUtils.h"; using struct mozilla::null_t from "ipc/IPCMessageUtils.h"; using struct mozilla::void_t from "ipc/IPCMessageUtils.h"; using mozilla::dom::asmjscache::OpenMode from "mozilla/dom/asmjscache/AsmJSCache.h"; using mozilla::dom::asmjscache::WriteParams from "mozilla/dom/asmjscache/AsmJSCache.h"; using mozilla::dom::AudioChannel from "mozilla/dom/AudioChannelBinding.h"; using mozilla::dom::AudioChannelState from "AudioChannelCommon.h"; using mozilla::dom::NativeThreadId from "mozilla/dom/TabMessageUtils.h"; using mozilla::dom::quota::PersistenceType from "mozilla/dom/quota/PersistenceType.h"; using mozilla::hal::ProcessPriority from "mozilla/HalTypes.h"; using gfxIntSize from "nsSize.h"; using mozilla::dom::TabId from "mozilla/dom/ipc/IdType.h"; using mozilla::dom::ContentParentId from "mozilla/dom/ipc/IdType.h"; union ChromeRegistryItem { ChromePackage; OverrideMapping; ResourceMapping; }; namespace mozilla { namespace dom { struct FontListEntry { nsString familyName; nsString faceName; nsCString filepath; uint16_t weight; int16_t stretch; uint8_t italic; uint8_t index; bool isHidden; }; struct DeviceStorageFreeSpaceParams { nsString type; nsString storageName; }; struct DeviceStorageUsedSpaceParams { nsString type; nsString storageName; }; struct DeviceStorageAvailableParams { nsString type; nsString storageName; }; struct DeviceStorageStatusParams { nsString type; nsString storageName; }; struct DeviceStorageFormatParams { nsString type; nsString storageName; }; struct DeviceStorageMountParams { nsString type; nsString storageName; }; struct DeviceStorageUnmountParams { nsString type; nsString storageName; }; struct DeviceStorageAddParams { nsString type; nsString storageName; nsString relpath; PBlob blob; }; struct DeviceStorageAppendParams { nsString type; nsString storageName; nsString relpath; PBlob blob; }; struct DeviceStorageCreateFdParams { nsString type; nsString storageName; nsString relpath; }; struct DeviceStorageGetParams { nsString type; nsString storageName; nsString rootDir; nsString relpath; }; struct DeviceStorageDeleteParams { nsString type; nsString storageName; nsString relpath; }; struct DeviceStorageEnumerationParams { nsString type; nsString storageName; nsString rootdir; uint64_t since; }; union DeviceStorageParams { DeviceStorageAddParams; DeviceStorageAppendParams; DeviceStorageCreateFdParams; DeviceStorageGetParams; DeviceStorageDeleteParams; DeviceStorageEnumerationParams; DeviceStorageFreeSpaceParams; DeviceStorageUsedSpaceParams; DeviceStorageAvailableParams; DeviceStorageStatusParams; DeviceStorageFormatParams; DeviceStorageMountParams; DeviceStorageUnmountParams; }; struct FMRadioRequestEnableParams { double frequency; }; struct FMRadioRequestDisableParams { }; struct FMRadioRequestSetFrequencyParams { double frequency; }; struct FMRadioRequestSeekParams { bool upward; }; struct FMRadioRequestCancelSeekParams { }; union FMRadioRequestParams { FMRadioRequestEnableParams; FMRadioRequestDisableParams; FMRadioRequestSetFrequencyParams; FMRadioRequestSeekParams; FMRadioRequestCancelSeekParams; }; struct FileSystemCreateDirectoryParams { nsString filesystem; nsString realPath; }; union FileSystemFileDataValue { uint8_t[]; PBlob; }; struct FileSystemCreateFileParams { nsString filesystem; nsString realPath; FileSystemFileDataValue data; bool replace; }; struct FileSystemGetFileOrDirectoryParams { nsString filesystem; nsString realPath; }; union FileSystemPathOrFileValue { nsString; PBlob; }; struct FileSystemRemoveParams { nsString filesystem; nsString directory; FileSystemPathOrFileValue target; bool recursive; }; union FileSystemParams { FileSystemCreateDirectoryParams; FileSystemCreateFileParams; FileSystemGetFileOrDirectoryParams; FileSystemRemoveParams; }; union PrefValue { nsCString; int32_t; bool; }; union MaybePrefValue { PrefValue; null_t; }; struct PrefSetting { nsCString name; MaybePrefValue defaultValue; MaybePrefValue userValue; }; struct DataStoreSetting { nsString name; nsString originURL; nsString manifestURL; bool readOnly; bool enabled; }; // Note: Any changes to this structure should also be changed in // FileSystemUpdate below. struct VolumeInfo { nsString name; nsString mountPoint; int32_t volState; int32_t mountGeneration; bool isMediaPresent; bool isSharing; bool isFormatting; bool isFake; bool isUnmounting; bool isRemovable; bool isHotSwappable; }; struct ClipboardCapabilities { bool supportsSelectionClipboard; bool supportsFindClipboard; }; union MaybeFileDesc { FileDescriptor; void_t; }; union OptionalContentId { ContentParentId; void_t; }; prio(normal upto urgent) sync protocol PContent { parent spawns PPluginModule; parent opens PCompositor; parent opens PProcessHangMonitor; parent opens PSharedBufferManager; parent opens PImageBridge; child opens PBackground; manages PAsmJSCacheEntry; manages PBlob; manages PBluetooth; manages PBrowser; manages PCellBroadcast; manages PCrashReporter; manages PCycleCollectWithLogs; manages PDocAccessible; manages PDeviceStorageRequest; manages PFileSystemRequest; manages PExternalHelperApp; manages PFileDescriptorSet; manages PFMRadio; manages PHal; manages PMemoryReportRequest; manages PMobileConnection; manages PNecko; manages POfflineCacheUpdate; manages PPrinting; manages PScreenManager; manages PSms; manages PSpeechSynthesis; manages PStorage; manages PTelephony; manages PTestShell; manages PVoicemail; manages PJavaScript; manages PRemoteSpellcheckEngine; both: // Depending on exactly how the new browser is being created, it might be // created from either the child or parent process! // // The child creates the PBrowser as part of // TabChild::BrowserFrameProvideWindow (which happens when the child's // content calls window.open()), and the parent creates the PBrowser as part // of ContentParent::CreateBrowserOrApp. // // When the parent constructs a PBrowser, the child trusts the app token it // receives from the parent. In that case, context can be any of the // IPCTabContext subtypes. // // When the child constructs a PBrowser, the parent doesn't trust the app // token it receives from the child. In this case, context must have type // PopupIPCTabContext. The browser created using a PopupIPCTabContext has // the opener PBrowser's app-id and containing-app-id. The parent checks // that if the opener is a browser element, the context is also for a // browser element. // // This allows the parent to prevent a malicious child from escalating its // privileges by requesting a PBrowser corresponding to a highly-privileged // app; the child can only request privileges for an app which the child has // access to (in the form of a TabChild). // // Keep the last 3 attributes in sync with GetProcessAttributes! async PBrowser(TabId tabId, IPCTabContext context, uint32_t chromeFlags, ContentParentId cpId, bool isForApp, bool isForBrowser); async PBlob(BlobConstructorParams params); PFileDescriptorSet(FileDescriptor fd); child: /** * Enable system-level sandboxing features, if available. Can * usually only be performed zero or one times. The child may * abnormally exit if this fails; the details are OS-specific. */ async SetProcessSandbox(); PMemoryReportRequest(uint32_t generation, bool anonymize, bool minimizeMemoryUsage, MaybeFileDesc DMDFile); /** * Notify the AudioChannelService in the child processes. */ async AudioChannelNotify(); async SpeakerManagerNotify(); async DataStoreNotify(uint32_t aAppId, nsString aName, nsString aManifestURL); /** * Dump this process's GC and CC logs to the provided files. * * For documentation on the other args, see dumpGCAndCCLogsToFile in * nsIMemoryInfoDumper.idl */ PCycleCollectWithLogs(bool dumpAllTraces, FileDescriptor gcLog, FileDescriptor ccLog); PTestShell(); RegisterChrome(ChromePackage[] packages, ResourceMapping[] resources, OverrideMapping[] overrides, nsCString locale, bool reset); RegisterChromeItem(ChromeRegistryItem item); async SetOffline(bool offline); async NotifyVisited(URIParams uri); async SystemMemoryAvailable(uint64_t getterId, uint32_t memoryAvailable); PreferenceUpdate(PrefSetting pref); NotifyAlertsObserver(nsCString topic, nsString data); GeolocationUpdate(GeoPosition somewhere); GeolocationError(uint16_t errorCode); UpdateDictionaryList(nsString[] dictionaries); // nsIPermissionManager messages AddPermission(Permission permission); ScreenSizeChanged(gfxIntSize size); Volumes(VolumeInfo[] volumes); FlushMemory(nsString reason); GarbageCollect(); CycleCollect(); /** * Start accessibility engine in content process. */ ActivateA11y(); AppInfo(nsCString version, nsCString buildID, nsCString name, nsCString UAName, nsCString ID, nsCString vendor); // Notify child that last-pb-context-exited notification was observed LastPrivateDocShellDestroyed(); FilePathUpdate(nsString storageType, nsString storageName, nsString filepath, nsCString reasons); // Note: Any changes to this structure should also be changed in // VolumeInfo above. FileSystemUpdate(nsString fsName, nsString mountPoint, int32_t fsState, int32_t mountGeneration, bool isMediaPresent, bool isSharing, bool isFormatting, bool isFake, bool isUnmounting, bool isRemovable, bool isHotSwappable); // Ask the Nuwa process to create a new child process. NuwaFork(); NotifyProcessPriorityChanged(ProcessPriority priority); MinimizeMemoryUsage(); /** * Used to manage nsIStyleSheetService across processes. */ async LoadAndRegisterSheet(URIParams uri, uint32_t type); async UnregisterSheet(URIParams uri, uint32_t type); NotifyPhoneStateChange(nsString newState); /** * Notify idle observers in the child */ NotifyIdleObserver(uint64_t observerId, nsCString topic, nsString str); /** * Notify windows in the child to apply a new app style. */ OnAppThemeChanged(); /** * Called during plugin initialization to map a plugin id to a child process * id. */ async AssociatePluginId(uint32_t aPluginId, ProcessId aProcessId); /** * This call is used by async plugin initialization to notify the * PluginModuleContentParent that the PluginModuleChromeParent's async * init has completed. */ async LoadPluginResult(uint32_t aPluginId, bool aResult); /** * Control the Gecko Profiler in the child process. */ async StartProfiler(uint32_t aEntries, double aInterval, nsCString[] aFeatures, nsCString[] aThreadNameFilters); async StopProfiler(); prio(high) sync GetProfile() returns (nsCString aProfile); NuwaFreeze(); /** * Notify the child to shutdown. The child will in turn call FinishShutdown * and let the parent close the channel. */ async Shutdown(); async LoadProcessScript(nsString url); parent: /** * Tell the parent process a new accessible document has been created. * aParentDoc is the accessible document it was created in if any, and * aParentAcc is the id of the accessible in that document the new document * is a child of. */ PDocAccessible(nullable PDocAccessible aParentDoc, uint64_t aParentAcc); /** * Tell the content process some attributes of itself. This is * among the first information queried by content processes after * startup. (The message is sync to allow the content process to * control when it receives the information.) * * |id| is a unique ID among all subprocesses. When |isForApp && * isForBrowser|, we're loading for an app. When * |isForBrowser|, we're loading . When |!isForApp && * !isForBrowser|, we're probably loading . * * Keep the return values in sync with PBrowser()! */ sync GetProcessAttributes() returns (ContentParentId cpId, bool isForApp, bool isForBrowser); sync GetXPCOMProcessAttributes() returns (bool isOffline, nsString[] dictionaries, ClipboardCapabilities clipboardCaps); sync CreateChildProcess(IPCTabContext context, ProcessPriority priority, TabId openerTabId) returns (ContentParentId cpId, bool isForApp, bool isForBrowser, TabId tabId); sync BridgeToChildProcess(ContentParentId cpId); /** * This call connects the content process to a plugin process. While this * call runs, a new PluginModuleParent will be created in the ContentChild * via bridging. The corresponding PluginModuleChild will live in the plugin * process. We use intr semantics here to ensure that the PluginModuleParent * allocation message is dispatched before LoadPlugin returns. */ sync LoadPlugin(uint32_t pluginId) returns (nsresult rv); /** * This call is used by asynchronous plugin instantiation to notify the * content parent that it is now safe to initiate the plugin bridge for * the specified plugin id. When this call returns, the requested bridge * connection has been made. */ sync ConnectPluginBridge(uint32_t aPluginId) returns (nsresult rv); /** * This call returns the set of plugins loaded in the chrome * process. However, in many cases this set will not have changed since the * last FindPlugins message. Consequently, the chrome process increments an * epoch number every time the set of plugins changes. The content process * sends up the last epoch it observed. If the epochs are the same, the * chrome process returns no plugins. Otherwise it returns a complete list. * * |pluginEpoch| is the epoch last observed by the content * process. |newPluginEpoch| is the current epoch in the chrome process. If * |pluginEpoch == newPluginEpoch|, then |plugins| will be left empty. */ sync FindPlugins(uint32_t pluginEpoch) returns (PluginTag[] plugins, uint32_t newPluginEpoch); async PJavaScript(); sync PRemoteSpellcheckEngine(); PDeviceStorageRequest(DeviceStorageParams params); PFileSystemRequest(FileSystemParams params); sync PCrashReporter(NativeThreadId tid, uint32_t processType); sync GetRandomValues(uint32_t length) returns (uint8_t[] randomValues); async GetSystemMemory(uint64_t getterId); sync IsSecureURI(uint32_t type, URIParams uri, uint32_t flags) returns (bool isSecureURI); PHal(); PMobileConnection(uint32_t clientId); PNecko(); PPrinting(); prio(high) sync PScreenManager() returns (uint32_t numberOfScreens, float systemDefaultScale, bool success); PCellBroadcast(); PSms(); PSpeechSynthesis(); PStorage(); PTelephony(); PVoicemail(); PBluetooth(); PFMRadio(); PAsmJSCacheEntry(OpenMode openMode, WriteParams write, Principal principal); // Services remoting async StartVisitedQuery(URIParams uri); async VisitURI(URIParams uri, OptionalURIParams referrer, uint32_t flags); async SetURITitle(URIParams uri, nsString title); async LoadURIExternal(URIParams uri); // PrefService message sync ReadPrefsArray() returns (PrefSetting[] prefs); sync ReadFontList() returns (FontListEntry[] retValue); sync SyncMessage(nsString aMessage, ClonedMessageData aData, CpowEntry[] aCpows, Principal aPrincipal) returns (nsString[] retval); prio(high) sync RpcMessage(nsString aMessage, ClonedMessageData aData, CpowEntry[] aCpows, Principal aPrincipal) returns (nsString[] retval); ShowAlertNotification(nsString imageUrl, nsString title, nsString text, bool textClickable, nsString cookie, nsString name, nsString bidi, nsString lang, nsString data, Principal principal, bool inPrivateBrowsing); CloseAlert(nsString name, Principal principal); PExternalHelperApp(OptionalURIParams uri, nsCString aMimeContentType, nsCString aContentDisposition, uint32_t aContentDispositionHint, nsString aContentDispositionFilename, bool aForceSave, int64_t aContentLength, OptionalURIParams aReferrer, nullable PBrowser aBrowser); AddGeolocationListener(Principal principal, bool highAccuracy); RemoveGeolocationListener(); SetGeolocationHigherAccuracy(bool enable); ConsoleMessage(nsString message); ScriptError(nsString message, nsString sourceName, nsString sourceLine, uint32_t lineNumber, uint32_t colNumber, uint32_t flags, nsCString category); // nsIPermissionManager messages sync ReadPermissions() returns (Permission[] permissions); SetClipboardText(nsString text, bool isPrivateData, int32_t whichClipboard); sync GetClipboardText(int32_t whichClipboard) returns (nsString text); EmptyClipboard(int32_t whichClipboard); sync ClipboardHasText(int32_t whichClipboard) returns (bool hasText); sync GetSystemColors(uint32_t colorsCount) returns (uint32_t[] colors); sync GetIconForExtension(nsCString aFileExt, uint32_t aIconSize) returns (uint8_t[] bits); sync GetShowPasswordSetting() returns (bool showPassword); // Notify the parent of the presence or absence of private docshells PrivateDocShellsExist(bool aExist); // Tell the parent that the child has gone idle for the first time async FirstIdle(); // Get Muted from the main AudioChannelService. sync AudioChannelGetState(AudioChannel aChannel, bool aElementHidden, bool aElementWasHidden) returns (AudioChannelState value); sync AudioChannelRegisterType(AudioChannel aChannel, bool aWithVideo); sync AudioChannelUnregisterType(AudioChannel aChannel, bool aElementHidden, bool aWithVideo); async AudioChannelChangedNotification(); async AudioChannelChangeDefVolChannel(int32_t aChannel, bool aHidden); sync DataStoreGetStores(nsString aName, nsString aOwner, Principal aPrincipal) returns (DataStoreSetting[] dataStores); async FilePathUpdateNotify(nsString aType, nsString aStorageName, nsString aFilepath, nsCString aReason); // Notify the parent that the child has finished handling a system message. async SystemMessageHandled(); NuwaReady(); // Sent when nuwa finished its initialization process and is waiting for // parent's signal to make it freeze. NuwaWaitForFreeze(); sync AddNewProcess(uint32_t pid, ProtocolFdMapping[] aFds); // called by the child (test code only) to propagate volume changes to the parent async CreateFakeVolume(nsString fsName, nsString mountPoint); async SetFakeVolumeState(nsString fsName, int32_t fsState); sync KeywordToURI(nsCString keyword) returns (nsString providerName, OptionalInputStreamParams postData, OptionalURIParams uri); sync NotifyKeywordSearchLoading(nsString providerName, nsString keyword); // Tell the compositor to allocate a layer tree id for nested remote mozbrowsers. sync AllocateLayerTreeId() returns (uint64_t id); async DeallocateLayerTreeId(uint64_t id); sync SpeakerManagerForceSpeaker(bool aEnable); sync SpeakerManagerGetSpeakerStatus() returns (bool value); /** * Notifies the parent about a recording device is starting or shutdown. * @param recordingStatus starting or shutdown * @param pageURL URL that request that changing the recording status * @param isAudio recording start with microphone * @param isVideo recording start with camera */ async RecordingDeviceEvents(nsString recordingStatus, nsString pageURL, bool isAudio, bool isVideo); sync GetGraphicsFeatureStatus(int32_t aFeature) returns (int32_t aStatus, bool aSuccess); AddIdleObserver(uint64_t observerId, uint32_t idleTimeInS); RemoveIdleObserver(uint64_t observerId, uint32_t idleTimeInS); /** * This message is only used on X11 platforms. * * Send a dup of the plugin process's X socket to the parent * process. In theory, this scheme keeps the plugin's X resources * around until after both the plugin process shuts down *and* the * parent process closes the dup fd. This is used to prevent the * parent process from crashing on X errors if, e.g., the plugin * crashes *just before* a repaint and the parent process tries to * use the newly-invalid surface. */ BackUpXResources(FileDescriptor aXSocketFd); sync OpenAnonymousTemporaryFile() returns (FileDescriptor aFD); /** * Keygen requires us to call it after a element is parsed and * before one is submitted. This is urgent because an extension might use * a CPOW to synchronously submit a keygen element. */ prio(urgent) sync KeygenProcessValue(nsString oldValue, nsString challenge, nsString keytype, nsString keyparams) returns (nsString newValue); /** * Called to provide the options for elements. */ sync KeygenProvideContent() returns (nsString aAttribute, nsString[] aContent); // Use only for testing! sync GetFileReferences(PersistenceType persistenceType, nsCString origin, nsString databaseName, int64_t fileId) returns (int32_t refCnt, int32_t dBRefCnt, int32_t sliceRefCnt, bool result); /** * Tell the chrome process there is an creation of PBrowser. * return a system-wise unique Id. */ sync AllocateTabId(TabId openerTabId, IPCTabContext context, ContentParentId cpId) returns (TabId tabId); async DeallocateTabId(TabId tabId); /** * Starts an offline application cache update. * @param manifestURI * URI of the manifest to fetch, the application cache group ID * @param documentURI * URI of the document that referred the manifest * @param stickDocument * True if the update was initiated by a document load that referred * a manifest. * False if the update was initiated by applicationCache.update() call. * * Tells the update to carry the documentURI to a potential separate * update of implicit (master) items. * * Why this argument? If the document was not found in an offline cache * before load and refers a manifest and this manifest itself has not * been changed since the last fetch, we will not do the application * cache group update. But we must cache the document (identified by the * documentURI). This argument will ensure that a previously uncached * document will get cached and that we don't re-cache a document that * has already been cached (stickDocument=false). * @param tabId * To identify which tab owns the app. */ POfflineCacheUpdate(URIParams manifestURI, URIParams documentURI, bool stickDocument, TabId tabId); /** * Sets "offline-app" permission for the principal. Called when we hit * a web app with the manifest attribute in and * offline-apps.allow_by_default is set to true. */ SetOfflinePermission(Principal principal); /** * Notifies the parent to continue shutting down after the child performs * its shutdown tasks. */ async FinishShutdown(); both: AsyncMessage(nsString aMessage, ClonedMessageData aData, CpowEntry[] aCpows, Principal aPrincipal); }; } }