2016-01-08 23:40:26 +03:00
|
|
|
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
|
|
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
2012-05-21 15:12:37 +04:00
|
|
|
/* 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/. */
|
2009-09-10 02:00:14 +04:00
|
|
|
|
2012-12-15 03:58:45 +04:00
|
|
|
#include "mozilla/DebugOnly.h"
|
|
|
|
|
2012-07-18 03:59:44 +04:00
|
|
|
#include "base/basictypes.h"
|
2009-08-12 20:18:08 +04:00
|
|
|
|
2012-08-02 10:02:29 +04:00
|
|
|
#include "ContentParent.h"
|
2015-10-30 02:30:57 +03:00
|
|
|
#include "TabParent.h"
|
2012-08-02 10:02:29 +04:00
|
|
|
|
2012-07-18 03:59:44 +04:00
|
|
|
#if defined(ANDROID) || defined(LINUX)
|
|
|
|
# include <sys/time.h>
|
|
|
|
# include <sys/resource.h>
|
|
|
|
#endif
|
|
|
|
|
2014-04-04 00:19:00 +04:00
|
|
|
#ifdef MOZ_WIDGET_GONK
|
2014-03-21 16:50:07 +04:00
|
|
|
#include <sys/types.h>
|
|
|
|
#include <sys/wait.h>
|
|
|
|
#endif
|
|
|
|
|
2011-07-13 10:52:31 +04:00
|
|
|
#include "chrome/common/process_watcher.h"
|
|
|
|
|
2015-10-08 00:38:08 +03:00
|
|
|
#include "mozilla/a11y/PDocAccessible.h"
|
2012-12-06 07:01:58 +04:00
|
|
|
#include "AudioChannelService.h"
|
2010-11-24 17:15:03 +03:00
|
|
|
#include "CrashReporterParent.h"
|
2015-12-19 04:17:46 +03:00
|
|
|
#include "DeviceStorageStatics.h"
|
2015-02-10 13:49:03 +03:00
|
|
|
#include "GMPServiceParent.h"
|
2015-08-26 02:42:21 +03:00
|
|
|
#include "HandlerServiceParent.h"
|
2012-11-09 13:55:54 +04:00
|
|
|
#include "IHistory.h"
|
2015-04-17 04:27:13 +03:00
|
|
|
#include "imgIContainer.h"
|
2016-09-27 01:17:58 +03:00
|
|
|
#if defined(XP_WIN) && defined(ACCESSIBILITY)
|
|
|
|
#include "mozilla/a11y/AccessibleWrap.h"
|
|
|
|
#endif
|
2012-08-16 05:46:03 +04:00
|
|
|
#include "mozilla/ClearOnShutdown.h"
|
2016-09-26 15:03:25 +03:00
|
|
|
#include "mozilla/StyleSheetInlines.h"
|
2015-10-30 22:30:00 +03:00
|
|
|
#include "mozilla/DataStorage.h"
|
2015-09-22 22:09:42 +03:00
|
|
|
#include "mozilla/devtools/HeapSnapshotTempFileHelperParent.h"
|
2014-11-13 03:31:00 +03:00
|
|
|
#include "mozilla/docshell/OfflineCacheUpdateParent.h"
|
2015-04-08 21:48:11 +03:00
|
|
|
#include "mozilla/dom/DataTransfer.h"
|
2014-09-29 18:46:00 +04:00
|
|
|
#include "mozilla/dom/Element.h"
|
2014-10-08 20:15:23 +04:00
|
|
|
#include "mozilla/dom/File.h"
|
2012-07-18 03:59:44 +04:00
|
|
|
#include "mozilla/dom/ExternalHelperAppParent.h"
|
2016-07-14 10:04:21 +03:00
|
|
|
#include "mozilla/dom/GetFilesHelper.h"
|
2014-09-29 18:46:00 +04:00
|
|
|
#include "mozilla/dom/GeolocationBinding.h"
|
2017-01-27 03:35:53 +03:00
|
|
|
#include "mozilla/dom/MemoryReportRequest.h"
|
2015-10-23 00:10:14 +03:00
|
|
|
#include "mozilla/dom/Notification.h"
|
2014-06-11 09:44:13 +04:00
|
|
|
#include "mozilla/dom/PContentBridgeParent.h"
|
2015-04-14 04:08:00 +03:00
|
|
|
#include "mozilla/dom/PContentPermissionRequestParent.h"
|
2014-05-13 21:13:00 +04:00
|
|
|
#include "mozilla/dom/PCycleCollectWithLogsParent.h"
|
2015-04-24 02:41:00 +03:00
|
|
|
#include "mozilla/dom/ServiceWorkerRegistrar.h"
|
2017-01-04 16:53:01 +03:00
|
|
|
#include "mozilla/dom/StorageIPC.h"
|
2012-07-18 03:59:44 +04:00
|
|
|
#include "mozilla/dom/devicestorage/DeviceStorageRequestParent.h"
|
2014-09-29 18:46:00 +04:00
|
|
|
#include "mozilla/dom/power/PowerManagerService.h"
|
2016-03-03 00:09:48 +03:00
|
|
|
#include "mozilla/dom/Permissions.h"
|
2015-03-26 06:16:21 +03:00
|
|
|
#include "mozilla/dom/PresentationParent.h"
|
|
|
|
#include "mozilla/dom/PPresentationParent.h"
|
2016-09-01 21:17:03 +03:00
|
|
|
#include "mozilla/dom/PushNotifier.h"
|
2016-06-07 12:46:03 +03:00
|
|
|
#include "mozilla/dom/FlyWebPublishedServerIPC.h"
|
2015-11-22 12:43:55 +03:00
|
|
|
#include "mozilla/dom/quota/QuotaManagerService.h"
|
2014-03-10 16:36:12 +04:00
|
|
|
#include "mozilla/dom/time/DateCacheCleaner.h"
|
2016-11-19 00:54:57 +03:00
|
|
|
#include "mozilla/dom/URLClassifierParent.h"
|
2016-12-01 17:12:42 +03:00
|
|
|
#include "mozilla/dom/ipc/BlobParent.h"
|
2014-10-28 18:59:08 +03:00
|
|
|
#include "mozilla/embedding/printingui/PrintingParent.h"
|
2016-08-04 21:33:42 +03:00
|
|
|
#include "mozilla/gfx/gfxVars.h"
|
2016-05-23 10:27:57 +03:00
|
|
|
#include "mozilla/gfx/GPUProcessManager.h"
|
2012-07-18 03:59:44 +04:00
|
|
|
#include "mozilla/hal_sandbox/PHalParent.h"
|
2013-11-27 11:59:41 +04:00
|
|
|
#include "mozilla/ipc/BackgroundChild.h"
|
|
|
|
#include "mozilla/ipc/BackgroundParent.h"
|
2014-05-13 21:13:00 +04:00
|
|
|
#include "mozilla/ipc/FileDescriptorUtils.h"
|
2016-05-15 20:32:09 +03:00
|
|
|
#include "mozilla/ipc/PSendStreamParent.h"
|
2009-08-12 22:31:48 +04:00
|
|
|
#include "mozilla/ipc/TestShellParent.h"
|
2013-08-16 21:59:31 +04:00
|
|
|
#include "mozilla/ipc/InputStreamUtils.h"
|
2015-01-27 00:32:18 +03:00
|
|
|
#include "mozilla/jsipc/CrossProcessObjectWrappers.h"
|
2016-01-08 22:17:39 +03:00
|
|
|
#include "mozilla/layers/PAPZParent.h"
|
2016-05-16 09:39:30 +03:00
|
|
|
#include "mozilla/layers/CompositorThread.h"
|
2012-08-29 16:24:48 +04:00
|
|
|
#include "mozilla/layers/ImageBridgeParent.h"
|
2016-08-16 23:59:13 +03:00
|
|
|
#include "mozilla/layers/LayerTreeOwnerTracker.h"
|
2016-03-29 21:32:41 +03:00
|
|
|
#include "mozilla/layout/RenderFrameParent.h"
|
2015-04-22 17:58:15 +03:00
|
|
|
#include "mozilla/LookAndFeel.h"
|
2015-06-18 18:46:36 +03:00
|
|
|
#include "mozilla/media/MediaParent.h"
|
2015-07-31 10:25:27 +03:00
|
|
|
#include "mozilla/Move.h"
|
2009-08-18 23:05:15 +04:00
|
|
|
#include "mozilla/net/NeckoParent.h"
|
2014-10-29 18:05:36 +03:00
|
|
|
#include "mozilla/plugins/PluginBridge.h"
|
2012-08-16 05:46:03 +04:00
|
|
|
#include "mozilla/Preferences.h"
|
2015-01-17 05:34:47 +03:00
|
|
|
#include "mozilla/ProcessHangMonitor.h"
|
|
|
|
#include "mozilla/ProcessHangMonitorIPC.h"
|
2017-01-24 06:15:12 +03:00
|
|
|
#ifdef MOZ_GECKO_PROFILER
|
2015-06-11 00:58:30 +03:00
|
|
|
#include "mozilla/ProfileGatherer.h"
|
2015-06-14 03:55:33 +03:00
|
|
|
#endif
|
2016-08-24 13:49:42 +03:00
|
|
|
#include "mozilla/ScopeExit.h"
|
2012-08-16 05:46:03 +04:00
|
|
|
#include "mozilla/Services.h"
|
|
|
|
#include "mozilla/StaticPtr.h"
|
2014-12-12 22:13:28 +03:00
|
|
|
#include "mozilla/Telemetry.h"
|
2015-09-21 15:54:00 +03:00
|
|
|
#include "mozilla/WebBrowserPersistDocumentParent.h"
|
2016-08-23 07:09:32 +03:00
|
|
|
#include "mozilla/Unused.h"
|
2014-06-24 21:11:36 +04:00
|
|
|
#include "nsAnonymousTemporaryFile.h"
|
2012-07-18 03:59:44 +04:00
|
|
|
#include "nsAppRunner.h"
|
2013-08-16 21:59:31 +04:00
|
|
|
#include "nsCDefaultURIFixup.h"
|
2012-07-18 03:59:44 +04:00
|
|
|
#include "nsCExternalHandlerService.h"
|
2009-09-03 04:18:27 +04:00
|
|
|
#include "nsCOMPtr.h"
|
2010-03-11 08:33:00 +03:00
|
|
|
#include "nsChromeRegistryChrome.h"
|
2012-07-18 03:59:44 +04:00
|
|
|
#include "nsConsoleMessage.h"
|
2012-11-09 21:52:09 +04:00
|
|
|
#include "nsConsoleService.h"
|
2014-11-13 03:31:00 +03:00
|
|
|
#include "nsContentUtils.h"
|
2012-07-18 03:59:44 +04:00
|
|
|
#include "nsDebugImpl.h"
|
2016-11-24 18:08:31 +03:00
|
|
|
#include "nsFrameLoader.h"
|
2010-08-31 22:58:35 +04:00
|
|
|
#include "nsFrameMessageManager.h"
|
2012-07-18 03:59:44 +04:00
|
|
|
#include "nsHashPropertyBag.h"
|
2010-09-15 20:44:57 +04:00
|
|
|
#include "nsIAlertsService.h"
|
2012-07-18 03:59:44 +04:00
|
|
|
#include "nsIClipboard.h"
|
2015-04-14 04:08:00 +03:00
|
|
|
#include "nsContentPermissionHelper.h"
|
2014-05-13 21:13:00 +04:00
|
|
|
#include "nsICycleCollectorListener.h"
|
2015-09-22 00:14:25 +03:00
|
|
|
#include "nsIDocShellTreeOwner.h"
|
2014-09-27 03:21:57 +04:00
|
|
|
#include "nsIDocument.h"
|
2012-07-18 03:59:44 +04:00
|
|
|
#include "nsIDOMGeoGeolocation.h"
|
2014-10-23 22:31:00 +04:00
|
|
|
#include "nsIDOMGeoPositionError.h"
|
2015-04-08 21:48:11 +03:00
|
|
|
#include "nsIDragService.h"
|
2014-08-01 22:02:55 +04:00
|
|
|
#include "mozilla/dom/WakeLock.h"
|
2012-07-18 03:59:44 +04:00
|
|
|
#include "nsIDOMWindow.h"
|
2013-09-24 01:30:40 +04:00
|
|
|
#include "nsIExternalProtocolService.h"
|
2014-11-27 01:28:28 +03:00
|
|
|
#include "nsIFormProcessor.h"
|
2014-01-11 05:09:20 +04:00
|
|
|
#include "nsIGfxInfo.h"
|
2013-12-13 20:28:46 +04:00
|
|
|
#include "nsIIdleService.h"
|
2015-09-22 00:14:25 +03:00
|
|
|
#include "nsIInterfaceRequestorUtils.h"
|
2014-05-13 21:13:00 +04:00
|
|
|
#include "nsIMemoryInfoDumper.h"
|
2012-07-18 03:59:44 +04:00
|
|
|
#include "nsIMemoryReporter.h"
|
2013-02-15 00:41:30 +04:00
|
|
|
#include "nsIMozBrowserFrame.h"
|
2013-01-10 22:16:40 +04:00
|
|
|
#include "nsIMutable.h"
|
2016-04-15 19:29:12 +03:00
|
|
|
#include "nsINSSU2FToken.h"
|
2012-07-18 03:59:44 +04:00
|
|
|
#include "nsIObserverService.h"
|
2016-07-01 06:16:00 +03:00
|
|
|
#include "nsIParentChannel.h"
|
2012-07-18 03:59:44 +04:00
|
|
|
#include "nsIPresShell.h"
|
2015-12-04 02:04:28 +03:00
|
|
|
#include "nsIRemoteWindowContext.h"
|
2010-09-24 05:39:32 +04:00
|
|
|
#include "nsIScriptError.h"
|
2015-07-07 05:17:00 +03:00
|
|
|
#include "nsIScriptSecurityManager.h"
|
2014-07-22 16:17:45 +04:00
|
|
|
#include "nsISiteSecurityService.h"
|
2014-10-03 18:52:37 +04:00
|
|
|
#include "nsISpellChecker.h"
|
2012-07-18 03:59:44 +04:00
|
|
|
#include "nsISupportsPrimitives.h"
|
2015-01-07 08:42:23 +03:00
|
|
|
#include "nsITimer.h"
|
2013-08-16 21:59:31 +04:00
|
|
|
#include "nsIURIFixup.h"
|
2015-10-30 02:30:57 +03:00
|
|
|
#include "nsIDocShellTreeOwner.h"
|
|
|
|
#include "nsIXULWindow.h"
|
|
|
|
#include "nsIDOMChromeWindow.h"
|
2012-07-18 03:59:44 +04:00
|
|
|
#include "nsIWindowWatcher.h"
|
2015-10-30 02:30:57 +03:00
|
|
|
#include "nsPIWindowWatcher.h"
|
|
|
|
#include "nsWindowWatcher.h"
|
2013-12-13 02:13:20 +04:00
|
|
|
#include "nsIXULRuntime.h"
|
2015-09-09 22:14:27 +03:00
|
|
|
#include "mozilla/dom/nsMixedContentBlocker.h"
|
2014-07-03 02:59:02 +04:00
|
|
|
#include "nsMemoryInfoDumper.h"
|
2013-10-23 09:26:24 +04:00
|
|
|
#include "nsMemoryReporterManager.h"
|
2012-07-18 03:59:44 +04:00
|
|
|
#include "nsServiceManagerUtils.h"
|
2013-08-27 21:10:39 +04:00
|
|
|
#include "nsStyleSheetService.h"
|
2012-07-18 03:59:44 +04:00
|
|
|
#include "nsThreadUtils.h"
|
|
|
|
#include "nsToolkitCompsCID.h"
|
|
|
|
#include "nsWidgetsCID.h"
|
2017-02-01 15:34:24 +03:00
|
|
|
#include "PreallocatedProcessManager.h"
|
2013-04-26 04:53:26 +04:00
|
|
|
#include "ProcessPriorityManager.h"
|
2012-07-18 03:59:44 +04:00
|
|
|
#include "SandboxHal.h"
|
2014-07-14 21:22:26 +04:00
|
|
|
#include "ScreenManagerParent.h"
|
2015-04-16 22:38:12 +03:00
|
|
|
#include "SourceSurfaceRawData.h"
|
2012-07-18 03:59:44 +04:00
|
|
|
#include "TabParent.h"
|
2012-08-23 23:33:46 +04:00
|
|
|
#include "URIUtils.h"
|
2013-05-07 08:10:31 +04:00
|
|
|
#include "nsIWebBrowserChrome.h"
|
|
|
|
#include "nsIDocShell.h"
|
2015-04-29 11:57:24 +03:00
|
|
|
#include "nsDocShell.h"
|
2015-10-30 02:30:57 +03:00
|
|
|
#include "nsOpenURIInFrameParams.h"
|
2013-10-19 00:57:55 +04:00
|
|
|
#include "mozilla/net/NeckoMessageUtils.h"
|
2014-02-27 06:52:54 +04:00
|
|
|
#include "gfxPrefs.h"
|
2014-06-24 21:11:36 +04:00
|
|
|
#include "prio.h"
|
|
|
|
#include "private/pprio.h"
|
2014-10-29 21:11:00 +03:00
|
|
|
#include "ContentProcessManager.h"
|
2015-09-10 23:50:58 +03:00
|
|
|
#include "mozilla/dom/ipc/StructuredCloneData.h"
|
2015-04-22 22:55:23 +03:00
|
|
|
#include "mozilla/psm/PSMContentListener.h"
|
2015-05-01 18:07:19 +03:00
|
|
|
#include "nsPluginHost.h"
|
|
|
|
#include "nsPluginTags.h"
|
|
|
|
#include "nsIBlocklistService.h"
|
2016-09-26 15:03:25 +03:00
|
|
|
#include "mozilla/StyleSheet.h"
|
|
|
|
#include "mozilla/StyleSheetInlines.h"
|
2016-07-17 17:50:50 +03:00
|
|
|
#include "nsHostObjectProtocolHandler.h"
|
2016-11-17 19:35:24 +03:00
|
|
|
#include "nsICaptivePortalService.h"
|
2011-02-15 01:34:46 +03:00
|
|
|
|
2015-04-11 01:18:05 +03:00
|
|
|
#include "nsIBidiKeyboard.h"
|
|
|
|
|
2016-07-21 13:57:35 +03:00
|
|
|
#include "nsLayoutStylesheetCache.h"
|
|
|
|
|
2017-02-05 08:52:38 +03:00
|
|
|
#include "ContentPrefs.h"
|
|
|
|
|
2015-05-06 19:29:33 +03:00
|
|
|
#ifdef MOZ_WEBRTC
|
|
|
|
#include "signaling/src/peerconnection/WebrtcGlobalParent.h"
|
|
|
|
#endif
|
|
|
|
|
2013-09-24 01:30:40 +04:00
|
|
|
#if defined(ANDROID) || defined(LINUX)
|
|
|
|
#include "nsSystemInfo.h"
|
2010-10-09 22:07:38 +04:00
|
|
|
#endif
|
|
|
|
|
2014-05-21 09:49:36 +04:00
|
|
|
#if defined(XP_LINUX)
|
|
|
|
#include "mozilla/Hal.h"
|
|
|
|
#endif
|
|
|
|
|
2013-09-24 01:30:40 +04:00
|
|
|
#ifdef ANDROID
|
|
|
|
# include "gfxAndroidPlatform.h"
|
2010-11-24 16:58:21 +03:00
|
|
|
#endif
|
|
|
|
|
2012-07-18 03:59:44 +04:00
|
|
|
#ifdef MOZ_PERMISSIONS
|
|
|
|
# include "nsPermissionManager.h"
|
|
|
|
#endif
|
2011-02-16 21:43:23 +03:00
|
|
|
|
2011-11-11 04:17:46 +04:00
|
|
|
#ifdef MOZ_WIDGET_ANDROID
|
2012-07-18 03:59:44 +04:00
|
|
|
# include "AndroidBridge.h"
|
2011-01-13 07:04:42 +03:00
|
|
|
#endif
|
|
|
|
|
2015-11-05 00:46:10 +03:00
|
|
|
#ifdef MOZ_WIDGET_GTK
|
|
|
|
#include <gdk/gdk.h>
|
|
|
|
#endif
|
|
|
|
|
2014-07-02 02:24:27 +04:00
|
|
|
#include "mozilla/RemoteSpellCheckEngineParent.h"
|
|
|
|
|
2013-02-28 00:31:19 +04:00
|
|
|
#include "Crypto.h"
|
|
|
|
|
2013-04-04 02:13:17 +04:00
|
|
|
#ifdef MOZ_WEBSPEECH
|
|
|
|
#include "mozilla/dom/SpeechSynthesisParent.h"
|
|
|
|
#endif
|
|
|
|
|
2014-08-15 22:56:28 +04:00
|
|
|
#if defined(MOZ_CONTENT_SANDBOX) && defined(XP_LINUX)
|
2014-11-25 02:22:13 +03:00
|
|
|
#include "mozilla/SandboxInfo.h"
|
2015-10-08 08:13:09 +03:00
|
|
|
#include "mozilla/SandboxBroker.h"
|
|
|
|
#include "mozilla/SandboxBrokerPolicyFactory.h"
|
2014-08-15 22:56:28 +04:00
|
|
|
#endif
|
|
|
|
|
2014-09-11 17:50:55 +04:00
|
|
|
#ifdef MOZ_TOOLKIT_SEARCH
|
|
|
|
#include "nsIBrowserSearchService.h"
|
|
|
|
#endif
|
|
|
|
|
2017-01-24 06:15:12 +03:00
|
|
|
#ifdef MOZ_GECKO_PROFILER
|
2014-11-18 20:50:25 +03:00
|
|
|
#include "nsIProfiler.h"
|
|
|
|
#include "nsIProfileSaveEvent.h"
|
|
|
|
#endif
|
|
|
|
|
2016-03-13 16:25:23 +03:00
|
|
|
#ifdef XP_WIN
|
|
|
|
#include "mozilla/widget/AudioSession.h"
|
|
|
|
#endif
|
|
|
|
|
2016-06-21 21:45:25 +03:00
|
|
|
#ifdef MOZ_CRASHREPORTER
|
|
|
|
#include "nsThread.h"
|
|
|
|
#endif
|
|
|
|
|
2016-08-29 18:06:48 +03:00
|
|
|
#ifdef ACCESSIBILITY
|
|
|
|
#include "nsAccessibilityService.h"
|
|
|
|
#endif
|
|
|
|
|
2016-03-17 09:18:35 +03:00
|
|
|
// For VP9Benchmark::sBenchmarkFpsPref
|
|
|
|
#include "Benchmark.h"
|
|
|
|
|
2011-03-01 08:36:43 +03:00
|
|
|
static NS_DEFINE_CID(kCClipboardCID, NS_CLIPBOARD_CID);
|
|
|
|
|
2015-12-10 22:28:33 +03:00
|
|
|
#if defined(XP_WIN)
|
|
|
|
// e10s forced enable pref, defined in nsAppRunner.cpp
|
|
|
|
extern const char* kForceEnableE10sPref;
|
|
|
|
#endif
|
|
|
|
|
2012-12-20 11:41:08 +04:00
|
|
|
using base::ChildPrivileges;
|
2011-01-20 09:14:12 +03:00
|
|
|
using base::KillProcess;
|
2017-01-24 06:15:12 +03:00
|
|
|
#ifdef MOZ_GECKO_PROFILER
|
2015-06-11 00:58:30 +03:00
|
|
|
using mozilla::ProfileGatherer;
|
2015-06-14 03:55:33 +03:00
|
|
|
#endif
|
2014-11-24 23:05:45 +03:00
|
|
|
|
|
|
|
#ifdef MOZ_CRASHREPORTER
|
|
|
|
using namespace CrashReporter;
|
|
|
|
#endif
|
2012-06-20 03:14:39 +04:00
|
|
|
using namespace mozilla::dom::devicestorage;
|
2014-08-01 22:02:55 +04:00
|
|
|
using namespace mozilla::dom::power;
|
2015-06-18 18:46:36 +03:00
|
|
|
using namespace mozilla::media;
|
2014-10-28 18:59:08 +03:00
|
|
|
using namespace mozilla::embedding;
|
2016-05-23 10:27:57 +03:00
|
|
|
using namespace mozilla::gfx;
|
2015-02-10 13:49:03 +03:00
|
|
|
using namespace mozilla::gmp;
|
2013-01-27 01:14:01 +04:00
|
|
|
using namespace mozilla::hal;
|
2012-07-18 03:59:44 +04:00
|
|
|
using namespace mozilla::ipc;
|
|
|
|
using namespace mozilla::layers;
|
2016-03-29 21:32:41 +03:00
|
|
|
using namespace mozilla::layout;
|
2012-07-18 03:59:44 +04:00
|
|
|
using namespace mozilla::net;
|
2013-07-03 11:24:32 +04:00
|
|
|
using namespace mozilla::jsipc;
|
2015-04-22 22:55:23 +03:00
|
|
|
using namespace mozilla::psm;
|
2014-07-14 21:22:26 +04:00
|
|
|
using namespace mozilla::widget;
|
2009-09-03 04:18:27 +04:00
|
|
|
|
2014-05-11 13:47:11 +04:00
|
|
|
// XXX Workaround for bug 986973 to maintain the existing broken semantics
|
|
|
|
template<>
|
|
|
|
struct nsIConsoleService::COMTypeInfo<nsConsoleService, void> {
|
2014-06-02 16:08:24 +04:00
|
|
|
static const nsIID kIID;
|
2014-05-11 13:47:11 +04:00
|
|
|
};
|
|
|
|
const nsIID nsIConsoleService::COMTypeInfo<nsConsoleService, void>::kIID = NS_ICONSOLESERVICE_IID;
|
|
|
|
|
2009-08-12 20:18:08 +04:00
|
|
|
namespace mozilla {
|
|
|
|
namespace dom {
|
|
|
|
|
2010-05-11 21:22:34 +04:00
|
|
|
#define NS_IPC_IOSERVICE_SET_OFFLINE_TOPIC "ipc:network:set-offline"
|
2015-05-02 00:14:39 +03:00
|
|
|
#define NS_IPC_IOSERVICE_SET_CONNECTIVITY_TOPIC "ipc:network:set-connectivity"
|
2010-05-11 16:44:12 +04:00
|
|
|
|
2014-05-13 21:13:00 +04:00
|
|
|
// IPC receiver for remote GC/CC logging.
|
2015-03-21 19:28:04 +03:00
|
|
|
class CycleCollectWithLogsParent final : public PCycleCollectWithLogsParent
|
2014-05-13 21:13:00 +04:00
|
|
|
{
|
|
|
|
public:
|
2016-01-05 12:59:30 +03:00
|
|
|
~CycleCollectWithLogsParent()
|
|
|
|
{
|
|
|
|
MOZ_COUNT_DTOR(CycleCollectWithLogsParent);
|
|
|
|
}
|
2014-05-13 21:13:00 +04:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
static bool AllocAndSendConstructor(ContentParent* aManager,
|
|
|
|
bool aDumpAllTraces,
|
|
|
|
nsICycleCollectorLogSink* aSink,
|
|
|
|
nsIDumpGCAndCCLogsCallback* aCallback)
|
|
|
|
{
|
|
|
|
CycleCollectWithLogsParent *actor;
|
|
|
|
FILE* gcLog;
|
|
|
|
FILE* ccLog;
|
|
|
|
nsresult rv;
|
2014-05-13 21:13:00 +04:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
actor = new CycleCollectWithLogsParent(aSink, aCallback);
|
|
|
|
rv = actor->mSink->Open(&gcLog, &ccLog);
|
|
|
|
if (NS_WARN_IF(NS_FAILED(rv))) {
|
|
|
|
delete actor;
|
|
|
|
return false;
|
2014-05-13 21:13:00 +04:00
|
|
|
}
|
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
return aManager->
|
|
|
|
SendPCycleCollectWithLogsConstructor(actor,
|
|
|
|
aDumpAllTraces,
|
|
|
|
FILEToFileDescriptor(gcLog),
|
|
|
|
FILEToFileDescriptor(ccLog));
|
|
|
|
}
|
|
|
|
|
2014-05-13 21:13:00 +04:00
|
|
|
private:
|
2016-11-15 06:26:00 +03:00
|
|
|
virtual mozilla::ipc::IPCResult RecvCloseGCLog() override
|
2016-01-05 12:59:30 +03:00
|
|
|
{
|
|
|
|
Unused << mSink->CloseGCLog();
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
2014-05-13 21:13:00 +04:00
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
virtual mozilla::ipc::IPCResult RecvCloseCCLog() override
|
2016-01-05 12:59:30 +03:00
|
|
|
{
|
|
|
|
Unused << mSink->CloseCCLog();
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
2014-05-13 21:13:00 +04:00
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
virtual mozilla::ipc::IPCResult Recv__delete__() override
|
2016-01-05 12:59:30 +03:00
|
|
|
{
|
|
|
|
// Report completion to mCallback only on successful
|
|
|
|
// completion of the protocol.
|
|
|
|
nsCOMPtr<nsIFile> gcLog, ccLog;
|
|
|
|
mSink->GetGcLog(getter_AddRefs(gcLog));
|
|
|
|
mSink->GetCcLog(getter_AddRefs(ccLog));
|
|
|
|
Unused << mCallback->OnDump(gcLog, ccLog, /* parent = */ false);
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
2014-05-13 21:13:00 +04:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
virtual void ActorDestroy(ActorDestroyReason aReason) override
|
|
|
|
{
|
|
|
|
// If the actor is unexpectedly destroyed, we deliberately
|
|
|
|
// don't call Close[GC]CLog on the sink, because the logs may
|
|
|
|
// be incomplete. See also the nsCycleCollectorLogSinkToFile
|
|
|
|
// implementaiton of those methods, and its destructor.
|
|
|
|
}
|
2014-05-13 21:13:00 +04:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
CycleCollectWithLogsParent(nsICycleCollectorLogSink *aSink,
|
|
|
|
nsIDumpGCAndCCLogsCallback *aCallback)
|
|
|
|
: mSink(aSink), mCallback(aCallback)
|
|
|
|
{
|
|
|
|
MOZ_COUNT_CTOR(CycleCollectWithLogsParent);
|
|
|
|
}
|
2014-05-13 21:13:00 +04:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
nsCOMPtr<nsICycleCollectorLogSink> mSink;
|
|
|
|
nsCOMPtr<nsIDumpGCAndCCLogsCallback> mCallback;
|
2014-05-13 21:13:00 +04:00
|
|
|
};
|
|
|
|
|
2013-11-06 07:58:20 +04:00
|
|
|
// A memory reporter for ContentParent objects themselves.
|
2015-03-21 19:28:04 +03:00
|
|
|
class ContentParentsMemoryReporter final : public nsIMemoryReporter
|
2013-07-18 01:31:10 +04:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
~ContentParentsMemoryReporter() {}
|
2013-07-18 01:31:10 +04:00
|
|
|
public:
|
2016-01-05 12:59:30 +03:00
|
|
|
NS_DECL_ISUPPORTS
|
|
|
|
NS_DECL_NSIMEMORYREPORTER
|
2013-11-06 07:58:20 +04:00
|
|
|
};
|
2013-12-08 09:39:47 +04:00
|
|
|
|
2014-04-27 11:06:00 +04:00
|
|
|
NS_IMPL_ISUPPORTS(ContentParentsMemoryReporter, nsIMemoryReporter)
|
2013-07-18 01:31:10 +04:00
|
|
|
|
|
|
|
NS_IMETHODIMP
|
2016-08-24 08:23:45 +03:00
|
|
|
ContentParentsMemoryReporter::CollectReports(
|
|
|
|
nsIHandleReportCallback* aHandleReport,
|
|
|
|
nsISupports* aData,
|
|
|
|
bool aAnonymize)
|
2013-07-18 01:31:10 +04:00
|
|
|
{
|
2016-02-02 18:36:30 +03:00
|
|
|
AutoTArray<ContentParent*, 16> cps;
|
2016-01-05 12:59:30 +03:00
|
|
|
ContentParent::GetAllEvenIfDead(cps);
|
2013-07-18 01:31:10 +04:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
for (uint32_t i = 0; i < cps.Length(); i++) {
|
|
|
|
ContentParent* cp = cps[i];
|
|
|
|
MessageChannel* channel = cp->GetIPCChannel();
|
2013-07-18 01:31:10 +04:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
nsString friendlyName;
|
|
|
|
cp->FriendlyName(friendlyName, aAnonymize);
|
2013-07-18 01:31:10 +04:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
cp->AddRef();
|
|
|
|
nsrefcnt refcnt = cp->Release();
|
2013-07-18 01:31:10 +04:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
const char* channelStr = "no channel";
|
|
|
|
uint32_t numQueuedMessages = 0;
|
|
|
|
if (channel) {
|
|
|
|
if (channel->Unsound_IsClosed()) {
|
|
|
|
channelStr = "closed channel";
|
|
|
|
} else {
|
|
|
|
channelStr = "open channel";
|
|
|
|
}
|
|
|
|
numQueuedMessages = channel->Unsound_NumQueuedMessages();
|
|
|
|
}
|
|
|
|
|
|
|
|
nsPrintfCString path("queued-ipc-messages/content-parent"
|
|
|
|
"(%s, pid=%d, %s, 0x%p, refcnt=%d)",
|
|
|
|
NS_ConvertUTF16toUTF8(friendlyName).get(),
|
|
|
|
cp->Pid(), channelStr,
|
|
|
|
static_cast<nsIContentParent*>(cp), refcnt);
|
|
|
|
|
|
|
|
NS_NAMED_LITERAL_CSTRING(desc,
|
|
|
|
"The number of unset IPC messages held in this ContentParent's "
|
|
|
|
"channel. A large value here might indicate that we're leaking "
|
|
|
|
"messages. Similarly, a ContentParent object for a process that's no "
|
|
|
|
"longer running could indicate that we're leaking ContentParents.");
|
|
|
|
|
2016-08-24 08:23:45 +03:00
|
|
|
aHandleReport->Callback(/* process */ EmptyCString(), path,
|
|
|
|
KIND_OTHER, UNITS_COUNT,
|
|
|
|
numQueuedMessages, desc, aData);
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
2013-07-18 01:31:10 +04:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
return NS_OK;
|
2013-07-18 01:31:10 +04:00
|
|
|
}
|
|
|
|
|
2016-11-24 18:08:32 +03:00
|
|
|
nsClassHashtable<nsStringHashKey, nsTArray<ContentParent*>>* ContentParent::sBrowserContentParents;
|
2013-04-26 04:53:26 +04:00
|
|
|
nsTArray<ContentParent*>* ContentParent::sPrivateContent;
|
2013-07-18 01:31:10 +04:00
|
|
|
StaticAutoPtr<LinkedList<ContentParent> > ContentParent::sContentParents;
|
2015-10-08 08:13:09 +03:00
|
|
|
#if defined(XP_LINUX) && defined(MOZ_CONTENT_SANDBOX)
|
|
|
|
UniquePtr<SandboxBrokerPolicyFactory> ContentParent::sSandboxBrokerPolicyFactory;
|
|
|
|
#endif
|
2009-08-12 20:18:08 +04:00
|
|
|
|
2012-12-28 13:45:16 +04:00
|
|
|
// This is true when subprocess launching is enabled. This is the
|
|
|
|
// case between StartUp() and ShutDown() or JoinAllSubprocesses().
|
|
|
|
static bool sCanLaunchSubprocesses;
|
|
|
|
|
2015-04-10 18:56:49 +03:00
|
|
|
// Set to true if the DISABLE_UNSAFE_CPOW_WARNINGS environment variable is
|
|
|
|
// set.
|
|
|
|
static bool sDisableUnsafeCPOWWarnings = false;
|
|
|
|
|
2011-09-30 11:00:48 +04:00
|
|
|
// The first content child has ID 1, so the chrome process can have ID 0.
|
2012-08-22 19:56:38 +04:00
|
|
|
static uint64_t gContentChildID = 1;
|
2011-09-30 11:00:48 +04:00
|
|
|
|
2014-02-13 10:55:28 +04:00
|
|
|
static const char* sObserverTopics[] = {
|
2016-01-05 12:59:30 +03:00
|
|
|
"xpcom-shutdown",
|
|
|
|
"profile-before-change",
|
|
|
|
NS_IPC_IOSERVICE_SET_OFFLINE_TOPIC,
|
|
|
|
NS_IPC_IOSERVICE_SET_CONNECTIVITY_TOPIC,
|
2016-11-17 19:35:24 +03:00
|
|
|
NS_IPC_CAPTIVE_PORTAL_SET_STATE,
|
2016-01-05 12:59:30 +03:00
|
|
|
"memory-pressure",
|
|
|
|
"child-gc-request",
|
|
|
|
"child-cc-request",
|
|
|
|
"child-mmu-request",
|
|
|
|
"last-pb-context-exited",
|
|
|
|
"file-watcher-update",
|
2014-02-13 10:55:28 +04:00
|
|
|
#ifdef ACCESSIBILITY
|
2016-01-05 12:59:30 +03:00
|
|
|
"a11y-init-or-shutdown",
|
2014-02-13 10:55:28 +04:00
|
|
|
#endif
|
2017-01-24 06:15:12 +03:00
|
|
|
#ifdef MOZ_GECKO_PROFILER
|
2016-01-05 12:59:30 +03:00
|
|
|
"profiler-started",
|
|
|
|
"profiler-stopped",
|
|
|
|
"profiler-paused",
|
|
|
|
"profiler-resumed",
|
|
|
|
"profiler-subprocess-gather",
|
|
|
|
"profiler-subprocess",
|
2014-11-18 20:50:25 +03:00
|
|
|
#endif
|
2016-08-08 06:04:55 +03:00
|
|
|
"cacheservice:empty-cache",
|
2014-02-13 10:55:28 +04:00
|
|
|
};
|
|
|
|
|
2017-02-01 15:34:24 +03:00
|
|
|
// PreallocateProcess is called by the PreallocatedProcessManager.
|
|
|
|
// ContentParent then takes this process back within GetNewOrUsedBrowserProcess.
|
|
|
|
/*static*/ already_AddRefed<ContentParent>
|
|
|
|
ContentParent::PreallocateProcess()
|
|
|
|
{
|
|
|
|
RefPtr<ContentParent> process =
|
|
|
|
new ContentParent(/* aOpener = */ nullptr,
|
|
|
|
NS_LITERAL_STRING(DEFAULT_REMOTE_TYPE));
|
|
|
|
|
|
|
|
if (!process->LaunchSubprocess(PROCESS_PRIORITY_PREALLOC)) {
|
|
|
|
return nullptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
process->Init();
|
|
|
|
return process.forget();
|
|
|
|
}
|
|
|
|
|
2012-08-16 05:46:03 +04:00
|
|
|
/*static*/ void
|
|
|
|
ContentParent::StartUp()
|
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
// We could launch sub processes from content process
|
|
|
|
// FIXME Bug 1023701 - Stop using ContentParent static methods in
|
|
|
|
// child process
|
|
|
|
sCanLaunchSubprocesses = true;
|
2014-06-18 21:22:05 +04:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
if (!XRE_IsParentProcess()) {
|
|
|
|
return;
|
|
|
|
}
|
2014-06-18 21:22:05 +04:00
|
|
|
|
2014-08-15 22:56:28 +04:00
|
|
|
#if defined(MOZ_CONTENT_SANDBOX) && defined(MOZ_WIDGET_GONK) && ANDROID_VERSION >= 19
|
2016-01-05 12:59:30 +03:00
|
|
|
// Require sandboxing on B2G >= KitKat. This condition must stay
|
|
|
|
// in sync with ContentChild::RecvSetProcessSandbox.
|
|
|
|
if (!SandboxInfo::Get().CanSandboxContent()) {
|
|
|
|
// MOZ_CRASH strings are only for debug builds; make sure the
|
|
|
|
// message is clear on non-debug builds as well:
|
|
|
|
printf_stderr("Sandboxing support is required on this platform. "
|
|
|
|
"Recompile kernel with CONFIG_SECCOMP_FILTER=y\n");
|
|
|
|
MOZ_CRASH("Sandboxing support is required on this platform.");
|
|
|
|
}
|
2014-08-15 22:56:28 +04:00
|
|
|
#endif
|
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
// Note: This reporter measures all ContentParents.
|
|
|
|
RegisterStrongMemoryReporter(new ContentParentsMemoryReporter());
|
2013-07-18 01:31:10 +04:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
mozilla::dom::time::InitializeDateCacheCleaner();
|
2014-03-10 16:36:12 +04:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
BlobParent::Startup(BlobParent::FriendKey());
|
2014-09-27 03:21:57 +04:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
BackgroundChild::Startup();
|
2013-11-27 11:59:41 +04:00
|
|
|
|
2017-02-01 15:34:24 +03:00
|
|
|
// Try to preallocate a process that we can use later.
|
|
|
|
PreallocatedProcessManager::AllocateAfterDelay();
|
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
sDisableUnsafeCPOWWarnings = PR_GetEnv("DISABLE_UNSAFE_CPOW_WARNINGS");
|
2015-10-08 08:13:09 +03:00
|
|
|
|
|
|
|
#if defined(XP_LINUX) && defined(MOZ_CONTENT_SANDBOX)
|
2016-01-05 12:59:30 +03:00
|
|
|
sSandboxBrokerPolicyFactory = MakeUnique<SandboxBrokerPolicyFactory>();
|
2015-10-08 08:13:09 +03:00
|
|
|
#endif
|
2012-08-16 05:46:03 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
/*static*/ void
|
|
|
|
ContentParent::ShutDown()
|
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
// No-op for now. We rely on normal process shutdown and
|
|
|
|
// ClearOnShutdown() to clean up our state.
|
|
|
|
sCanLaunchSubprocesses = false;
|
2015-10-08 08:13:09 +03:00
|
|
|
|
|
|
|
#if defined(XP_LINUX) && defined(MOZ_CONTENT_SANDBOX)
|
2016-01-05 12:59:30 +03:00
|
|
|
sSandboxBrokerPolicyFactory = nullptr;
|
2015-10-08 08:13:09 +03:00
|
|
|
#endif
|
2012-12-28 13:45:16 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
/*static*/ void
|
|
|
|
ContentParent::JoinProcessesIOThread(const nsTArray<ContentParent*>* aProcesses,
|
|
|
|
Monitor* aMonitor, bool* aDone)
|
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
const nsTArray<ContentParent*>& processes = *aProcesses;
|
|
|
|
for (uint32_t i = 0; i < processes.Length(); ++i) {
|
|
|
|
if (GeckoChildProcessHost* process = processes[i]->mSubprocess) {
|
|
|
|
process->Join();
|
2012-12-28 13:45:16 +04:00
|
|
|
}
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
|
|
|
{
|
|
|
|
MonitorAutoLock lock(*aMonitor);
|
|
|
|
*aDone = true;
|
|
|
|
lock.Notify();
|
|
|
|
}
|
|
|
|
// Don't touch any arguments to this function from now on.
|
2012-12-28 13:45:16 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
/*static*/ void
|
|
|
|
ContentParent::JoinAllSubprocesses()
|
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
MOZ_ASSERT(NS_IsMainThread());
|
2012-12-28 13:45:16 +04:00
|
|
|
|
2016-02-02 18:36:30 +03:00
|
|
|
AutoTArray<ContentParent*, 8> processes;
|
2016-01-05 12:59:30 +03:00
|
|
|
GetAll(processes);
|
|
|
|
if (processes.IsEmpty()) {
|
|
|
|
printf_stderr("There are no live subprocesses.");
|
|
|
|
return;
|
|
|
|
}
|
2012-12-28 13:45:16 +04:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
printf_stderr("Subprocesses are still alive. Doing emergency join.\n");
|
|
|
|
|
|
|
|
bool done = false;
|
|
|
|
Monitor monitor("mozilla.dom.ContentParent.JoinAllSubprocesses");
|
2016-04-28 03:06:05 +03:00
|
|
|
XRE_GetIOMessageLoop()->PostTask(NewRunnableFunction(
|
2016-01-05 12:59:30 +03:00
|
|
|
&ContentParent::JoinProcessesIOThread,
|
|
|
|
&processes, &monitor, &done));
|
|
|
|
{
|
|
|
|
MonitorAutoLock lock(monitor);
|
|
|
|
while (!done) {
|
|
|
|
lock.Wait();
|
2012-12-28 13:45:16 +04:00
|
|
|
}
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
2012-12-28 13:45:16 +04:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
sCanLaunchSubprocesses = false;
|
2012-08-16 05:46:03 +04:00
|
|
|
}
|
|
|
|
|
2017-02-01 15:34:24 +03:00
|
|
|
/*static*/ uint32_t
|
|
|
|
ContentParent::GetPoolSize(const nsAString& aContentProcessType)
|
2009-08-12 20:18:08 +04:00
|
|
|
{
|
2017-02-01 15:34:24 +03:00
|
|
|
if (!sBrowserContentParents) {
|
|
|
|
return 0;
|
2017-01-26 22:20:44 +03:00
|
|
|
}
|
|
|
|
|
2017-02-01 15:34:24 +03:00
|
|
|
nsTArray<ContentParent*>* parents =
|
|
|
|
sBrowserContentParents->Get(aContentProcessType);
|
|
|
|
|
|
|
|
return parents ? parents->Length() : 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*static*/ nsTArray<ContentParent*>&
|
|
|
|
ContentParent::GetOrCreatePool(const nsAString& aContentProcessType)
|
|
|
|
{
|
2016-11-24 18:08:32 +03:00
|
|
|
if (!sBrowserContentParents) {
|
|
|
|
sBrowserContentParents =
|
|
|
|
new nsClassHashtable<nsStringHashKey, nsTArray<ContentParent*>>;
|
|
|
|
}
|
2012-08-09 06:58:06 +04:00
|
|
|
|
2017-02-01 15:34:24 +03:00
|
|
|
return *sBrowserContentParents->LookupOrAdd(aContentProcessType);
|
|
|
|
}
|
2016-10-21 23:56:51 +03:00
|
|
|
|
2017-02-01 15:34:24 +03:00
|
|
|
/*static*/ uint32_t
|
|
|
|
ContentParent::GetMaxProcessCount(const nsAString& aContentProcessType)
|
|
|
|
{
|
2016-11-24 18:08:32 +03:00
|
|
|
int32_t maxContentParents;
|
|
|
|
nsAutoCString processCountPref("dom.ipc.processCount.");
|
2017-02-01 15:34:24 +03:00
|
|
|
processCountPref.Append(NS_ConvertUTF16toUTF8(aContentProcessType));
|
2016-11-24 18:08:32 +03:00
|
|
|
if (NS_FAILED(Preferences::GetInt(processCountPref.get(), &maxContentParents))) {
|
2016-10-21 23:56:51 +03:00
|
|
|
maxContentParents = Preferences::GetInt("dom.ipc.processCount", 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (maxContentParents < 1) {
|
|
|
|
maxContentParents = 1;
|
|
|
|
}
|
2015-05-11 10:24:40 +03:00
|
|
|
|
2017-02-01 15:34:24 +03:00
|
|
|
return static_cast<uint32_t>(maxContentParents);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*static*/ bool
|
|
|
|
ContentParent::IsMaxProcessCountReached(const nsAString& aContentProcessType)
|
|
|
|
{
|
|
|
|
return GetPoolSize(aContentProcessType) >= GetMaxProcessCount(aContentProcessType);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*static*/ already_AddRefed<ContentParent>
|
|
|
|
ContentParent::RandomSelect(const nsTArray<ContentParent*>& aContentParents,
|
|
|
|
ContentParent* aOpener, int32_t aMaxContentParents)
|
|
|
|
{
|
|
|
|
uint32_t maxSelectable = std::min(static_cast<uint32_t>(aContentParents.Length()),
|
|
|
|
static_cast<uint32_t>(aMaxContentParents));
|
|
|
|
uint32_t startIdx = rand() % maxSelectable;
|
|
|
|
uint32_t currIdx = startIdx;
|
|
|
|
do {
|
|
|
|
RefPtr<ContentParent> p = aContentParents[currIdx];
|
|
|
|
NS_ASSERTION(p->IsAlive(), "Non-alive contentparent in sBrowserContentParents?");
|
|
|
|
if (p->mOpener == aOpener) {
|
|
|
|
return p.forget();
|
|
|
|
}
|
|
|
|
currIdx = (currIdx + 1) % maxSelectable;
|
|
|
|
} while (currIdx != startIdx);
|
2016-01-05 12:59:30 +03:00
|
|
|
|
2017-02-01 15:34:24 +03:00
|
|
|
return nullptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*static*/ already_AddRefed<ContentParent>
|
|
|
|
ContentParent::GetNewOrUsedBrowserProcess(const nsAString& aRemoteType,
|
|
|
|
ProcessPriority aPriority,
|
|
|
|
ContentParent* aOpener,
|
|
|
|
bool aLargeAllocationProcess,
|
|
|
|
bool* aNew)
|
|
|
|
{
|
2017-01-26 22:20:44 +03:00
|
|
|
if (aNew) {
|
2017-02-01 15:34:24 +03:00
|
|
|
*aNew = false;
|
2017-01-26 22:20:44 +03:00
|
|
|
}
|
2017-02-01 15:34:24 +03:00
|
|
|
// Decide which pool of content parents we are going to be pulling from based
|
|
|
|
// on the aRemoteType and aLargeAllocationProcess flag.
|
|
|
|
nsAutoString contentProcessType(aLargeAllocationProcess
|
|
|
|
? NS_LITERAL_STRING(LARGE_ALLOCATION_REMOTE_TYPE)
|
|
|
|
: aRemoteType);
|
2015-05-11 10:24:40 +03:00
|
|
|
|
2017-02-01 15:34:24 +03:00
|
|
|
nsTArray<ContentParent*>& contentParents = GetOrCreatePool(contentProcessType);
|
|
|
|
|
|
|
|
uint32_t maxContentParents = GetMaxProcessCount(contentProcessType);
|
|
|
|
|
|
|
|
RefPtr<ContentParent> p;
|
|
|
|
if (contentParents.Length() >= uint32_t(maxContentParents) &&
|
|
|
|
(p = RandomSelect(contentParents, aOpener, maxContentParents))) {
|
|
|
|
return p.forget();
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
2016-11-02 13:13:37 +03:00
|
|
|
|
2017-02-01 15:34:24 +03:00
|
|
|
// Try to take the preallocated process only for the default process type.
|
|
|
|
if (contentProcessType.Equals(NS_LITERAL_STRING(DEFAULT_REMOTE_TYPE)) &&
|
|
|
|
(p = PreallocatedProcessManager::Take())) {
|
|
|
|
// For pre-allocated process we have not set the opener yet.
|
|
|
|
p->mOpener = aOpener;
|
|
|
|
} else {
|
|
|
|
p = new ContentParent(aOpener, contentProcessType);
|
|
|
|
|
|
|
|
if (aNew) {
|
|
|
|
*aNew = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!p->LaunchSubprocess(aPriority)) {
|
|
|
|
return nullptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
p->Init();
|
|
|
|
}
|
2016-10-19 04:54:12 +03:00
|
|
|
|
2017-02-01 15:34:24 +03:00
|
|
|
contentParents.AppendElement(p);
|
2016-01-05 12:59:30 +03:00
|
|
|
return p.forget();
|
2011-08-02 23:35:42 +04:00
|
|
|
}
|
2010-12-26 23:03:52 +03:00
|
|
|
|
2013-02-15 00:41:30 +04:00
|
|
|
/*static*/ ProcessPriority
|
2013-07-24 03:39:17 +04:00
|
|
|
ContentParent::GetInitialProcessPriority(Element* aFrameElement)
|
2013-02-15 00:41:30 +04:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
// Frames with mozapptype == critical which are expecting a system message
|
|
|
|
// get FOREGROUND_HIGH priority.
|
2013-02-15 00:41:30 +04:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
if (!aFrameElement) {
|
|
|
|
return PROCESS_PRIORITY_FOREGROUND;
|
|
|
|
}
|
2013-02-15 00:41:30 +04:00
|
|
|
|
2016-12-21 03:32:12 +03:00
|
|
|
if (!aFrameElement->AttrValueIs(kNameSpaceID_None, nsGkAtoms::mozapptype,
|
|
|
|
NS_LITERAL_STRING("critical"), eCaseMatters)) {
|
2016-01-05 12:59:30 +03:00
|
|
|
return PROCESS_PRIORITY_FOREGROUND;
|
|
|
|
}
|
2013-02-15 00:41:30 +04:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
nsCOMPtr<nsIMozBrowserFrame> browserFrame = do_QueryInterface(aFrameElement);
|
|
|
|
if (!browserFrame) {
|
|
|
|
return PROCESS_PRIORITY_FOREGROUND;
|
|
|
|
}
|
2013-02-15 00:41:30 +04:00
|
|
|
|
2016-04-20 20:04:13 +03:00
|
|
|
return PROCESS_PRIORITY_FOREGROUND;
|
2013-02-15 00:41:30 +04:00
|
|
|
}
|
|
|
|
|
2015-04-07 16:17:27 +03:00
|
|
|
#if defined(XP_WIN)
|
|
|
|
extern const wchar_t* kPluginWidgetContentParentProperty;
|
|
|
|
|
|
|
|
/*static*/ void
|
|
|
|
ContentParent::SendAsyncUpdate(nsIWidget* aWidget)
|
|
|
|
{
|
|
|
|
if (!aWidget || aWidget->Destroyed()) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
// Fire off an async request to the plugin to paint its window
|
|
|
|
HWND hwnd = (HWND)aWidget->GetNativeData(NS_NATIVE_WINDOW);
|
|
|
|
NS_ASSERTION(hwnd, "Expected valid hwnd value.");
|
|
|
|
ContentParent* cp = reinterpret_cast<ContentParent*>(
|
|
|
|
::GetPropW(hwnd, kPluginWidgetContentParentProperty));
|
|
|
|
if (cp && !cp->IsDestroyed()) {
|
2016-09-15 02:28:26 +03:00
|
|
|
Unused << cp->SendUpdateWindow((uintptr_t)hwnd);
|
2015-04-07 16:17:27 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif // defined(XP_WIN)
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2014-06-11 09:44:13 +04:00
|
|
|
ContentParent::RecvCreateChildProcess(const IPCTabContext& aContext,
|
|
|
|
const hal::ProcessPriority& aPriority,
|
2014-10-29 21:11:00 +03:00
|
|
|
const TabId& aOpenerTabId,
|
|
|
|
ContentParentId* aCpId,
|
|
|
|
bool* aIsForBrowser,
|
|
|
|
TabId* aTabId)
|
2014-06-11 09:44:13 +04:00
|
|
|
{
|
|
|
|
#if 0
|
2016-01-05 12:59:30 +03:00
|
|
|
if (!CanOpenBrowser(aContext)) {
|
|
|
|
return false;
|
|
|
|
}
|
2014-06-11 09:44:13 +04:00
|
|
|
#endif
|
2016-01-05 12:59:30 +03:00
|
|
|
RefPtr<ContentParent> cp;
|
|
|
|
MaybeInvalidTabContext tc(aContext);
|
|
|
|
if (!tc.IsValid()) {
|
|
|
|
NS_ERROR(nsPrintfCString("Received an invalid TabContext from "
|
|
|
|
"the child process. (%s)",
|
|
|
|
tc.GetInvalidReason()).get());
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_FAIL_NO_REASON(this);
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
2014-08-13 10:18:00 +04:00
|
|
|
|
2016-11-24 18:08:31 +03:00
|
|
|
cp = GetNewOrUsedBrowserProcess(NS_LITERAL_STRING(DEFAULT_REMOTE_TYPE),
|
2016-11-23 20:32:54 +03:00
|
|
|
aPriority, this);
|
2014-08-13 10:18:00 +04:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
if (!cp) {
|
|
|
|
*aCpId = 0;
|
|
|
|
*aIsForBrowser = false;
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
2014-06-11 09:44:13 +04:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
*aCpId = cp->ChildID();
|
|
|
|
*aIsForBrowser = cp->IsForBrowser();
|
2014-10-29 21:11:00 +03:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
ContentProcessManager *cpm = ContentProcessManager::GetSingleton();
|
|
|
|
cpm->AddContentProcess(cp, this->ChildID());
|
2014-10-29 21:11:00 +03:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
if (cpm->AddGrandchildProcess(this->ChildID(), cp->ChildID())) {
|
|
|
|
// Pre-allocate a TabId here to save one time IPC call at app startup.
|
|
|
|
*aTabId = AllocateTabId(aOpenerTabId, aContext, cp->ChildID());
|
2016-11-15 06:26:00 +03:00
|
|
|
if (*aTabId == 0) {
|
|
|
|
return IPC_FAIL_NO_REASON(this);
|
|
|
|
}
|
|
|
|
return IPC_OK();
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
2014-10-29 21:11:00 +03:00
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_FAIL_NO_REASON(this);
|
2014-06-11 09:44:13 +04:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2017-01-27 01:40:17 +03:00
|
|
|
ContentParent::RecvBridgeToChildProcess(const ContentParentId& aCpId,
|
|
|
|
Endpoint<PContentBridgeParent>* aEndpoint)
|
2014-10-24 10:29:00 +04:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
ContentProcessManager *cpm = ContentProcessManager::GetSingleton();
|
|
|
|
ContentParent* cp = cpm->GetContentProcessById(aCpId);
|
2014-10-29 21:11:00 +03:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
if (cp) {
|
|
|
|
ContentParentId parentId;
|
|
|
|
if (cpm->GetParentProcessId(cp->ChildID(), &parentId) &&
|
|
|
|
parentId == this->ChildID()) {
|
2017-01-27 01:40:17 +03:00
|
|
|
|
|
|
|
Endpoint<PContentBridgeParent> parent;
|
|
|
|
Endpoint<PContentBridgeChild> child;
|
|
|
|
|
|
|
|
if (NS_FAILED(PContentBridge::CreateEndpoints(OtherPid(), cp->OtherPid(),
|
|
|
|
&parent, &child))) {
|
|
|
|
return IPC_FAIL(this, "CreateEndpoints failed");
|
|
|
|
}
|
|
|
|
|
|
|
|
*aEndpoint = Move(parent);
|
|
|
|
|
|
|
|
if (!cp->SendInitContentBridgeChild(Move(child))) {
|
|
|
|
return IPC_FAIL(this, "SendInitContentBridgeChild failed");
|
2016-11-15 06:26:00 +03:00
|
|
|
}
|
2017-01-27 01:40:17 +03:00
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2014-10-29 21:11:00 +03:00
|
|
|
}
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
2014-10-29 21:11:00 +03:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
// You can't bridge to a process you didn't open!
|
|
|
|
KillHard("BridgeToChildProcess");
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_FAIL_NO_REASON(this);
|
2014-10-29 21:11:00 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
static nsIDocShell* GetOpenerDocShellHelper(Element* aFrameElement)
|
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
// Propagate the private-browsing status of the element's parent
|
|
|
|
// docshell to the remote docshell, via the chrome flags.
|
|
|
|
nsCOMPtr<Element> frameElement = do_QueryInterface(aFrameElement);
|
|
|
|
MOZ_ASSERT(frameElement);
|
2016-01-30 20:05:36 +03:00
|
|
|
nsPIDOMWindowOuter* win = frameElement->OwnerDoc()->GetWindow();
|
2016-01-05 12:59:30 +03:00
|
|
|
if (!win) {
|
|
|
|
NS_WARNING("Remote frame has no window");
|
|
|
|
return nullptr;
|
|
|
|
}
|
|
|
|
nsIDocShell* docShell = win->GetDocShell();
|
|
|
|
if (!docShell) {
|
|
|
|
NS_WARNING("Remote frame has no docshell");
|
|
|
|
return nullptr;
|
|
|
|
}
|
2014-10-29 21:11:00 +03:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
return docShell;
|
2014-06-11 09:44:13 +04:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2015-02-10 13:49:03 +03:00
|
|
|
ContentParent::RecvCreateGMPService()
|
|
|
|
{
|
2017-01-05 23:55:57 +03:00
|
|
|
Endpoint<PGMPServiceParent> parent;
|
|
|
|
Endpoint<PGMPServiceChild> child;
|
|
|
|
|
|
|
|
nsresult rv;
|
|
|
|
rv = PGMPService::CreateEndpoints(base::GetCurrentProcId(),
|
|
|
|
OtherPid(),
|
|
|
|
&parent, &child);
|
|
|
|
if (NS_FAILED(rv)) {
|
|
|
|
MOZ_ASSERT(false, "CreateEndpoints failed");
|
|
|
|
return IPC_FAIL_NO_REASON(this);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!GMPServiceParent::Create(Move(parent))) {
|
|
|
|
MOZ_ASSERT(false, "GMPServiceParent::Create failed");
|
|
|
|
return IPC_FAIL_NO_REASON(this);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!SendInitGMPService(Move(child))) {
|
|
|
|
MOZ_ASSERT(false, "SendInitGMPService failed");
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_FAIL_NO_REASON(this);
|
|
|
|
}
|
2017-01-05 23:55:57 +03:00
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2015-02-10 13:49:03 +03:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2017-01-26 01:17:17 +03:00
|
|
|
ContentParent::RecvLoadPlugin(const uint32_t& aPluginId,
|
|
|
|
nsresult* aRv,
|
|
|
|
uint32_t* aRunID,
|
|
|
|
Endpoint<PPluginModuleParent>* aEndpoint)
|
2014-10-29 18:05:36 +03:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
*aRv = NS_OK;
|
2017-01-26 01:17:17 +03:00
|
|
|
if (!mozilla::plugins::SetupBridge(aPluginId, this, false, aRv, aRunID,
|
|
|
|
aEndpoint)) {
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_FAIL_NO_REASON(this);
|
|
|
|
}
|
|
|
|
return IPC_OK();
|
2014-10-29 18:05:36 +03:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2015-11-05 00:46:10 +03:00
|
|
|
ContentParent::RecvUngrabPointer(const uint32_t& aTime)
|
|
|
|
{
|
|
|
|
#if !defined(MOZ_WIDGET_GTK)
|
2016-01-05 12:59:30 +03:00
|
|
|
NS_RUNTIMEABORT("This message only makes sense on GTK platforms");
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2015-11-05 00:46:10 +03:00
|
|
|
#else
|
2016-01-05 12:59:30 +03:00
|
|
|
gdk_pointer_ungrab(aTime);
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2015-11-05 00:46:10 +03:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2016-03-03 00:09:48 +03:00
|
|
|
ContentParent::RecvRemovePermission(const IPC::Principal& aPrincipal,
|
|
|
|
const nsCString& aPermissionType,
|
|
|
|
nsresult* aRv) {
|
|
|
|
*aRv = Permissions::RemovePermission(aPrincipal, aPermissionType.get());
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2016-03-03 00:09:48 +03:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2017-01-26 01:17:17 +03:00
|
|
|
ContentParent::RecvConnectPluginBridge(const uint32_t& aPluginId,
|
|
|
|
nsresult* aRv,
|
|
|
|
Endpoint<PPluginModuleParent>* aEndpoint)
|
2015-01-17 00:03:27 +03:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
*aRv = NS_OK;
|
|
|
|
// We don't need to get the run ID for the plugin, since we already got it
|
|
|
|
// in the first call to SetupBridge in RecvLoadPlugin, so we pass in a dummy
|
|
|
|
// pointer and just throw it away.
|
|
|
|
uint32_t dummy = 0;
|
2017-01-26 01:17:17 +03:00
|
|
|
if (!mozilla::plugins::SetupBridge(aPluginId, this, true, aRv, &dummy, aEndpoint)) {
|
|
|
|
return IPC_FAIL(this, "SetupBridge failed");
|
2016-11-15 06:26:00 +03:00
|
|
|
}
|
|
|
|
return IPC_OK();
|
2015-01-17 00:03:27 +03:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2015-05-01 18:07:19 +03:00
|
|
|
ContentParent::RecvGetBlocklistState(const uint32_t& aPluginId,
|
|
|
|
uint32_t* aState)
|
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
*aState = nsIBlocklistService::STATE_BLOCKED;
|
2015-05-01 18:07:19 +03:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
RefPtr<nsPluginHost> pluginHost = nsPluginHost::GetInst();
|
|
|
|
if (!pluginHost) {
|
|
|
|
NS_WARNING("Plugin host not found");
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_FAIL_NO_REASON(this);
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
|
|
|
nsPluginTag* tag = pluginHost->PluginWithId(aPluginId);
|
2015-05-01 18:07:19 +03:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
if (!tag) {
|
|
|
|
// Default state is blocked anyway
|
|
|
|
NS_WARNING("Plugin tag not found. This should never happen, but to avoid a crash we're forcibly blocking it");
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
2015-05-01 18:07:19 +03:00
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
if (NS_FAILED(tag->GetBlocklistState(aState))) {
|
|
|
|
return IPC_FAIL_NO_REASON(this);
|
|
|
|
}
|
|
|
|
return IPC_OK();
|
2015-05-01 18:07:19 +03:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2014-10-29 18:05:36 +03:00
|
|
|
ContentParent::RecvFindPlugins(const uint32_t& aPluginEpoch,
|
2015-11-11 07:35:00 +03:00
|
|
|
nsresult* aRv,
|
2014-10-29 18:05:36 +03:00
|
|
|
nsTArray<PluginTag>* aPlugins,
|
|
|
|
uint32_t* aNewPluginEpoch)
|
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
*aRv = mozilla::plugins::FindPluginsForContent(aPluginEpoch, aPlugins, aNewPluginEpoch);
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2014-10-29 18:05:36 +03:00
|
|
|
}
|
|
|
|
|
2012-08-09 06:58:06 +04:00
|
|
|
/*static*/ TabParent*
|
2016-10-15 04:46:26 +03:00
|
|
|
ContentParent::CreateBrowser(const TabContext& aContext,
|
|
|
|
Element* aFrameElement,
|
|
|
|
ContentParent* aOpenerContentParent,
|
|
|
|
bool aFreshProcess)
|
2012-07-14 01:10:20 +04:00
|
|
|
{
|
2016-01-15 01:03:11 +03:00
|
|
|
PROFILER_LABEL_FUNC(js::ProfileEntry::Category::OTHER);
|
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
if (!sCanLaunchSubprocesses) {
|
|
|
|
return nullptr;
|
|
|
|
}
|
2012-12-28 13:45:16 +04:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
if (TabParent* parent = TabParent::GetNextTabParent()) {
|
|
|
|
parent->SetOwnerElement(aFrameElement);
|
|
|
|
return parent;
|
|
|
|
}
|
2015-01-16 21:07:50 +03:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
ProcessPriority initialPriority = GetInitialProcessPriority(aFrameElement);
|
|
|
|
bool isInContentProcess = !XRE_IsParentProcess();
|
|
|
|
TabId tabId;
|
2014-10-29 21:11:00 +03:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
nsIDocShell* docShell = GetOpenerDocShellHelper(aFrameElement);
|
|
|
|
TabId openerTabId;
|
|
|
|
if (docShell) {
|
|
|
|
openerTabId = TabParent::GetTabIdFrom(docShell);
|
|
|
|
}
|
2014-05-30 17:29:43 +04:00
|
|
|
|
2017-01-26 22:20:44 +03:00
|
|
|
bool newProcess = false;
|
2016-10-15 04:46:26 +03:00
|
|
|
RefPtr<nsIContentParent> constructorSender;
|
|
|
|
if (isInContentProcess) {
|
|
|
|
MOZ_ASSERT(aContext.IsMozBrowserElement());
|
|
|
|
constructorSender = CreateContentBridgeParent(aContext, initialPriority,
|
|
|
|
openerTabId, &tabId);
|
|
|
|
} else {
|
|
|
|
if (aOpenerContentParent) {
|
|
|
|
constructorSender = aOpenerContentParent;
|
2016-01-05 12:59:30 +03:00
|
|
|
} else {
|
2016-11-24 18:08:31 +03:00
|
|
|
nsAutoString remoteType;
|
|
|
|
if (!aFrameElement->GetAttr(kNameSpaceID_None, nsGkAtoms::RemoteType,
|
|
|
|
remoteType)) {
|
|
|
|
remoteType.AssignLiteral(DEFAULT_REMOTE_TYPE);
|
|
|
|
}
|
|
|
|
|
2016-10-15 04:46:26 +03:00
|
|
|
constructorSender =
|
2016-11-24 18:08:31 +03:00
|
|
|
GetNewOrUsedBrowserProcess(remoteType, initialPriority, nullptr,
|
2017-01-26 22:20:44 +03:00
|
|
|
aFreshProcess, &newProcess);
|
2016-10-15 04:46:26 +03:00
|
|
|
if (!constructorSender) {
|
2012-08-09 06:58:06 +04:00
|
|
|
return nullptr;
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
|
|
|
}
|
2016-10-15 04:46:26 +03:00
|
|
|
tabId = AllocateTabId(openerTabId,
|
|
|
|
aContext.AsIPCTabContext(),
|
|
|
|
constructorSender->ChildID());
|
|
|
|
}
|
|
|
|
if (constructorSender) {
|
|
|
|
nsCOMPtr<nsIDocShellTreeOwner> treeOwner;
|
|
|
|
docShell->GetTreeOwner(getter_AddRefs(treeOwner));
|
|
|
|
if (!treeOwner) {
|
|
|
|
return nullptr;
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
|
|
|
|
2016-10-15 04:46:26 +03:00
|
|
|
nsCOMPtr<nsIWebBrowserChrome> wbc = do_GetInterface(treeOwner);
|
|
|
|
if (!wbc) {
|
2016-01-05 12:59:30 +03:00
|
|
|
return nullptr;
|
|
|
|
}
|
2016-10-15 04:46:26 +03:00
|
|
|
uint32_t chromeFlags = 0;
|
|
|
|
wbc->GetChromeFlags(&chromeFlags);
|
2016-01-05 12:59:30 +03:00
|
|
|
|
2016-10-15 04:46:26 +03:00
|
|
|
nsCOMPtr<nsILoadContext> loadContext = do_QueryInterface(docShell);
|
|
|
|
if (loadContext && loadContext->UsePrivateBrowsing()) {
|
|
|
|
chromeFlags |= nsIWebBrowserChrome::CHROME_PRIVATE_WINDOW;
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
2016-10-15 04:46:26 +03:00
|
|
|
if (docShell->GetAffectPrivateSessionLifetime()) {
|
|
|
|
chromeFlags |= nsIWebBrowserChrome::CHROME_PRIVATE_LIFETIME;
|
2014-08-13 10:18:00 +04:00
|
|
|
}
|
|
|
|
|
2016-10-15 04:46:26 +03:00
|
|
|
if (tabId == 0) {
|
|
|
|
return nullptr;
|
2012-07-14 01:10:20 +04:00
|
|
|
}
|
2016-10-15 04:46:26 +03:00
|
|
|
RefPtr<TabParent> tp(new TabParent(constructorSender, tabId,
|
|
|
|
aContext, chromeFlags));
|
|
|
|
tp->SetInitedByParent();
|
|
|
|
|
|
|
|
PBrowserParent* browser =
|
|
|
|
constructorSender->SendPBrowserConstructor(
|
|
|
|
// DeallocPBrowserParent() releases this ref.
|
|
|
|
tp.forget().take(), tabId,
|
|
|
|
aContext.AsIPCTabContext(),
|
|
|
|
chromeFlags,
|
|
|
|
constructorSender->ChildID(),
|
|
|
|
constructorSender->IsForBrowser());
|
|
|
|
|
|
|
|
if (aFreshProcess) {
|
2017-01-26 22:20:44 +03:00
|
|
|
// Tell the TabChild object that it was created due to a Large-Allocation
|
|
|
|
// request, and whether or not that Large-Allocation request succeeded at
|
|
|
|
// creating a new content process.
|
|
|
|
Unused << browser->SendSetIsLargeAllocation(true, newProcess);
|
2014-08-13 10:18:00 +04:00
|
|
|
}
|
|
|
|
|
2016-10-15 04:46:26 +03:00
|
|
|
if (browser) {
|
|
|
|
RefPtr<TabParent> constructedTabParent = TabParent::GetFrom(browser);
|
|
|
|
constructedTabParent->SetOwnerElement(aFrameElement);
|
|
|
|
return constructedTabParent;
|
2014-07-09 02:56:22 +04:00
|
|
|
}
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
2016-10-15 04:46:26 +03:00
|
|
|
return nullptr;
|
2012-07-14 01:10:20 +04:00
|
|
|
}
|
|
|
|
|
2014-08-13 10:18:00 +04:00
|
|
|
/*static*/ ContentBridgeParent*
|
|
|
|
ContentParent::CreateContentBridgeParent(const TabContext& aContext,
|
2014-10-29 21:11:00 +03:00
|
|
|
const hal::ProcessPriority& aPriority,
|
|
|
|
const TabId& aOpenerTabId,
|
|
|
|
/*out*/ TabId* aTabId)
|
2014-08-13 10:18:00 +04:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
MOZ_ASSERT(aTabId);
|
|
|
|
|
|
|
|
ContentChild* child = ContentChild::GetSingleton();
|
|
|
|
ContentParentId cpId;
|
|
|
|
bool isForBrowser;
|
|
|
|
if (!child->SendCreateChildProcess(aContext.AsIPCTabContext(),
|
|
|
|
aPriority,
|
|
|
|
aOpenerTabId,
|
|
|
|
&cpId,
|
|
|
|
&isForBrowser,
|
|
|
|
aTabId)) {
|
|
|
|
return nullptr;
|
|
|
|
}
|
|
|
|
if (cpId == 0) {
|
|
|
|
return nullptr;
|
|
|
|
}
|
2017-01-27 01:40:17 +03:00
|
|
|
Endpoint<PContentBridgeParent> endpoint;
|
|
|
|
if (!child->SendBridgeToChildProcess(cpId, &endpoint)) {
|
2016-01-05 12:59:30 +03:00
|
|
|
return nullptr;
|
|
|
|
}
|
2017-01-27 01:40:17 +03:00
|
|
|
ContentBridgeParent* parent = ContentBridgeParent::Create(Move(endpoint));
|
2016-01-05 12:59:30 +03:00
|
|
|
parent->SetChildID(cpId);
|
|
|
|
parent->SetIsForBrowser(isForBrowser);
|
|
|
|
return parent;
|
2014-08-13 10:18:00 +04:00
|
|
|
}
|
|
|
|
|
2011-08-02 23:35:42 +04:00
|
|
|
void
|
|
|
|
ContentParent::GetAll(nsTArray<ContentParent*>& aArray)
|
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
aArray.Clear();
|
2012-07-14 01:10:20 +04:00
|
|
|
|
2016-06-07 01:23:43 +03:00
|
|
|
for (auto* cp : AllProcesses(eLive)) {
|
|
|
|
aArray.AppendElement(cp);
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
2013-07-18 01:31:10 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
ContentParent::GetAllEvenIfDead(nsTArray<ContentParent*>& aArray)
|
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
aArray.Clear();
|
2013-07-18 01:31:10 +04:00
|
|
|
|
2016-06-07 01:23:43 +03:00
|
|
|
for (auto* cp : AllProcesses(eAll)) {
|
2016-01-05 12:59:30 +03:00
|
|
|
aArray.AppendElement(cp);
|
|
|
|
}
|
2009-08-12 20:18:08 +04:00
|
|
|
}
|
|
|
|
|
2017-01-25 10:18:00 +03:00
|
|
|
const nsAString&
|
|
|
|
ContentParent::GetRemoteType() const
|
|
|
|
{
|
|
|
|
return mRemoteType;
|
|
|
|
}
|
|
|
|
|
2010-12-26 23:03:52 +03:00
|
|
|
void
|
|
|
|
ContentParent::Init()
|
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
nsCOMPtr<nsIObserverService> obs = mozilla::services::GetObserverService();
|
|
|
|
if (obs) {
|
|
|
|
size_t length = ArrayLength(sObserverTopics);
|
|
|
|
for (size_t i = 0; i < length; ++i) {
|
|
|
|
obs->AddObserver(this, sObserverTopics[i], false);
|
2010-12-26 23:03:52 +03:00
|
|
|
}
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
|
|
|
Preferences::AddStrongObserver(this, "");
|
|
|
|
if (obs) {
|
|
|
|
nsAutoString cpId;
|
|
|
|
cpId.AppendInt(static_cast<uint64_t>(this->ChildID()));
|
|
|
|
obs->NotifyObservers(static_cast<nsIObserver*>(this), "ipc:content-created", cpId.get());
|
|
|
|
}
|
2011-07-21 08:37:32 +04:00
|
|
|
|
|
|
|
#ifdef ACCESSIBILITY
|
2016-01-05 12:59:30 +03:00
|
|
|
// If accessibility is running in chrome process then start it in content
|
|
|
|
// process.
|
|
|
|
if (nsIPresShell::IsAccessibilityActive()) {
|
2016-10-17 22:08:21 +03:00
|
|
|
#if defined(XP_WIN)
|
2017-01-29 10:27:33 +03:00
|
|
|
Unused <<
|
|
|
|
SendActivateA11y(a11y::AccessibleWrap::GetContentProcessIdFor(ChildID()));
|
2016-10-17 22:08:21 +03:00
|
|
|
#else
|
2016-10-20 21:34:16 +03:00
|
|
|
Unused << SendActivateA11y(0);
|
2011-07-21 08:37:32 +04:00
|
|
|
#endif
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
|
|
|
#endif
|
2015-08-11 21:26:27 +03:00
|
|
|
|
2017-01-24 06:15:12 +03:00
|
|
|
#ifdef MOZ_GECKO_PROFILER
|
2016-01-05 12:59:30 +03:00
|
|
|
nsCOMPtr<nsIProfiler> profiler(do_GetService("@mozilla.org/tools/profiler;1"));
|
|
|
|
bool profilerActive = false;
|
|
|
|
DebugOnly<nsresult> rv = profiler->IsActive(&profilerActive);
|
|
|
|
MOZ_ASSERT(NS_SUCCEEDED(rv));
|
|
|
|
|
|
|
|
if (profilerActive) {
|
|
|
|
nsCOMPtr<nsIProfilerStartParams> currentProfilerParams;
|
|
|
|
rv = profiler->GetStartParams(getter_AddRefs(currentProfilerParams));
|
2015-08-11 21:26:27 +03:00
|
|
|
MOZ_ASSERT(NS_SUCCEEDED(rv));
|
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
nsCOMPtr<nsISupports> gatherer;
|
|
|
|
rv = profiler->GetProfileGatherer(getter_AddRefs(gatherer));
|
|
|
|
MOZ_ASSERT(NS_SUCCEEDED(rv));
|
|
|
|
mGatherer = static_cast<ProfileGatherer*>(gatherer.get());
|
2015-08-12 21:20:26 +03:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
StartProfiler(currentProfilerParams);
|
|
|
|
}
|
2015-08-11 21:26:27 +03:00
|
|
|
#endif
|
2016-11-01 06:25:19 +03:00
|
|
|
|
|
|
|
RefPtr<GeckoMediaPluginServiceParent> gmps(GeckoMediaPluginServiceParent::GetSingleton());
|
|
|
|
gmps->UpdateContentProcessGMPCapabilities();
|
2010-12-26 23:03:52 +03:00
|
|
|
}
|
|
|
|
|
2014-08-01 22:02:55 +04:00
|
|
|
namespace {
|
|
|
|
|
2015-12-04 02:04:28 +03:00
|
|
|
class RemoteWindowContext final : public nsIRemoteWindowContext
|
|
|
|
, public nsIInterfaceRequestor
|
|
|
|
{
|
|
|
|
public:
|
2016-01-05 12:59:30 +03:00
|
|
|
explicit RemoteWindowContext(TabParent* aTabParent)
|
|
|
|
: mTabParent(aTabParent)
|
|
|
|
{
|
|
|
|
}
|
2015-12-04 02:04:28 +03:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
NS_DECL_ISUPPORTS
|
|
|
|
NS_DECL_NSIINTERFACEREQUESTOR
|
|
|
|
NS_DECL_NSIREMOTEWINDOWCONTEXT
|
2015-12-04 02:04:28 +03:00
|
|
|
|
|
|
|
private:
|
2016-01-05 12:59:30 +03:00
|
|
|
~RemoteWindowContext();
|
|
|
|
RefPtr<TabParent> mTabParent;
|
2015-12-04 02:04:28 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
NS_IMPL_ISUPPORTS(RemoteWindowContext, nsIRemoteWindowContext, nsIInterfaceRequestor)
|
|
|
|
|
|
|
|
RemoteWindowContext::~RemoteWindowContext()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
RemoteWindowContext::GetInterface(const nsIID& aIID, void** aSink)
|
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
return QueryInterface(aIID, aSink);
|
2015-12-04 02:04:28 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
2016-03-12 01:31:55 +03:00
|
|
|
RemoteWindowContext::OpenURI(nsIURI* aURI)
|
2015-12-04 02:04:28 +03:00
|
|
|
{
|
2016-03-12 01:31:55 +03:00
|
|
|
mTabParent->LoadURL(aURI);
|
2016-01-05 12:59:30 +03:00
|
|
|
return NS_OK;
|
2015-12-04 02:04:28 +03:00
|
|
|
}
|
|
|
|
|
2015-07-13 18:25:42 +03:00
|
|
|
} // namespace
|
2014-08-01 22:02:55 +04:00
|
|
|
|
2013-02-08 18:32:23 +04:00
|
|
|
bool
|
2013-02-15 00:41:30 +04:00
|
|
|
ContentParent::SetPriorityAndCheckIsAlive(ProcessPriority aPriority)
|
2012-08-16 05:46:03 +04:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
ProcessPriorityManager::SetProcessPriority(this, aPriority);
|
|
|
|
|
|
|
|
// Now that we've set this process's priority, check whether the process is
|
|
|
|
// still alive. Hopefully we've set the priority to FOREGROUND*, so the
|
|
|
|
// process won't unexpectedly crash after this point!
|
|
|
|
//
|
|
|
|
// Bug 943174: use waitid() with WNOWAIT so that, if the process
|
|
|
|
// did exit, we won't consume its zombie and confuse the
|
2016-08-02 15:54:00 +03:00
|
|
|
// GeckoChildProcessHost dtor.
|
2014-04-04 00:19:00 +04:00
|
|
|
#ifdef MOZ_WIDGET_GONK
|
2016-01-05 12:59:30 +03:00
|
|
|
siginfo_t info;
|
|
|
|
info.si_pid = 0;
|
|
|
|
if (waitid(P_PID, Pid(), &info, WNOWAIT | WNOHANG | WEXITED) == 0
|
|
|
|
&& info.si_pid != 0) {
|
|
|
|
return false;
|
|
|
|
}
|
2013-02-15 00:41:29 +04:00
|
|
|
#endif
|
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
return true;
|
2013-02-15 00:41:30 +04:00
|
|
|
}
|
|
|
|
|
2012-08-16 05:46:03 +04:00
|
|
|
void
|
2015-01-10 21:18:59 +03:00
|
|
|
ContentParent::ShutDownProcess(ShutDownMethod aMethod)
|
2015-01-07 10:33:50 +03:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
// Shutting down by sending a shutdown message works differently than the
|
|
|
|
// other methods. We first call Shutdown() in the child. After the child is
|
|
|
|
// ready, it calls FinishShutdown() on us. Then we close the channel.
|
|
|
|
if (aMethod == SEND_SHUTDOWN_MESSAGE) {
|
|
|
|
if (mIPCOpen && !mShutdownPending && SendShutdown()) {
|
|
|
|
mShutdownPending = true;
|
|
|
|
// Start the force-kill timer if we haven't already.
|
|
|
|
StartForceKillTimer();
|
2015-01-10 21:18:59 +03:00
|
|
|
}
|
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
// If call was not successful, the channel must have been broken
|
|
|
|
// somehow, and we will clean up the error in ActorDestroy.
|
|
|
|
return;
|
|
|
|
}
|
2014-09-27 03:21:57 +04:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
using mozilla::dom::quota::QuotaManagerService;
|
2013-08-07 22:08:52 +04:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
if (QuotaManagerService* quotaManagerService = QuotaManagerService::Get()) {
|
|
|
|
quotaManagerService->AbortOperationsForProcess(mChildID);
|
|
|
|
}
|
|
|
|
|
|
|
|
// If Close() fails with an error, we'll end up back in this function, but
|
2016-06-10 00:52:33 +03:00
|
|
|
// with aMethod = CLOSE_CHANNEL_WITH_ERROR.
|
2013-08-07 22:08:52 +04:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
if (aMethod == CLOSE_CHANNEL && !mCalledClose) {
|
|
|
|
// Close() can only be called once: It kicks off the destruction
|
|
|
|
// sequence.
|
|
|
|
mCalledClose = true;
|
|
|
|
Close();
|
|
|
|
}
|
2013-08-07 22:08:52 +04:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
const ManagedContainer<POfflineCacheUpdateParent>& ocuParents =
|
|
|
|
ManagedPOfflineCacheUpdateParent();
|
|
|
|
for (auto iter = ocuParents.ConstIter(); !iter.Done(); iter.Next()) {
|
|
|
|
RefPtr<mozilla::docshell::OfflineCacheUpdateParent> ocuParent =
|
|
|
|
static_cast<mozilla::docshell::OfflineCacheUpdateParent*>(iter.Get()->GetKey());
|
|
|
|
ocuParent->StopSendingMessagesToChild();
|
|
|
|
}
|
2014-11-13 03:31:00 +03:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
// NB: must MarkAsDead() here so that this isn't accidentally
|
|
|
|
// returned from Get*() while in the midst of shutdown.
|
|
|
|
MarkAsDead();
|
2013-08-07 22:08:52 +04:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
// A ContentParent object might not get freed until after XPCOM shutdown has
|
|
|
|
// shut down the cycle collector. But by then it's too late to release any
|
|
|
|
// CC'ed objects, so we need to null them out here, while we still can. See
|
|
|
|
// bug 899761.
|
|
|
|
ShutDownMessageManager();
|
2014-05-31 01:03:05 +04:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2015-01-10 21:18:59 +03:00
|
|
|
ContentParent::RecvFinishShutdown()
|
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
// At this point, we already called ShutDownProcess once with
|
|
|
|
// SEND_SHUTDOWN_MESSAGE. To actually close the channel, we call
|
|
|
|
// ShutDownProcess again with CLOSE_CHANNEL.
|
|
|
|
MOZ_ASSERT(mShutdownPending);
|
|
|
|
ShutDownProcess(CLOSE_CHANNEL);
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2015-01-10 21:18:59 +03:00
|
|
|
}
|
|
|
|
|
2014-05-31 01:03:05 +04:00
|
|
|
void
|
|
|
|
ContentParent::ShutDownMessageManager()
|
|
|
|
{
|
|
|
|
if (!mMessageManager) {
|
2016-01-05 12:59:30 +03:00
|
|
|
return;
|
2014-05-31 01:03:05 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
mMessageManager->ReceiveMessage(
|
2016-01-05 12:59:30 +03:00
|
|
|
static_cast<nsIContentFrameMessageManager*>(mMessageManager.get()), nullptr,
|
|
|
|
CHILD_PROCESS_SHUTDOWN_MESSAGE, false,
|
|
|
|
nullptr, nullptr, nullptr, nullptr);
|
2014-05-31 01:03:05 +04:00
|
|
|
|
|
|
|
mMessageManager->Disconnect();
|
|
|
|
mMessageManager = nullptr;
|
2012-07-17 22:27:27 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
ContentParent::MarkAsDead()
|
|
|
|
{
|
2016-10-15 04:46:26 +03:00
|
|
|
if (sBrowserContentParents) {
|
2016-11-24 18:08:32 +03:00
|
|
|
nsTArray<ContentParent*>* contentParents =
|
|
|
|
sBrowserContentParents->Get(mRemoteType);
|
|
|
|
if (contentParents) {
|
|
|
|
contentParents->RemoveElement(this);
|
|
|
|
if (contentParents->IsEmpty()) {
|
|
|
|
sBrowserContentParents->Remove(mRemoteType);
|
|
|
|
if (sBrowserContentParents->IsEmpty()) {
|
|
|
|
delete sBrowserContentParents;
|
|
|
|
sBrowserContentParents = nullptr;
|
|
|
|
}
|
|
|
|
}
|
2012-07-17 22:27:27 +04:00
|
|
|
}
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
2012-07-17 22:27:27 +04:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
if (sPrivateContent) {
|
|
|
|
sPrivateContent->RemoveElement(this);
|
|
|
|
if (!sPrivateContent->Length()) {
|
|
|
|
delete sPrivateContent;
|
|
|
|
sPrivateContent = nullptr;
|
2012-07-17 22:27:27 +04:00
|
|
|
}
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
2012-07-17 22:27:27 +04:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
mIsAlive = false;
|
2012-07-17 22:27:27 +04:00
|
|
|
}
|
|
|
|
|
2013-06-03 14:14:40 +04:00
|
|
|
void
|
|
|
|
ContentParent::OnChannelError()
|
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
RefPtr<ContentParent> content(this);
|
|
|
|
PContentParent::OnChannelError();
|
2013-06-03 14:14:40 +04:00
|
|
|
}
|
|
|
|
|
2010-11-24 16:58:21 +03:00
|
|
|
void
|
2012-09-17 12:37:20 +04:00
|
|
|
ContentParent::OnChannelConnected(int32_t pid)
|
2010-11-24 16:58:21 +03:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
SetOtherProcessId(pid);
|
2011-02-15 01:34:46 +03:00
|
|
|
|
|
|
|
#if defined(ANDROID) || defined(LINUX)
|
2016-01-05 12:59:30 +03:00
|
|
|
// Check nice preference
|
|
|
|
int32_t nice = Preferences::GetInt("dom.ipc.content.nice", 0);
|
2015-04-01 11:40:35 +03:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
// Environment variable overrides preference
|
|
|
|
char* relativeNicenessStr = getenv("MOZ_CHILD_PROCESS_RELATIVE_NICENESS");
|
|
|
|
if (relativeNicenessStr) {
|
|
|
|
nice = atoi(relativeNicenessStr);
|
|
|
|
}
|
2015-04-01 11:40:35 +03:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
/* make the GUI thread have higher priority on single-cpu devices */
|
|
|
|
nsCOMPtr<nsIPropertyBag2> infoService = do_GetService(NS_SYSTEMINFO_CONTRACTID);
|
|
|
|
if (infoService) {
|
|
|
|
int32_t cpus;
|
|
|
|
nsresult rv = infoService->GetPropertyAsInt32(NS_LITERAL_STRING("cpucount"), &cpus);
|
|
|
|
if (NS_FAILED(rv)) {
|
|
|
|
cpus = 1;
|
2010-11-24 16:58:21 +03:00
|
|
|
}
|
2016-01-05 12:59:30 +03:00
|
|
|
if (nice != 0 && cpus == 1) {
|
|
|
|
setpriority(PRIO_PROCESS, pid, getpriority(PRIO_PROCESS, pid) + nice);
|
|
|
|
}
|
|
|
|
}
|
2015-04-01 11:40:35 +03:00
|
|
|
#endif
|
2010-11-24 16:58:21 +03:00
|
|
|
}
|
|
|
|
|
2011-07-13 10:52:31 +04:00
|
|
|
void
|
2015-02-03 20:09:27 +03:00
|
|
|
ContentParent::ProcessingError(Result aCode, const char* aReason)
|
2011-07-13 10:52:31 +04:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
if (MsgDropped == aCode) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
// Other errors are big deals.
|
|
|
|
KillHard(aReason);
|
2011-07-13 10:52:31 +04:00
|
|
|
}
|
|
|
|
|
2016-01-08 22:17:39 +03:00
|
|
|
/* static */
|
2014-06-11 09:44:39 +04:00
|
|
|
bool
|
2016-01-08 22:17:39 +03:00
|
|
|
ContentParent::AllocateLayerTreeId(TabParent* aTabParent, uint64_t* aId)
|
|
|
|
{
|
|
|
|
return AllocateLayerTreeId(aTabParent->Manager()->AsContentParent(),
|
|
|
|
aTabParent, aTabParent->GetTabId(), aId);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* static */
|
|
|
|
bool
|
|
|
|
ContentParent::AllocateLayerTreeId(ContentParent* aContent,
|
|
|
|
TabParent* aTopLevel, const TabId& aTabId,
|
|
|
|
uint64_t* aId)
|
2014-06-11 09:44:39 +04:00
|
|
|
{
|
2016-05-23 10:28:51 +03:00
|
|
|
GPUProcessManager* gpu = GPUProcessManager::Get();
|
2016-08-16 23:59:13 +03:00
|
|
|
|
2016-05-23 10:28:51 +03:00
|
|
|
*aId = gpu->AllocateLayerTreeId();
|
2016-08-30 14:32:55 +03:00
|
|
|
|
|
|
|
if (!aContent || !aTopLevel) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2016-08-16 23:59:13 +03:00
|
|
|
gpu->MapLayerTreeId(*aId, aContent->OtherPid());
|
2014-06-11 09:44:39 +04:00
|
|
|
|
2016-11-29 07:21:27 +03:00
|
|
|
return true;
|
2016-01-08 22:17:39 +03:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2016-01-08 22:17:39 +03:00
|
|
|
ContentParent::RecvAllocateLayerTreeId(const ContentParentId& aCpId,
|
|
|
|
const TabId& aTabId, uint64_t* aId)
|
|
|
|
{
|
|
|
|
// Protect against spoofing by a compromised child. aCpId must either
|
|
|
|
// correspond to the process that this ContentParent represents or be a
|
|
|
|
// child of it.
|
|
|
|
ContentProcessManager* cpm = ContentProcessManager::GetSingleton();
|
|
|
|
if (ChildID() != aCpId) {
|
|
|
|
ContentParentId parent;
|
|
|
|
if (!cpm->GetParentProcessId(aCpId, &parent) ||
|
|
|
|
ChildID() != parent) {
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_FAIL_NO_REASON(this);
|
2016-01-08 22:17:39 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// GetTopLevelTabParentByProcessAndTabId will make sure that aTabId
|
|
|
|
// lives in the process for aCpId.
|
|
|
|
RefPtr<ContentParent> contentParent = cpm->GetContentProcessById(aCpId);
|
|
|
|
RefPtr<TabParent> browserParent =
|
|
|
|
cpm->GetTopLevelTabParentByProcessAndTabId(aCpId, aTabId);
|
|
|
|
MOZ_ASSERT(contentParent && browserParent);
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
if (!AllocateLayerTreeId(contentParent, browserParent, aTabId, aId)) {
|
|
|
|
return IPC_FAIL_NO_REASON(this);
|
|
|
|
}
|
|
|
|
return IPC_OK();
|
2014-06-11 09:44:39 +04:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2014-06-11 09:44:39 +04:00
|
|
|
ContentParent::RecvDeallocateLayerTreeId(const uint64_t& aId)
|
|
|
|
{
|
2016-08-16 23:59:13 +03:00
|
|
|
GPUProcessManager* gpu = GPUProcessManager::Get();
|
|
|
|
|
2016-11-02 23:55:07 +03:00
|
|
|
if (!gpu->IsLayerTreeIdMapped(aId, OtherPid()))
|
2016-05-23 10:27:57 +03:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
// You can't deallocate layer tree ids that you didn't allocate
|
|
|
|
KillHard("DeallocateLayerTreeId");
|
|
|
|
}
|
2016-08-16 23:59:13 +03:00
|
|
|
|
2016-11-02 23:55:07 +03:00
|
|
|
gpu->UnmapLayerTreeId(aId, OtherPid());
|
2016-08-16 23:59:13 +03:00
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2014-06-11 09:44:39 +04:00
|
|
|
}
|
|
|
|
|
2010-11-24 16:58:21 +03:00
|
|
|
namespace {
|
2011-08-31 08:11:25 +04:00
|
|
|
|
2016-05-28 04:03:12 +03:00
|
|
|
void
|
|
|
|
DelayedDeleteSubprocess(GeckoChildProcessHost* aSubprocess)
|
|
|
|
{
|
|
|
|
RefPtr<DeleteTask<GeckoChildProcessHost>> task = new DeleteTask<GeckoChildProcessHost>(aSubprocess);
|
|
|
|
XRE_GetIOMessageLoop()->PostTask(task.forget());
|
|
|
|
}
|
|
|
|
|
2011-08-31 08:11:25 +04:00
|
|
|
// This runnable only exists to delegate ownership of the
|
|
|
|
// ContentParent to this runnable, until it's deleted by the event
|
|
|
|
// system.
|
2016-04-26 03:23:21 +03:00
|
|
|
struct DelayedDeleteContentParentTask : public Runnable
|
2011-08-31 08:11:25 +04:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
explicit DelayedDeleteContentParentTask(ContentParent* aObj) : mObj(aObj) { }
|
2011-08-31 08:11:25 +04:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
// No-op
|
2016-08-08 05:18:10 +03:00
|
|
|
NS_IMETHOD Run() override { return NS_OK; }
|
2011-08-31 08:11:25 +04:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
RefPtr<ContentParent> mObj;
|
2011-08-31 08:11:25 +04:00
|
|
|
};
|
|
|
|
|
2015-07-13 18:25:42 +03:00
|
|
|
} // namespace
|
2010-11-24 16:58:21 +03:00
|
|
|
|
2010-02-02 04:53:52 +03:00
|
|
|
void
|
2010-07-19 22:33:33 +04:00
|
|
|
ContentParent::ActorDestroy(ActorDestroyReason why)
|
2010-02-02 04:53:52 +03:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
if (mForceKillTimer) {
|
|
|
|
mForceKillTimer->Cancel();
|
|
|
|
mForceKillTimer = nullptr;
|
|
|
|
}
|
2015-01-07 08:40:56 +03:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
// Signal shutdown completion regardless of error state, so we can
|
|
|
|
// finish waiting in the xpcom-shutdown/profile-before-change observer.
|
|
|
|
mIPCOpen = false;
|
2015-01-10 21:18:59 +03:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
if (mHangMonitorActor) {
|
|
|
|
ProcessHangMonitor::RemoveProcess(mHangMonitorActor);
|
|
|
|
mHangMonitorActor = nullptr;
|
|
|
|
}
|
2015-01-17 05:34:47 +03:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
if (why == NormalShutdown && !mCalledClose) {
|
|
|
|
// If we shut down normally but haven't called Close, assume somebody
|
|
|
|
// else called Close on us. In that case, we still need to call
|
|
|
|
// ShutDownProcess below to perform other necessary clean up.
|
|
|
|
mCalledClose = true;
|
|
|
|
}
|
2015-01-10 21:18:59 +03:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
// Make sure we always clean up.
|
|
|
|
ShutDownProcess(why == NormalShutdown ? CLOSE_CHANNEL
|
|
|
|
: CLOSE_CHANNEL_WITH_ERROR);
|
|
|
|
|
|
|
|
RefPtr<ContentParent> kungFuDeathGrip(this);
|
|
|
|
nsCOMPtr<nsIObserverService> obs = mozilla::services::GetObserverService();
|
|
|
|
if (obs) {
|
|
|
|
size_t length = ArrayLength(sObserverTopics);
|
|
|
|
for (size_t i = 0; i < length; ++i) {
|
|
|
|
obs->RemoveObserver(static_cast<nsIObserver*>(this),
|
|
|
|
sObserverTopics[i]);
|
2010-12-26 22:27:50 +03:00
|
|
|
}
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
2010-12-26 22:27:50 +03:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
// remove the global remote preferences observers
|
|
|
|
Preferences::RemoveObserver(this, "");
|
2016-08-04 21:33:42 +03:00
|
|
|
gfxVars::RemoveReceiver(this);
|
2010-12-26 22:27:50 +03:00
|
|
|
|
2016-09-20 11:18:50 +03:00
|
|
|
if (GPUProcessManager* gpu = GPUProcessManager::Get()) {
|
|
|
|
// Note: the manager could have shutdown already.
|
|
|
|
gpu->RemoveListener(this);
|
|
|
|
}
|
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
RecvRemoveGeolocationListener();
|
2010-12-26 22:27:50 +03:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
mConsoleService = nullptr;
|
2012-11-09 21:52:09 +04:00
|
|
|
|
2017-01-24 06:15:12 +03:00
|
|
|
#ifdef MOZ_GECKO_PROFILER
|
2016-01-05 12:59:30 +03:00
|
|
|
if (mGatherer && !mProfile.IsEmpty()) {
|
|
|
|
mGatherer->OOPExitProfile(mProfile);
|
|
|
|
}
|
2015-08-18 21:57:35 +03:00
|
|
|
#endif
|
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
if (obs) {
|
|
|
|
RefPtr<nsHashPropertyBag> props = new nsHashPropertyBag();
|
2010-11-24 16:58:21 +03:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
props->SetPropertyAsUint64(NS_LITERAL_STRING("childID"), mChildID);
|
2012-11-17 19:05:18 +04:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
if (AbnormalShutdown == why) {
|
|
|
|
Telemetry::Accumulate(Telemetry::SUBPROCESS_ABNORMAL_ABORT,
|
|
|
|
NS_LITERAL_CSTRING("content"), 1);
|
2014-12-12 22:13:28 +03:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
props->SetPropertyAsBool(NS_LITERAL_STRING("abnormal"), true);
|
2010-11-24 16:58:21 +03:00
|
|
|
|
|
|
|
#ifdef MOZ_CRASHREPORTER
|
2016-01-05 12:59:30 +03:00
|
|
|
// There's a window in which child processes can crash
|
|
|
|
// after IPC is established, but before a crash reporter
|
|
|
|
// is created.
|
|
|
|
if (PCrashReporterParent* p = LoneManagedOrNullAsserts(ManagedPCrashReporterParent())) {
|
|
|
|
CrashReporterParent* crashReporter =
|
|
|
|
static_cast<CrashReporterParent*>(p);
|
|
|
|
|
|
|
|
// if mCreatedPairedMinidumps is true, we've already generated
|
|
|
|
// parent/child dumps for dekstop crashes.
|
|
|
|
if (!mCreatedPairedMinidumps) {
|
|
|
|
crashReporter->GenerateCrashReport(this, nullptr);
|
2015-08-28 10:18:00 +03:00
|
|
|
}
|
2016-01-05 12:59:30 +03:00
|
|
|
|
|
|
|
nsAutoString dumpID(crashReporter->ChildDumpID());
|
|
|
|
props->SetPropertyAsAString(NS_LITERAL_STRING("dumpID"), dumpID);
|
2015-08-28 10:18:00 +03:00
|
|
|
}
|
2016-01-05 12:59:30 +03:00
|
|
|
#endif
|
2015-08-28 10:18:00 +03:00
|
|
|
}
|
2016-01-05 12:59:30 +03:00
|
|
|
nsAutoString cpId;
|
|
|
|
cpId.AppendInt(static_cast<uint64_t>(this->ChildID()));
|
|
|
|
obs->NotifyObservers((nsIPropertyBag2*) props, "ipc:content-shutdown", cpId.get());
|
|
|
|
}
|
2015-08-28 10:18:00 +03:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
// Remove any and all idle listeners.
|
|
|
|
nsCOMPtr<nsIIdleService> idleService =
|
|
|
|
do_GetService("@mozilla.org/widget/idleservice;1");
|
|
|
|
MOZ_ASSERT(idleService);
|
|
|
|
RefPtr<ParentIdleListener> listener;
|
|
|
|
for (int32_t i = mIdleListeners.Length() - 1; i >= 0; --i) {
|
|
|
|
listener = static_cast<ParentIdleListener*>(mIdleListeners[i].get());
|
|
|
|
idleService->RemoveIdleObserver(listener, listener->mTime);
|
|
|
|
}
|
|
|
|
mIdleListeners.Clear();
|
|
|
|
|
2016-05-28 04:03:12 +03:00
|
|
|
MessageLoop::current()->
|
|
|
|
PostTask(NewRunnableFunction(DelayedDeleteSubprocess, mSubprocess));
|
|
|
|
mSubprocess = nullptr;
|
2016-01-05 12:59:30 +03:00
|
|
|
|
|
|
|
// IPDL rules require actors to live on past ActorDestroy, but it
|
|
|
|
// may be that the kungFuDeathGrip above is the last reference to
|
|
|
|
// |this|. If so, when we go out of scope here, we're deleted and
|
|
|
|
// all hell breaks loose.
|
|
|
|
//
|
|
|
|
// This runnable ensures that a reference to |this| lives on at
|
|
|
|
// least until after the current task finishes running.
|
|
|
|
NS_DispatchToCurrentThread(new DelayedDeleteContentParentTask(this));
|
|
|
|
|
|
|
|
ContentProcessManager* cpm = ContentProcessManager::GetSingleton();
|
|
|
|
nsTArray<ContentParentId> childIDArray =
|
|
|
|
cpm->GetAllChildProcessById(this->ChildID());
|
|
|
|
|
|
|
|
// Destroy any processes created by this ContentParent
|
|
|
|
for(uint32_t i = 0; i < childIDArray.Length(); i++) {
|
|
|
|
ContentParent* cp = cpm->GetContentProcessById(childIDArray[i]);
|
2016-05-05 11:45:00 +03:00
|
|
|
MessageLoop::current()->PostTask(NewRunnableMethod
|
|
|
|
<ShutDownMethod>(cp,
|
|
|
|
&ContentParent::ShutDownProcess,
|
|
|
|
SEND_SHUTDOWN_MESSAGE));
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
|
|
|
cpm->RemoveContentProcess(this->ChildID());
|
|
|
|
|
|
|
|
if (mDriverCrashGuard) {
|
|
|
|
mDriverCrashGuard->NotifyCrashed();
|
|
|
|
}
|
2016-07-18 12:12:18 +03:00
|
|
|
|
|
|
|
// Unregister all the BlobURLs registered by the ContentChild.
|
|
|
|
for (uint32_t i = 0; i < mBlobURLs.Length(); ++i) {
|
|
|
|
nsHostObjectProtocolHandler::RemoveDataEntry(mBlobURLs[i]);
|
|
|
|
}
|
|
|
|
|
|
|
|
mBlobURLs.Clear();
|
2016-09-27 01:17:58 +03:00
|
|
|
|
|
|
|
#if defined(XP_WIN32) && defined(ACCESSIBILITY)
|
|
|
|
a11y::AccessibleWrap::ReleaseContentProcessIdFor(ChildID());
|
|
|
|
#endif
|
2010-02-02 04:53:52 +03:00
|
|
|
}
|
|
|
|
|
2016-11-24 18:08:32 +03:00
|
|
|
bool
|
|
|
|
ContentParent::ShouldKeepProcessAlive() const
|
|
|
|
{
|
|
|
|
if (!sBrowserContentParents) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
// If we have already been marked as dead, don't prevent shutdown.
|
|
|
|
if (!IsAlive()) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
auto contentParents = sBrowserContentParents->Get(mRemoteType);
|
|
|
|
if (!contentParents) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2017-01-13 00:48:23 +03:00
|
|
|
// We might want to keep alive some content processes alive during test runs,
|
|
|
|
// for performance reasons. This should never be used in production.
|
2016-11-24 18:08:32 +03:00
|
|
|
// We don't want to alter behavior if the pref is not set, so default to 0.
|
2017-01-13 00:48:23 +03:00
|
|
|
int32_t processesToKeepAlive = 0;
|
|
|
|
|
|
|
|
nsAutoCString keepAlivePref("dom.ipc.keepProcessesAlive.");
|
|
|
|
keepAlivePref.Append(NS_ConvertUTF16toUTF8(mRemoteType));
|
|
|
|
if (NS_FAILED(Preferences::GetInt(keepAlivePref.get(), &processesToKeepAlive))) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2016-11-24 18:08:32 +03:00
|
|
|
int32_t numberOfAliveProcesses = contentParents->Length();
|
|
|
|
|
|
|
|
return numberOfAliveProcesses <= processesToKeepAlive;
|
|
|
|
}
|
|
|
|
|
2012-07-17 22:27:27 +04:00
|
|
|
void
|
2015-08-28 10:18:00 +03:00
|
|
|
ContentParent::NotifyTabDestroying(const TabId& aTabId,
|
|
|
|
const ContentParentId& aCpId)
|
2013-01-10 17:22:14 +04:00
|
|
|
{
|
2015-08-28 10:18:00 +03:00
|
|
|
if (XRE_IsParentProcess()) {
|
2013-01-10 17:22:14 +04:00
|
|
|
// There can be more than one PBrowser for a given app process
|
|
|
|
// because of popup windows. PBrowsers can also destroy
|
|
|
|
// concurrently. When all the PBrowsers are destroying, kick off
|
|
|
|
// another task to ensure the child process *really* shuts down,
|
|
|
|
// even if the PBrowsers themselves never finish destroying.
|
2015-08-28 10:18:00 +03:00
|
|
|
ContentProcessManager* cpm = ContentProcessManager::GetSingleton();
|
|
|
|
ContentParent* cp = cpm->GetContentProcessById(aCpId);
|
|
|
|
if (!cp) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
++cp->mNumDestroyingTabs;
|
|
|
|
nsTArray<TabId> tabIds = cpm->GetTabParentsByProcessId(aCpId);
|
|
|
|
if (static_cast<size_t>(cp->mNumDestroyingTabs) != tabIds.Length()) {
|
2013-01-10 17:22:14 +04:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2016-11-24 18:08:32 +03:00
|
|
|
if (cp->ShouldKeepProcessAlive()) {
|
2016-11-18 02:58:51 +03:00
|
|
|
return;
|
2016-11-02 13:13:37 +03:00
|
|
|
}
|
|
|
|
|
2013-01-10 17:22:14 +04:00
|
|
|
// We're dying now, so prevent this content process from being
|
|
|
|
// recycled during its shutdown procedure.
|
2015-08-28 10:18:00 +03:00
|
|
|
cp->MarkAsDead();
|
|
|
|
cp->StartForceKillTimer();
|
|
|
|
} else {
|
|
|
|
ContentChild::GetSingleton()->SendNotifyTabDestroying(aTabId, aCpId);
|
|
|
|
}
|
2015-01-10 21:45:58 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
ContentParent::StartForceKillTimer()
|
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
if (mForceKillTimer || !mIPCOpen) {
|
|
|
|
return;
|
|
|
|
}
|
2013-01-10 17:22:14 +04:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
int32_t timeoutSecs = Preferences::GetInt("dom.ipc.tabs.shutdownTimeoutSecs", 5);
|
|
|
|
if (timeoutSecs > 0) {
|
|
|
|
mForceKillTimer = do_CreateInstance("@mozilla.org/timer;1");
|
|
|
|
MOZ_ASSERT(mForceKillTimer);
|
|
|
|
mForceKillTimer->InitWithFuncCallback(ContentParent::ForceKillTimerCallback,
|
|
|
|
this,
|
|
|
|
timeoutSecs * 1000,
|
|
|
|
nsITimer::TYPE_ONE_SHOT);
|
|
|
|
}
|
2013-01-10 17:22:14 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2015-08-28 10:18:00 +03:00
|
|
|
ContentParent::NotifyTabDestroyed(const TabId& aTabId,
|
2013-01-10 17:22:14 +04:00
|
|
|
bool aNotifiedDestroying)
|
2012-07-17 22:27:27 +04:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
if (aNotifiedDestroying) {
|
|
|
|
--mNumDestroyingTabs;
|
|
|
|
}
|
2013-01-10 17:22:14 +04:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
nsTArray<PContentPermissionRequestParent*> parentArray =
|
|
|
|
nsContentPermissionUtils::GetContentPermissionRequestParentById(aTabId);
|
2015-04-14 04:08:00 +03:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
// Need to close undeleted ContentPermissionRequestParents before tab is closed.
|
|
|
|
for (auto& permissionRequestParent : parentArray) {
|
|
|
|
Unused << PContentPermissionRequestParent::Send__delete__(permissionRequestParent);
|
|
|
|
}
|
2015-04-14 04:08:00 +03:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
// There can be more than one PBrowser for a given app process
|
|
|
|
// because of popup windows. When the last one closes, shut
|
|
|
|
// us down.
|
|
|
|
ContentProcessManager* cpm = ContentProcessManager::GetSingleton();
|
|
|
|
nsTArray<TabId> tabIds = cpm->GetTabParentsByProcessId(this->ChildID());
|
2016-11-02 13:13:37 +03:00
|
|
|
|
2016-11-24 18:08:32 +03:00
|
|
|
if (tabIds.Length() == 1 && !ShouldKeepProcessAlive()) {
|
2016-01-05 12:59:30 +03:00
|
|
|
// In the case of normal shutdown, send a shutdown message to child to
|
|
|
|
// allow it to perform shutdown tasks.
|
2016-05-05 11:45:00 +03:00
|
|
|
MessageLoop::current()->PostTask(NewRunnableMethod
|
|
|
|
<ShutDownMethod>(this,
|
|
|
|
&ContentParent::ShutDownProcess,
|
|
|
|
SEND_SHUTDOWN_MESSAGE));
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
2012-07-17 22:27:27 +04:00
|
|
|
}
|
|
|
|
|
2015-01-27 00:32:18 +03:00
|
|
|
jsipc::CPOWManager*
|
2013-07-03 11:24:32 +04:00
|
|
|
ContentParent::GetCPOWManager()
|
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
if (PJavaScriptParent* p = LoneManagedOrNullAsserts(ManagedPJavaScriptParent())) {
|
|
|
|
return CPOWManagerFor(p);
|
|
|
|
}
|
|
|
|
return nullptr;
|
2013-07-03 11:24:32 +04:00
|
|
|
}
|
|
|
|
|
2009-08-12 22:31:48 +04:00
|
|
|
TestShellParent*
|
2010-07-19 22:33:33 +04:00
|
|
|
ContentParent::CreateTestShell()
|
2009-08-12 22:31:48 +04:00
|
|
|
{
|
2009-09-10 02:00:14 +04:00
|
|
|
return static_cast<TestShellParent*>(SendPTestShellConstructor());
|
2009-08-12 22:31:48 +04:00
|
|
|
}
|
|
|
|
|
2009-11-11 11:34:08 +03:00
|
|
|
bool
|
2010-07-19 22:33:33 +04:00
|
|
|
ContentParent::DestroyTestShell(TestShellParent* aTestShell)
|
2009-11-11 11:34:08 +03:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
return PTestShellParent::Send__delete__(aTestShell);
|
2009-11-11 11:34:08 +03:00
|
|
|
}
|
|
|
|
|
2011-06-24 03:31:58 +04:00
|
|
|
TestShellParent*
|
|
|
|
ContentParent::GetTestShellSingleton()
|
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
PTestShellParent* p = LoneManagedOrNullAsserts(ManagedPTestShellParent());
|
|
|
|
return static_cast<TestShellParent*>(p);
|
2011-06-24 03:31:58 +04:00
|
|
|
}
|
|
|
|
|
2013-06-03 14:14:40 +04:00
|
|
|
void
|
|
|
|
ContentParent::InitializeMembers()
|
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
mSubprocess = nullptr;
|
|
|
|
mChildID = gContentChildID++;
|
|
|
|
mGeolocationWatchID = -1;
|
|
|
|
mNumDestroyingTabs = 0;
|
|
|
|
mIsAlive = true;
|
|
|
|
mSendPermissionUpdates = false;
|
|
|
|
mCalledClose = false;
|
|
|
|
mCalledKillHard = false;
|
|
|
|
mCreatedPairedMinidumps = false;
|
|
|
|
mShutdownPending = false;
|
|
|
|
mIPCOpen = true;
|
|
|
|
mHangMonitorActor = nullptr;
|
2013-06-03 14:14:40 +04:00
|
|
|
}
|
|
|
|
|
2015-05-11 10:24:40 +03:00
|
|
|
bool
|
|
|
|
ContentParent::LaunchSubprocess(ProcessPriority aInitialPriority /* = PROCESS_PRIORITY_FOREGROUND */)
|
|
|
|
{
|
2016-01-15 01:03:11 +03:00
|
|
|
PROFILER_LABEL_FUNC(js::ProfileEntry::Category::OTHER);
|
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
std::vector<std::string> extraArgs;
|
2017-02-05 08:52:38 +03:00
|
|
|
extraArgs.push_back("-childID");
|
|
|
|
char idStr[21];
|
|
|
|
SprintfLiteral(idStr, "%" PRId64, static_cast<uint64_t>(mChildID));
|
|
|
|
extraArgs.push_back(idStr);
|
|
|
|
extraArgs.push_back(IsForBrowser() ? "-isForBrowser" : "-notForBrowser");
|
|
|
|
|
|
|
|
std::stringstream boolPrefs;
|
|
|
|
std::stringstream intPrefs;
|
|
|
|
std::stringstream stringPrefs;
|
|
|
|
|
|
|
|
size_t prefsLen;
|
|
|
|
ContentPrefs::GetContentPrefs(&prefsLen);
|
|
|
|
|
|
|
|
for (unsigned int i = 0; i < prefsLen; i++) {
|
|
|
|
MOZ_ASSERT(i == 0 || strcmp(ContentPrefs::GetContentPref(i), ContentPrefs::GetContentPref(i - 1)) > 0);
|
|
|
|
switch (Preferences::GetType(ContentPrefs::GetContentPref(i))) {
|
|
|
|
case nsIPrefBranch::PREF_INT:
|
|
|
|
intPrefs << i << ':' << Preferences::GetInt(ContentPrefs::GetContentPref(i)) << '|';
|
|
|
|
break;
|
|
|
|
case nsIPrefBranch::PREF_BOOL:
|
|
|
|
boolPrefs << i << ':' << Preferences::GetBool(ContentPrefs::GetContentPref(i)) << '|';
|
|
|
|
break;
|
|
|
|
case nsIPrefBranch::PREF_STRING: {
|
|
|
|
std::string value(Preferences::GetCString(ContentPrefs::GetContentPref(i)).get());
|
|
|
|
stringPrefs << i << ':' << value.length() << ':' << value << '|';
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case nsIPrefBranch::PREF_INVALID:
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
printf("preference type: %x\n", Preferences::GetType(ContentPrefs::GetContentPref(i)));
|
|
|
|
MOZ_CRASH();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
extraArgs.push_back("-intPrefs");
|
|
|
|
extraArgs.push_back(intPrefs.str());
|
|
|
|
extraArgs.push_back("-boolPrefs");
|
|
|
|
extraArgs.push_back(boolPrefs.str());
|
|
|
|
extraArgs.push_back("-stringPrefs");
|
|
|
|
extraArgs.push_back(stringPrefs.str());
|
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
if (!mSubprocess->LaunchAndWaitForProcessHandle(extraArgs)) {
|
|
|
|
MarkAsDead();
|
|
|
|
return false;
|
|
|
|
}
|
2015-05-11 10:24:40 +03:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
Open(mSubprocess->GetChannel(),
|
|
|
|
base::GetProcId(mSubprocess->GetChildProcessHandle()));
|
2015-05-11 10:24:40 +03:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
InitInternal(aInitialPriority,
|
|
|
|
true, /* Setup off-main thread compositing */
|
|
|
|
true /* Send registered chrome */);
|
2015-05-11 10:24:40 +03:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
ContentProcessManager::GetSingleton()->AddContentProcess(this);
|
2015-05-11 10:24:40 +03:00
|
|
|
|
2017-01-05 23:54:52 +03:00
|
|
|
mHangMonitorActor = ProcessHangMonitor::AddProcess(this);
|
2015-05-11 10:24:40 +03:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
// Set a reply timeout for CPOWs.
|
|
|
|
SetReplyTimeoutMs(Preferences::GetInt("dom.ipc.cpow.timeout", 0));
|
2015-05-11 10:24:40 +03:00
|
|
|
|
2017-02-05 08:52:38 +03:00
|
|
|
Telemetry::Accumulate(Telemetry::CONTENT_PROCESS_LAUNCH_TIME_MS,
|
|
|
|
static_cast<uint32_t>((TimeStamp::Now() - mLaunchTS)
|
|
|
|
.ToMilliseconds()));
|
|
|
|
|
|
|
|
nsCOMPtr<nsIObserverService> obs = mozilla::services::GetObserverService();
|
|
|
|
if (obs) {
|
|
|
|
nsAutoString cpId;
|
|
|
|
cpId.AppendInt(static_cast<uint64_t>(this->ChildID()));
|
|
|
|
obs->NotifyObservers(static_cast<nsIObserver*>(this), "ipc:content-initializing", cpId.get());
|
|
|
|
}
|
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
return true;
|
2015-05-11 10:24:40 +03:00
|
|
|
}
|
|
|
|
|
2016-10-15 04:46:26 +03:00
|
|
|
ContentParent::ContentParent(ContentParent* aOpener,
|
2016-11-24 18:08:31 +03:00
|
|
|
const nsAString& aRemoteType)
|
2016-01-05 12:59:30 +03:00
|
|
|
: nsIContentParent()
|
2016-12-09 21:52:28 +03:00
|
|
|
, mLaunchTS(TimeStamp::Now())
|
2016-01-05 12:59:30 +03:00
|
|
|
, mOpener(aOpener)
|
2016-11-24 18:08:31 +03:00
|
|
|
, mRemoteType(aRemoteType)
|
|
|
|
, mIsForBrowser(!mRemoteType.IsEmpty())
|
2009-08-12 20:18:08 +04:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
InitializeMembers(); // Perform common initialization.
|
2013-06-03 14:14:40 +04:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
// Insert ourselves into the global linked list of ContentParent objects.
|
|
|
|
if (!sContentParents) {
|
|
|
|
sContentParents = new LinkedList<ContentParent>();
|
|
|
|
}
|
2016-08-02 15:54:00 +03:00
|
|
|
sContentParents->insertBack(this);
|
2013-04-26 04:53:26 +04:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
// From this point on, NS_WARNING, NS_ASSERTION, etc. should print out the
|
|
|
|
// PID along with the warning.
|
|
|
|
nsDebugImpl::SetMultiprocessMode("Parent");
|
2012-04-10 23:57:20 +04:00
|
|
|
|
2014-11-15 04:22:44 +03:00
|
|
|
#if defined(XP_WIN) && !defined(MOZ_B2G)
|
2016-01-05 12:59:30 +03:00
|
|
|
// Request Windows message deferral behavior on our side of the PContent
|
|
|
|
// channel. Generally only applies to the situation where we get caught in
|
|
|
|
// a deadlock with the plugin process when sending CPOWs.
|
|
|
|
GetIPCChannel()->SetChannelFlags(MessageChannel::REQUIRE_DEFERRED_MESSAGE_PROTECTION);
|
2014-11-15 04:22:44 +03:00
|
|
|
#endif
|
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
|
2016-11-24 18:08:32 +03:00
|
|
|
ChildPrivileges privs = mRemoteType.EqualsLiteral(FILE_REMOTE_TYPE)
|
|
|
|
? base::PRIVILEGES_FILEREAD
|
|
|
|
: base::PRIVILEGES_DEFAULT;
|
2016-01-05 12:59:30 +03:00
|
|
|
mSubprocess = new GeckoChildProcessHost(GeckoProcessType_Content, privs);
|
2009-08-12 20:18:08 +04:00
|
|
|
}
|
|
|
|
|
2010-07-19 22:33:33 +04:00
|
|
|
ContentParent::~ContentParent()
|
2009-08-12 20:18:08 +04:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
if (mForceKillTimer) {
|
|
|
|
mForceKillTimer->Cancel();
|
|
|
|
}
|
2013-01-10 17:22:14 +04:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
|
2012-07-14 01:10:20 +04:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
// We should be removed from all these lists in ActorDestroy.
|
|
|
|
MOZ_ASSERT(!sPrivateContent || !sPrivateContent->Contains(this));
|
2016-11-24 18:08:32 +03:00
|
|
|
MOZ_ASSERT(!sBrowserContentParents ||
|
|
|
|
!sBrowserContentParents->Contains(mRemoteType) ||
|
|
|
|
!sBrowserContentParents->Get(mRemoteType)->Contains(this));
|
2010-04-12 04:24:45 +04:00
|
|
|
}
|
|
|
|
|
2013-11-29 13:28:54 +04:00
|
|
|
void
|
|
|
|
ContentParent::InitInternal(ProcessPriority aInitialPriority,
|
|
|
|
bool aSetupOffMainThreadCompositing,
|
|
|
|
bool aSendRegisteredChrome)
|
|
|
|
{
|
2017-02-05 08:52:38 +03:00
|
|
|
Telemetry::Accumulate(Telemetry::CONTENT_PROCESS_LAUNCH_TIME_MS,
|
|
|
|
static_cast<uint32_t>((TimeStamp::Now() - mLaunchTS)
|
|
|
|
.ToMilliseconds()));
|
|
|
|
|
|
|
|
XPCOMInitData xpcomInit;
|
|
|
|
|
|
|
|
Preferences::GetPreferences(&xpcomInit.prefs());
|
|
|
|
nsCOMPtr<nsIIOService> io(do_GetIOService());
|
|
|
|
MOZ_ASSERT(io, "No IO service?");
|
|
|
|
DebugOnly<nsresult> rv = io->GetOffline(&xpcomInit.isOffline());
|
|
|
|
MOZ_ASSERT(NS_SUCCEEDED(rv), "Failed getting offline?");
|
|
|
|
|
|
|
|
rv = io->GetConnectivity(&xpcomInit.isConnected());
|
|
|
|
MOZ_ASSERT(NS_SUCCEEDED(rv), "Failed getting connectivity?");
|
|
|
|
|
|
|
|
xpcomInit.captivePortalState() = nsICaptivePortalService::UNKNOWN;
|
|
|
|
nsCOMPtr<nsICaptivePortalService> cps = do_GetService(NS_CAPTIVEPORTAL_CONTRACTID);
|
|
|
|
if (cps) {
|
|
|
|
cps->GetState(&xpcomInit.captivePortalState());
|
|
|
|
}
|
|
|
|
|
|
|
|
nsIBidiKeyboard* bidi = nsContentUtils::GetBidiKeyboard();
|
|
|
|
|
|
|
|
xpcomInit.isLangRTL() = false;
|
|
|
|
xpcomInit.haveBidiKeyboards() = false;
|
|
|
|
if (bidi) {
|
|
|
|
bidi->IsLangRTL(&xpcomInit.isLangRTL());
|
|
|
|
bidi->GetHaveBidiKeyboards(&xpcomInit.haveBidiKeyboards());
|
|
|
|
}
|
|
|
|
|
|
|
|
nsCOMPtr<nsISpellChecker> spellChecker(do_GetService(NS_SPELLCHECKER_CONTRACTID));
|
|
|
|
MOZ_ASSERT(spellChecker, "No spell checker?");
|
|
|
|
|
|
|
|
spellChecker->GetDictionaryList(&xpcomInit.dictionaries());
|
|
|
|
|
|
|
|
nsCOMPtr<nsIClipboard> clipboard(do_GetService("@mozilla.org/widget/clipboard;1"));
|
|
|
|
MOZ_ASSERT(clipboard, "No clipboard?");
|
|
|
|
|
|
|
|
rv = clipboard->SupportsSelectionClipboard(&xpcomInit.clipboardCaps().supportsSelectionClipboard());
|
|
|
|
MOZ_ASSERT(NS_SUCCEEDED(rv));
|
|
|
|
|
|
|
|
rv = clipboard->SupportsFindClipboard(&xpcomInit.clipboardCaps().supportsFindClipboard());
|
|
|
|
MOZ_ASSERT(NS_SUCCEEDED(rv));
|
|
|
|
|
|
|
|
// Let's copy the domain policy from the parent to the child (if it's active).
|
|
|
|
StructuredCloneData initialData;
|
|
|
|
nsIScriptSecurityManager* ssm = nsContentUtils::GetSecurityManager();
|
|
|
|
if (ssm) {
|
|
|
|
ssm->CloneDomainPolicy(&xpcomInit.domainPolicy());
|
|
|
|
|
|
|
|
if (nsFrameMessageManager* mm = nsFrameMessageManager::sParentProcessManager) {
|
|
|
|
AutoJSAPI jsapi;
|
|
|
|
if (NS_WARN_IF(!jsapi.Init(xpc::PrivilegedJunkScope()))) {
|
|
|
|
MOZ_CRASH();
|
|
|
|
}
|
|
|
|
JS::RootedValue init(jsapi.cx());
|
|
|
|
nsresult result = mm->GetInitialProcessData(jsapi.cx(), &init);
|
|
|
|
if (NS_FAILED(result)) {
|
|
|
|
MOZ_CRASH();
|
|
|
|
}
|
|
|
|
|
|
|
|
ErrorResult rv;
|
|
|
|
initialData.Write(jsapi.cx(), init, rv);
|
|
|
|
if (NS_WARN_IF(rv.Failed())) {
|
|
|
|
rv.SuppressException();
|
|
|
|
MOZ_CRASH();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// This is only implemented (returns a non-empty list) by MacOSX at present.
|
|
|
|
gfxPlatform::GetPlatform()->GetSystemFontFamilyList(&xpcomInit.fontFamilies());
|
|
|
|
nsTArray<LookAndFeelInt> lnfCache = LookAndFeel::GetIntCache();
|
|
|
|
|
|
|
|
// Content processes have no permission to access profile directory, so we
|
|
|
|
// send the file URL instead.
|
|
|
|
StyleSheet* ucs = nsLayoutStylesheetCache::For(StyleBackendType::Gecko)->UserContentSheet();
|
|
|
|
if (ucs) {
|
|
|
|
SerializeURI(ucs->GetSheetURI(), xpcomInit.userContentSheetURL());
|
|
|
|
} else {
|
|
|
|
SerializeURI(nullptr, xpcomInit.userContentSheetURL());
|
|
|
|
}
|
|
|
|
|
|
|
|
Unused << SendSetXPCOMProcessAttributes(xpcomInit, initialData, lnfCache);
|
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
if (aSendRegisteredChrome) {
|
|
|
|
nsCOMPtr<nsIChromeRegistry> registrySvc = nsChromeRegistry::GetService();
|
|
|
|
nsChromeRegistryChrome* chromeRegistry =
|
|
|
|
static_cast<nsChromeRegistryChrome*>(registrySvc.get());
|
|
|
|
chromeRegistry->SendRegisteredChrome(this);
|
|
|
|
}
|
2015-04-20 22:50:34 +03:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
if (gAppData) {
|
|
|
|
nsCString version(gAppData->version);
|
|
|
|
nsCString buildID(gAppData->buildID);
|
|
|
|
nsCString name(gAppData->name);
|
|
|
|
nsCString UAName(gAppData->UAName);
|
|
|
|
nsCString ID(gAppData->ID);
|
|
|
|
nsCString vendor(gAppData->vendor);
|
2015-05-14 17:49:38 +03:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
// Sending all information to content process.
|
|
|
|
Unused << SendAppInfo(version, buildID, name, UAName, ID, vendor);
|
|
|
|
}
|
2015-05-14 17:49:38 +03:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
// Initialize the message manager (and load delayed scripts) now that we
|
|
|
|
// have established communications with the child.
|
|
|
|
mMessageManager->InitWithCallback(this);
|
|
|
|
|
2017-01-25 01:26:21 +03:00
|
|
|
// Send the child its remote type. On Mac, this needs to be sent prior
|
|
|
|
// to the message we send to enable the Sandbox (SendStartProcessSandbox)
|
|
|
|
// because different remote types require different sandbox privileges.
|
|
|
|
Unused << SendRemoteType(mRemoteType);
|
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
// Set the subprocess's priority. We do this early on because we're likely
|
|
|
|
// /lowering/ the process's CPU and memory priority, which it has inherited
|
|
|
|
// from this process.
|
|
|
|
//
|
|
|
|
// This call can cause us to send IPC messages to the child process, so it
|
|
|
|
// must come after the Open() call above.
|
|
|
|
ProcessPriorityManager::SetProcessPriority(this, aInitialPriority);
|
|
|
|
|
|
|
|
if (aSetupOffMainThreadCompositing) {
|
|
|
|
// NB: internally, this will send an IPC message to the child
|
2016-03-22 21:08:38 +03:00
|
|
|
// process to get it to create the CompositorBridgeChild. This
|
2016-01-05 12:59:30 +03:00
|
|
|
// message goes through the regular IPC queue for this
|
|
|
|
// channel, so delivery will happen-before any other messages
|
2016-03-22 21:08:38 +03:00
|
|
|
// we send. The CompositorBridgeChild must be created before any
|
2016-01-05 12:59:30 +03:00
|
|
|
// PBrowsers are created, because they rely on the Compositor
|
|
|
|
// already being around. (Creation is async, so can't happen
|
|
|
|
// on demand.)
|
2016-05-16 09:39:30 +03:00
|
|
|
bool useOffMainThreadCompositing = !!CompositorThreadHolder::Loop();
|
2016-01-05 12:59:30 +03:00
|
|
|
if (useOffMainThreadCompositing) {
|
2016-07-18 07:24:28 +03:00
|
|
|
GPUProcessManager* gpm = GPUProcessManager::Get();
|
|
|
|
|
2016-09-20 11:15:49 +03:00
|
|
|
Endpoint<PCompositorBridgeChild> compositor;
|
|
|
|
Endpoint<PImageBridgeChild> imageBridge;
|
|
|
|
Endpoint<PVRManagerChild> vrBridge;
|
2016-11-08 05:21:35 +03:00
|
|
|
Endpoint<PVideoDecoderManagerChild> videoManager;
|
2016-09-20 11:15:49 +03:00
|
|
|
|
|
|
|
DebugOnly<bool> opened = gpm->CreateContentBridges(
|
|
|
|
OtherPid(),
|
|
|
|
&compositor,
|
|
|
|
&imageBridge,
|
2016-11-08 05:21:35 +03:00
|
|
|
&vrBridge,
|
|
|
|
&videoManager);
|
2016-09-20 11:15:49 +03:00
|
|
|
MOZ_ASSERT(opened);
|
|
|
|
|
|
|
|
Unused << SendInitRendering(
|
|
|
|
Move(compositor),
|
|
|
|
Move(imageBridge),
|
2016-11-08 05:21:35 +03:00
|
|
|
Move(vrBridge),
|
|
|
|
Move(videoManager));
|
2016-09-20 11:18:50 +03:00
|
|
|
|
|
|
|
gpm->AddListener(this);
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
|
|
|
}
|
2013-11-29 13:28:54 +04:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
nsStyleSheetService *sheetService = nsStyleSheetService::GetInstance();
|
|
|
|
if (sheetService) {
|
|
|
|
// This looks like a lot of work, but in a normal browser session we just
|
|
|
|
// send two loads.
|
2013-11-29 13:28:54 +04:00
|
|
|
|
2016-09-26 15:03:25 +03:00
|
|
|
for (StyleSheet* sheet : *sheetService->AgentStyleSheets()) {
|
2016-01-05 12:59:30 +03:00
|
|
|
URIParams uri;
|
|
|
|
SerializeURI(sheet->GetSheetURI(), uri);
|
|
|
|
Unused << SendLoadAndRegisterSheet(uri, nsIStyleSheetService::AGENT_SHEET);
|
|
|
|
}
|
2013-11-29 13:28:54 +04:00
|
|
|
|
2016-09-26 15:03:25 +03:00
|
|
|
for (StyleSheet* sheet : *sheetService->UserStyleSheets()) {
|
2016-01-05 12:59:30 +03:00
|
|
|
URIParams uri;
|
|
|
|
SerializeURI(sheet->GetSheetURI(), uri);
|
|
|
|
Unused << SendLoadAndRegisterSheet(uri, nsIStyleSheetService::USER_SHEET);
|
|
|
|
}
|
2013-11-29 13:28:54 +04:00
|
|
|
|
2016-09-26 15:03:25 +03:00
|
|
|
for (StyleSheet* sheet : *sheetService->AuthorStyleSheets()) {
|
2016-01-05 12:59:30 +03:00
|
|
|
URIParams uri;
|
|
|
|
SerializeURI(sheet->GetSheetURI(), uri);
|
|
|
|
Unused << SendLoadAndRegisterSheet(uri, nsIStyleSheetService::AUTHOR_SHEET);
|
2013-11-29 13:28:54 +04:00
|
|
|
}
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
2013-11-29 13:28:54 +04:00
|
|
|
|
|
|
|
#ifdef MOZ_CONTENT_SANDBOX
|
2016-01-05 12:59:30 +03:00
|
|
|
bool shouldSandbox = true;
|
|
|
|
MaybeFileDesc brokerFd = void_t();
|
2015-10-08 08:13:09 +03:00
|
|
|
#ifdef XP_LINUX
|
2016-06-16 13:39:07 +03:00
|
|
|
// XXX: Checking the pref here makes it possible to enable/disable sandboxing
|
|
|
|
// during an active session. Currently the pref is only used for testing
|
|
|
|
// purpose. If the decision is made to permanently rely on the pref, this
|
|
|
|
// should be changed so that it is required to restart firefox for the change
|
|
|
|
// of value to take effect.
|
|
|
|
shouldSandbox = (Preferences::GetInt("security.sandbox.content.level") > 0) &&
|
|
|
|
!PR_GetEnv("MOZ_DISABLE_CONTENT_SANDBOX");
|
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
if (shouldSandbox) {
|
|
|
|
MOZ_ASSERT(!mSandboxBroker);
|
|
|
|
UniquePtr<SandboxBroker::Policy> policy =
|
|
|
|
sSandboxBrokerPolicyFactory->GetContentPolicy(Pid());
|
|
|
|
if (policy) {
|
|
|
|
brokerFd = FileDescriptor();
|
|
|
|
mSandboxBroker = SandboxBroker::Create(Move(policy), Pid(), brokerFd);
|
|
|
|
if (!mSandboxBroker) {
|
|
|
|
KillHard("SandboxBroker::Create failed");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
MOZ_ASSERT(static_cast<const FileDescriptor&>(brokerFd).IsValid());
|
2015-10-08 08:13:09 +03:00
|
|
|
}
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
2015-10-08 08:13:09 +03:00
|
|
|
#endif
|
2016-01-05 12:59:30 +03:00
|
|
|
if (shouldSandbox && !SendSetProcessSandbox(brokerFd)) {
|
|
|
|
KillHard("SandboxInitFailed");
|
|
|
|
}
|
2013-11-29 13:28:54 +04:00
|
|
|
#endif
|
2016-03-13 16:25:23 +03:00
|
|
|
#if defined(XP_WIN)
|
|
|
|
// Send the info needed to join the browser process's audio session.
|
|
|
|
nsID id;
|
|
|
|
nsString sessionName;
|
|
|
|
nsString iconPath;
|
|
|
|
if (NS_SUCCEEDED(mozilla::widget::GetAudioSessionData(id, sessionName,
|
|
|
|
iconPath))) {
|
|
|
|
Unused << SendSetAudioSessionData(id, sessionName, iconPath);
|
|
|
|
}
|
|
|
|
#endif
|
2016-07-13 11:34:24 +03:00
|
|
|
|
2016-07-17 17:50:50 +03:00
|
|
|
{
|
|
|
|
RefPtr<ServiceWorkerRegistrar> swr = ServiceWorkerRegistrar::Get();
|
|
|
|
MOZ_ASSERT(swr);
|
2016-07-13 11:34:24 +03:00
|
|
|
|
2016-07-17 17:50:50 +03:00
|
|
|
nsTArray<ServiceWorkerRegistrationData> registrations;
|
|
|
|
swr->GetRegistrations(registrations);
|
|
|
|
Unused << SendInitServiceWorkers(ServiceWorkerConfiguration(registrations));
|
|
|
|
}
|
2016-07-13 11:34:24 +03:00
|
|
|
|
2016-07-17 17:50:50 +03:00
|
|
|
{
|
|
|
|
nsTArray<BlobURLRegistrationData> registrations;
|
|
|
|
if (nsHostObjectProtocolHandler::GetAllBlobURLEntries(registrations,
|
|
|
|
this)) {
|
|
|
|
Unused << SendInitBlobURLs(registrations);
|
|
|
|
}
|
|
|
|
}
|
2013-11-29 13:28:54 +04:00
|
|
|
}
|
|
|
|
|
2010-04-12 04:24:45 +04:00
|
|
|
bool
|
2016-01-05 12:59:30 +03:00
|
|
|
ContentParent::IsAlive() const
|
2010-04-12 04:24:45 +04:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
return mIsAlive;
|
2009-09-03 04:18:27 +04:00
|
|
|
}
|
|
|
|
|
2013-07-18 01:31:10 +04:00
|
|
|
int32_t
|
2016-01-05 12:59:30 +03:00
|
|
|
ContentParent::Pid() const
|
2013-07-18 01:31:10 +04:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
if (!mSubprocess || !mSubprocess->GetChildProcessHandle()) {
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
return base::GetProcId(mSubprocess->GetChildProcessHandle());
|
2013-07-18 01:31:10 +04:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2016-08-04 21:33:42 +03:00
|
|
|
ContentParent::RecvGetGfxVars(InfallibleTArray<GfxVarUpdate>* aVars)
|
|
|
|
{
|
|
|
|
// Ensure gfxVars is initialized (for xpcshell tests).
|
|
|
|
gfxVars::Initialize();
|
|
|
|
|
|
|
|
*aVars = gfxVars::FetchNonDefaultVars();
|
|
|
|
|
|
|
|
// Now that content has initialized gfxVars, we can start listening for
|
|
|
|
// updates.
|
|
|
|
gfxVars::AddReceiver(this);
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2016-08-04 21:33:42 +03:00
|
|
|
}
|
|
|
|
|
2016-09-20 11:18:50 +03:00
|
|
|
void
|
|
|
|
ContentParent::OnCompositorUnexpectedShutdown()
|
|
|
|
{
|
|
|
|
GPUProcessManager* gpm = GPUProcessManager::Get();
|
|
|
|
|
|
|
|
Endpoint<PCompositorBridgeChild> compositor;
|
|
|
|
Endpoint<PImageBridgeChild> imageBridge;
|
|
|
|
Endpoint<PVRManagerChild> vrBridge;
|
2016-11-08 05:21:35 +03:00
|
|
|
Endpoint<PVideoDecoderManagerChild> videoManager;
|
2016-09-20 11:18:50 +03:00
|
|
|
|
|
|
|
DebugOnly<bool> opened = gpm->CreateContentBridges(
|
|
|
|
OtherPid(),
|
|
|
|
&compositor,
|
|
|
|
&imageBridge,
|
2016-11-08 05:21:35 +03:00
|
|
|
&vrBridge,
|
|
|
|
&videoManager);
|
2016-09-20 11:18:50 +03:00
|
|
|
MOZ_ASSERT(opened);
|
|
|
|
|
|
|
|
Unused << SendReinitRendering(
|
|
|
|
Move(compositor),
|
|
|
|
Move(imageBridge),
|
2016-11-08 05:21:35 +03:00
|
|
|
Move(vrBridge),
|
|
|
|
Move(videoManager));
|
2016-09-20 11:18:50 +03:00
|
|
|
}
|
|
|
|
|
2016-08-04 21:33:42 +03:00
|
|
|
void
|
|
|
|
ContentParent::OnVarChanged(const GfxVarUpdate& aVar)
|
|
|
|
{
|
|
|
|
if (!mIPCOpen) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
Unused << SendVarUpdate(aVar);
|
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2011-01-13 07:04:42 +03:00
|
|
|
ContentParent::RecvReadFontList(InfallibleTArray<FontListEntry>* retValue)
|
|
|
|
{
|
|
|
|
#ifdef ANDROID
|
2016-01-05 12:59:30 +03:00
|
|
|
gfxAndroidPlatform::GetPlatform()->GetSystemFontList(retValue);
|
2011-01-13 07:04:42 +03:00
|
|
|
#endif
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2011-01-13 07:04:42 +03:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2015-10-30 22:30:00 +03:00
|
|
|
ContentParent::RecvReadDataStorageArray(const nsString& aFilename,
|
|
|
|
InfallibleTArray<DataStorageItem>* aValues)
|
|
|
|
{
|
2016-12-21 19:42:58 +03:00
|
|
|
// If we're shutting down, the DataStorage object may have been cleared
|
|
|
|
// already, and setting it up is pointless anyways since we're about to die.
|
|
|
|
if (mShutdownPending) {
|
|
|
|
return IPC_OK();
|
|
|
|
}
|
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
// Ensure the SSS is initialized before we try to use its storage.
|
|
|
|
nsCOMPtr<nsISiteSecurityService> sss = do_GetService("@mozilla.org/ssservice;1");
|
2015-11-16 21:51:10 +03:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
RefPtr<DataStorage> storage = DataStorage::Get(aFilename);
|
|
|
|
storage->GetAll(aValues);
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2015-10-30 22:30:00 +03:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2010-11-09 05:49:00 +03:00
|
|
|
ContentParent::RecvReadPermissions(InfallibleTArray<IPC::Permission>* aPermissions)
|
2010-07-15 18:04:25 +04:00
|
|
|
{
|
2010-10-09 22:07:38 +04:00
|
|
|
#ifdef MOZ_PERMISSIONS
|
2016-01-05 12:59:30 +03:00
|
|
|
nsCOMPtr<nsIPermissionManager> permissionManagerIface =
|
|
|
|
services::GetPermissionManager();
|
|
|
|
nsPermissionManager* permissionManager =
|
|
|
|
static_cast<nsPermissionManager*>(permissionManagerIface.get());
|
|
|
|
MOZ_ASSERT(permissionManager,
|
|
|
|
"We have no permissionManager in the Chrome process !");
|
|
|
|
|
|
|
|
nsCOMPtr<nsISimpleEnumerator> enumerator;
|
|
|
|
DebugOnly<nsresult> rv = permissionManager->GetEnumerator(getter_AddRefs(enumerator));
|
|
|
|
MOZ_ASSERT(NS_SUCCEEDED(rv), "Could not get enumerator!");
|
|
|
|
while(1) {
|
|
|
|
bool hasMore;
|
|
|
|
enumerator->HasMoreElements(&hasMore);
|
|
|
|
if (!hasMore)
|
|
|
|
break;
|
|
|
|
|
|
|
|
nsCOMPtr<nsISupports> supp;
|
|
|
|
enumerator->GetNext(getter_AddRefs(supp));
|
|
|
|
nsCOMPtr<nsIPermission> perm = do_QueryInterface(supp);
|
|
|
|
|
|
|
|
nsCOMPtr<nsIPrincipal> principal;
|
|
|
|
perm->GetPrincipal(getter_AddRefs(principal));
|
|
|
|
nsCString origin;
|
|
|
|
if (principal) {
|
|
|
|
principal->GetOrigin(origin);
|
|
|
|
}
|
|
|
|
nsCString type;
|
|
|
|
perm->GetType(type);
|
|
|
|
uint32_t capability;
|
|
|
|
perm->GetCapability(&capability);
|
|
|
|
uint32_t expireType;
|
|
|
|
perm->GetExpireType(&expireType);
|
|
|
|
int64_t expireTime;
|
|
|
|
perm->GetExpireTime(&expireTime);
|
|
|
|
|
|
|
|
aPermissions->AppendElement(IPC::Permission(origin, type,
|
|
|
|
capability, expireType,
|
|
|
|
expireTime));
|
|
|
|
}
|
2010-10-09 22:07:38 +04:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
// Ask for future changes
|
|
|
|
mSendPermissionUpdates = true;
|
2010-10-09 22:07:38 +04:00
|
|
|
#endif
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2011-04-30 03:46:20 +04:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2015-04-16 22:38:12 +03:00
|
|
|
ContentParent::RecvSetClipboard(const IPCDataTransfer& aDataTransfer,
|
|
|
|
const bool& aIsPrivateData,
|
2016-06-30 10:12:56 +03:00
|
|
|
const IPC::Principal& aRequestingPrincipal,
|
2015-04-16 22:38:12 +03:00
|
|
|
const int32_t& aWhichClipboard)
|
2011-03-01 08:36:43 +03:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
nsresult rv;
|
|
|
|
nsCOMPtr<nsIClipboard> clipboard(do_GetService(kCClipboardCID, &rv));
|
2016-11-15 06:26:00 +03:00
|
|
|
NS_ENSURE_SUCCESS(rv, IPC_OK());
|
2016-01-05 12:59:30 +03:00
|
|
|
|
2016-02-24 03:31:29 +03:00
|
|
|
nsCOMPtr<nsITransferable> trans =
|
|
|
|
do_CreateInstance("@mozilla.org/widget/transferable;1", &rv);
|
2016-11-15 06:26:00 +03:00
|
|
|
NS_ENSURE_SUCCESS(rv, IPC_OK());
|
2016-01-05 12:59:30 +03:00
|
|
|
trans->Init(nullptr);
|
|
|
|
|
2016-08-31 04:30:45 +03:00
|
|
|
rv = nsContentUtils::IPCTransferableToTransferable(aDataTransfer,
|
|
|
|
aIsPrivateData,
|
|
|
|
aRequestingPrincipal,
|
|
|
|
trans, this, nullptr);
|
2016-11-15 06:26:00 +03:00
|
|
|
NS_ENSURE_SUCCESS(rv, IPC_OK());
|
2015-04-16 22:38:12 +03:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
clipboard->SetData(trans, nullptr, aWhichClipboard);
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2011-03-01 08:36:43 +03:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2015-04-16 22:38:12 +03:00
|
|
|
ContentParent::RecvGetClipboard(nsTArray<nsCString>&& aTypes,
|
|
|
|
const int32_t& aWhichClipboard,
|
|
|
|
IPCDataTransfer* aDataTransfer)
|
2011-03-01 08:36:43 +03:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
nsresult rv;
|
|
|
|
nsCOMPtr<nsIClipboard> clipboard(do_GetService(kCClipboardCID, &rv));
|
2016-11-15 06:26:00 +03:00
|
|
|
NS_ENSURE_SUCCESS(rv, IPC_OK());
|
2011-03-01 08:36:43 +03:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
nsCOMPtr<nsITransferable> trans = do_CreateInstance("@mozilla.org/widget/transferable;1", &rv);
|
2016-11-15 06:26:00 +03:00
|
|
|
NS_ENSURE_SUCCESS(rv, IPC_OK());
|
2016-01-05 12:59:30 +03:00
|
|
|
trans->Init(nullptr);
|
2014-02-10 04:13:10 +04:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
for (uint32_t t = 0; t < aTypes.Length(); t++) {
|
|
|
|
trans->AddDataFlavor(aTypes[t].get());
|
|
|
|
}
|
2011-03-01 08:36:43 +03:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
clipboard->GetData(trans, aWhichClipboard);
|
|
|
|
nsContentUtils::TransferableToIPCTransferable(trans, aDataTransfer,
|
|
|
|
true, nullptr, this);
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2011-03-01 08:36:43 +03:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2015-04-16 22:38:12 +03:00
|
|
|
ContentParent::RecvEmptyClipboard(const int32_t& aWhichClipboard)
|
2011-03-01 08:36:43 +03:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
nsresult rv;
|
|
|
|
nsCOMPtr<nsIClipboard> clipboard(do_GetService(kCClipboardCID, &rv));
|
2016-11-15 06:26:00 +03:00
|
|
|
NS_ENSURE_SUCCESS(rv, IPC_OK());
|
2011-03-01 08:36:43 +03:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
clipboard->EmptyClipboard(aWhichClipboard);
|
2011-03-01 08:36:43 +03:00
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2011-03-01 08:36:43 +03:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2015-04-16 22:38:12 +03:00
|
|
|
ContentParent::RecvClipboardHasType(nsTArray<nsCString>&& aTypes,
|
|
|
|
const int32_t& aWhichClipboard,
|
|
|
|
bool* aHasType)
|
2011-03-01 08:36:43 +03:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
nsresult rv;
|
|
|
|
nsCOMPtr<nsIClipboard> clipboard(do_GetService(kCClipboardCID, &rv));
|
2016-11-15 06:26:00 +03:00
|
|
|
NS_ENSURE_SUCCESS(rv, IPC_OK());
|
2011-03-01 08:36:43 +03:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
const char** typesChrs = new const char *[aTypes.Length()];
|
|
|
|
for (uint32_t t = 0; t < aTypes.Length(); t++) {
|
|
|
|
typesChrs[t] = aTypes[t].get();
|
|
|
|
}
|
2015-04-16 22:38:12 +03:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
clipboard->HasDataMatchingFlavors(typesChrs, aTypes.Length(),
|
|
|
|
aWhichClipboard, aHasType);
|
2015-04-16 22:38:12 +03:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
delete [] typesChrs;
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2011-03-01 08:36:43 +03:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2016-01-05 12:59:30 +03:00
|
|
|
ContentParent::RecvGetSystemColors(const uint32_t& colorsCount,
|
|
|
|
InfallibleTArray<uint32_t>* colors)
|
2011-03-30 22:04:41 +04:00
|
|
|
{
|
2011-11-11 04:17:46 +04:00
|
|
|
#ifdef MOZ_WIDGET_ANDROID
|
2016-01-05 12:59:30 +03:00
|
|
|
NS_ASSERTION(AndroidBridge::Bridge() != nullptr, "AndroidBridge is not available");
|
|
|
|
if (AndroidBridge::Bridge() == nullptr) {
|
|
|
|
// Do not fail - the colors won't be right, but it's not critical
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
2011-03-30 22:04:41 +04:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
colors->AppendElements(colorsCount);
|
2011-03-30 22:04:41 +04:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
// The array elements correspond to the members of AndroidSystemColors structure,
|
|
|
|
// so just pass the pointer to the elements buffer
|
|
|
|
AndroidBridge::Bridge()->GetSystemColors((AndroidSystemColors*)colors->Elements());
|
2011-03-30 22:04:41 +04:00
|
|
|
#endif
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2011-03-30 22:04:41 +04:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2016-01-05 12:59:30 +03:00
|
|
|
ContentParent::RecvGetIconForExtension(const nsCString& aFileExt,
|
|
|
|
const uint32_t& aIconSize,
|
|
|
|
InfallibleTArray<uint8_t>* bits)
|
2011-06-14 01:02:13 +04:00
|
|
|
{
|
2011-11-11 04:17:46 +04:00
|
|
|
#ifdef MOZ_WIDGET_ANDROID
|
2016-01-05 12:59:30 +03:00
|
|
|
NS_ASSERTION(AndroidBridge::Bridge() != nullptr, "AndroidBridge is not available");
|
|
|
|
if (AndroidBridge::Bridge() == nullptr) {
|
|
|
|
// Do not fail - just no icon will be shown
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
2011-06-14 01:02:13 +04:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
bits->AppendElements(aIconSize * aIconSize * 4);
|
2011-06-14 01:02:13 +04:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
AndroidBridge::Bridge()->GetIconForExtension(aFileExt, aIconSize, bits->Elements());
|
2011-06-14 01:02:13 +04:00
|
|
|
#endif
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2011-06-14 01:02:13 +04:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2011-09-29 10:19:26 +04:00
|
|
|
ContentParent::RecvGetShowPasswordSetting(bool* showPassword)
|
2011-07-27 05:14:52 +04:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
// default behavior is to show the last password character
|
|
|
|
*showPassword = true;
|
2011-11-11 04:17:46 +04:00
|
|
|
#ifdef MOZ_WIDGET_ANDROID
|
2016-01-05 12:59:30 +03:00
|
|
|
NS_ASSERTION(AndroidBridge::Bridge() != nullptr, "AndroidBridge is not available");
|
2013-11-12 22:41:01 +04:00
|
|
|
|
2016-07-21 20:49:04 +03:00
|
|
|
*showPassword = java::GeckoAppShell::GetShowPasswordSetting();
|
2011-07-27 05:14:52 +04:00
|
|
|
#endif
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2011-07-27 05:14:52 +04:00
|
|
|
}
|
|
|
|
|
2017-02-01 15:34:24 +03:00
|
|
|
mozilla::ipc::IPCResult
|
|
|
|
ContentParent::RecvFirstIdle()
|
|
|
|
{
|
|
|
|
// When the ContentChild goes idle, it sends us a FirstIdle message
|
|
|
|
// which we use as a good time to prelaunch another process. If we
|
|
|
|
// prelaunch any sooner than this, then we'll be competing with the
|
|
|
|
// child process and slowing it down.
|
|
|
|
PreallocatedProcessManager::AllocateAfterDelay();
|
|
|
|
return IPC_OK();
|
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2015-07-11 03:55:59 +03:00
|
|
|
ContentParent::RecvAudioChannelChangeDefVolChannel(const int32_t& aChannel,
|
|
|
|
const bool& aHidden)
|
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
RefPtr<AudioChannelService> service = AudioChannelService::GetOrCreate();
|
|
|
|
MOZ_ASSERT(service);
|
|
|
|
service->SetDefaultVolumeControlChannelInternal(aChannel, aHidden, mChildID);
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2015-07-10 19:38:46 +03:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2015-07-10 19:38:46 +03:00
|
|
|
ContentParent::RecvAudioChannelServiceStatus(
|
|
|
|
const bool& aTelephonyChannel,
|
|
|
|
const bool& aContentOrNormalChannel,
|
|
|
|
const bool& aAnyChannel)
|
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
RefPtr<AudioChannelService> service = AudioChannelService::GetOrCreate();
|
|
|
|
MOZ_ASSERT(service);
|
2015-07-10 19:38:46 +03:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
service->ChildStatusReceived(mChildID, aTelephonyChannel,
|
|
|
|
aContentOrNormalChannel, aAnyChannel);
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2015-07-10 19:38:46 +03:00
|
|
|
}
|
|
|
|
|
2014-03-20 04:22:25 +04:00
|
|
|
// We want ContentParent to show up in CC logs for debugging purposes, but we
|
|
|
|
// don't actually cycle collect it.
|
|
|
|
NS_IMPL_CYCLE_COLLECTION_0(ContentParent)
|
|
|
|
|
|
|
|
NS_IMPL_CYCLE_COLLECTING_ADDREF(ContentParent)
|
|
|
|
NS_IMPL_CYCLE_COLLECTING_RELEASE(ContentParent)
|
|
|
|
|
|
|
|
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(ContentParent)
|
2014-06-11 09:44:03 +04:00
|
|
|
NS_INTERFACE_MAP_ENTRY(nsIContentParent)
|
2014-03-20 04:22:25 +04:00
|
|
|
NS_INTERFACE_MAP_ENTRY(nsIObserver)
|
|
|
|
NS_INTERFACE_MAP_ENTRY(nsIDOMGeoPositionCallback)
|
2014-10-23 22:31:00 +04:00
|
|
|
NS_INTERFACE_MAP_ENTRY(nsIDOMGeoPositionErrorCallback)
|
2014-03-20 04:22:25 +04:00
|
|
|
NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIObserver)
|
|
|
|
NS_INTERFACE_MAP_END
|
2009-09-03 04:18:27 +04:00
|
|
|
|
|
|
|
NS_IMETHODIMP
|
2010-07-19 22:33:33 +04:00
|
|
|
ContentParent::Observe(nsISupports* aSubject,
|
|
|
|
const char* aTopic,
|
2014-01-04 19:02:17 +04:00
|
|
|
const char16_t* aData)
|
2009-09-03 04:18:27 +04:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
if (mSubprocess && (!strcmp(aTopic, "profile-before-change") ||
|
|
|
|
!strcmp(aTopic, "xpcom-shutdown"))) {
|
|
|
|
// Okay to call ShutDownProcess multiple times.
|
|
|
|
ShutDownProcess(SEND_SHUTDOWN_MESSAGE);
|
2015-01-10 21:39:33 +03:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
// Wait for shutdown to complete, so that we receive any shutdown
|
|
|
|
// data (e.g. telemetry) from the child before we quit.
|
|
|
|
// This loop terminate prematurely based on mForceKillTimer.
|
|
|
|
while (mIPCOpen && !mCalledKillHard) {
|
|
|
|
NS_ProcessNextEvent(nullptr, true);
|
2009-09-03 04:18:27 +04:00
|
|
|
}
|
2016-01-05 12:59:30 +03:00
|
|
|
NS_ASSERTION(!mSubprocess, "Close should have nulled mSubprocess");
|
|
|
|
}
|
2010-05-11 16:44:12 +04:00
|
|
|
|
2017-01-24 06:15:12 +03:00
|
|
|
#ifdef MOZ_GECKO_PROFILER
|
2016-03-07 02:43:29 +03:00
|
|
|
// Need to do this before the mIsAlive check to avoid missing profiles.
|
|
|
|
if (!strcmp(aTopic, "profiler-subprocess-gather")) {
|
|
|
|
if (mGatherer) {
|
|
|
|
mGatherer->WillGatherOOPProfile();
|
|
|
|
if (mIsAlive && mSubprocess) {
|
|
|
|
Unused << SendGatherProfile();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (!strcmp(aTopic, "profiler-subprocess")) {
|
|
|
|
nsCOMPtr<nsIProfileSaveEvent> pse = do_QueryInterface(aSubject);
|
|
|
|
if (pse) {
|
|
|
|
if (!mProfile.IsEmpty()) {
|
|
|
|
pse->AddSubProfile(mProfile.get());
|
|
|
|
mProfile.Truncate();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
if (!mIsAlive || !mSubprocess)
|
|
|
|
return NS_OK;
|
|
|
|
|
|
|
|
// listening for memory pressure event
|
|
|
|
if (!strcmp(aTopic, "memory-pressure") &&
|
|
|
|
!StringEndsWith(nsDependentString(aData),
|
|
|
|
NS_LITERAL_STRING("-no-forward"))) {
|
|
|
|
Unused << SendFlushMemory(nsDependentString(aData));
|
|
|
|
}
|
|
|
|
// listening for remotePrefs...
|
|
|
|
else if (!strcmp(aTopic, "nsPref:changed")) {
|
|
|
|
// We know prefs are ASCII here.
|
|
|
|
NS_LossyConvertUTF16toASCII strData(aData);
|
2010-10-20 00:35:08 +04:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
PrefSetting pref(strData, null_t(), null_t());
|
|
|
|
Preferences::GetPreference(&pref);
|
|
|
|
if (!SendPreferenceUpdate(pref)) {
|
|
|
|
return NS_ERROR_NOT_AVAILABLE;
|
2013-12-03 08:07:02 +04:00
|
|
|
}
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
|
|
|
else if (!strcmp(aTopic, NS_IPC_IOSERVICE_SET_OFFLINE_TOPIC)) {
|
|
|
|
NS_ConvertUTF16toUTF8 dataStr(aData);
|
|
|
|
const char *offline = dataStr.get();
|
|
|
|
if (!SendSetOffline(!strcmp(offline, "true") ? true : false)) {
|
|
|
|
return NS_ERROR_NOT_AVAILABLE;
|
2012-04-20 04:13:20 +04:00
|
|
|
}
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
|
|
|
else if (!strcmp(aTopic, NS_IPC_IOSERVICE_SET_CONNECTIVITY_TOPIC)) {
|
|
|
|
if (!SendSetConnectivity(NS_LITERAL_STRING("true").Equals(aData))) {
|
|
|
|
return NS_ERROR_NOT_AVAILABLE;
|
2012-08-18 06:43:00 +04:00
|
|
|
}
|
2016-11-17 19:35:24 +03:00
|
|
|
} else if (!strcmp(aTopic, NS_IPC_CAPTIVE_PORTAL_SET_STATE)) {
|
|
|
|
nsCOMPtr<nsICaptivePortalService> cps = do_QueryInterface(aSubject);
|
|
|
|
MOZ_ASSERT(cps, "Should QI to a captive portal service");
|
|
|
|
if (!cps) {
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
int32_t state;
|
|
|
|
cps->GetState(&state);
|
|
|
|
if (!SendSetCaptivePortalState(state)) {
|
|
|
|
return NS_ERROR_NOT_AVAILABLE;
|
|
|
|
}
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
|
|
|
// listening for alert notifications
|
|
|
|
else if (!strcmp(aTopic, "alertfinished") ||
|
|
|
|
!strcmp(aTopic, "alertclickcallback") ||
|
|
|
|
!strcmp(aTopic, "alertshow") ||
|
|
|
|
!strcmp(aTopic, "alertdisablecallback") ||
|
|
|
|
!strcmp(aTopic, "alertsettingscallback")) {
|
|
|
|
if (!SendNotifyAlertsObserver(nsDependentCString(aTopic),
|
|
|
|
nsDependentString(aData)))
|
|
|
|
return NS_ERROR_NOT_AVAILABLE;
|
|
|
|
}
|
|
|
|
else if (!strcmp(aTopic, "child-gc-request")){
|
|
|
|
Unused << SendGarbageCollect();
|
|
|
|
}
|
|
|
|
else if (!strcmp(aTopic, "child-cc-request")){
|
|
|
|
Unused << SendCycleCollect();
|
|
|
|
}
|
|
|
|
else if (!strcmp(aTopic, "child-mmu-request")){
|
|
|
|
Unused << SendMinimizeMemoryUsage();
|
|
|
|
}
|
|
|
|
else if (!strcmp(aTopic, "last-pb-context-exited")) {
|
|
|
|
Unused << SendLastPrivateDocShellDestroyed();
|
|
|
|
}
|
|
|
|
else if (!strcmp(aTopic, "file-watcher-update")) {
|
|
|
|
nsCString creason;
|
|
|
|
CopyUTF16toUTF8(aData, creason);
|
|
|
|
DeviceStorageFile* file = static_cast<DeviceStorageFile*>(aSubject);
|
|
|
|
Unused << SendFilePathUpdate(file->mStorageType, file->mStorageName, file->mPath, creason);
|
|
|
|
}
|
2011-07-21 08:37:32 +04:00
|
|
|
#ifdef ACCESSIBILITY
|
2016-08-29 18:06:48 +03:00
|
|
|
else if (aData && !strcmp(aTopic, "a11y-init-or-shutdown")) {
|
|
|
|
if (*aData == '1') {
|
|
|
|
// Make sure accessibility is running in content process when
|
|
|
|
// accessibility gets initiated in chrome process.
|
2016-10-17 22:08:21 +03:00
|
|
|
#if defined(XP_WIN)
|
2017-01-29 10:27:33 +03:00
|
|
|
Unused <<
|
|
|
|
SendActivateA11y(a11y::AccessibleWrap::GetContentProcessIdFor(ChildID()));
|
2016-10-17 22:08:21 +03:00
|
|
|
#else
|
2016-10-20 21:34:16 +03:00
|
|
|
Unused << SendActivateA11y(0);
|
2011-07-21 08:37:32 +04:00
|
|
|
#endif
|
2016-08-29 18:06:48 +03:00
|
|
|
} else {
|
|
|
|
// If possible, shut down accessibility in content process when
|
|
|
|
// accessibility gets shutdown in chrome process.
|
|
|
|
Unused << SendShutdownA11y();
|
|
|
|
}
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
|
|
|
#endif
|
2017-01-24 06:15:12 +03:00
|
|
|
#ifdef MOZ_GECKO_PROFILER
|
2016-01-05 12:59:30 +03:00
|
|
|
else if (!strcmp(aTopic, "profiler-started")) {
|
|
|
|
nsCOMPtr<nsIProfilerStartParams> params(do_QueryInterface(aSubject));
|
|
|
|
StartProfiler(params);
|
|
|
|
}
|
|
|
|
else if (!strcmp(aTopic, "profiler-stopped")) {
|
|
|
|
mGatherer = nullptr;
|
|
|
|
Unused << SendStopProfiler();
|
|
|
|
}
|
|
|
|
else if (!strcmp(aTopic, "profiler-paused")) {
|
|
|
|
Unused << SendPauseProfiler(true);
|
|
|
|
}
|
|
|
|
else if (!strcmp(aTopic, "profiler-resumed")) {
|
|
|
|
Unused << SendPauseProfiler(false);
|
|
|
|
}
|
2014-11-18 20:50:25 +03:00
|
|
|
#endif
|
2016-08-08 06:04:55 +03:00
|
|
|
else if (!strcmp(aTopic, "cacheservice:empty-cache")) {
|
|
|
|
Unused << SendNotifyEmptyHTTPCache();
|
|
|
|
}
|
2016-01-05 12:59:30 +03:00
|
|
|
return NS_OK;
|
2009-09-03 04:18:27 +04:00
|
|
|
}
|
|
|
|
|
2017-01-24 22:49:13 +03:00
|
|
|
mozilla::ipc::IPCResult
|
|
|
|
ContentParent::RecvInitBackground(Endpoint<PBackgroundParent>&& aEndpoint)
|
2013-11-27 11:59:41 +04:00
|
|
|
{
|
2017-01-24 22:49:13 +03:00
|
|
|
if (!BackgroundParent::Alloc(this, Move(aEndpoint))) {
|
|
|
|
return IPC_FAIL(this, "BackgroundParent::Alloc failed");
|
|
|
|
}
|
|
|
|
|
|
|
|
return IPC_OK();
|
2014-05-01 05:52:00 +04:00
|
|
|
}
|
|
|
|
|
2013-07-03 11:24:32 +04:00
|
|
|
mozilla::jsipc::PJavaScriptParent *
|
2013-07-08 19:48:39 +04:00
|
|
|
ContentParent::AllocPJavaScriptParent()
|
2013-07-03 11:24:32 +04:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
MOZ_ASSERT(ManagedPJavaScriptParent().IsEmpty());
|
|
|
|
return nsIContentParent::AllocPJavaScriptParent();
|
2013-07-03 11:24:32 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
2013-07-08 19:48:39 +04:00
|
|
|
ContentParent::DeallocPJavaScriptParent(PJavaScriptParent *parent)
|
2013-07-03 11:24:32 +04:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
return nsIContentParent::DeallocPJavaScriptParent(parent);
|
2013-07-03 11:24:32 +04:00
|
|
|
}
|
|
|
|
|
2010-07-19 22:33:33 +04:00
|
|
|
PBrowserParent*
|
2014-10-29 21:11:00 +03:00
|
|
|
ContentParent::AllocPBrowserParent(const TabId& aTabId,
|
|
|
|
const IPCTabContext& aContext,
|
2014-06-04 01:15:27 +04:00
|
|
|
const uint32_t& aChromeFlags,
|
2014-10-24 04:28:00 +04:00
|
|
|
const ContentParentId& aCpId,
|
2014-06-04 01:15:27 +04:00
|
|
|
const bool& aIsForBrowser)
|
2009-08-12 20:18:08 +04:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
return nsIContentParent::AllocPBrowserParent(aTabId,
|
|
|
|
aContext,
|
|
|
|
aChromeFlags,
|
|
|
|
aCpId,
|
|
|
|
aIsForBrowser);
|
2009-08-12 20:18:08 +04:00
|
|
|
}
|
|
|
|
|
2009-09-18 03:09:20 +04:00
|
|
|
bool
|
2013-07-08 19:48:39 +04:00
|
|
|
ContentParent::DeallocPBrowserParent(PBrowserParent* frame)
|
2009-08-12 20:18:08 +04:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
return nsIContentParent::DeallocPBrowserParent(frame);
|
2009-08-12 20:18:08 +04:00
|
|
|
}
|
|
|
|
|
2012-06-20 03:14:39 +04:00
|
|
|
PDeviceStorageRequestParent*
|
2013-07-08 19:48:39 +04:00
|
|
|
ContentParent::AllocPDeviceStorageRequestParent(const DeviceStorageParams& aParams)
|
2012-06-20 03:14:39 +04:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
RefPtr<DeviceStorageRequestParent> result = new DeviceStorageRequestParent(aParams);
|
|
|
|
result->Dispatch();
|
|
|
|
return result.forget().take();
|
2012-06-20 03:14:39 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
2013-07-08 19:48:39 +04:00
|
|
|
ContentParent::DeallocPDeviceStorageRequestParent(PDeviceStorageRequestParent* doomed)
|
2012-06-20 03:14:39 +04:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
DeviceStorageRequestParent *parent = static_cast<DeviceStorageRequestParent*>(doomed);
|
|
|
|
NS_RELEASE(parent);
|
|
|
|
return true;
|
2012-06-20 03:14:39 +04:00
|
|
|
}
|
|
|
|
|
2012-08-02 10:02:29 +04:00
|
|
|
PBlobParent*
|
2013-07-08 19:48:39 +04:00
|
|
|
ContentParent::AllocPBlobParent(const BlobConstructorParams& aParams)
|
2012-08-02 10:02:29 +04:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
return nsIContentParent::AllocPBlobParent(aParams);
|
2012-08-02 10:02:29 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
2013-07-08 19:48:39 +04:00
|
|
|
ContentParent::DeallocPBlobParent(PBlobParent* aActor)
|
2012-08-02 10:02:29 +04:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
return nsIContentParent::DeallocPBlobParent(aActor);
|
2012-08-02 10:02:29 +04:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2015-11-28 13:48:28 +03:00
|
|
|
ContentParent::RecvPBlobConstructor(PBlobParent* aActor,
|
|
|
|
const BlobConstructorParams& aParams)
|
|
|
|
{
|
|
|
|
const ParentBlobConstructorParams& params = aParams.get_ParentBlobConstructorParams();
|
|
|
|
if (params.blobParams().type() == AnyBlobConstructorParams::TKnownBlobConstructorParams) {
|
2016-11-15 06:26:00 +03:00
|
|
|
if (!aActor->SendCreatedFromKnownBlob()) {
|
|
|
|
return IPC_FAIL_NO_REASON(this);
|
|
|
|
}
|
|
|
|
return IPC_OK();
|
2015-11-28 13:48:28 +03:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2015-11-28 13:48:28 +03:00
|
|
|
}
|
|
|
|
|
2014-07-02 02:24:27 +04:00
|
|
|
mozilla::PRemoteSpellcheckEngineParent *
|
|
|
|
ContentParent::AllocPRemoteSpellcheckEngineParent()
|
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
mozilla::RemoteSpellcheckEngineParent *parent = new mozilla::RemoteSpellcheckEngineParent();
|
|
|
|
return parent;
|
2014-07-02 02:24:27 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
ContentParent::DeallocPRemoteSpellcheckEngineParent(PRemoteSpellcheckEngineParent *parent)
|
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
delete parent;
|
|
|
|
return true;
|
2014-07-02 02:24:27 +04:00
|
|
|
}
|
|
|
|
|
2015-01-07 08:42:23 +03:00
|
|
|
/* static */ void
|
|
|
|
ContentParent::ForceKillTimerCallback(nsITimer* aTimer, void* aClosure)
|
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
// We don't want to time out the content process during XPCShell tests. This
|
|
|
|
// is the easiest way to ensure that.
|
|
|
|
if (PR_GetEnv("XPCSHELL_TEST_PROFILE_DIR")) {
|
|
|
|
return;
|
|
|
|
}
|
2015-09-09 03:12:27 +03:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
auto self = static_cast<ContentParent*>(aClosure);
|
|
|
|
self->KillHard("ShutDownKill");
|
2015-01-07 08:42:23 +03:00
|
|
|
}
|
|
|
|
|
2016-05-04 06:08:41 +03:00
|
|
|
// WARNING: aReason appears in telemetry, so any new value passed in requires
|
|
|
|
// data review.
|
2012-09-06 02:18:48 +04:00
|
|
|
void
|
2015-02-03 20:09:27 +03:00
|
|
|
ContentParent::KillHard(const char* aReason)
|
2012-09-06 02:18:48 +04:00
|
|
|
{
|
2016-01-15 01:03:11 +03:00
|
|
|
PROFILER_LABEL_FUNC(js::ProfileEntry::Category::OTHER);
|
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
// On Windows, calling KillHard multiple times causes problems - the
|
|
|
|
// process handle becomes invalid on the first call, causing a second call
|
|
|
|
// to crash our process - more details in bug 890840.
|
|
|
|
if (mCalledKillHard) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
mCalledKillHard = true;
|
|
|
|
mForceKillTimer = nullptr;
|
2014-11-24 23:05:45 +03:00
|
|
|
|
2014-12-18 21:52:00 +03:00
|
|
|
#if defined(MOZ_CRASHREPORTER) && !defined(MOZ_B2G)
|
2016-01-05 12:59:30 +03:00
|
|
|
// We're about to kill the child process associated with this content.
|
|
|
|
// Something has gone wrong to get us here, so we generate a minidump
|
|
|
|
// of the parent and child for submission to the crash server.
|
|
|
|
if (PCrashReporterParent* p = LoneManagedOrNullAsserts(ManagedPCrashReporterParent())) {
|
|
|
|
CrashReporterParent* crashReporter =
|
|
|
|
static_cast<CrashReporterParent*>(p);
|
|
|
|
// GeneratePairedMinidump creates two minidumps for us - the main
|
|
|
|
// one is for the content process we're about to kill, and the other
|
|
|
|
// one is for the main browser process. That second one is the extra
|
|
|
|
// minidump tagging along, so we have to tell the crash reporter that
|
|
|
|
// it exists and is being appended.
|
|
|
|
nsAutoCString additionalDumps("browser");
|
|
|
|
crashReporter->AnnotateCrashReport(
|
|
|
|
NS_LITERAL_CSTRING("additional_minidumps"),
|
|
|
|
additionalDumps);
|
|
|
|
nsDependentCString reason(aReason);
|
|
|
|
crashReporter->AnnotateCrashReport(
|
|
|
|
NS_LITERAL_CSTRING("ipc_channel_error"),
|
|
|
|
reason);
|
|
|
|
|
|
|
|
// Generate the report and insert into the queue for submittal.
|
|
|
|
mCreatedPairedMinidumps = crashReporter->GenerateCompleteMinidump(this);
|
2016-05-04 06:08:41 +03:00
|
|
|
|
|
|
|
Telemetry::Accumulate(Telemetry::SUBPROCESS_KILL_HARD, reason, 1);
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
2014-11-24 23:05:45 +03:00
|
|
|
#endif
|
2016-01-05 12:59:30 +03:00
|
|
|
ProcessHandle otherProcessHandle;
|
|
|
|
if (!base::OpenProcessHandle(OtherPid(), &otherProcessHandle)) {
|
|
|
|
NS_ERROR("Failed to open child process when attempting kill.");
|
|
|
|
return;
|
|
|
|
}
|
2015-04-01 11:40:35 +03:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
if (!KillProcess(otherProcessHandle, base::PROCESS_END_KILLED_BY_USER,
|
|
|
|
false)) {
|
|
|
|
NS_WARNING("failed to kill subprocess!");
|
|
|
|
}
|
2015-04-01 11:40:35 +03:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
if (mSubprocess) {
|
|
|
|
mSubprocess->SetAlreadyDead();
|
|
|
|
}
|
2015-04-01 11:40:35 +03:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
// EnsureProcessTerminated has responsibilty for closing otherProcessHandle.
|
|
|
|
XRE_GetIOMessageLoop()->PostTask(
|
|
|
|
NewRunnableFunction(&ProcessWatcher::EnsureProcessTerminated,
|
|
|
|
otherProcessHandle, /*force=*/true));
|
2012-09-06 02:18:48 +04:00
|
|
|
}
|
|
|
|
|
2013-04-26 04:53:26 +04:00
|
|
|
void
|
2014-05-21 10:06:54 +04:00
|
|
|
ContentParent::FriendlyName(nsAString& aName, bool aAnonymize)
|
2013-04-26 04:53:26 +04:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
aName.Truncate();
|
2016-10-19 04:54:12 +03:00
|
|
|
if (mIsForBrowser) {
|
2016-01-05 12:59:30 +03:00
|
|
|
aName.AssignLiteral("Browser");
|
|
|
|
} else if (aAnonymize) {
|
|
|
|
aName.AssignLiteral("<anonymized-name>");
|
|
|
|
} else {
|
|
|
|
aName.AssignLiteral("???");
|
|
|
|
}
|
2013-04-26 04:53:26 +04:00
|
|
|
}
|
|
|
|
|
2010-11-24 17:15:03 +03:00
|
|
|
PCrashReporterParent*
|
2013-07-08 19:48:39 +04:00
|
|
|
ContentParent::AllocPCrashReporterParent(const NativeThreadId& tid,
|
|
|
|
const uint32_t& processType)
|
2010-11-24 17:15:03 +03:00
|
|
|
{
|
2011-06-08 23:56:31 +04:00
|
|
|
#ifdef MOZ_CRASHREPORTER
|
2016-01-05 12:59:30 +03:00
|
|
|
return new CrashReporterParent();
|
2011-06-08 23:56:31 +04:00
|
|
|
#else
|
2016-01-05 12:59:30 +03:00
|
|
|
return nullptr;
|
2011-06-08 23:56:31 +04:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2011-06-08 23:56:31 +04:00
|
|
|
ContentParent::RecvPCrashReporterConstructor(PCrashReporterParent* actor,
|
|
|
|
const NativeThreadId& tid,
|
2012-08-22 19:56:38 +04:00
|
|
|
const uint32_t& processType)
|
2011-06-08 23:56:31 +04:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
static_cast<CrashReporterParent*>(actor)->SetChildData(tid, processType);
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2010-11-24 17:15:03 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
2013-07-08 19:48:39 +04:00
|
|
|
ContentParent::DeallocPCrashReporterParent(PCrashReporterParent* crashreporter)
|
2010-11-24 17:15:03 +03:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
delete crashreporter;
|
|
|
|
return true;
|
2010-11-24 17:15:03 +03:00
|
|
|
}
|
|
|
|
|
2013-01-27 01:14:01 +04:00
|
|
|
hal_sandbox::PHalParent*
|
2013-07-08 19:48:39 +04:00
|
|
|
ContentParent::AllocPHalParent()
|
2011-10-06 02:15:45 +04:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
return hal_sandbox::CreateHalParent();
|
2011-10-06 02:15:45 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
2013-07-08 19:48:39 +04:00
|
|
|
ContentParent::DeallocPHalParent(hal_sandbox::PHalParent* aHal)
|
2011-10-06 02:15:45 +04:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
delete aHal;
|
|
|
|
return true;
|
2011-10-06 02:15:45 +04:00
|
|
|
}
|
|
|
|
|
2015-09-22 22:09:42 +03:00
|
|
|
devtools::PHeapSnapshotTempFileHelperParent*
|
|
|
|
ContentParent::AllocPHeapSnapshotTempFileHelperParent()
|
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
return devtools::HeapSnapshotTempFileHelperParent::Create();
|
2015-09-22 22:09:42 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
ContentParent::DeallocPHeapSnapshotTempFileHelperParent(
|
2016-01-05 12:59:30 +03:00
|
|
|
devtools::PHeapSnapshotTempFileHelperParent* aHeapSnapshotHelper)
|
2015-09-22 22:09:42 +03:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
delete aHeapSnapshotHelper;
|
|
|
|
return true;
|
2015-09-22 22:09:42 +03:00
|
|
|
}
|
|
|
|
|
2017-01-27 03:35:54 +03:00
|
|
|
bool
|
|
|
|
ContentParent::SendRequestMemoryReport(const uint32_t& aGeneration,
|
|
|
|
const bool& aAnonymize,
|
|
|
|
const bool& aMinimizeMemoryUsage,
|
|
|
|
const MaybeFileDesc& aDMDFile)
|
|
|
|
{
|
|
|
|
// This automatically cancels the previous request.
|
|
|
|
mMemoryReportRequest = MakeUnique<MemoryReportRequestHost>(aGeneration);
|
|
|
|
Unused << PContentParent::SendRequestMemoryReport(
|
|
|
|
aGeneration,
|
|
|
|
aAnonymize,
|
|
|
|
aMinimizeMemoryUsage,
|
|
|
|
aDMDFile);
|
|
|
|
return IPC_OK();
|
2011-02-16 21:43:23 +03:00
|
|
|
}
|
|
|
|
|
2017-01-27 03:35:54 +03:00
|
|
|
mozilla::ipc::IPCResult
|
|
|
|
ContentParent::RecvAddMemoryReport(const MemoryReport& aReport)
|
2011-02-16 21:43:23 +03:00
|
|
|
{
|
2017-01-27 03:35:54 +03:00
|
|
|
if (mMemoryReportRequest) {
|
|
|
|
mMemoryReportRequest->RecvReport(aReport);
|
|
|
|
}
|
|
|
|
return IPC_OK();
|
|
|
|
}
|
|
|
|
|
|
|
|
mozilla::ipc::IPCResult
|
|
|
|
ContentParent::RecvFinishMemoryReport(const uint32_t& aGeneration)
|
|
|
|
{
|
|
|
|
if (mMemoryReportRequest) {
|
|
|
|
mMemoryReportRequest->Finish(aGeneration);
|
|
|
|
mMemoryReportRequest = nullptr;
|
|
|
|
}
|
|
|
|
return IPC_OK();
|
2011-02-16 21:43:23 +03:00
|
|
|
}
|
|
|
|
|
2014-05-13 21:13:00 +04:00
|
|
|
PCycleCollectWithLogsParent*
|
|
|
|
ContentParent::AllocPCycleCollectWithLogsParent(const bool& aDumpAllTraces,
|
|
|
|
const FileDescriptor& aGCLog,
|
|
|
|
const FileDescriptor& aCCLog)
|
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
MOZ_CRASH("Don't call this; use ContentParent::CycleCollectWithLogs");
|
2014-05-13 21:13:00 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
ContentParent::DeallocPCycleCollectWithLogsParent(PCycleCollectWithLogsParent* aActor)
|
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
delete aActor;
|
|
|
|
return true;
|
2014-05-13 21:13:00 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
ContentParent::CycleCollectWithLogs(bool aDumpAllTraces,
|
|
|
|
nsICycleCollectorLogSink* aSink,
|
|
|
|
nsIDumpGCAndCCLogsCallback* aCallback)
|
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
return CycleCollectWithLogsParent::AllocAndSendConstructor(this,
|
|
|
|
aDumpAllTraces,
|
|
|
|
aSink,
|
|
|
|
aCallback);
|
2014-05-13 21:13:00 +04:00
|
|
|
}
|
|
|
|
|
2009-09-10 02:59:06 +04:00
|
|
|
PTestShellParent*
|
2013-07-08 19:48:39 +04:00
|
|
|
ContentParent::AllocPTestShellParent()
|
2009-08-12 22:31:48 +04:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
return new TestShellParent();
|
2009-08-12 22:31:48 +04:00
|
|
|
}
|
|
|
|
|
2009-09-18 03:09:20 +04:00
|
|
|
bool
|
2013-07-08 19:48:39 +04:00
|
|
|
ContentParent::DeallocPTestShellParent(PTestShellParent* shell)
|
2009-08-12 22:31:48 +04:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
delete shell;
|
|
|
|
return true;
|
2009-08-12 22:31:48 +04:00
|
|
|
}
|
2013-07-08 19:48:39 +04:00
|
|
|
|
|
|
|
PNeckoParent*
|
|
|
|
ContentParent::AllocPNeckoParent()
|
2009-08-18 23:05:15 +04:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
return new NeckoParent();
|
2009-08-18 23:05:15 +04:00
|
|
|
}
|
|
|
|
|
2013-07-08 19:48:39 +04:00
|
|
|
bool
|
|
|
|
ContentParent::DeallocPNeckoParent(PNeckoParent* necko)
|
2009-08-18 23:05:15 +04:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
delete necko;
|
|
|
|
return true;
|
2009-08-18 23:05:15 +04:00
|
|
|
}
|
|
|
|
|
2014-10-28 18:59:08 +03:00
|
|
|
PPrintingParent*
|
|
|
|
ContentParent::AllocPPrintingParent()
|
|
|
|
{
|
2014-11-22 14:15:00 +03:00
|
|
|
#ifdef NS_PRINTING
|
2016-05-16 12:40:54 +03:00
|
|
|
MOZ_ASSERT(!mPrintingParent,
|
|
|
|
"Only one PrintingParent should be created per process.");
|
|
|
|
|
|
|
|
// Create the printing singleton for this process.
|
|
|
|
mPrintingParent = new PrintingParent();
|
|
|
|
return mPrintingParent.get();
|
2014-11-22 14:15:00 +03:00
|
|
|
#else
|
2016-05-16 12:40:54 +03:00
|
|
|
MOZ_ASSERT_UNREACHABLE("Should never be created if no printing.");
|
2016-01-05 12:59:30 +03:00
|
|
|
return nullptr;
|
2014-11-22 14:15:00 +03:00
|
|
|
#endif
|
2014-10-28 18:59:08 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
ContentParent::DeallocPPrintingParent(PPrintingParent* printing)
|
|
|
|
{
|
2016-05-16 12:40:54 +03:00
|
|
|
#ifdef NS_PRINTING
|
|
|
|
MOZ_ASSERT(mPrintingParent == printing,
|
|
|
|
"Only one PrintingParent should have been created per process.");
|
|
|
|
|
|
|
|
mPrintingParent = nullptr;
|
|
|
|
#else
|
|
|
|
MOZ_ASSERT_UNREACHABLE("Should never have been created if no printing.");
|
|
|
|
#endif
|
2016-01-05 12:59:30 +03:00
|
|
|
return true;
|
2014-10-28 18:59:08 +03:00
|
|
|
}
|
|
|
|
|
2016-05-16 12:40:54 +03:00
|
|
|
#ifdef NS_PRINTING
|
|
|
|
already_AddRefed<embedding::PrintingParent>
|
|
|
|
ContentParent::GetPrintingParent()
|
|
|
|
{
|
|
|
|
MOZ_ASSERT(mPrintingParent);
|
|
|
|
|
|
|
|
RefPtr<embedding::PrintingParent> printingParent = mPrintingParent;
|
|
|
|
return printingParent.forget();
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2016-05-15 20:32:09 +03:00
|
|
|
PSendStreamParent*
|
|
|
|
ContentParent::AllocPSendStreamParent()
|
|
|
|
{
|
2016-09-21 13:27:26 +03:00
|
|
|
return nsIContentParent::AllocPSendStreamParent();
|
2016-05-15 20:32:09 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
ContentParent::DeallocPSendStreamParent(PSendStreamParent* aActor)
|
|
|
|
{
|
2016-09-21 13:27:26 +03:00
|
|
|
return nsIContentParent::DeallocPSendStreamParent(aActor);
|
2016-05-15 20:32:09 +03:00
|
|
|
}
|
|
|
|
|
2014-07-14 21:22:26 +04:00
|
|
|
PScreenManagerParent*
|
|
|
|
ContentParent::AllocPScreenManagerParent(uint32_t* aNumberOfScreens,
|
|
|
|
float* aSystemDefaultScale,
|
|
|
|
bool* aSuccess)
|
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
return new ScreenManagerParent(aNumberOfScreens, aSystemDefaultScale, aSuccess);
|
2014-07-14 21:22:26 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
ContentParent::DeallocPScreenManagerParent(PScreenManagerParent* aActor)
|
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
delete aActor;
|
|
|
|
return true;
|
2014-07-14 21:22:26 +04:00
|
|
|
}
|
|
|
|
|
2015-04-22 22:55:23 +03:00
|
|
|
PPSMContentDownloaderParent*
|
|
|
|
ContentParent::AllocPPSMContentDownloaderParent(const uint32_t& aCertType)
|
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
RefPtr<PSMContentDownloaderParent> downloader =
|
|
|
|
new PSMContentDownloaderParent(aCertType);
|
|
|
|
return downloader.forget().take();
|
2015-04-22 22:55:23 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
ContentParent::DeallocPPSMContentDownloaderParent(PPSMContentDownloaderParent* aListener)
|
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
auto* listener = static_cast<PSMContentDownloaderParent*>(aListener);
|
|
|
|
RefPtr<PSMContentDownloaderParent> downloader = dont_AddRef(listener);
|
|
|
|
return true;
|
2015-04-22 22:55:23 +03:00
|
|
|
}
|
|
|
|
|
2010-09-16 02:55:08 +04:00
|
|
|
PExternalHelperAppParent*
|
2013-07-08 19:48:39 +04:00
|
|
|
ContentParent::AllocPExternalHelperAppParent(const OptionalURIParams& uri,
|
|
|
|
const nsCString& aMimeContentType,
|
|
|
|
const nsCString& aContentDisposition,
|
2014-02-14 02:43:58 +04:00
|
|
|
const uint32_t& aContentDispositionHint,
|
|
|
|
const nsString& aContentDispositionFilename,
|
2013-07-08 19:48:39 +04:00
|
|
|
const bool& aForceSave,
|
|
|
|
const int64_t& aContentLength,
|
2017-01-11 04:49:16 +03:00
|
|
|
const bool& aWasFileChannel,
|
2013-09-12 23:24:10 +04:00
|
|
|
const OptionalURIParams& aReferrer,
|
|
|
|
PBrowserParent* aBrowser)
|
2010-09-16 02:55:08 +04:00
|
|
|
{
|
2017-01-11 04:49:16 +03:00
|
|
|
ExternalHelperAppParent *parent =
|
|
|
|
new ExternalHelperAppParent(uri, aContentLength, aWasFileChannel);
|
2016-01-05 12:59:30 +03:00
|
|
|
parent->AddRef();
|
|
|
|
parent->Init(this,
|
|
|
|
aMimeContentType,
|
|
|
|
aContentDisposition,
|
|
|
|
aContentDispositionHint,
|
|
|
|
aContentDispositionFilename,
|
|
|
|
aForceSave,
|
|
|
|
aReferrer,
|
|
|
|
aBrowser);
|
|
|
|
return parent;
|
2010-09-16 02:55:08 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
2013-07-08 19:48:39 +04:00
|
|
|
ContentParent::DeallocPExternalHelperAppParent(PExternalHelperAppParent* aService)
|
2010-09-16 02:55:08 +04:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
ExternalHelperAppParent *parent = static_cast<ExternalHelperAppParent *>(aService);
|
|
|
|
parent->Release();
|
|
|
|
return true;
|
2010-09-16 02:55:08 +04:00
|
|
|
}
|
|
|
|
|
2015-08-26 02:42:21 +03:00
|
|
|
PHandlerServiceParent*
|
|
|
|
ContentParent::AllocPHandlerServiceParent()
|
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
HandlerServiceParent* actor = new HandlerServiceParent();
|
|
|
|
actor->AddRef();
|
|
|
|
return actor;
|
2015-08-26 02:42:21 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
ContentParent::DeallocPHandlerServiceParent(PHandlerServiceParent* aHandlerServiceParent)
|
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
static_cast<HandlerServiceParent*>(aHandlerServiceParent)->Release();
|
|
|
|
return true;
|
2015-08-26 02:42:21 +03:00
|
|
|
}
|
|
|
|
|
2015-06-18 18:46:36 +03:00
|
|
|
media::PMediaParent*
|
|
|
|
ContentParent::AllocPMediaParent()
|
|
|
|
{
|
|
|
|
return media::AllocPMediaParent();
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
ContentParent::DeallocPMediaParent(media::PMediaParent *aActor)
|
|
|
|
{
|
|
|
|
return media::DeallocPMediaParent(aActor);
|
|
|
|
}
|
|
|
|
|
2010-11-19 04:15:23 +03:00
|
|
|
PStorageParent*
|
2013-07-08 19:48:39 +04:00
|
|
|
ContentParent::AllocPStorageParent()
|
2010-11-19 04:15:23 +03:00
|
|
|
{
|
2017-01-04 16:53:01 +03:00
|
|
|
return new StorageDBParent();
|
2010-11-19 04:15:23 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
2013-07-08 19:48:39 +04:00
|
|
|
ContentParent::DeallocPStorageParent(PStorageParent* aActor)
|
2010-11-19 04:15:23 +03:00
|
|
|
{
|
2017-01-04 16:53:01 +03:00
|
|
|
StorageDBParent* child = static_cast<StorageDBParent*>(aActor);
|
2016-01-05 12:59:30 +03:00
|
|
|
child->ReleaseIPDLReference();
|
|
|
|
return true;
|
2010-11-19 04:15:23 +03:00
|
|
|
}
|
|
|
|
|
2015-03-26 06:16:21 +03:00
|
|
|
PPresentationParent*
|
|
|
|
ContentParent::AllocPPresentationParent()
|
|
|
|
{
|
2015-10-18 08:24:48 +03:00
|
|
|
RefPtr<PresentationParent> actor = new PresentationParent();
|
2015-03-26 06:16:21 +03:00
|
|
|
return actor.forget().take();
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
ContentParent::DeallocPPresentationParent(PPresentationParent* aActor)
|
|
|
|
{
|
2015-10-18 08:24:48 +03:00
|
|
|
RefPtr<PresentationParent> actor =
|
2016-01-05 12:59:30 +03:00
|
|
|
dont_AddRef(static_cast<PresentationParent*>(aActor));
|
2015-03-26 06:16:21 +03:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2015-03-26 06:16:21 +03:00
|
|
|
ContentParent::RecvPPresentationConstructor(PPresentationParent* aActor)
|
|
|
|
{
|
2016-11-15 06:26:00 +03:00
|
|
|
if (!static_cast<PresentationParent*>(aActor)->Init(mChildID)) {
|
|
|
|
return IPC_FAIL_NO_REASON(this);
|
|
|
|
}
|
|
|
|
return IPC_OK();
|
2015-03-26 06:16:21 +03:00
|
|
|
}
|
|
|
|
|
2016-06-07 12:46:03 +03:00
|
|
|
PFlyWebPublishedServerParent*
|
|
|
|
ContentParent::AllocPFlyWebPublishedServerParent(const nsString& name,
|
|
|
|
const FlyWebPublishOptions& params)
|
|
|
|
{
|
|
|
|
RefPtr<FlyWebPublishedServerParent> actor =
|
|
|
|
new FlyWebPublishedServerParent(name, params);
|
|
|
|
return actor.forget().take();
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
ContentParent::DeallocPFlyWebPublishedServerParent(PFlyWebPublishedServerParent* aActor)
|
|
|
|
{
|
|
|
|
RefPtr<FlyWebPublishedServerParent> actor =
|
|
|
|
dont_AddRef(static_cast<FlyWebPublishedServerParent*>(aActor));
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2013-04-04 02:13:17 +04:00
|
|
|
PSpeechSynthesisParent*
|
2013-07-08 19:48:39 +04:00
|
|
|
ContentParent::AllocPSpeechSynthesisParent()
|
2013-04-04 02:13:17 +04:00
|
|
|
{
|
|
|
|
#ifdef MOZ_WEBSPEECH
|
2016-01-05 12:59:30 +03:00
|
|
|
return new mozilla::dom::SpeechSynthesisParent();
|
2013-04-04 02:13:17 +04:00
|
|
|
#else
|
2016-01-05 12:59:30 +03:00
|
|
|
return nullptr;
|
2013-04-04 02:13:17 +04:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
2013-07-08 19:48:39 +04:00
|
|
|
ContentParent::DeallocPSpeechSynthesisParent(PSpeechSynthesisParent* aActor)
|
2013-04-04 02:13:17 +04:00
|
|
|
{
|
|
|
|
#ifdef MOZ_WEBSPEECH
|
2016-01-05 12:59:30 +03:00
|
|
|
delete aActor;
|
|
|
|
return true;
|
2013-04-04 02:13:17 +04:00
|
|
|
#else
|
2016-01-05 12:59:30 +03:00
|
|
|
return false;
|
2013-04-04 02:13:17 +04:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2013-04-04 02:13:17 +04:00
|
|
|
ContentParent::RecvPSpeechSynthesisConstructor(PSpeechSynthesisParent* aActor)
|
|
|
|
{
|
|
|
|
#ifdef MOZ_WEBSPEECH
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2013-04-04 02:13:17 +04:00
|
|
|
#else
|
2016-11-21 09:04:20 +03:00
|
|
|
return IPC_FAIL_NO_REASON(this);
|
2013-04-04 02:13:17 +04:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2012-08-23 23:33:46 +04:00
|
|
|
ContentParent::RecvStartVisitedQuery(const URIParams& aURI)
|
2010-07-02 19:50:41 +04:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
nsCOMPtr<nsIURI> newURI = DeserializeURI(aURI);
|
|
|
|
if (!newURI) {
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_FAIL_NO_REASON(this);
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
|
|
|
nsCOMPtr<IHistory> history = services::GetHistoryService();
|
|
|
|
if (history) {
|
|
|
|
history->RegisterVisitedCallback(newURI, nullptr);
|
|
|
|
}
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2010-07-02 19:50:41 +04:00
|
|
|
}
|
|
|
|
|
2010-07-02 19:50:24 +04:00
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2012-08-23 23:33:46 +04:00
|
|
|
ContentParent::RecvVisitURI(const URIParams& uri,
|
|
|
|
const OptionalURIParams& referrer,
|
|
|
|
const uint32_t& flags)
|
2010-07-02 19:50:24 +04:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
nsCOMPtr<nsIURI> ourURI = DeserializeURI(uri);
|
|
|
|
if (!ourURI) {
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_FAIL_NO_REASON(this);
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
|
|
|
nsCOMPtr<nsIURI> ourReferrer = DeserializeURI(referrer);
|
|
|
|
nsCOMPtr<IHistory> history = services::GetHistoryService();
|
|
|
|
if (history) {
|
|
|
|
history->VisitURI(ourURI, ourReferrer, flags);
|
|
|
|
}
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2010-07-02 19:50:24 +04:00
|
|
|
}
|
|
|
|
|
2010-07-02 19:53:42 +04:00
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2012-08-23 23:33:46 +04:00
|
|
|
ContentParent::RecvSetURITitle(const URIParams& uri,
|
|
|
|
const nsString& title)
|
2010-07-02 19:53:42 +04:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
nsCOMPtr<nsIURI> ourURI = DeserializeURI(uri);
|
|
|
|
if (!ourURI) {
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_FAIL_NO_REASON(this);
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
|
|
|
nsCOMPtr<IHistory> history = services::GetHistoryService();
|
|
|
|
if (history) {
|
|
|
|
history->SetURITitle(ourURI, title);
|
|
|
|
}
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2010-07-02 19:53:42 +04:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2016-04-13 20:20:37 +03:00
|
|
|
ContentParent::RecvNSSU2FTokenIsCompatibleVersion(const nsString& aVersion,
|
|
|
|
bool* aIsCompatible)
|
2016-04-15 19:29:12 +03:00
|
|
|
{
|
2016-04-13 20:20:37 +03:00
|
|
|
MOZ_ASSERT(aIsCompatible);
|
|
|
|
|
2016-04-15 19:29:12 +03:00
|
|
|
nsCOMPtr<nsINSSU2FToken> nssToken(do_GetService(NS_NSSU2FTOKEN_CONTRACTID));
|
|
|
|
if (NS_WARN_IF(!nssToken)) {
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_FAIL_NO_REASON(this);
|
2016-04-15 19:29:12 +03:00
|
|
|
}
|
|
|
|
|
2016-04-13 20:20:37 +03:00
|
|
|
nsresult rv = nssToken->IsCompatibleVersion(aVersion, aIsCompatible);
|
2016-11-15 06:26:00 +03:00
|
|
|
if (NS_FAILED(rv)) {
|
|
|
|
return IPC_FAIL_NO_REASON(this);
|
|
|
|
}
|
|
|
|
return IPC_OK();
|
2016-04-15 19:29:12 +03:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2016-04-13 20:20:37 +03:00
|
|
|
ContentParent::RecvNSSU2FTokenIsRegistered(nsTArray<uint8_t>&& aKeyHandle,
|
|
|
|
bool* aIsValidKeyHandle)
|
2016-04-15 19:29:12 +03:00
|
|
|
{
|
2016-04-13 20:20:37 +03:00
|
|
|
MOZ_ASSERT(aIsValidKeyHandle);
|
|
|
|
|
2016-04-15 19:29:12 +03:00
|
|
|
nsCOMPtr<nsINSSU2FToken> nssToken(do_GetService(NS_NSSU2FTOKEN_CONTRACTID));
|
|
|
|
if (NS_WARN_IF(!nssToken)) {
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_FAIL_NO_REASON(this);
|
2016-04-15 19:29:12 +03:00
|
|
|
}
|
|
|
|
|
2016-04-13 20:20:37 +03:00
|
|
|
nsresult rv = nssToken->IsRegistered(aKeyHandle.Elements(), aKeyHandle.Length(),
|
|
|
|
aIsValidKeyHandle);
|
2016-11-15 06:26:00 +03:00
|
|
|
if (NS_FAILED(rv)) {
|
|
|
|
return IPC_FAIL_NO_REASON(this);
|
|
|
|
}
|
|
|
|
return IPC_OK();
|
2016-04-15 19:29:12 +03:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2016-04-13 20:20:37 +03:00
|
|
|
ContentParent::RecvNSSU2FTokenRegister(nsTArray<uint8_t>&& aApplication,
|
|
|
|
nsTArray<uint8_t>&& aChallenge,
|
|
|
|
nsTArray<uint8_t>* aRegistration)
|
2016-04-15 19:29:12 +03:00
|
|
|
{
|
2016-04-13 20:20:37 +03:00
|
|
|
MOZ_ASSERT(aRegistration);
|
|
|
|
|
2016-04-15 19:29:12 +03:00
|
|
|
nsCOMPtr<nsINSSU2FToken> nssToken(do_GetService(NS_NSSU2FTOKEN_CONTRACTID));
|
|
|
|
if (NS_WARN_IF(!nssToken)) {
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_FAIL_NO_REASON(this);
|
2016-04-15 19:29:12 +03:00
|
|
|
}
|
|
|
|
uint8_t* buffer;
|
|
|
|
uint32_t bufferlen;
|
2016-04-13 20:20:37 +03:00
|
|
|
nsresult rv = nssToken->Register(aApplication.Elements(), aApplication.Length(),
|
|
|
|
aChallenge.Elements(), aChallenge.Length(),
|
2016-04-15 19:29:12 +03:00
|
|
|
&buffer, &bufferlen);
|
|
|
|
if (NS_WARN_IF(NS_FAILED(rv))) {
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_FAIL_NO_REASON(this);
|
2016-04-15 19:29:12 +03:00
|
|
|
}
|
|
|
|
|
2016-04-13 20:20:37 +03:00
|
|
|
MOZ_ASSERT(buffer);
|
|
|
|
aRegistration->ReplaceElementsAt(0, aRegistration->Length(), buffer, bufferlen);
|
2016-04-15 19:29:12 +03:00
|
|
|
free(buffer);
|
2016-11-15 06:26:00 +03:00
|
|
|
if (NS_FAILED(rv)) {
|
|
|
|
return IPC_FAIL_NO_REASON(this);
|
|
|
|
}
|
|
|
|
return IPC_OK();
|
2016-04-15 19:29:12 +03:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2016-04-13 20:20:37 +03:00
|
|
|
ContentParent::RecvNSSU2FTokenSign(nsTArray<uint8_t>&& aApplication,
|
|
|
|
nsTArray<uint8_t>&& aChallenge,
|
|
|
|
nsTArray<uint8_t>&& aKeyHandle,
|
|
|
|
nsTArray<uint8_t>* aSignature)
|
2016-04-15 19:29:12 +03:00
|
|
|
{
|
2016-04-13 20:20:37 +03:00
|
|
|
MOZ_ASSERT(aSignature);
|
|
|
|
|
2016-04-15 19:29:12 +03:00
|
|
|
nsCOMPtr<nsINSSU2FToken> nssToken(do_GetService(NS_NSSU2FTOKEN_CONTRACTID));
|
|
|
|
if (NS_WARN_IF(!nssToken)) {
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_FAIL_NO_REASON(this);
|
2016-04-15 19:29:12 +03:00
|
|
|
}
|
|
|
|
uint8_t* buffer;
|
|
|
|
uint32_t bufferlen;
|
2016-04-13 20:20:37 +03:00
|
|
|
nsresult rv = nssToken->Sign(aApplication.Elements(), aApplication.Length(),
|
|
|
|
aChallenge.Elements(), aChallenge.Length(),
|
|
|
|
aKeyHandle.Elements(), aKeyHandle.Length(),
|
2016-04-15 19:29:12 +03:00
|
|
|
&buffer, &bufferlen);
|
|
|
|
if (NS_WARN_IF(NS_FAILED(rv))) {
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_FAIL_NO_REASON(this);
|
2016-04-15 19:29:12 +03:00
|
|
|
}
|
|
|
|
|
2016-04-13 20:20:37 +03:00
|
|
|
MOZ_ASSERT(buffer);
|
|
|
|
aSignature->ReplaceElementsAt(0, aSignature->Length(), buffer, bufferlen);
|
2016-04-15 19:29:12 +03:00
|
|
|
free(buffer);
|
2016-11-15 06:26:00 +03:00
|
|
|
if (NS_FAILED(rv)) {
|
|
|
|
return IPC_FAIL_NO_REASON(this);
|
|
|
|
}
|
|
|
|
return IPC_OK();
|
2016-04-15 19:29:12 +03:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2014-07-22 16:17:45 +04:00
|
|
|
ContentParent::RecvIsSecureURI(const uint32_t& type,
|
|
|
|
const URIParams& uri,
|
|
|
|
const uint32_t& flags,
|
|
|
|
bool* isSecureURI)
|
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
nsCOMPtr<nsISiteSecurityService> sss(do_GetService(NS_SSSERVICE_CONTRACTID));
|
|
|
|
if (!sss) {
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_FAIL_NO_REASON(this);
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
|
|
|
nsCOMPtr<nsIURI> ourURI = DeserializeURI(uri);
|
|
|
|
if (!ourURI) {
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_FAIL_NO_REASON(this);
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
Bug 1246540 - HSTS Priming Proof of Concept. r=ckerschb, r=mayhemer, r=jld, r=smaug, r=dkeeler, r=jmaher, p=ally
HSTS priming changes the order of mixed-content blocking and HSTS
upgrades, and adds a priming request to check if a mixed-content load is
accesible over HTTPS and the server supports upgrading via the
Strict-Transport-Security header.
Every call site that uses AsyncOpen2 passes through the mixed-content
blocker, and has a LoadInfo. If the mixed-content blocker marks the load as
needing HSTS priming, nsHttpChannel will build and send an HSTS priming
request on the same URI with the scheme upgraded to HTTPS. If the server
allows the upgrade, then channel performs an internal redirect to the HTTPS URI,
otherwise use the result of mixed-content blocker to allow or block the
load.
nsISiteSecurityService adds an optional boolean out parameter to
determine if the HSTS state is already cached for negative assertions.
If the host has been probed within the previous 24 hours, no HSTS
priming check will be sent.
MozReview-Commit-ID: ES1JruCtDdX
--HG--
extra : rebase_source : 2ac6c93c49f2862fc0b9e595eb0598cd1ea4bedf
2016-09-27 18:27:00 +03:00
|
|
|
nsresult rv = sss->IsSecureURI(type, ourURI, flags, nullptr, isSecureURI);
|
2016-11-15 06:26:00 +03:00
|
|
|
if (NS_FAILED(rv)) {
|
|
|
|
return IPC_FAIL_NO_REASON(this);
|
|
|
|
}
|
|
|
|
return IPC_OK();
|
2014-07-22 16:17:45 +04:00
|
|
|
}
|
2014-05-21 09:49:36 +04:00
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
Bug 1246540 - HSTS Priming Proof of Concept. r=ckerschb, r=mayhemer, r=jld, r=smaug, r=dkeeler, r=jmaher, p=ally
HSTS priming changes the order of mixed-content blocking and HSTS
upgrades, and adds a priming request to check if a mixed-content load is
accesible over HTTPS and the server supports upgrading via the
Strict-Transport-Security header.
Every call site that uses AsyncOpen2 passes through the mixed-content
blocker, and has a LoadInfo. If the mixed-content blocker marks the load as
needing HSTS priming, nsHttpChannel will build and send an HSTS priming
request on the same URI with the scheme upgraded to HTTPS. If the server
allows the upgrade, then channel performs an internal redirect to the HTTPS URI,
otherwise use the result of mixed-content blocker to allow or block the
load.
nsISiteSecurityService adds an optional boolean out parameter to
determine if the HSTS state is already cached for negative assertions.
If the host has been probed within the previous 24 hours, no HSTS
priming check will be sent.
MozReview-Commit-ID: ES1JruCtDdX
--HG--
extra : rebase_source : 2ac6c93c49f2862fc0b9e595eb0598cd1ea4bedf
2016-09-27 18:27:00 +03:00
|
|
|
ContentParent::RecvAccumulateMixedContentHSTS(const URIParams& aURI, const bool& aActive, const bool& aHSTSPriming)
|
2015-09-09 22:14:27 +03:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
nsCOMPtr<nsIURI> ourURI = DeserializeURI(aURI);
|
|
|
|
if (!ourURI) {
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_FAIL_NO_REASON(this);
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
Bug 1246540 - HSTS Priming Proof of Concept. r=ckerschb, r=mayhemer, r=jld, r=smaug, r=dkeeler, r=jmaher, p=ally
HSTS priming changes the order of mixed-content blocking and HSTS
upgrades, and adds a priming request to check if a mixed-content load is
accesible over HTTPS and the server supports upgrading via the
Strict-Transport-Security header.
Every call site that uses AsyncOpen2 passes through the mixed-content
blocker, and has a LoadInfo. If the mixed-content blocker marks the load as
needing HSTS priming, nsHttpChannel will build and send an HSTS priming
request on the same URI with the scheme upgraded to HTTPS. If the server
allows the upgrade, then channel performs an internal redirect to the HTTPS URI,
otherwise use the result of mixed-content blocker to allow or block the
load.
nsISiteSecurityService adds an optional boolean out parameter to
determine if the HSTS state is already cached for negative assertions.
If the host has been probed within the previous 24 hours, no HSTS
priming check will be sent.
MozReview-Commit-ID: ES1JruCtDdX
--HG--
extra : rebase_source : 2ac6c93c49f2862fc0b9e595eb0598cd1ea4bedf
2016-09-27 18:27:00 +03:00
|
|
|
nsMixedContentBlocker::AccumulateMixedContentHSTS(ourURI, aActive, aHSTSPriming);
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2015-09-09 22:14:27 +03:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2015-12-04 02:04:28 +03:00
|
|
|
ContentParent::RecvLoadURIExternal(const URIParams& uri,
|
|
|
|
PBrowserParent* windowContext)
|
2010-08-10 21:14:45 +04:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
nsCOMPtr<nsIExternalProtocolService> extProtService(do_GetService(NS_EXTERNALPROTOCOLSERVICE_CONTRACTID));
|
|
|
|
if (!extProtService) {
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
|
|
|
nsCOMPtr<nsIURI> ourURI = DeserializeURI(uri);
|
|
|
|
if (!ourURI) {
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_FAIL_NO_REASON(this);
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
RefPtr<RemoteWindowContext> context =
|
|
|
|
new RemoteWindowContext(static_cast<TabParent*>(windowContext));
|
|
|
|
extProtService->LoadURI(ourURI, context);
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2010-08-10 21:14:45 +04:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2016-07-01 06:16:00 +03:00
|
|
|
ContentParent::RecvExtProtocolChannelConnectParent(const uint32_t& registrarId)
|
|
|
|
{
|
|
|
|
nsresult rv;
|
|
|
|
|
|
|
|
// First get the real channel created before redirect on the parent.
|
|
|
|
nsCOMPtr<nsIChannel> channel;
|
|
|
|
rv = NS_LinkRedirectChannels(registrarId, nullptr, getter_AddRefs(channel));
|
2016-11-15 06:26:00 +03:00
|
|
|
NS_ENSURE_SUCCESS(rv, IPC_OK());
|
2016-07-01 06:16:00 +03:00
|
|
|
|
|
|
|
nsCOMPtr<nsIParentChannel> parent = do_QueryInterface(channel, &rv);
|
2016-11-15 06:26:00 +03:00
|
|
|
NS_ENSURE_SUCCESS(rv, IPC_OK());
|
2016-07-01 06:16:00 +03:00
|
|
|
|
|
|
|
// The channel itself is its own (faked) parent, link it.
|
|
|
|
rv = NS_LinkRedirectChannels(registrarId, parent, getter_AddRefs(channel));
|
2016-11-15 06:26:00 +03:00
|
|
|
NS_ENSURE_SUCCESS(rv, IPC_OK());
|
2016-07-01 06:16:00 +03:00
|
|
|
|
|
|
|
// Signal the parent channel that it's a redirect-to parent. This will
|
|
|
|
// make AsyncOpen on it do nothing (what we want).
|
|
|
|
// Yes, this is a bit of a hack, but I don't think it's necessary to invent
|
|
|
|
// a new interface just to set this flag on the channel.
|
|
|
|
parent->SetParentListener(nullptr);
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2016-07-01 06:16:00 +03:00
|
|
|
}
|
|
|
|
|
2015-10-23 00:20:51 +03:00
|
|
|
bool
|
|
|
|
ContentParent::HasNotificationPermission(const IPC::Principal& aPrincipal)
|
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
return true;
|
2015-10-23 00:20:51 +03:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2015-12-31 22:04:24 +03:00
|
|
|
ContentParent::RecvShowAlert(const AlertNotificationType& aAlert)
|
2010-09-15 20:44:57 +04:00
|
|
|
{
|
2016-01-06 03:34:06 +03:00
|
|
|
nsCOMPtr<nsIAlertNotification> alert(dont_AddRef(aAlert));
|
|
|
|
if (NS_WARN_IF(!alert)) {
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
2013-11-12 03:56:21 +04:00
|
|
|
|
2016-01-06 03:34:06 +03:00
|
|
|
nsCOMPtr<nsIPrincipal> principal;
|
|
|
|
nsresult rv = alert->GetPrincipal(getter_AddRefs(principal));
|
|
|
|
if (NS_WARN_IF(NS_FAILED(rv)) ||
|
|
|
|
!HasNotificationPermission(IPC::Principal(principal))) {
|
2015-12-31 22:04:24 +03:00
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2016-01-06 03:34:06 +03:00
|
|
|
}
|
2013-11-12 03:56:21 +04:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
nsCOMPtr<nsIAlertsService> sysAlerts(do_GetService(NS_ALERTSERVICE_CONTRACTID));
|
|
|
|
if (sysAlerts) {
|
2016-01-06 03:34:06 +03:00
|
|
|
sysAlerts->ShowAlert(alert, this);
|
|
|
|
}
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2013-03-18 17:24:53 +04:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2013-11-12 03:56:21 +04:00
|
|
|
ContentParent::RecvCloseAlert(const nsString& aName,
|
|
|
|
const IPC::Principal& aPrincipal)
|
2013-03-18 17:24:53 +04:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
if (!HasNotificationPermission(aPrincipal)) {
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
2013-11-12 03:56:21 +04:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
nsCOMPtr<nsIAlertsService> sysAlerts(do_GetService(NS_ALERTSERVICE_CONTRACTID));
|
|
|
|
if (sysAlerts) {
|
|
|
|
sysAlerts->CloseAlert(aName, aPrincipal);
|
|
|
|
}
|
2010-09-15 20:44:57 +04:00
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2010-09-15 20:44:57 +04:00
|
|
|
}
|
2010-08-31 22:58:35 +04:00
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2015-10-23 00:10:14 +03:00
|
|
|
ContentParent::RecvDisableNotifications(const IPC::Principal& aPrincipal)
|
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
if (HasNotificationPermission(aPrincipal)) {
|
|
|
|
Unused << Notification::RemovePermission(aPrincipal);
|
|
|
|
}
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2015-10-23 00:20:51 +03:00
|
|
|
}
|
2015-10-23 00:10:14 +03:00
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2015-10-23 00:20:51 +03:00
|
|
|
ContentParent::RecvOpenNotificationSettings(const IPC::Principal& aPrincipal)
|
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
if (HasNotificationPermission(aPrincipal)) {
|
|
|
|
Unused << Notification::OpenSettings(aPrincipal);
|
|
|
|
}
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2015-10-23 00:10:14 +03:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2012-08-02 10:02:29 +04:00
|
|
|
ContentParent::RecvSyncMessage(const nsString& aMsg,
|
|
|
|
const ClonedMessageData& aData,
|
2015-01-16 22:58:52 +03:00
|
|
|
InfallibleTArray<CpowEntry>&& aCpows,
|
2013-11-06 21:21:15 +04:00
|
|
|
const IPC::Principal& aPrincipal,
|
2015-09-10 23:50:58 +03:00
|
|
|
nsTArray<StructuredCloneData>* aRetvals)
|
2010-08-31 22:58:35 +04:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
return nsIContentParent::RecvSyncMessage(aMsg, aData, Move(aCpows),
|
|
|
|
aPrincipal, aRetvals);
|
2010-08-31 22:58:35 +04:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2014-10-08 08:32:45 +04:00
|
|
|
ContentParent::RecvRpcMessage(const nsString& aMsg,
|
|
|
|
const ClonedMessageData& aData,
|
2015-01-16 22:58:52 +03:00
|
|
|
InfallibleTArray<CpowEntry>&& aCpows,
|
2014-10-08 08:32:45 +04:00
|
|
|
const IPC::Principal& aPrincipal,
|
2015-09-10 23:50:58 +03:00
|
|
|
nsTArray<StructuredCloneData>* aRetvals)
|
2014-10-08 08:32:45 +04:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
return nsIContentParent::RecvRpcMessage(aMsg, aData, Move(aCpows), aPrincipal,
|
|
|
|
aRetvals);
|
2013-10-01 20:15:06 +04:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2012-08-02 10:02:29 +04:00
|
|
|
ContentParent::RecvAsyncMessage(const nsString& aMsg,
|
2015-01-16 22:58:52 +03:00
|
|
|
InfallibleTArray<CpowEntry>&& aCpows,
|
2016-04-09 16:50:59 +03:00
|
|
|
const IPC::Principal& aPrincipal,
|
|
|
|
const ClonedMessageData& aData)
|
2010-08-31 22:58:35 +04:00
|
|
|
{
|
2016-04-09 16:50:59 +03:00
|
|
|
return nsIContentParent::RecvAsyncMessage(aMsg, Move(aCpows), aPrincipal,
|
|
|
|
aData);
|
2010-08-31 22:58:35 +04:00
|
|
|
}
|
2010-09-21 08:16:37 +04:00
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2013-04-18 18:13:23 +04:00
|
|
|
ContentParent::RecvFilePathUpdateNotify(const nsString& aType,
|
2013-05-11 13:10:18 +04:00
|
|
|
const nsString& aStorageName,
|
2013-04-18 18:13:23 +04:00
|
|
|
const nsString& aFilePath,
|
|
|
|
const nsCString& aReason)
|
2013-01-09 19:03:28 +04:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
RefPtr<DeviceStorageFile> dsf = new DeviceStorageFile(aType,
|
|
|
|
aStorageName,
|
|
|
|
aFilePath);
|
2013-01-09 19:03:28 +04:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
nsCOMPtr<nsIObserverService> obs = mozilla::services::GetObserverService();
|
|
|
|
if (!obs) {
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_FAIL_NO_REASON(this);
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
|
|
|
obs->NotifyObservers(dsf, "file-watcher-update",
|
|
|
|
NS_ConvertASCIItoUTF16(aReason).get());
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2013-01-09 19:03:28 +04:00
|
|
|
}
|
|
|
|
|
2013-02-26 21:27:31 +04:00
|
|
|
static int32_t
|
2016-01-05 12:59:30 +03:00
|
|
|
AddGeolocationListener(nsIDOMGeoPositionCallback* watcher,
|
|
|
|
nsIDOMGeoPositionErrorCallback* errorCallBack,
|
|
|
|
bool highAccuracy)
|
2013-02-26 21:27:31 +04:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
nsCOMPtr<nsIDOMGeoGeolocation> geo = do_GetService("@mozilla.org/geolocation;1");
|
|
|
|
if (!geo) {
|
|
|
|
return -1;
|
|
|
|
}
|
2013-02-26 21:27:31 +04:00
|
|
|
|
2016-10-24 09:40:18 +03:00
|
|
|
UniquePtr<PositionOptions> options = MakeUnique<PositionOptions>();
|
2016-01-05 12:59:30 +03:00
|
|
|
options->mTimeout = 0;
|
|
|
|
options->mMaximumAge = 0;
|
|
|
|
options->mEnableHighAccuracy = highAccuracy;
|
|
|
|
int32_t retval = 1;
|
2016-09-03 00:55:37 +03:00
|
|
|
geo->WatchPosition(watcher, errorCallBack, Move(options), &retval);
|
2016-01-05 12:59:30 +03:00
|
|
|
return retval;
|
2013-02-26 21:27:31 +04:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2013-02-26 21:27:31 +04:00
|
|
|
ContentParent::RecvAddGeolocationListener(const IPC::Principal& aPrincipal,
|
|
|
|
const bool& aHighAccuracy)
|
2010-09-21 08:16:37 +04:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
// To ensure no geolocation updates are skipped, we always force the
|
|
|
|
// creation of a new listener.
|
|
|
|
RecvRemoveGeolocationListener();
|
|
|
|
mGeolocationWatchID = AddGeolocationListener(this, this, aHighAccuracy);
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2010-09-21 08:16:37 +04:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2010-11-05 20:43:13 +03:00
|
|
|
ContentParent::RecvRemoveGeolocationListener()
|
2010-09-21 08:16:37 +04:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
if (mGeolocationWatchID != -1) {
|
|
|
|
nsCOMPtr<nsIDOMGeoGeolocation> geo = do_GetService("@mozilla.org/geolocation;1");
|
|
|
|
if (!geo) {
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
|
|
|
geo->ClearWatch(mGeolocationWatchID);
|
|
|
|
mGeolocationWatchID = -1;
|
|
|
|
}
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2010-09-21 08:16:37 +04:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2012-12-31 20:36:46 +04:00
|
|
|
ContentParent::RecvSetGeolocationHigherAccuracy(const bool& aEnable)
|
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
// This should never be called without a listener already present,
|
|
|
|
// so this check allows us to forgo securing privileges.
|
|
|
|
if (mGeolocationWatchID != -1) {
|
|
|
|
RecvRemoveGeolocationListener();
|
|
|
|
mGeolocationWatchID = AddGeolocationListener(this, this, aEnable);
|
|
|
|
}
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2012-12-31 20:36:46 +04:00
|
|
|
}
|
|
|
|
|
2010-09-21 08:16:37 +04:00
|
|
|
NS_IMETHODIMP
|
|
|
|
ContentParent::HandleEvent(nsIDOMGeoPosition* postion)
|
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
Unused << SendGeolocationUpdate(GeoPosition(postion));
|
|
|
|
return NS_OK;
|
2010-09-21 08:16:37 +04:00
|
|
|
}
|
|
|
|
|
2014-10-23 22:31:00 +04:00
|
|
|
NS_IMETHODIMP
|
|
|
|
ContentParent::HandleEvent(nsIDOMGeoPositionError* postionError)
|
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
int16_t errorCode;
|
|
|
|
nsresult rv;
|
|
|
|
rv = postionError->GetCode(&errorCode);
|
|
|
|
NS_ENSURE_SUCCESS(rv,rv);
|
|
|
|
Unused << SendGeolocationError(errorCode);
|
|
|
|
return NS_OK;
|
2014-10-23 22:31:00 +04:00
|
|
|
}
|
|
|
|
|
2012-11-09 21:52:09 +04:00
|
|
|
nsConsoleService *
|
|
|
|
ContentParent::GetConsoleService()
|
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
if (mConsoleService) {
|
2012-11-09 21:52:09 +04:00
|
|
|
return mConsoleService.get();
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
// XXXkhuey everything about this is terrible.
|
|
|
|
// Get the ConsoleService by CID rather than ContractID, so that we
|
|
|
|
// can cast the returned pointer to an nsConsoleService (rather than
|
|
|
|
// just an nsIConsoleService). This allows us to call the non-idl function
|
|
|
|
// nsConsoleService::LogMessageWithMode.
|
|
|
|
NS_DEFINE_CID(consoleServiceCID, NS_CONSOLESERVICE_CID);
|
|
|
|
nsCOMPtr<nsIConsoleService> consoleService(do_GetService(consoleServiceCID));
|
|
|
|
mConsoleService = static_cast<nsConsoleService*>(consoleService.get());
|
|
|
|
return mConsoleService.get();
|
2012-11-09 21:52:09 +04:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2010-09-24 05:39:32 +04:00
|
|
|
ContentParent::RecvConsoleMessage(const nsString& aMessage)
|
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
RefPtr<nsConsoleService> consoleService = GetConsoleService();
|
|
|
|
if (!consoleService) {
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
RefPtr<nsConsoleMessage> msg(new nsConsoleMessage(aMessage.get()));
|
|
|
|
consoleService->LogMessageWithMode(msg, nsConsoleService::SuppressLog);
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2010-09-24 05:39:32 +04:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2010-09-24 05:39:32 +04:00
|
|
|
ContentParent::RecvScriptError(const nsString& aMessage,
|
2016-01-05 12:59:30 +03:00
|
|
|
const nsString& aSourceName,
|
|
|
|
const nsString& aSourceLine,
|
|
|
|
const uint32_t& aLineNumber,
|
|
|
|
const uint32_t& aColNumber,
|
|
|
|
const uint32_t& aFlags,
|
|
|
|
const nsCString& aCategory)
|
|
|
|
{
|
|
|
|
RefPtr<nsConsoleService> consoleService = GetConsoleService();
|
|
|
|
if (!consoleService) {
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
2010-09-24 05:39:32 +04:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
nsCOMPtr<nsIScriptError> msg(do_CreateInstance(NS_SCRIPTERROR_CONTRACTID));
|
|
|
|
nsresult rv = msg->Init(aMessage, aSourceName, aSourceLine,
|
|
|
|
aLineNumber, aColNumber, aFlags, aCategory.get());
|
|
|
|
if (NS_FAILED(rv))
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2016-01-05 12:59:30 +03:00
|
|
|
|
|
|
|
consoleService->LogMessageWithMode(msg, nsConsoleService::SuppressLog);
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2010-09-24 05:39:32 +04:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2012-04-20 04:13:20 +04:00
|
|
|
ContentParent::RecvPrivateDocShellsExist(const bool& aExist)
|
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
if (!sPrivateContent)
|
|
|
|
sPrivateContent = new nsTArray<ContentParent*>();
|
|
|
|
if (aExist) {
|
|
|
|
sPrivateContent->AppendElement(this);
|
|
|
|
} else {
|
|
|
|
sPrivateContent->RemoveElement(this);
|
|
|
|
|
|
|
|
// Only fire the notification if we have private and non-private
|
|
|
|
// windows: if privatebrowsing.autostart is true, all windows are
|
|
|
|
// private.
|
|
|
|
if (!sPrivateContent->Length() &&
|
|
|
|
!Preferences::GetBool("browser.privatebrowsing.autostart")) {
|
|
|
|
nsCOMPtr<nsIObserverService> obs = mozilla::services::GetObserverService();
|
|
|
|
obs->NotifyObservers(nullptr, "last-pb-context-exited", nullptr);
|
|
|
|
delete sPrivateContent;
|
|
|
|
sPrivateContent = nullptr;
|
2012-04-20 04:13:20 +04:00
|
|
|
}
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2012-04-20 04:13:20 +04:00
|
|
|
}
|
|
|
|
|
2015-02-20 04:13:02 +03:00
|
|
|
bool
|
|
|
|
ContentParent::DoLoadMessageManagerScript(const nsAString& aURL,
|
|
|
|
bool aRunInGlobalScope)
|
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
MOZ_ASSERT(!aRunInGlobalScope);
|
|
|
|
return SendLoadProcessScript(nsString(aURL));
|
2015-02-20 04:13:02 +03:00
|
|
|
}
|
|
|
|
|
2015-10-07 13:42:43 +03:00
|
|
|
nsresult
|
2013-07-11 02:05:39 +04:00
|
|
|
ContentParent::DoSendAsyncMessage(JSContext* aCx,
|
|
|
|
const nsAString& aMessage,
|
2015-09-10 23:50:58 +03:00
|
|
|
StructuredCloneData& aHelper,
|
2013-11-06 21:21:15 +04:00
|
|
|
JS::Handle<JSObject *> aCpows,
|
|
|
|
nsIPrincipal* aPrincipal)
|
2012-09-28 09:43:12 +04:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
ClonedMessageData data;
|
|
|
|
if (!BuildClonedMessageDataForParent(this, aHelper, data)) {
|
|
|
|
return NS_ERROR_DOM_DATA_CLONE_ERR;
|
|
|
|
}
|
|
|
|
InfallibleTArray<CpowEntry> cpows;
|
|
|
|
jsipc::CPOWManager* mgr = GetCPOWManager();
|
|
|
|
if (aCpows && (!mgr || !mgr->Wrap(aCx, aCpows, &cpows))) {
|
|
|
|
return NS_ERROR_UNEXPECTED;
|
|
|
|
}
|
2016-04-09 16:50:59 +03:00
|
|
|
if (!SendAsyncMessage(nsString(aMessage), cpows, Principal(aPrincipal), data)) {
|
2016-01-05 12:59:30 +03:00
|
|
|
return NS_ERROR_UNEXPECTED;
|
|
|
|
}
|
|
|
|
return NS_OK;
|
2012-09-28 09:43:12 +04:00
|
|
|
}
|
|
|
|
|
2014-06-11 09:44:03 +04:00
|
|
|
PBlobParent*
|
|
|
|
ContentParent::SendPBlobConstructor(PBlobParent* aActor,
|
|
|
|
const BlobConstructorParams& aParams)
|
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
return PContentParent::SendPBlobConstructor(aActor, aParams);
|
2014-06-11 09:44:03 +04:00
|
|
|
}
|
|
|
|
|
2014-06-11 09:44:13 +04:00
|
|
|
PBrowserParent*
|
|
|
|
ContentParent::SendPBrowserConstructor(PBrowserParent* aActor,
|
2014-10-29 21:11:00 +03:00
|
|
|
const TabId& aTabId,
|
2014-06-11 09:44:13 +04:00
|
|
|
const IPCTabContext& aContext,
|
|
|
|
const uint32_t& aChromeFlags,
|
2014-10-24 04:28:00 +04:00
|
|
|
const ContentParentId& aCpId,
|
2014-06-11 09:44:13 +04:00
|
|
|
const bool& aIsForBrowser)
|
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
return PContentParent::SendPBrowserConstructor(aActor,
|
|
|
|
aTabId,
|
|
|
|
aContext,
|
|
|
|
aChromeFlags,
|
|
|
|
aCpId,
|
|
|
|
aIsForBrowser);
|
2014-06-11 09:44:13 +04:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2014-09-11 17:50:55 +04:00
|
|
|
ContentParent::RecvKeywordToURI(const nsCString& aKeyword,
|
|
|
|
nsString* aProviderName,
|
|
|
|
OptionalInputStreamParams* aPostData,
|
2013-08-16 21:59:31 +04:00
|
|
|
OptionalURIParams* aURI)
|
|
|
|
{
|
2016-08-24 06:23:56 +03:00
|
|
|
*aPostData = void_t();
|
|
|
|
*aURI = void_t();
|
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
nsCOMPtr<nsIURIFixup> fixup = do_GetService(NS_URIFIXUP_CONTRACTID);
|
|
|
|
if (!fixup) {
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
2013-08-16 21:59:31 +04:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
nsCOMPtr<nsIInputStream> postData;
|
|
|
|
nsCOMPtr<nsIURIFixupInfo> info;
|
2014-09-11 17:50:55 +04:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
if (NS_FAILED(fixup->KeywordToURI(aKeyword, getter_AddRefs(postData),
|
|
|
|
getter_AddRefs(info)))) {
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
|
|
|
info->GetKeywordProviderName(*aProviderName);
|
2013-08-16 21:59:31 +04:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
nsTArray<mozilla::ipc::FileDescriptor> fds;
|
|
|
|
SerializeInputStream(postData, *aPostData, fds);
|
|
|
|
MOZ_ASSERT(fds.IsEmpty());
|
2014-03-25 22:37:13 +04:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
nsCOMPtr<nsIURI> uri;
|
|
|
|
info->GetPreferredURI(getter_AddRefs(uri));
|
|
|
|
SerializeURI(uri, *aURI);
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2013-08-16 21:59:31 +04:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2014-09-11 17:50:55 +04:00
|
|
|
ContentParent::RecvNotifyKeywordSearchLoading(const nsString &aProvider,
|
2016-01-05 12:59:30 +03:00
|
|
|
const nsString &aKeyword)
|
|
|
|
{
|
2014-09-11 17:50:55 +04:00
|
|
|
#ifdef MOZ_TOOLKIT_SEARCH
|
2016-01-05 12:59:30 +03:00
|
|
|
nsCOMPtr<nsIBrowserSearchService> searchSvc = do_GetService("@mozilla.org/browser/search-service;1");
|
|
|
|
if (searchSvc) {
|
|
|
|
nsCOMPtr<nsISearchEngine> searchEngine;
|
|
|
|
searchSvc->GetEngineByName(aProvider, getter_AddRefs(searchEngine));
|
|
|
|
if (searchEngine) {
|
|
|
|
nsCOMPtr<nsIObserverService> obsSvc = mozilla::services::GetObserverService();
|
|
|
|
if (obsSvc) {
|
|
|
|
// Note that "keyword-search" refers to a search via the url
|
|
|
|
// bar, not a bookmarks keyword search.
|
|
|
|
obsSvc->NotifyObservers(searchEngine, "keyword-search", aKeyword.get());
|
|
|
|
}
|
2014-09-11 17:50:55 +04:00
|
|
|
}
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
2014-09-11 17:50:55 +04:00
|
|
|
#endif
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2014-09-11 17:50:55 +04:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2015-04-29 11:57:24 +03:00
|
|
|
ContentParent::RecvCopyFavicon(const URIParams& aOldURI,
|
|
|
|
const URIParams& aNewURI,
|
2015-11-25 00:31:57 +03:00
|
|
|
const IPC::Principal& aLoadingPrincipal,
|
2015-04-29 11:57:24 +03:00
|
|
|
const bool& aInPrivateBrowsing)
|
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
nsCOMPtr<nsIURI> oldURI = DeserializeURI(aOldURI);
|
|
|
|
if (!oldURI) {
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
|
|
|
nsCOMPtr<nsIURI> newURI = DeserializeURI(aNewURI);
|
|
|
|
if (!newURI) {
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
nsDocShell::CopyFavicon(oldURI, newURI, aLoadingPrincipal, aInPrivateBrowsing);
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2015-04-29 11:57:24 +03:00
|
|
|
}
|
|
|
|
|
2013-08-27 08:56:57 +04:00
|
|
|
bool
|
|
|
|
ContentParent::ShouldContinueFromReplyTimeout()
|
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
RefPtr<ProcessHangMonitor> monitor = ProcessHangMonitor::Get();
|
|
|
|
return !monitor || !monitor->ShouldTimeOutCPOWs();
|
2013-08-27 08:56:57 +04:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2013-11-24 13:06:27 +04:00
|
|
|
ContentParent::RecvRecordingDeviceEvents(const nsString& aRecordingStatus,
|
|
|
|
const nsString& aPageURL,
|
|
|
|
const bool& aIsAudio,
|
|
|
|
const bool& aIsVideo)
|
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
nsCOMPtr<nsIObserverService> obs = mozilla::services::GetObserverService();
|
|
|
|
if (obs) {
|
|
|
|
// recording-device-ipc-events needs to gather more information from content process
|
|
|
|
RefPtr<nsHashPropertyBag> props = new nsHashPropertyBag();
|
|
|
|
props->SetPropertyAsUint64(NS_LITERAL_STRING("childID"), ChildID());
|
|
|
|
props->SetPropertyAsBool(NS_LITERAL_STRING("isAudio"), aIsAudio);
|
|
|
|
props->SetPropertyAsBool(NS_LITERAL_STRING("isVideo"), aIsVideo);
|
2016-10-15 04:46:26 +03:00
|
|
|
props->SetPropertyAsAString(NS_LITERAL_STRING("requestURL"), aPageURL);
|
2016-01-05 12:59:30 +03:00
|
|
|
|
|
|
|
obs->NotifyObservers((nsIPropertyBag2*) props,
|
|
|
|
"recording-device-ipc-events",
|
|
|
|
aRecordingStatus.get());
|
|
|
|
} else {
|
|
|
|
NS_WARNING("Could not get the Observer service for ContentParent::RecvRecordingDeviceEvents.");
|
|
|
|
}
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2013-11-24 13:06:27 +04:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2017-01-17 07:05:46 +03:00
|
|
|
ContentParent::RecvGetGfxInfoFeatureStatus(nsTArray<mozilla::dom::GfxInfoFeatureStatus>* aFS)
|
2014-01-11 05:09:20 +04:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
nsCOMPtr<nsIGfxInfo> gfxInfo = services::GetGfxInfo();
|
|
|
|
if (!gfxInfo) {
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
|
|
|
|
2017-01-17 07:05:46 +03:00
|
|
|
for (int32_t i = 1; i <= nsIGfxInfo::FEATURE_MAX_VALUE; ++i) {
|
|
|
|
int32_t status = 0;
|
|
|
|
nsAutoCString failureId;
|
|
|
|
gfxInfo->GetFeatureStatus(i, failureId, &status);
|
|
|
|
mozilla::dom::GfxInfoFeatureStatus fs(i, status, failureId);
|
|
|
|
aFS->AppendElement(Move(fs));
|
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2014-01-11 05:09:20 +04:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2016-01-05 12:59:30 +03:00
|
|
|
ContentParent::RecvAddIdleObserver(const uint64_t& aObserver,
|
|
|
|
const uint32_t& aIdleTimeInS)
|
2013-12-13 20:28:46 +04:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
nsresult rv;
|
|
|
|
nsCOMPtr<nsIIdleService> idleService =
|
|
|
|
do_GetService("@mozilla.org/widget/idleservice;1", &rv);
|
2016-11-15 06:26:00 +03:00
|
|
|
NS_ENSURE_SUCCESS(rv, IPC_FAIL_NO_REASON(this));
|
2013-12-13 20:28:46 +04:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
RefPtr<ParentIdleListener> listener =
|
|
|
|
new ParentIdleListener(this, aObserver, aIdleTimeInS);
|
|
|
|
rv = idleService->AddIdleObserver(listener, aIdleTimeInS);
|
2016-11-15 06:26:00 +03:00
|
|
|
NS_ENSURE_SUCCESS(rv, IPC_FAIL_NO_REASON(this));
|
2016-01-05 12:59:30 +03:00
|
|
|
mIdleListeners.AppendElement(listener);
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2013-12-13 20:28:46 +04:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2016-01-05 12:59:30 +03:00
|
|
|
ContentParent::RecvRemoveIdleObserver(const uint64_t& aObserver,
|
|
|
|
const uint32_t& aIdleTimeInS)
|
2013-12-13 20:28:46 +04:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
RefPtr<ParentIdleListener> listener;
|
|
|
|
for (int32_t i = mIdleListeners.Length() - 1; i >= 0; --i) {
|
|
|
|
listener = static_cast<ParentIdleListener*>(mIdleListeners[i].get());
|
|
|
|
if (listener->mObserver == aObserver &&
|
|
|
|
listener->mTime == aIdleTimeInS) {
|
|
|
|
nsresult rv;
|
|
|
|
nsCOMPtr<nsIIdleService> idleService =
|
|
|
|
do_GetService("@mozilla.org/widget/idleservice;1", &rv);
|
2016-11-15 06:26:00 +03:00
|
|
|
NS_ENSURE_SUCCESS(rv, IPC_FAIL_NO_REASON(this));
|
2016-01-05 12:59:30 +03:00
|
|
|
idleService->RemoveIdleObserver(listener, aIdleTimeInS);
|
|
|
|
mIdleListeners.RemoveElementAt(i);
|
|
|
|
break;
|
2014-05-28 07:04:23 +04:00
|
|
|
}
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2013-12-13 20:28:46 +04:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2014-02-05 20:37:26 +04:00
|
|
|
ContentParent::RecvBackUpXResources(const FileDescriptor& aXSocketFd)
|
|
|
|
{
|
|
|
|
#ifndef MOZ_X11
|
2016-12-03 00:46:53 +03:00
|
|
|
MOZ_CRASH("This message only makes sense on X11 platforms");
|
2014-02-05 20:37:26 +04:00
|
|
|
#else
|
2016-01-05 12:59:30 +03:00
|
|
|
MOZ_ASSERT(0 > mChildXSocketFdDup.get(),
|
|
|
|
"Already backed up X resources??");
|
|
|
|
if (aXSocketFd.IsValid()) {
|
2016-05-27 11:12:51 +03:00
|
|
|
auto rawFD = aXSocketFd.ClonePlatformHandle();
|
|
|
|
mChildXSocketFdDup.reset(rawFD.release());
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
2014-02-05 20:37:26 +04:00
|
|
|
#endif
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2014-02-05 20:37:26 +04:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2015-03-10 12:32:00 +03:00
|
|
|
ContentParent::RecvOpenAnonymousTemporaryFile(FileDescOrError *aFD)
|
2014-06-24 21:11:36 +04:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
PRFileDesc *prfd;
|
|
|
|
nsresult rv = NS_OpenAnonymousTemporaryFile(&prfd);
|
|
|
|
if (NS_WARN_IF(NS_FAILED(rv))) {
|
|
|
|
// Returning false will kill the child process; instead
|
|
|
|
// propagate the error and let the child handle it.
|
|
|
|
*aFD = rv;
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
|
|
|
*aFD = FileDescriptor(FileDescriptor::PlatformHandleType(PR_FileDesc2NativeHandle(prfd)));
|
|
|
|
// The FileDescriptor object owns a duplicate of the file handle; we
|
|
|
|
// must close the original (and clean up the NSPR descriptor).
|
|
|
|
PR_Close(prfd);
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2014-06-24 21:11:36 +04:00
|
|
|
}
|
|
|
|
|
2014-11-27 01:28:28 +03:00
|
|
|
static NS_DEFINE_CID(kFormProcessorCID, NS_FORMPROCESSOR_CID);
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2014-12-19 20:07:04 +03:00
|
|
|
ContentParent::RecvKeygenProcessValue(const nsString& oldValue,
|
|
|
|
const nsString& challenge,
|
|
|
|
const nsString& keytype,
|
|
|
|
const nsString& keyparams,
|
|
|
|
nsString* newValue)
|
2014-11-27 01:28:28 +03:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
nsCOMPtr<nsIFormProcessor> formProcessor =
|
|
|
|
do_GetService(kFormProcessorCID);
|
|
|
|
if (!formProcessor) {
|
|
|
|
newValue->Truncate();
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
formProcessor->ProcessValueIPC(oldValue, challenge, keytype, keyparams,
|
|
|
|
*newValue);
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2014-11-27 01:28:28 +03:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2014-12-19 20:07:04 +03:00
|
|
|
ContentParent::RecvKeygenProvideContent(nsString* aAttribute,
|
|
|
|
nsTArray<nsString>* aContent)
|
2014-11-27 01:28:28 +03:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
nsCOMPtr<nsIFormProcessor> formProcessor =
|
|
|
|
do_GetService(kFormProcessorCID);
|
|
|
|
if (!formProcessor) {
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
formProcessor->ProvideContent(NS_LITERAL_STRING("SELECT"), *aContent,
|
|
|
|
*aAttribute);
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2014-11-27 01:28:28 +03:00
|
|
|
}
|
|
|
|
|
2014-03-25 22:37:13 +04:00
|
|
|
PFileDescriptorSetParent*
|
2014-03-25 22:37:28 +04:00
|
|
|
ContentParent::AllocPFileDescriptorSetParent(const FileDescriptor& aFD)
|
2014-03-25 22:37:13 +04:00
|
|
|
{
|
2016-09-21 13:27:26 +03:00
|
|
|
return nsIContentParent::AllocPFileDescriptorSetParent(aFD);
|
2014-03-25 22:37:13 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
ContentParent::DeallocPFileDescriptorSetParent(PFileDescriptorSetParent* aActor)
|
|
|
|
{
|
2016-09-21 13:27:26 +03:00
|
|
|
return nsIContentParent::DeallocPFileDescriptorSetParent(aActor);
|
2014-03-25 22:37:13 +04:00
|
|
|
}
|
|
|
|
|
2014-06-14 00:40:46 +04:00
|
|
|
bool
|
|
|
|
ContentParent::IgnoreIPCPrincipal()
|
|
|
|
{
|
|
|
|
static bool sDidAddVarCache = false;
|
|
|
|
static bool sIgnoreIPCPrincipal = false;
|
|
|
|
if (!sDidAddVarCache) {
|
|
|
|
sDidAddVarCache = true;
|
|
|
|
Preferences::AddBoolVarCache(&sIgnoreIPCPrincipal,
|
|
|
|
"dom.testing.ignore_ipc_principal", false);
|
|
|
|
}
|
|
|
|
return sIgnoreIPCPrincipal;
|
|
|
|
}
|
|
|
|
|
2014-10-03 18:52:37 +04:00
|
|
|
void
|
|
|
|
ContentParent::NotifyUpdatedDictionaries()
|
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
nsCOMPtr<nsISpellChecker> spellChecker(do_GetService(NS_SPELLCHECKER_CONTRACTID));
|
|
|
|
MOZ_ASSERT(spellChecker, "No spell checker?");
|
2014-10-03 18:52:37 +04:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
InfallibleTArray<nsString> dictionaries;
|
|
|
|
spellChecker->GetDictionaryList(&dictionaries);
|
2014-10-03 18:52:37 +04:00
|
|
|
|
2016-06-07 01:23:43 +03:00
|
|
|
for (auto* cp : AllProcesses(eLive)) {
|
|
|
|
Unused << cp->SendUpdateDictionaryList(dictionaries);
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
2014-10-03 18:52:37 +04:00
|
|
|
}
|
|
|
|
|
2014-10-29 21:11:00 +03:00
|
|
|
/*static*/ TabId
|
|
|
|
ContentParent::AllocateTabId(const TabId& aOpenerTabId,
|
|
|
|
const IPCTabContext& aContext,
|
|
|
|
const ContentParentId& aCpId)
|
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
TabId tabId;
|
|
|
|
if (XRE_IsParentProcess()) {
|
|
|
|
ContentProcessManager* cpm = ContentProcessManager::GetSingleton();
|
|
|
|
tabId = cpm->AllocateTabId(aOpenerTabId, aContext, aCpId);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
ContentChild::GetSingleton()->SendAllocateTabId(aOpenerTabId,
|
|
|
|
aContext,
|
|
|
|
aCpId,
|
|
|
|
&tabId);
|
|
|
|
}
|
|
|
|
return tabId;
|
2014-10-29 21:11:00 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
/*static*/ void
|
|
|
|
ContentParent::DeallocateTabId(const TabId& aTabId,
|
2015-08-28 10:18:00 +03:00
|
|
|
const ContentParentId& aCpId,
|
|
|
|
bool aMarkedDestroying)
|
2014-10-29 21:11:00 +03:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
if (XRE_IsParentProcess()) {
|
|
|
|
ContentProcessManager* cpm = ContentProcessManager::GetSingleton();
|
|
|
|
ContentParent* cp = cpm->GetContentProcessById(aCpId);
|
2015-08-28 10:18:00 +03:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
cp->NotifyTabDestroyed(aTabId, aMarkedDestroying);
|
2015-08-28 10:18:00 +03:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
ContentProcessManager::GetSingleton()->DeallocateTabId(aCpId, aTabId);
|
|
|
|
} else {
|
|
|
|
ContentChild::GetSingleton()->SendDeallocateTabId(aTabId, aCpId,
|
|
|
|
aMarkedDestroying);
|
|
|
|
}
|
2014-10-29 21:11:00 +03:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2014-10-29 21:11:00 +03:00
|
|
|
ContentParent::RecvAllocateTabId(const TabId& aOpenerTabId,
|
|
|
|
const IPCTabContext& aContext,
|
|
|
|
const ContentParentId& aCpId,
|
|
|
|
TabId* aTabId)
|
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
*aTabId = AllocateTabId(aOpenerTabId, aContext, aCpId);
|
|
|
|
if (!(*aTabId)) {
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_FAIL_NO_REASON(this);
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2014-10-29 21:11:00 +03:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2015-08-28 10:18:00 +03:00
|
|
|
ContentParent::RecvDeallocateTabId(const TabId& aTabId,
|
|
|
|
const ContentParentId& aCpId,
|
|
|
|
const bool& aMarkedDestroying)
|
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
DeallocateTabId(aTabId, aCpId, aMarkedDestroying);
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2015-08-28 10:18:00 +03:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2015-08-28 10:18:00 +03:00
|
|
|
ContentParent::RecvNotifyTabDestroying(const TabId& aTabId,
|
|
|
|
const ContentParentId& aCpId)
|
2014-10-29 21:11:00 +03:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
NotifyTabDestroying(aTabId, aCpId);
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2014-10-29 21:11:00 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
nsTArray<TabContext>
|
|
|
|
ContentParent::GetManagedTabContext()
|
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
return Move(ContentProcessManager::GetSingleton()->
|
|
|
|
GetTabContextByContentProcess(this->ChildID()));
|
2014-10-29 21:11:00 +03:00
|
|
|
}
|
|
|
|
|
2014-11-13 03:31:00 +03:00
|
|
|
mozilla::docshell::POfflineCacheUpdateParent*
|
|
|
|
ContentParent::AllocPOfflineCacheUpdateParent(const URIParams& aManifestURI,
|
|
|
|
const URIParams& aDocumentURI,
|
2015-10-02 19:10:02 +03:00
|
|
|
const PrincipalInfo& aLoadingPrincipalInfo,
|
2016-01-18 22:20:08 +03:00
|
|
|
const bool& aStickDocument)
|
2014-11-13 03:31:00 +03:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
RefPtr<mozilla::docshell::OfflineCacheUpdateParent> update =
|
2016-01-18 22:20:08 +03:00
|
|
|
new mozilla::docshell::OfflineCacheUpdateParent();
|
2016-01-05 12:59:30 +03:00
|
|
|
// Use this reference as the IPDL reference.
|
|
|
|
return update.forget().take();
|
2014-11-13 03:31:00 +03:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2014-11-13 03:31:00 +03:00
|
|
|
ContentParent::RecvPOfflineCacheUpdateConstructor(POfflineCacheUpdateParent* aActor,
|
|
|
|
const URIParams& aManifestURI,
|
|
|
|
const URIParams& aDocumentURI,
|
2015-10-02 19:10:02 +03:00
|
|
|
const PrincipalInfo& aLoadingPrincipal,
|
2016-01-18 22:20:08 +03:00
|
|
|
const bool& aStickDocument)
|
2014-11-13 03:31:00 +03:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
MOZ_ASSERT(aActor);
|
2014-11-13 03:31:00 +03:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
RefPtr<mozilla::docshell::OfflineCacheUpdateParent> update =
|
|
|
|
static_cast<mozilla::docshell::OfflineCacheUpdateParent*>(aActor);
|
2014-11-13 03:31:00 +03:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
nsresult rv = update->Schedule(aManifestURI, aDocumentURI, aLoadingPrincipal, aStickDocument);
|
|
|
|
if (NS_FAILED(rv) && IsAlive()) {
|
|
|
|
// Inform the child of failure.
|
|
|
|
Unused << update->SendFinish(false, false);
|
|
|
|
}
|
2014-11-13 03:31:00 +03:00
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2014-11-13 03:31:00 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
ContentParent::DeallocPOfflineCacheUpdateParent(POfflineCacheUpdateParent* aActor)
|
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
// Reclaim the IPDL reference.
|
|
|
|
RefPtr<mozilla::docshell::OfflineCacheUpdateParent> update =
|
|
|
|
dont_AddRef(static_cast<mozilla::docshell::OfflineCacheUpdateParent*>(aActor));
|
|
|
|
return true;
|
2014-11-13 03:31:00 +03:00
|
|
|
}
|
|
|
|
|
2015-04-22 01:29:18 +03:00
|
|
|
PWebrtcGlobalParent *
|
|
|
|
ContentParent::AllocPWebrtcGlobalParent()
|
|
|
|
{
|
2015-05-06 19:29:33 +03:00
|
|
|
#ifdef MOZ_WEBRTC
|
2016-01-05 12:59:30 +03:00
|
|
|
return WebrtcGlobalParent::Alloc();
|
2015-05-06 19:29:33 +03:00
|
|
|
#else
|
2016-01-05 12:59:30 +03:00
|
|
|
return nullptr;
|
2015-05-06 19:29:33 +03:00
|
|
|
#endif
|
2015-04-22 01:29:18 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
ContentParent::DeallocPWebrtcGlobalParent(PWebrtcGlobalParent *aActor)
|
|
|
|
{
|
2015-05-06 19:29:33 +03:00
|
|
|
#ifdef MOZ_WEBRTC
|
2016-01-05 12:59:30 +03:00
|
|
|
WebrtcGlobalParent::Dealloc(static_cast<WebrtcGlobalParent*>(aActor));
|
|
|
|
return true;
|
2015-05-06 19:29:33 +03:00
|
|
|
#else
|
2016-01-05 12:59:30 +03:00
|
|
|
return false;
|
2015-05-06 19:29:33 +03:00
|
|
|
#endif
|
2015-04-22 01:29:18 +03:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2014-11-13 03:31:00 +03:00
|
|
|
ContentParent::RecvSetOfflinePermission(const Principal& aPrincipal)
|
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
nsIPrincipal* principal = aPrincipal;
|
2016-01-30 20:05:36 +03:00
|
|
|
nsContentUtils::MaybeAllowOfflineAppByDefault(principal);
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2014-11-13 03:31:00 +03:00
|
|
|
}
|
2014-10-29 21:11:00 +03:00
|
|
|
|
2015-04-08 21:48:11 +03:00
|
|
|
void
|
|
|
|
ContentParent::MaybeInvokeDragSession(TabParent* aParent)
|
|
|
|
{
|
|
|
|
nsCOMPtr<nsIDragService> dragService =
|
|
|
|
do_GetService("@mozilla.org/widget/dragservice;1");
|
|
|
|
if (dragService && dragService->MaybeAddChildProcess(this)) {
|
|
|
|
// We need to send transferable data to child process.
|
|
|
|
nsCOMPtr<nsIDragSession> session;
|
|
|
|
dragService->GetCurrentSession(getter_AddRefs(session));
|
|
|
|
if (session) {
|
|
|
|
nsTArray<IPCDataTransfer> dataTransfers;
|
|
|
|
nsCOMPtr<nsIDOMDataTransfer> domTransfer;
|
|
|
|
session->GetDataTransfer(getter_AddRefs(domTransfer));
|
|
|
|
nsCOMPtr<DataTransfer> transfer = do_QueryInterface(domTransfer);
|
|
|
|
if (!transfer) {
|
2015-09-02 09:08:01 +03:00
|
|
|
// Pass eDrop to get DataTransfer with external
|
2015-04-08 21:48:11 +03:00
|
|
|
// drag formats cached.
|
2015-09-02 09:08:01 +03:00
|
|
|
transfer = new DataTransfer(nullptr, eDrop, true, -1);
|
2015-04-08 21:48:11 +03:00
|
|
|
session->SetDataTransfer(transfer);
|
|
|
|
}
|
|
|
|
// Note, even though this fills the DataTransfer object with
|
|
|
|
// external data, the data is usually transfered over IPC lazily when
|
|
|
|
// needed.
|
|
|
|
transfer->FillAllExternalData();
|
|
|
|
nsCOMPtr<nsILoadContext> lc = aParent ?
|
|
|
|
aParent->GetLoadContext() : nullptr;
|
2016-10-18 21:56:20 +03:00
|
|
|
nsCOMPtr<nsIArray> transferables =
|
2015-04-08 21:48:11 +03:00
|
|
|
transfer->GetTransferables(lc);
|
|
|
|
nsContentUtils::TransferablesToIPCTransferables(transferables,
|
|
|
|
dataTransfers,
|
2015-10-28 00:41:58 +03:00
|
|
|
false,
|
2015-04-08 21:48:11 +03:00
|
|
|
nullptr,
|
|
|
|
this);
|
|
|
|
uint32_t action;
|
|
|
|
session->GetDragAction(&action);
|
2015-11-02 08:53:26 +03:00
|
|
|
mozilla::Unused << SendInvokeDragSession(dataTransfers, action);
|
2015-04-08 21:48:11 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2015-04-08 21:48:11 +03:00
|
|
|
ContentParent::RecvUpdateDropEffect(const uint32_t& aDragAction,
|
|
|
|
const uint32_t& aDropEffect)
|
|
|
|
{
|
|
|
|
nsCOMPtr<nsIDragSession> dragSession = nsContentUtils::GetDragSession();
|
|
|
|
if (dragSession) {
|
|
|
|
dragSession->SetDragAction(aDragAction);
|
|
|
|
nsCOMPtr<nsIDOMDataTransfer> dt;
|
|
|
|
dragSession->GetDataTransfer(getter_AddRefs(dt));
|
|
|
|
if (dt) {
|
|
|
|
dt->SetDropEffectInt(aDropEffect);
|
|
|
|
}
|
|
|
|
dragSession->UpdateDragEffect();
|
|
|
|
}
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2015-04-08 21:48:11 +03:00
|
|
|
}
|
|
|
|
|
2015-04-14 04:08:00 +03:00
|
|
|
PContentPermissionRequestParent*
|
|
|
|
ContentParent::AllocPContentPermissionRequestParent(const InfallibleTArray<PermissionRequest>& aRequests,
|
|
|
|
const IPC::Principal& aPrincipal,
|
|
|
|
const TabId& aTabId)
|
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
ContentProcessManager* cpm = ContentProcessManager::GetSingleton();
|
|
|
|
RefPtr<TabParent> tp =
|
|
|
|
cpm->GetTopLevelTabParentByProcessAndTabId(this->ChildID(), aTabId);
|
|
|
|
if (!tp) {
|
|
|
|
return nullptr;
|
|
|
|
}
|
2015-04-14 04:08:00 +03:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
return nsContentPermissionUtils::CreateContentPermissionRequestParent(aRequests,
|
|
|
|
tp->GetOwnerElement(),
|
|
|
|
aPrincipal,
|
|
|
|
aTabId);
|
2015-04-14 04:08:00 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
ContentParent::DeallocPContentPermissionRequestParent(PContentPermissionRequestParent* actor)
|
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
nsContentPermissionUtils::NotifyRemoveContentPermissionRequestParent(actor);
|
|
|
|
delete actor;
|
|
|
|
return true;
|
2015-04-14 04:08:00 +03:00
|
|
|
}
|
|
|
|
|
2015-09-21 15:54:00 +03:00
|
|
|
PWebBrowserPersistDocumentParent*
|
|
|
|
ContentParent::AllocPWebBrowserPersistDocumentParent(PBrowserParent* aBrowser,
|
|
|
|
const uint64_t& aOuterWindowID)
|
|
|
|
{
|
|
|
|
return new WebBrowserPersistDocumentParent();
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
ContentParent::DeallocPWebBrowserPersistDocumentParent(PWebBrowserPersistDocumentParent* aActor)
|
|
|
|
{
|
|
|
|
delete aActor;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2016-11-24 18:08:31 +03:00
|
|
|
ContentParent::CommonCreateWindow(PBrowserParent* aThisTab,
|
|
|
|
bool aSetOpener,
|
|
|
|
const uint32_t& aChromeFlags,
|
|
|
|
const bool& aCalledFromJS,
|
|
|
|
const bool& aPositionSpecified,
|
|
|
|
const bool& aSizeSpecified,
|
|
|
|
nsIURI* aURIToLoad,
|
|
|
|
const nsCString& aFeatures,
|
|
|
|
const nsCString& aBaseURI,
|
2017-01-12 19:38:48 +03:00
|
|
|
const OriginAttributes& aOpenerOriginAttributes,
|
2016-11-24 18:08:31 +03:00
|
|
|
const float& aFullZoom,
|
|
|
|
nsresult& aResult,
|
|
|
|
nsCOMPtr<nsITabParent>& aNewTabParent,
|
|
|
|
bool* aWindowIsNew)
|
2016-11-23 20:32:50 +03:00
|
|
|
|
2016-11-24 18:08:31 +03:00
|
|
|
{
|
2016-01-05 12:59:30 +03:00
|
|
|
// The content process should never be in charge of computing whether or
|
|
|
|
// not a window should be private or remote - the parent will do that.
|
2016-11-24 18:08:31 +03:00
|
|
|
const uint32_t badFlags = nsIWebBrowserChrome::CHROME_PRIVATE_WINDOW |
|
|
|
|
nsIWebBrowserChrome::CHROME_NON_PRIVATE_WINDOW |
|
|
|
|
nsIWebBrowserChrome::CHROME_PRIVATE_LIFETIME |
|
|
|
|
nsIWebBrowserChrome::CHROME_REMOTE_WINDOW;
|
2016-01-08 23:40:26 +03:00
|
|
|
if (!!(aChromeFlags & badFlags)) {
|
2016-11-24 18:08:31 +03:00
|
|
|
return IPC_FAIL(this, "Forbidden aChromeFlags passed");
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
2015-10-30 02:30:57 +03:00
|
|
|
|
2016-11-24 18:08:31 +03:00
|
|
|
TabParent* thisTabParent = TabParent::GetFrom(aThisTab);
|
2016-01-05 12:59:30 +03:00
|
|
|
nsCOMPtr<nsIContent> frame;
|
|
|
|
if (thisTabParent) {
|
|
|
|
frame = do_QueryInterface(thisTabParent->GetOwnerElement());
|
2016-11-24 18:08:31 +03:00
|
|
|
|
|
|
|
if (NS_WARN_IF(thisTabParent->IsMozBrowser())) {
|
|
|
|
return IPC_FAIL(this, "aThisTab is not a MozBrowser");
|
|
|
|
}
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
2015-10-30 02:30:57 +03:00
|
|
|
|
2016-11-24 18:08:31 +03:00
|
|
|
nsCOMPtr<nsPIDOMWindowOuter> outerWin;
|
2016-01-05 12:59:30 +03:00
|
|
|
if (frame) {
|
2016-11-24 18:08:31 +03:00
|
|
|
outerWin = frame->OwnerDoc()->GetWindow();
|
2015-10-30 02:30:57 +03:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
// If our chrome window is in the process of closing, don't try to open a
|
|
|
|
// new tab in it.
|
2016-11-24 18:08:31 +03:00
|
|
|
if (outerWin && outerWin->Closed()) {
|
|
|
|
outerWin = nullptr;
|
2015-10-30 02:30:57 +03:00
|
|
|
}
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
2015-10-30 02:30:57 +03:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
nsCOMPtr<nsIBrowserDOMWindow> browserDOMWin;
|
|
|
|
if (thisTabParent) {
|
|
|
|
browserDOMWin = thisTabParent->GetBrowserDOMWindow();
|
|
|
|
}
|
2015-10-30 02:30:57 +03:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
// If we haven't found a chrome window to open in, just use the most recently
|
|
|
|
// opened one.
|
2016-11-24 18:08:31 +03:00
|
|
|
if (!outerWin) {
|
|
|
|
outerWin = nsContentUtils::GetMostRecentNonPBWindow();
|
|
|
|
if (NS_WARN_IF(!outerWin)) {
|
|
|
|
aResult = NS_ERROR_FAILURE;
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2015-10-30 02:30:57 +03:00
|
|
|
}
|
|
|
|
|
2016-11-24 18:08:31 +03:00
|
|
|
nsCOMPtr<nsIDOMChromeWindow> rootChromeWin = do_QueryInterface(outerWin);
|
2016-01-05 12:59:30 +03:00
|
|
|
if (rootChromeWin) {
|
|
|
|
rootChromeWin->GetBrowserDOMWindow(getter_AddRefs(browserDOMWin));
|
|
|
|
}
|
|
|
|
}
|
2015-10-30 02:30:57 +03:00
|
|
|
|
2016-11-24 18:08:31 +03:00
|
|
|
int32_t openLocation = nsWindowWatcher::GetWindowOpenLocation(
|
|
|
|
outerWin, aChromeFlags, aCalledFromJS, aPositionSpecified, aSizeSpecified);
|
2015-10-30 02:30:57 +03:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
MOZ_ASSERT(openLocation == nsIBrowserDOMWindow::OPEN_NEWTAB ||
|
|
|
|
openLocation == nsIBrowserDOMWindow::OPEN_NEWWINDOW);
|
2015-10-30 02:30:57 +03:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
if (openLocation == nsIBrowserDOMWindow::OPEN_NEWTAB) {
|
|
|
|
if (NS_WARN_IF(!browserDOMWin)) {
|
2016-11-24 18:08:31 +03:00
|
|
|
aResult = NS_ERROR_ABORT;
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
2015-10-30 02:30:57 +03:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
bool isPrivate = false;
|
|
|
|
if (thisTabParent) {
|
|
|
|
nsCOMPtr<nsILoadContext> loadContext = thisTabParent->GetLoadContext();
|
|
|
|
loadContext->GetUsePrivateBrowsing(&isPrivate);
|
|
|
|
}
|
2015-10-30 02:30:57 +03:00
|
|
|
|
2016-02-18 11:33:07 +03:00
|
|
|
nsCOMPtr<nsIOpenURIInFrameParams> params =
|
|
|
|
new nsOpenURIInFrameParams(aOpenerOriginAttributes);
|
2016-01-05 12:59:30 +03:00
|
|
|
params->SetReferrer(NS_ConvertUTF8toUTF16(aBaseURI));
|
|
|
|
params->SetIsPrivate(isPrivate);
|
2015-10-30 02:30:57 +03:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
nsCOMPtr<nsIFrameLoaderOwner> frameLoaderOwner;
|
2016-11-24 18:08:31 +03:00
|
|
|
aResult = browserDOMWin->OpenURIInFrame(aURIToLoad, params, openLocation,
|
|
|
|
nsIBrowserDOMWindow::OPEN_NEW,
|
|
|
|
getter_AddRefs(frameLoaderOwner));
|
|
|
|
if (NS_SUCCEEDED(aResult) && frameLoaderOwner) {
|
|
|
|
RefPtr<nsFrameLoader> frameLoader = frameLoaderOwner->GetFrameLoader();
|
|
|
|
if (frameLoader) {
|
|
|
|
frameLoader->GetTabParent(getter_AddRefs(aNewTabParent));
|
|
|
|
}
|
|
|
|
} else {
|
2016-01-05 12:59:30 +03:00
|
|
|
*aWindowIsNew = false;
|
2015-10-30 02:30:57 +03:00
|
|
|
}
|
|
|
|
|
2016-11-23 20:32:50 +03:00
|
|
|
return IPC_OK();
|
2016-11-23 16:36:58 +03:00
|
|
|
}
|
|
|
|
|
2016-11-23 20:32:50 +03:00
|
|
|
nsCOMPtr<nsPIWindowWatcher> pwwatch =
|
2016-11-24 18:08:31 +03:00
|
|
|
do_GetService(NS_WINDOWWATCHER_CONTRACTID, &aResult);
|
|
|
|
if (NS_WARN_IF(NS_FAILED(aResult))) {
|
2016-11-23 20:32:50 +03:00
|
|
|
return IPC_OK();
|
|
|
|
}
|
2016-11-23 16:36:58 +03:00
|
|
|
|
2016-11-24 18:08:31 +03:00
|
|
|
if (aSetOpener && thisTabParent) {
|
|
|
|
aResult = pwwatch->OpenWindowWithTabParent(thisTabParent, aFeatures,
|
|
|
|
aCalledFromJS, aFullZoom,
|
|
|
|
getter_AddRefs(aNewTabParent));
|
2016-11-23 20:32:50 +03:00
|
|
|
} else {
|
2016-11-24 18:08:31 +03:00
|
|
|
aResult = pwwatch->OpenWindowWithoutParent(getter_AddRefs(aNewTabParent));
|
|
|
|
}
|
|
|
|
|
|
|
|
return IPC_OK();
|
|
|
|
}
|
|
|
|
|
|
|
|
mozilla::ipc::IPCResult
|
|
|
|
ContentParent::RecvCreateWindow(PBrowserParent* aThisTab,
|
|
|
|
PBrowserParent* aNewTab,
|
|
|
|
PRenderFrameParent* aRenderFrame,
|
|
|
|
const uint32_t& aChromeFlags,
|
|
|
|
const bool& aCalledFromJS,
|
|
|
|
const bool& aPositionSpecified,
|
|
|
|
const bool& aSizeSpecified,
|
|
|
|
const nsCString& aFeatures,
|
|
|
|
const nsCString& aBaseURI,
|
2017-01-12 19:38:48 +03:00
|
|
|
const OriginAttributes& aOpenerOriginAttributes,
|
2016-11-24 18:08:31 +03:00
|
|
|
const float& aFullZoom,
|
|
|
|
nsresult* aResult,
|
|
|
|
bool* aWindowIsNew,
|
|
|
|
InfallibleTArray<FrameScriptInfo>* aFrameScripts,
|
|
|
|
nsCString* aURLToLoad,
|
|
|
|
TextureFactoryIdentifier* aTextureFactoryIdentifier,
|
|
|
|
uint64_t* aLayersId)
|
|
|
|
{
|
|
|
|
// We always expect to open a new window here. If we don't, it's an error.
|
|
|
|
*aWindowIsNew = true;
|
|
|
|
*aResult = NS_OK;
|
|
|
|
|
|
|
|
TabParent* newTab = TabParent::GetFrom(aNewTab);
|
|
|
|
MOZ_ASSERT(newTab);
|
|
|
|
|
|
|
|
auto destroyNewTabOnError = MakeScopeExit([&] {
|
|
|
|
if (!*aWindowIsNew || NS_FAILED(*aResult)) {
|
|
|
|
if (newTab) {
|
|
|
|
newTab->Destroy();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
// Content has requested that we open this new content window, so
|
|
|
|
// we must have an opener.
|
|
|
|
newTab->SetHasContentOpener(true);
|
|
|
|
|
|
|
|
TabParent::AutoUseNewTab aunt(newTab, aWindowIsNew, aURLToLoad);
|
|
|
|
|
|
|
|
nsCOMPtr<nsITabParent> newRemoteTab;
|
|
|
|
mozilla::ipc::IPCResult ipcResult =
|
|
|
|
CommonCreateWindow(aThisTab, /* aSetOpener = */ true, aChromeFlags,
|
|
|
|
aCalledFromJS, aPositionSpecified, aSizeSpecified,
|
|
|
|
nullptr, aFeatures, aBaseURI, aOpenerOriginAttributes,
|
|
|
|
aFullZoom, *aResult, newRemoteTab, aWindowIsNew);
|
|
|
|
if (!ipcResult) {
|
|
|
|
return ipcResult;
|
2016-07-05 19:00:07 +03:00
|
|
|
}
|
2016-07-19 10:12:58 +03:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
if (NS_WARN_IF(NS_FAILED(*aResult))) {
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
MOZ_ASSERT(TabParent::GetFrom(newRemoteTab) == newTab);
|
|
|
|
|
|
|
|
newTab->SwapFrameScriptsFrom(*aFrameScripts);
|
2016-03-29 21:32:41 +03:00
|
|
|
|
|
|
|
RenderFrameParent* rfp = static_cast<RenderFrameParent*>(aRenderFrame);
|
|
|
|
if (!newTab->SetRenderFrame(rfp) ||
|
|
|
|
!newTab->GetRenderFrameInfo(aTextureFactoryIdentifier, aLayersId)) {
|
|
|
|
*aResult = NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2015-10-30 02:30:57 +03:00
|
|
|
}
|
|
|
|
|
2016-11-24 18:08:31 +03:00
|
|
|
mozilla::ipc::IPCResult
|
|
|
|
ContentParent::RecvCreateWindowInDifferentProcess(
|
|
|
|
PBrowserParent* aThisTab,
|
|
|
|
const uint32_t& aChromeFlags,
|
|
|
|
const bool& aCalledFromJS,
|
|
|
|
const bool& aPositionSpecified,
|
|
|
|
const bool& aSizeSpecified,
|
|
|
|
const URIParams& aURIToLoad,
|
|
|
|
const nsCString& aFeatures,
|
|
|
|
const nsCString& aBaseURI,
|
2017-01-12 19:38:48 +03:00
|
|
|
const OriginAttributes& aOpenerOriginAttributes,
|
2016-11-24 18:08:31 +03:00
|
|
|
const float& aFullZoom)
|
|
|
|
{
|
|
|
|
nsCOMPtr<nsITabParent> newRemoteTab;
|
|
|
|
bool windowIsNew;
|
|
|
|
nsCOMPtr<nsIURI> uriToLoad = DeserializeURI(aURIToLoad);
|
|
|
|
nsresult rv;
|
|
|
|
mozilla::ipc::IPCResult ipcResult =
|
|
|
|
CommonCreateWindow(aThisTab, /* aSetOpener = */ false, aChromeFlags,
|
|
|
|
aCalledFromJS, aPositionSpecified, aSizeSpecified,
|
|
|
|
uriToLoad, aFeatures, aBaseURI, aOpenerOriginAttributes,
|
|
|
|
aFullZoom, rv, newRemoteTab, &windowIsNew);
|
|
|
|
if (!ipcResult) {
|
|
|
|
return ipcResult;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (NS_FAILED(rv)) {
|
|
|
|
NS_WARNING("Call to CommonCreateWindow failed.");
|
|
|
|
}
|
|
|
|
|
|
|
|
return IPC_OK();
|
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2015-06-11 00:58:30 +03:00
|
|
|
ContentParent::RecvProfile(const nsCString& aProfile)
|
|
|
|
{
|
2017-01-24 06:15:12 +03:00
|
|
|
#ifdef MOZ_GECKO_PROFILER
|
2016-01-05 12:59:30 +03:00
|
|
|
if (NS_WARN_IF(!mGatherer)) {
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2016-01-05 12:59:30 +03:00
|
|
|
}
|
|
|
|
mProfile = aProfile;
|
|
|
|
mGatherer->GatheredOOPProfile();
|
|
|
|
#endif
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2015-06-11 00:58:30 +03:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2016-08-21 06:59:11 +03:00
|
|
|
ContentParent::RecvGetGraphicsDeviceInitData(ContentDeviceData* aOut)
|
2015-08-02 23:59:33 +03:00
|
|
|
{
|
2016-08-21 06:59:11 +03:00
|
|
|
gfxPlatform::GetPlatform()->BuildContentDeviceData(aOut);
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2015-08-02 23:59:33 +03:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2016-02-17 02:07:37 +03:00
|
|
|
ContentParent::RecvGraphicsError(const nsCString& aError)
|
|
|
|
{
|
|
|
|
gfx::LogForwarder* lf = gfx::Factory::GetLogForwarder();
|
|
|
|
if (lf) {
|
|
|
|
std::stringstream message;
|
|
|
|
message << "CP+" << aError.get();
|
|
|
|
lf->UpdateStringsVector(message.str());
|
|
|
|
}
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2016-02-17 02:07:37 +03:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2015-08-12 06:22:20 +03:00
|
|
|
ContentParent::RecvBeginDriverCrashGuard(const uint32_t& aGuardType, bool* aOutCrashed)
|
|
|
|
{
|
|
|
|
// Only one driver crash guard should be active at a time, per-process.
|
|
|
|
MOZ_ASSERT(!mDriverCrashGuard);
|
|
|
|
|
|
|
|
UniquePtr<gfx::DriverCrashGuard> guard;
|
|
|
|
switch (gfx::CrashGuardType(aGuardType)) {
|
2016-01-05 12:59:30 +03:00
|
|
|
case gfx::CrashGuardType::D3D11Layers:
|
|
|
|
guard = MakeUnique<gfx::D3D11LayersCrashGuard>(this);
|
|
|
|
break;
|
|
|
|
case gfx::CrashGuardType::D3D9Video:
|
|
|
|
guard = MakeUnique<gfx::D3D9VideoCrashGuard>(this);
|
|
|
|
break;
|
|
|
|
case gfx::CrashGuardType::GLContext:
|
|
|
|
guard = MakeUnique<gfx::GLContextCrashGuard>(this);
|
|
|
|
break;
|
2016-04-14 07:15:31 +03:00
|
|
|
case gfx::CrashGuardType::D3D11Video:
|
|
|
|
guard = MakeUnique<gfx::D3D11VideoCrashGuard>(this);
|
|
|
|
break;
|
2016-01-05 12:59:30 +03:00
|
|
|
default:
|
|
|
|
MOZ_ASSERT_UNREACHABLE("unknown crash guard type");
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_FAIL_NO_REASON(this);
|
2015-08-12 06:22:20 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
if (guard->Crashed()) {
|
2016-04-14 07:15:31 +03:00
|
|
|
*aOutCrashed = true;
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2015-08-12 06:22:20 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
*aOutCrashed = false;
|
|
|
|
mDriverCrashGuard = Move(guard);
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2015-08-12 06:22:20 +03:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2015-08-12 06:22:20 +03:00
|
|
|
ContentParent::RecvEndDriverCrashGuard(const uint32_t& aGuardType)
|
|
|
|
{
|
|
|
|
mDriverCrashGuard = nullptr;
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2015-08-12 06:22:20 +03:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2015-09-15 21:01:07 +03:00
|
|
|
ContentParent::RecvGetDeviceStorageLocation(const nsString& aType,
|
2016-01-05 12:59:30 +03:00
|
|
|
nsString* aPath)
|
|
|
|
{
|
2015-09-15 21:01:07 +03:00
|
|
|
#ifdef MOZ_WIDGET_ANDROID
|
|
|
|
mozilla::AndroidBridge::GetExternalPublicDirectory(aType, *aPath);
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2015-09-15 21:01:07 +03:00
|
|
|
#else
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_FAIL_NO_REASON(this);
|
2015-09-15 21:01:07 +03:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2015-12-19 04:17:46 +03:00
|
|
|
ContentParent::RecvGetDeviceStorageLocations(DeviceStorageLocationInfo* info)
|
|
|
|
{
|
|
|
|
DeviceStorageStatics::GetDeviceStorageLocationsForIPC(info);
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2015-12-19 04:17:46 +03:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2015-11-04 22:08:14 +03:00
|
|
|
ContentParent::RecvGetAndroidSystemInfo(AndroidSystemInfo* aInfo)
|
|
|
|
{
|
|
|
|
#ifdef MOZ_WIDGET_ANDROID
|
|
|
|
nsSystemInfo::GetAndroidSystemInfo(aInfo);
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2015-11-04 22:08:14 +03:00
|
|
|
#else
|
|
|
|
MOZ_CRASH("wrong platform!");
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_FAIL_NO_REASON(this);
|
2015-11-04 22:08:14 +03:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2016-03-17 09:18:35 +03:00
|
|
|
ContentParent::RecvNotifyBenchmarkResult(const nsString& aCodecName,
|
|
|
|
const uint32_t& aDecodeFPS)
|
|
|
|
|
|
|
|
{
|
|
|
|
if (aCodecName.EqualsLiteral("VP9")) {
|
|
|
|
Preferences::SetUint(VP9Benchmark::sBenchmarkFpsPref, aDecodeFPS);
|
2016-04-13 05:44:29 +03:00
|
|
|
Preferences::SetUint(VP9Benchmark::sBenchmarkFpsVersionCheck,
|
|
|
|
VP9Benchmark::sBenchmarkVersionID);
|
2016-03-17 09:18:35 +03:00
|
|
|
}
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2016-03-17 09:18:35 +03:00
|
|
|
}
|
|
|
|
|
2015-08-11 21:26:27 +03:00
|
|
|
void
|
|
|
|
ContentParent::StartProfiler(nsIProfilerStartParams* aParams)
|
|
|
|
{
|
2017-01-24 06:15:12 +03:00
|
|
|
#ifdef MOZ_GECKO_PROFILER
|
2016-01-05 12:59:30 +03:00
|
|
|
if (NS_WARN_IF(!aParams)) {
|
|
|
|
return;
|
|
|
|
}
|
2015-08-11 21:26:27 +03:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
ProfilerInitParams ipcParams;
|
2015-08-11 21:26:27 +03:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
ipcParams.enabled() = true;
|
|
|
|
aParams->GetEntries(&ipcParams.entries());
|
|
|
|
aParams->GetInterval(&ipcParams.interval());
|
|
|
|
ipcParams.features() = aParams->GetFeatures();
|
|
|
|
ipcParams.threadFilters() = aParams->GetThreadFilterNames();
|
2015-08-11 21:26:27 +03:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
Unused << SendStartProfiler(ipcParams);
|
2015-08-12 21:20:26 +03:00
|
|
|
|
2016-01-05 12:59:30 +03:00
|
|
|
nsCOMPtr<nsIProfiler> profiler(do_GetService("@mozilla.org/tools/profiler;1"));
|
|
|
|
if (NS_WARN_IF(!profiler)) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
nsCOMPtr<nsISupports> gatherer;
|
|
|
|
profiler->GetProfileGatherer(getter_AddRefs(gatherer));
|
|
|
|
mGatherer = static_cast<ProfileGatherer*>(gatherer.get());
|
2015-11-27 19:00:18 +03:00
|
|
|
#endif
|
2015-08-11 21:26:27 +03:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2016-04-21 21:11:03 +03:00
|
|
|
ContentParent::RecvNotifyPushObservers(const nsCString& aScope,
|
2016-05-02 19:38:47 +03:00
|
|
|
const IPC::Principal& aPrincipal,
|
2016-04-21 21:11:03 +03:00
|
|
|
const nsString& aMessageId)
|
|
|
|
{
|
2016-05-20 05:01:34 +03:00
|
|
|
PushMessageDispatcher dispatcher(aScope, aPrincipal, aMessageId, Nothing());
|
|
|
|
Unused << NS_WARN_IF(NS_FAILED(dispatcher.NotifyObservers()));
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2016-04-21 21:11:03 +03:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2016-04-21 21:11:03 +03:00
|
|
|
ContentParent::RecvNotifyPushObserversWithData(const nsCString& aScope,
|
2016-05-02 19:38:47 +03:00
|
|
|
const IPC::Principal& aPrincipal,
|
2016-04-21 21:11:03 +03:00
|
|
|
const nsString& aMessageId,
|
|
|
|
InfallibleTArray<uint8_t>&& aData)
|
|
|
|
{
|
2016-05-20 05:01:34 +03:00
|
|
|
PushMessageDispatcher dispatcher(aScope, aPrincipal, aMessageId, Some(aData));
|
|
|
|
Unused << NS_WARN_IF(NS_FAILED(dispatcher.NotifyObservers()));
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2016-04-21 21:11:03 +03:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2016-05-02 19:38:47 +03:00
|
|
|
ContentParent::RecvNotifyPushSubscriptionChangeObservers(const nsCString& aScope,
|
|
|
|
const IPC::Principal& aPrincipal)
|
2016-04-21 21:11:03 +03:00
|
|
|
{
|
2016-05-20 05:01:34 +03:00
|
|
|
PushSubscriptionChangeDispatcher dispatcher(aScope, aPrincipal);
|
|
|
|
Unused << NS_WARN_IF(NS_FAILED(dispatcher.NotifyObservers()));
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2016-04-21 21:11:03 +03:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2016-05-02 18:20:14 +03:00
|
|
|
ContentParent::RecvNotifyPushSubscriptionModifiedObservers(const nsCString& aScope,
|
|
|
|
const IPC::Principal& aPrincipal)
|
2016-04-21 22:04:15 +03:00
|
|
|
{
|
2016-05-20 05:01:34 +03:00
|
|
|
PushSubscriptionModifiedDispatcher dispatcher(aScope, aPrincipal);
|
|
|
|
Unused << NS_WARN_IF(NS_FAILED(dispatcher.NotifyObservers()));
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2016-04-21 22:04:15 +03:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2016-06-21 21:45:25 +03:00
|
|
|
ContentParent::RecvNotifyLowMemory()
|
|
|
|
{
|
|
|
|
#ifdef MOZ_CRASHREPORTER
|
|
|
|
nsThread::SaveMemoryReportNearOOM(nsThread::ShouldSaveMemoryReport::kForceReport);
|
|
|
|
#endif
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2016-06-21 21:45:25 +03:00
|
|
|
}
|
|
|
|
|
2016-07-17 17:50:50 +03:00
|
|
|
/* static */ void
|
|
|
|
ContentParent::BroadcastBlobURLRegistration(const nsACString& aURI,
|
|
|
|
BlobImpl* aBlobImpl,
|
|
|
|
nsIPrincipal* aPrincipal,
|
|
|
|
ContentParent* aIgnoreThisCP)
|
|
|
|
{
|
|
|
|
nsCString uri(aURI);
|
|
|
|
IPC::Principal principal(aPrincipal);
|
|
|
|
|
|
|
|
for (auto* cp : AllProcesses(eLive)) {
|
|
|
|
if (cp != aIgnoreThisCP) {
|
|
|
|
PBlobParent* blobParent = cp->GetOrCreateActorForBlobImpl(aBlobImpl);
|
|
|
|
if (blobParent) {
|
|
|
|
Unused << cp->SendBlobURLRegistration(uri, blobParent, principal);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* static */ void
|
|
|
|
ContentParent::BroadcastBlobURLUnregistration(const nsACString& aURI,
|
|
|
|
ContentParent* aIgnoreThisCP)
|
|
|
|
{
|
|
|
|
nsCString uri(aURI);
|
|
|
|
|
|
|
|
for (auto* cp : AllProcesses(eLive)) {
|
|
|
|
if (cp != aIgnoreThisCP) {
|
|
|
|
Unused << cp->SendBlobURLUnregistration(uri);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2016-07-17 17:50:50 +03:00
|
|
|
ContentParent::RecvStoreAndBroadcastBlobURLRegistration(const nsCString& aURI,
|
|
|
|
PBlobParent* aBlobParent,
|
|
|
|
const Principal& aPrincipal)
|
|
|
|
{
|
|
|
|
RefPtr<BlobImpl> blobImpl =
|
|
|
|
static_cast<BlobParent*>(aBlobParent)->GetBlobImpl();
|
|
|
|
if (NS_WARN_IF(!blobImpl)) {
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_FAIL_NO_REASON(this);
|
2016-07-17 17:50:50 +03:00
|
|
|
}
|
|
|
|
|
2016-07-21 15:31:43 +03:00
|
|
|
if (NS_SUCCEEDED(nsHostObjectProtocolHandler::AddDataEntry(aURI, aPrincipal,
|
|
|
|
blobImpl))) {
|
2016-07-18 12:12:18 +03:00
|
|
|
BroadcastBlobURLRegistration(aURI, blobImpl, aPrincipal, this);
|
|
|
|
|
|
|
|
// We want to store this blobURL, so we can unregister it if the child
|
|
|
|
// crashes.
|
|
|
|
mBlobURLs.AppendElement(aURI);
|
|
|
|
}
|
|
|
|
|
2016-07-17 17:50:50 +03:00
|
|
|
BroadcastBlobURLRegistration(aURI, blobImpl, aPrincipal, this);
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2016-07-17 17:50:50 +03:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2016-07-17 17:50:50 +03:00
|
|
|
ContentParent::RecvUnstoreAndBroadcastBlobURLUnregistration(const nsCString& aURI)
|
|
|
|
{
|
|
|
|
nsHostObjectProtocolHandler::RemoveDataEntry(aURI,
|
|
|
|
false /* Don't broadcast */);
|
|
|
|
BroadcastBlobURLUnregistration(aURI, this);
|
2016-07-18 12:12:18 +03:00
|
|
|
mBlobURLs.RemoveElement(aURI);
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2016-07-17 17:50:50 +03:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2016-10-27 21:40:50 +03:00
|
|
|
ContentParent::RecvGetA11yContentId(uint32_t* aContentId)
|
|
|
|
{
|
|
|
|
#if defined(XP_WIN32) && defined(ACCESSIBILITY)
|
|
|
|
*aContentId = a11y::AccessibleWrap::GetContentProcessIdFor(ChildID());
|
|
|
|
MOZ_ASSERT(*aContentId);
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2016-10-27 21:40:50 +03:00
|
|
|
#else
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_FAIL_NO_REASON(this);
|
2016-10-27 21:40:50 +03:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2009-08-12 20:18:08 +04:00
|
|
|
} // namespace dom
|
2013-02-15 00:41:30 +04:00
|
|
|
} // namespace mozilla
|
2013-12-13 20:28:46 +04:00
|
|
|
|
2014-04-27 11:06:00 +04:00
|
|
|
NS_IMPL_ISUPPORTS(ParentIdleListener, nsIObserver)
|
2013-12-13 20:28:46 +04:00
|
|
|
|
|
|
|
NS_IMETHODIMP
|
2016-01-05 12:59:30 +03:00
|
|
|
ParentIdleListener::Observe(nsISupports*, const char* aTopic, const char16_t* aData)
|
|
|
|
{
|
|
|
|
mozilla::Unused << mParent->SendNotifyIdleObserver(mObserver,
|
|
|
|
nsDependentCString(aTopic),
|
|
|
|
nsDependentString(aData));
|
|
|
|
return NS_OK;
|
2013-12-13 20:28:46 +04:00
|
|
|
}
|
2015-10-08 00:38:08 +03:00
|
|
|
|
|
|
|
bool
|
|
|
|
ContentParent::HandleWindowsMessages(const Message& aMsg) const
|
|
|
|
{
|
|
|
|
MOZ_ASSERT(aMsg.is_sync());
|
|
|
|
|
|
|
|
// a11y messages can be triggered by windows messages, which means if we
|
|
|
|
// allow handling windows messages while we wait for the response to a sync
|
|
|
|
// a11y message we can reenter the ipc message sending code.
|
|
|
|
if (a11y::PDocAccessible::PDocAccessibleStart < aMsg.type() &&
|
|
|
|
a11y::PDocAccessible::PDocAccessibleEnd > aMsg.type()) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
2016-07-14 10:04:21 +03:00
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2016-07-14 10:04:21 +03:00
|
|
|
ContentParent::RecvGetFilesRequest(const nsID& aUUID,
|
|
|
|
const nsString& aDirectoryPath,
|
|
|
|
const bool& aRecursiveFlag)
|
|
|
|
{
|
|
|
|
MOZ_ASSERT(!mGetFilesPendingRequests.GetWeak(aUUID));
|
|
|
|
|
|
|
|
ErrorResult rv;
|
|
|
|
RefPtr<GetFilesHelper> helper =
|
|
|
|
GetFilesHelperParent::Create(aUUID, aDirectoryPath, aRecursiveFlag, this,
|
|
|
|
rv);
|
|
|
|
|
|
|
|
if (NS_WARN_IF(rv.Failed())) {
|
2016-11-15 06:26:00 +03:00
|
|
|
if (!SendGetFilesResponse(aUUID,
|
|
|
|
GetFilesResponseFailure(rv.StealNSResult()))) {
|
|
|
|
return IPC_FAIL_NO_REASON(this);
|
|
|
|
}
|
|
|
|
return IPC_OK();
|
2016-07-14 10:04:21 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
mGetFilesPendingRequests.Put(aUUID, helper);
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2016-07-14 10:04:21 +03:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2016-07-14 10:04:21 +03:00
|
|
|
ContentParent::RecvDeleteGetFilesRequest(const nsID& aUUID)
|
|
|
|
{
|
|
|
|
GetFilesHelper* helper = mGetFilesPendingRequests.GetWeak(aUUID);
|
|
|
|
if (helper) {
|
|
|
|
mGetFilesPendingRequests.Remove(aUUID);
|
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2016-07-14 10:04:21 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
ContentParent::SendGetFilesResponseAndForget(const nsID& aUUID,
|
|
|
|
const GetFilesResponseResult& aResult)
|
|
|
|
{
|
|
|
|
GetFilesHelper* helper = mGetFilesPendingRequests.GetWeak(aUUID);
|
|
|
|
if (helper) {
|
|
|
|
mGetFilesPendingRequests.Remove(aUUID);
|
|
|
|
Unused << SendGetFilesResponse(aUUID, aResult);
|
|
|
|
}
|
|
|
|
}
|
2016-07-23 02:36:45 +03:00
|
|
|
|
|
|
|
void
|
|
|
|
ContentParent::ForceTabPaint(TabParent* aTabParent, uint64_t aLayerObserverEpoch)
|
|
|
|
{
|
|
|
|
if (!mHangMonitorActor) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
ProcessHangMonitor::ForcePaint(mHangMonitorActor, aTabParent, aLayerObserverEpoch);
|
|
|
|
}
|
2016-06-22 17:16:40 +03:00
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2016-06-22 17:16:40 +03:00
|
|
|
ContentParent::RecvAccumulateChildHistogram(
|
|
|
|
InfallibleTArray<Accumulation>&& aAccumulations)
|
|
|
|
{
|
2016-10-31 08:35:57 +03:00
|
|
|
Telemetry::AccumulateChild(GeckoProcessType_Content, aAccumulations);
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2016-06-22 17:16:40 +03:00
|
|
|
}
|
|
|
|
|
2016-11-15 06:26:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
2016-06-22 17:16:40 +03:00
|
|
|
ContentParent::RecvAccumulateChildKeyedHistogram(
|
|
|
|
InfallibleTArray<KeyedAccumulation>&& aAccumulations)
|
|
|
|
{
|
2016-10-31 08:35:57 +03:00
|
|
|
Telemetry::AccumulateChildKeyed(GeckoProcessType_Content, aAccumulations);
|
2016-11-15 06:26:00 +03:00
|
|
|
return IPC_OK();
|
2016-06-22 17:16:40 +03:00
|
|
|
}
|
2016-11-19 00:54:57 +03:00
|
|
|
|
2017-01-16 07:12:00 +03:00
|
|
|
mozilla::ipc::IPCResult
|
|
|
|
ContentParent::RecvUpdateChildScalars(
|
|
|
|
InfallibleTArray<ScalarAction>&& aScalarActions)
|
|
|
|
{
|
|
|
|
Telemetry::UpdateChildScalars(GeckoProcessType_Content, aScalarActions);
|
|
|
|
return IPC_OK();
|
|
|
|
}
|
|
|
|
|
|
|
|
mozilla::ipc::IPCResult
|
|
|
|
ContentParent::RecvUpdateChildKeyedScalars(
|
|
|
|
InfallibleTArray<KeyedScalarAction>&& aScalarActions)
|
|
|
|
{
|
|
|
|
Telemetry::UpdateChildKeyedScalars(GeckoProcessType_Content, aScalarActions);
|
|
|
|
return IPC_OK();
|
|
|
|
}
|
|
|
|
|
2016-11-19 00:54:57 +03:00
|
|
|
PURLClassifierParent*
|
|
|
|
ContentParent::AllocPURLClassifierParent(const Principal& aPrincipal,
|
|
|
|
const bool& aUseTrackingProtection,
|
|
|
|
bool* aSuccess)
|
|
|
|
{
|
|
|
|
MOZ_ASSERT(NS_IsMainThread());
|
|
|
|
|
|
|
|
*aSuccess = true;
|
|
|
|
RefPtr<URLClassifierParent> actor = new URLClassifierParent();
|
|
|
|
return actor.forget().take();
|
|
|
|
}
|
|
|
|
|
|
|
|
mozilla::ipc::IPCResult
|
|
|
|
ContentParent::RecvPURLClassifierConstructor(PURLClassifierParent* aActor,
|
|
|
|
const Principal& aPrincipal,
|
|
|
|
const bool& aUseTrackingProtection,
|
|
|
|
bool* aSuccess)
|
|
|
|
{
|
|
|
|
MOZ_ASSERT(NS_IsMainThread());
|
|
|
|
MOZ_ASSERT(aActor);
|
2016-12-24 02:28:39 +03:00
|
|
|
*aSuccess = false;
|
2016-11-19 00:54:57 +03:00
|
|
|
|
|
|
|
auto* actor = static_cast<URLClassifierParent*>(aActor);
|
|
|
|
nsCOMPtr<nsIPrincipal> principal(aPrincipal);
|
|
|
|
if (!principal) {
|
2016-12-22 23:04:05 +03:00
|
|
|
actor->ClassificationFailed();
|
|
|
|
return IPC_OK();
|
2016-11-19 00:54:57 +03:00
|
|
|
}
|
|
|
|
return actor->StartClassify(principal, aUseTrackingProtection, aSuccess);
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
ContentParent::DeallocPURLClassifierParent(PURLClassifierParent* aActor)
|
|
|
|
{
|
|
|
|
MOZ_ASSERT(NS_IsMainThread());
|
|
|
|
MOZ_ASSERT(aActor);
|
|
|
|
|
|
|
|
RefPtr<URLClassifierParent> actor =
|
|
|
|
dont_AddRef(static_cast<URLClassifierParent*>(aActor));
|
|
|
|
return true;
|
|
|
|
}
|
2016-11-19 00:43:28 +03:00
|
|
|
|
|
|
|
mozilla::ipc::IPCResult
|
|
|
|
ContentParent::RecvClassifyLocal(const URIParams& aURI, const nsCString& aTables,
|
2016-11-30 21:57:48 +03:00
|
|
|
nsresult *aRv, nsTArray<nsCString>* aResults)
|
2016-11-19 00:43:28 +03:00
|
|
|
{
|
|
|
|
MOZ_ASSERT(aResults);
|
|
|
|
nsCOMPtr<nsIURI> uri = DeserializeURI(aURI);
|
|
|
|
if (!uri) {
|
|
|
|
return IPC_FAIL_NO_REASON(this);
|
|
|
|
}
|
|
|
|
nsCOMPtr<nsIURIClassifier> uriClassifier =
|
|
|
|
do_GetService(NS_URICLASSIFIERSERVICE_CONTRACTID);
|
|
|
|
if (!uriClassifier) {
|
|
|
|
return IPC_FAIL_NO_REASON(this);
|
|
|
|
}
|
2016-11-30 21:57:48 +03:00
|
|
|
*aRv = uriClassifier->ClassifyLocalWithTables(uri, aTables, *aResults);
|
2016-11-19 00:43:28 +03:00
|
|
|
return IPC_OK();
|
|
|
|
}
|