--- a/dom/ipc/ContentChild.cpp
+++ b/dom/ipc/ContentChild.cpp
@@ -123,16 +123,17 @@
#include "nsThreadManager.h"
#include "nsAnonymousTemporaryFile.h"
#include "nsISpellChecker.h"
#include "nsClipboardProxy.h"
#include "nsDirectoryService.h"
#include "nsDirectoryServiceUtils.h"
#include "nsDirectoryServiceDefs.h"
#include "nsContentPermissionHelper.h"
+#include "nsPluginHost.h"
#ifdef NS_PRINTING
#include "nsPrintingProxy.h"
#endif
#include "IHistory.h"
#include "nsNetUtil.h"
#include "base/message_loop.h"
@@ -3369,10 +3370,20 @@ ContentChild::RecvRefreshScreens(nsTArra
}
already_AddRefed<nsIEventTarget>
ContentChild::GetEventTargetFor(TabChild* aTabChild)
{
return IToplevelProtocol::GetActorEventTarget(aTabChild);
}
+mozilla::ipc::IPCResult
+ContentChild::RecvSetPluginList(const uint32_t& aPluginEpoch,
+ nsTArray<plugins::PluginTag>&& aPluginTags,
+ nsTArray<plugins::FakePluginTag>&& aFakePluginTags)
+{
+ RefPtr<nsPluginHost> host = nsPluginHost::GetInst();
+ host->SetPluginsInContent(aPluginEpoch, aPluginTags, aFakePluginTags);
+ return IPC_OK();
+}
+
} // namespace dom
} // namespace mozilla
--- a/dom/ipc/ContentChild.h
+++ b/dom/ipc/ContentChild.h
@@ -656,16 +656,19 @@ public:
const Optional<int64_t>& aLastModified,
bool aExistenceCheck, bool aIsFromNsIFile);
typedef std::function<void(PRFileDesc*)> AnonymousTemporaryFileCallback;
nsresult AsyncOpenAnonymousTemporaryFile(const AnonymousTemporaryFileCallback& aCallback);
virtual already_AddRefed<nsIEventTarget> GetEventTargetFor(TabChild* aTabChild) override;
+ mozilla::ipc::IPCResult
+ RecvSetPluginList(const uint32_t& aPluginEpoch, nsTArray<PluginTag>&& aPluginTags, nsTArray<FakePluginTag>&& aFakePluginTags) override;
+
private:
static void ForceKillTimerCallback(nsITimer* aTimer, void* aClosure);
void StartForceKillTimer();
virtual void ActorDestroy(ActorDestroyReason why) override;
virtual void ProcessingError(Result aCode, const char* aReason) override;
--- a/dom/ipc/ContentParent.cpp
+++ b/dom/ipc/ContentParent.cpp
@@ -1157,27 +1157,16 @@ ContentParent::RecvGetBlocklistState(con
}
if (NS_FAILED(tag->GetBlocklistState(aState))) {
return IPC_FAIL_NO_REASON(this);
}
return IPC_OK();
}
-mozilla::ipc::IPCResult
-ContentParent::RecvFindPlugins(const uint32_t& aPluginEpoch,
- nsresult* aRv,
- nsTArray<PluginTag>* aPlugins,
- nsTArray<FakePluginTag>* aFakePlugins,
- uint32_t* aNewPluginEpoch)
-{
- *aRv = mozilla::plugins::FindPluginsForContent(aPluginEpoch, aPlugins, aFakePlugins, aNewPluginEpoch);
- return IPC_OK();
-}
-
/*static*/ TabParent*
ContentParent::CreateBrowser(const TabContext& aContext,
Element* aFrameElement,
ContentParent* aOpenerContentParent,
TabParent* aSameTabGroupAs,
uint64_t aNextTabParentId)
{
PROFILER_LABEL_FUNC(js::ProfileEntry::Category::OTHER);
@@ -2443,16 +2432,21 @@ ContentParent::InitInternal(ProcessPrior
{
nsTArray<BlobURLRegistrationData> registrations;
if (nsHostObjectProtocolHandler::GetAllBlobURLEntries(registrations,
this)) {
Unused << SendInitBlobURLs(registrations);
}
}
+
+ // Start up nsPluginHost and run FindPlugins to cache the plugin list.
+ // If this isn't our first content process, just send over cached list.
+ RefPtr<nsPluginHost> pluginHost = nsPluginHost::GetInst();
+ pluginHost->SendPluginsToContent();
}
bool
ContentParent::IsAlive() const
{
return mIsAlive;
}
@@ -5292,8 +5286,16 @@ ContentParent::CanCommunicateWith(Conten
if (!cpm->GetParentProcessId(ChildID(), &parentId)) {
return false;
}
if (IsForJSPlugin()) {
return parentId == ContentParentId(0);
}
return parentId == aOtherProcess;
}
+
+mozilla::ipc::IPCResult
+ContentParent::RecvMaybeReloadPlugins()
+{
+ RefPtr<nsPluginHost> pluginHost = nsPluginHost::GetInst();
+ pluginHost->ReloadPlugins();
+ return IPC_OK();
+}
--- a/dom/ipc/ContentParent.h
+++ b/dom/ipc/ContentParent.h
@@ -293,29 +293,25 @@ public:
Endpoint<PContentBridgeParent>* aEndpoint) override;
virtual mozilla::ipc::IPCResult RecvCreateGMPService() override;
virtual mozilla::ipc::IPCResult RecvLoadPlugin(const uint32_t& aPluginId, nsresult* aRv,
uint32_t* aRunID,
Endpoint<PPluginModuleParent>* aEndpoint) override;
+ virtual mozilla::ipc::IPCResult RecvMaybeReloadPlugins() override;
+
virtual mozilla::ipc::IPCResult RecvConnectPluginBridge(const uint32_t& aPluginId,
nsresult* aRv,
Endpoint<PPluginModuleParent>* aEndpoint) override;
virtual mozilla::ipc::IPCResult RecvGetBlocklistState(const uint32_t& aPluginId,
uint32_t* aIsBlocklisted) override;
- virtual mozilla::ipc::IPCResult RecvFindPlugins(const uint32_t& aPluginEpoch,
- nsresult* aRv,
- nsTArray<PluginTag>* aPlugins,
- nsTArray<FakePluginTag>* aFakePlugins,
- uint32_t* aNewPluginEpoch) override;
-
virtual mozilla::ipc::IPCResult RecvUngrabPointer(const uint32_t& aTime) override;
virtual mozilla::ipc::IPCResult RecvRemovePermission(const IPC::Principal& aPrincipal,
const nsCString& aPermissionType,
nsresult* aRv) override;
NS_DECL_CYCLE_COLLECTION_CLASS_AMBIGUOUS(ContentParent, nsIObserver)
--- a/dom/ipc/PContent.ipdl
+++ b/dom/ipc/PContent.ipdl
@@ -606,16 +606,27 @@ child:
async ProvideAnonymousTemporaryFile(uint64_t aID, FileDescOrError aFD);
async SetPermissionsWithKey(nsCString aPermissionKey, Permission[] aPermissions);
async RefreshScreens(ScreenDetails[] aScreens);
async PIPCBlobInputStream(nsID aID, uint64_t aSize);
+ /**
+ * This call takes the set of plugins loaded in the chrome process, and
+ * sends them to the content process. However, in many cases this set will
+ * not have changed since the last SetPluginList message. To keep track of
+ * this, the chrome process increments an epoch number every time the set of
+ * plugins changes. The chrome process sends up the last epoch it observed.
+ * If the epoch last seen by the content process is the same, the content
+ * process ignores the update. Otherwise the content process updates its
+ * list and reloads its plugins.
+ **/
+ async SetPluginList(uint32_t pluginEpoch, PluginTag[] plugins, FakePluginTag[] fakePlugins);
parent:
async InitBackground(Endpoint<PBackgroundParent> aEndpoint);
sync CreateChildProcess(IPCTabContext context,
ProcessPriority priority,
TabId openerTabId,
TabId tabId)
returns (ContentParentId cpId, bool isForBrowser);
@@ -641,30 +652,16 @@ parent:
sync ConnectPluginBridge(uint32_t aPluginId)
returns (nsresult rv, Endpoint<PPluginModuleParent> aEndpoint);
/**
* Return the current blocklist state for a particular plugin.
*/
sync GetBlocklistState(uint32_t aPluginId) returns (uint32_t aState);
- /**
- * This call returns the set of plugins loaded in the chrome
- * process. However, in many cases this set will not have changed since the
- * last FindPlugins message. Consequently, the chrome process increments an
- * epoch number every time the set of plugins changes. The content process
- * sends up the last epoch it observed. If the epochs are the same, the
- * chrome process returns no plugins. Otherwise it returns a complete list.
- *
- * |pluginEpoch| is the epoch last observed by the content
- * process. |newPluginEpoch| is the current epoch in the chrome process. If
- * |pluginEpoch == newPluginEpoch|, then |plugins| will be left empty.
- */
- sync FindPlugins(uint32_t pluginEpoch) returns (nsresult aResult, PluginTag[] plugins, FakePluginTag[] fakePlugins, uint32_t newPluginEpoch);
-
async PJavaScript();
async PRemoteSpellcheckEngine();
async InitCrashReporter(Shmem shmem, NativeThreadId tid);
/**
* Is this token compatible with the provided version?
@@ -1089,16 +1086,17 @@ parent:
sync GetA11yContentId() returns (uint32_t aContentId);
async A11yHandlerControl(uint32_t aPid,
IHandlerControlHolder aHandlerControl);
async AddMemoryReport(MemoryReport aReport);
async FinishMemoryReport(uint32_t aGeneration);
+ async MaybeReloadPlugins();
both:
async AsyncMessage(nsString aMessage, CpowEntry[] aCpows,
Principal aPrincipal, ClonedMessageData aData);
/**
* Notify `push-subscription-modified` observers in the parent and child.
*/
async NotifyPushSubscriptionModifiedObservers(nsCString scope,
--- a/dom/plugins/base/nsPluginHost.cpp
+++ b/dom/plugins/base/nsPluginHost.cpp
@@ -46,16 +46,17 @@
#include "nsIScriptChannel.h"
#include "nsIBlocklistService.h"
#include "nsVersionComparator.h"
#include "nsIObjectLoadingContent.h"
#include "nsIWritablePropertyBag2.h"
#include "nsICategoryManager.h"
#include "nsPluginStreamListenerPeer.h"
#include "mozilla/dom/ContentChild.h"
+#include "mozilla/dom/ContentParent.h"
#include "mozilla/dom/FakePluginTagInitBinding.h"
#include "mozilla/LoadInfo.h"
#include "mozilla/plugins/PluginAsyncSurrogate.h"
#include "mozilla/plugins/PluginBridge.h"
#include "mozilla/plugins/PluginTypes.h"
#include "mozilla/Preferences.h"
#include "mozilla/ipc/URIUtils.h"
@@ -262,24 +263,16 @@ static bool UnloadPluginsASAP()
}
nsPluginHost::nsPluginHost()
: mPluginsLoaded(false)
, mOverrideInternalTypes(false)
, mPluginsDisabled(false)
, mPluginEpoch(0)
{
- // Bump the pluginchanged epoch on startup. This insures content gets a
- // good plugin list the first time it requests it. Normally we'd just
- // init this to 1, but due to the unique nature of our ctor we need to do
- // this manually.
- if (XRE_IsParentProcess()) {
- IncrementChromeEpoch();
- }
-
// check to see if pref is set at startup to let plugins take over in
// full page mode for certain image mime types that we handle internally
mOverrideInternalTypes =
Preferences::GetBool("plugin.override_internal_types", false);
mPluginsDisabled = Preferences::GetBool("plugin.disable", false);
Preferences::AddStrongObserver(this, "plugin.disable");
@@ -298,16 +291,23 @@ nsPluginHost::nsPluginHost()
#ifdef PLUGIN_LOGGING
MOZ_LOG(nsPluginLogging::gNPNLog, PLUGIN_LOG_ALWAYS,("NPN Logging Active!\n"));
MOZ_LOG(nsPluginLogging::gPluginLog, PLUGIN_LOG_ALWAYS,("General Plugin Logging Active! (nsPluginHost::ctor)\n"));
MOZ_LOG(nsPluginLogging::gNPPLog, PLUGIN_LOG_ALWAYS,("NPP Logging Active!\n"));
PLUGIN_LOG(PLUGIN_LOG_ALWAYS,("nsPluginHost::ctor\n"));
PR_LogFlush();
#endif
+
+ // Load plugins on creation, as there's a good chance we'll need to send them
+ // to content processes directly after creation.
+ if (XRE_IsParentProcess())
+ {
+ LoadPlugins();
+ }
}
nsPluginHost::~nsPluginHost()
{
PLUGIN_LOG(PLUGIN_LOG_ALWAYS,("nsPluginHost::dtor\n"));
UnloadPlugins();
sInst = nullptr;
@@ -355,18 +355,30 @@ bool nsPluginHost::IsRunningPlugin(nsPlu
return false;
}
nsresult nsPluginHost::ReloadPlugins()
{
PLUGIN_LOG(PLUGIN_LOG_NORMAL,
("nsPluginHost::ReloadPlugins Begin\n"));
- nsresult rv = NS_OK;
-
+ // If we're calling this from a content process, forward the reload request to
+ // the parent process. If plugins actually changed, it will notify us
+ // asynchronously later.
+ if (XRE_IsContentProcess())
+ {
+ Unused << mozilla::dom::ContentChild::GetSingleton()->SendMaybeReloadPlugins();
+ // In content processes, always signal that plugins have not changed. We
+ // will never know if they changed here unless we make slow synchronous
+ // calls. This information will hopefully only be wrong once, as if there
+ // has been a plugin update, we expect to have gotten notification from the
+ // parent process and everything should be updated by the next time this is
+ // called. See Bug 1337058 for more info.
+ return NS_ERROR_PLUGINS_PLUGINSNOTCHANGED;
+ }
// this will create the initial plugin list out of cache
// if it was not created yet
if (!mPluginsLoaded)
return LoadPlugins();
// we are re-scanning plugins. New plugins may have been added, also some
// plugins may have been removed, so we should probably shut everything down
// but don't touch running (active and not stopped) plugins
@@ -377,16 +389,24 @@ nsresult nsPluginHost::ReloadPlugins()
// look for possible changes
bool pluginschanged = true;
FindPlugins(false, &pluginschanged);
// if no changed detected, return an appropriate error code
if (!pluginschanged)
return NS_ERROR_PLUGINS_PLUGINSNOTCHANGED;
+ return ActuallyReloadPlugins();
+}
+
+nsresult
+nsPluginHost::ActuallyReloadPlugins()
+{
+ nsresult rv = NS_OK;
+
// shutdown plugins and kill the list if there are no running plugins
RefPtr<nsPluginTag> prev;
RefPtr<nsPluginTag> next;
for (RefPtr<nsPluginTag> p = mPlugins; p != nullptr;) {
next = p->mNext;
// only remove our plugin from the list if it's not running.
@@ -410,16 +430,23 @@ nsresult nsPluginHost::ReloadPlugins()
}
// set flags
mPluginsLoaded = false;
// load them again
rv = LoadPlugins();
+ if (XRE_IsParentProcess())
+ {
+ // If the plugin list changed, update content. If the plugin list changed
+ // for the content process, it will also reload plugins.
+ SendPluginsToContent();
+ }
+
PLUGIN_LOG(PLUGIN_LOG_NORMAL,
("nsPluginHost::ReloadPlugins End\n"));
return rv;
}
#define NS_RETURN_UASTRING_SIZE 128
@@ -2271,21 +2298,21 @@ WatchRegKey(uint32_t aRoot, nsCOMPtr<nsI
return;
}
aKey->StartWatching(true);
}
#endif
nsresult nsPluginHost::LoadPlugins()
{
-#ifdef ANDROID
+ // This should only be run in the parent process. On plugin list change, we'll
+ // update observers in the content process as part of SetPluginsInContent
if (XRE_IsContentProcess()) {
return NS_OK;
}
-#endif
// do not do anything if it is already done
// use ReloadPlugins() to enforce loading
if (mPluginsLoaded)
return NS_OK;
if (mPluginsDisabled)
return NS_OK;
@@ -2310,42 +2337,34 @@ nsresult nsPluginHost::LoadPlugins()
if (obsService)
obsService->NotifyObservers(nullptr, "plugins-list-updated", nullptr);
}
return NS_OK;
}
nsresult
-nsPluginHost::FindPluginsInContent(bool aCreatePluginList, bool* aPluginsChanged)
+nsPluginHost::SetPluginsInContent(uint32_t aPluginEpoch,
+ nsTArray<mozilla::plugins::PluginTag>& aPlugins,
+ nsTArray<mozilla::plugins::FakePluginTag>& aFakePlugins)
{
MOZ_ASSERT(XRE_IsContentProcess());
- dom::ContentChild* cp = dom::ContentChild::GetSingleton();
- nsresult rv;
nsTArray<PluginTag> plugins;
+
nsTArray<FakePluginTag> fakePlugins;
- uint32_t parentEpoch;
- if (!cp->SendFindPlugins(ChromeEpochForContent(), &rv, &plugins, &fakePlugins, &parentEpoch) ||
- NS_FAILED(rv)) {
- return NS_ERROR_NOT_AVAILABLE;
- }
-
- if (parentEpoch != ChromeEpochForContent()) {
- *aPluginsChanged = true;
- if (!aCreatePluginList) {
- return NS_OK;
- }
-
- // Don't do this if aCreatePluginList is false. Otherwise, when we actually
- // want to create the list, we'll come back here and do nothing.
- SetChromeEpochForContent(parentEpoch);
-
- for (size_t i = 0; i < plugins.Length(); i++) {
- PluginTag& tag = plugins[i];
+
+ if (aPluginEpoch != ChromeEpochForContent()) {
+ // Since we know we're going to be repopulating the lists anyways, trigger a
+ // reload now to clear out all old entries.
+ ActuallyReloadPlugins();
+
+ SetChromeEpochForContent(aPluginEpoch);
+
+ for (auto tag : aPlugins) {
// Don't add the same plugin again.
if (nsPluginTag* existing = PluginWithId(tag.id())) {
UpdateInMemoryPluginInfo(existing);
continue;
}
nsPluginTag *pluginTag = new nsPluginTag(tag.id(),
@@ -2362,17 +2381,17 @@ nsPluginHost::FindPluginsInContent(bool
tag.supportsAsyncInit(),
tag.supportsAsyncRender(),
tag.lastModifiedTime(),
tag.isFromExtension(),
tag.sandboxLevel());
AddPluginTag(pluginTag);
}
- for (const auto& tag : fakePlugins) {
+ for (const auto& tag : aFakePlugins) {
// Don't add the same plugin again.
for (const auto& existingTag : mFakePlugins) {
if (existingTag->Id() == tag.id()) {
continue;
}
}
RefPtr<nsFakePluginTag> pluginTag =
@@ -2389,16 +2408,22 @@ nsPluginHost::FindPluginsInContent(bool
Preferences::GetCString(kPrefDisableFullPage);
for (uint32_t i = 0; i < pluginTag->MimeTypes().Length(); i++) {
if (!IsTypeInList(pluginTag->MimeTypes()[i], disableFullPage)) {
RegisterWithCategoryManager(pluginTag->MimeTypes()[i],
ePluginRegister);
}
}
}
+
+ nsCOMPtr<nsIObserverService> obsService =
+ mozilla::services::GetObserverService();
+ if (obsService) {
+ obsService->NotifyObservers(nullptr, "plugins-list-updated", nullptr);
+ }
}
mPluginsLoaded = true;
return NS_OK;
}
// if aCreatePluginList is false we will just scan for plugins
// and see if any changes have been made to the plugins.
@@ -2406,18 +2431,20 @@ nsPluginHost::FindPluginsInContent(bool
nsresult nsPluginHost::FindPlugins(bool aCreatePluginList, bool * aPluginsChanged)
{
Telemetry::AutoTimer<Telemetry::FIND_PLUGINS> telemetry;
NS_ENSURE_ARG_POINTER(aPluginsChanged);
*aPluginsChanged = false;
+ // If plugins are found or change, the content process will be notified by the
+ // parent process. Bail out early if this is called from the content process.
if (XRE_IsContentProcess()) {
- return FindPluginsInContent(aCreatePluginList, aPluginsChanged);
+ return NS_OK;
}
nsresult rv;
// Read cached plugins info. If the profile isn't yet available then don't
// scan for plugins
if (ReadPluginInfo() == NS_ERROR_NOT_AVAILABLE)
return NS_OK;
@@ -2536,90 +2563,80 @@ nsresult nsPluginHost::FindPlugins(bool
// No more need for cached plugins. Clear it up.
NS_ITERATIVE_UNREF_LIST(RefPtr<nsPluginTag>, mCachedPlugins, mNext);
NS_ITERATIVE_UNREF_LIST(RefPtr<nsInvalidPluginTag>, mInvalidPlugins, mNext);
return NS_OK;
}
nsresult
-mozilla::plugins::FindPluginsForContent(uint32_t aPluginEpoch,
- nsTArray<PluginTag>* aPlugins,
- nsTArray<FakePluginTag>* aFakePlugins,
- uint32_t* aNewPluginEpoch)
+nsPluginHost::SendPluginsToContent()
{
MOZ_ASSERT(XRE_IsParentProcess());
- RefPtr<nsPluginHost> host = nsPluginHost::GetInst();
- return host->FindPluginsForContent(aPluginEpoch, aPlugins, aFakePlugins, aNewPluginEpoch);
-}
-
-nsresult
-nsPluginHost::FindPluginsForContent(uint32_t aPluginEpoch,
- nsTArray<PluginTag>* aPlugins,
- nsTArray<FakePluginTag>* aFakePlugins,
- uint32_t* aNewPluginEpoch)
-{
- MOZ_ASSERT(XRE_IsParentProcess());
-
+ nsTArray<PluginTag> pluginTags;
+ nsTArray<FakePluginTag> fakePluginTags;
// Load plugins so that the epoch is correct.
nsresult rv = LoadPlugins();
if (NS_FAILED(rv)) {
return rv;
}
- *aNewPluginEpoch = ChromeEpoch();
- if (aPluginEpoch == ChromeEpoch()) {
- return NS_OK;
- }
+ uint32_t newPluginEpoch = ChromeEpoch();
nsTArray<nsCOMPtr<nsIInternalPluginTag>> plugins;
GetPlugins(plugins, true);
for (size_t i = 0; i < plugins.Length(); i++) {
nsCOMPtr<nsIInternalPluginTag> basetag = plugins[i];
nsCOMPtr<nsIFakePluginTag> faketag = do_QueryInterface(basetag);
if (faketag) {
/// FIXME-jsplugins - We need to add a nsIInternalPluginTag->AsNative() to
/// avoid this hacky static cast
nsFakePluginTag* tag = static_cast<nsFakePluginTag*>(basetag.get());
mozilla::ipc::URIParams handlerURI;
SerializeURI(tag->HandlerURI(), handlerURI);
- aFakePlugins->AppendElement(FakePluginTag(tag->Id(),
- handlerURI,
- tag->Name(),
- tag->Description(),
- tag->MimeTypes(),
- tag->MimeDescriptions(),
- tag->Extensions(),
- tag->GetNiceFileName(),
- tag->SandboxScript()));
+ fakePluginTags.AppendElement(FakePluginTag(tag->Id(),
+ handlerURI,
+ tag->Name(),
+ tag->Description(),
+ tag->MimeTypes(),
+ tag->MimeDescriptions(),
+ tag->Extensions(),
+ tag->GetNiceFileName(),
+ tag->SandboxScript()));
continue;
}
/// FIXME-jsplugins - We need to cleanup the various plugintag classes
/// to be more sane and avoid this dance
nsPluginTag *tag = static_cast<nsPluginTag *>(basetag.get());
- aPlugins->AppendElement(PluginTag(tag->mId,
- tag->Name(),
- tag->Description(),
- tag->MimeTypes(),
- tag->MimeDescriptions(),
- tag->Extensions(),
- tag->mIsJavaPlugin,
- tag->mIsFlashPlugin,
- tag->mSupportsAsyncInit,
- tag->mSupportsAsyncRender,
- tag->FileName(),
- tag->Version(),
- tag->mLastModifiedTime,
- tag->IsFromExtension(),
- tag->mSandboxLevel));
+ pluginTags.AppendElement(PluginTag(tag->mId,
+ tag->Name(),
+ tag->Description(),
+ tag->MimeTypes(),
+ tag->MimeDescriptions(),
+ tag->Extensions(),
+ tag->mIsJavaPlugin,
+ tag->mIsFlashPlugin,
+ tag->mSupportsAsyncInit,
+ tag->mSupportsAsyncRender,
+ tag->FileName(),
+ tag->Version(),
+ tag->mLastModifiedTime,
+ tag->IsFromExtension(),
+ tag->mSandboxLevel));
+ }
+ nsTArray<dom::ContentParent*> parents;
+ dom::ContentParent::GetAll(parents);
+ for (auto p : parents)
+ {
+ Unused << p->SendSetPluginList(newPluginEpoch, pluginTags, fakePluginTags);
}
return NS_OK;
}
void
nsPluginHost::UpdateInMemoryPluginInfo(nsPluginTag* aPluginTag)
{
NS_ITERATIVE_UNREF_LIST(RefPtr<nsPluginTag>, mCachedPlugins, mNext);
--- a/dom/plugins/base/nsPluginHost.h
+++ b/dom/plugins/base/nsPluginHost.h
@@ -247,16 +247,20 @@ public:
void CreateWidget(nsPluginInstanceOwner* aOwner);
nsresult EnumerateSiteData(const nsACString& domain,
const InfallibleTArray<nsCString>& sites,
InfallibleTArray<nsCString>& result,
bool firstMatchOnly);
+ nsresult SendPluginsToContent();
+ nsresult SetPluginsInContent(uint32_t aPluginEpoch,
+ nsTArray<mozilla::plugins::PluginTag>& aPlugins,
+ nsTArray<mozilla::plugins::FakePluginTag>& aFakePlugins);
private:
friend class nsPluginUnloadRunnable;
void DestroyRunningInstances(nsPluginTag* aPluginTag);
// Writes updated plugins settings to disk and unloads the plugin
// if it is now disabled. Should only be called by the plugin tag in question
void UpdatePluginInfo(nsPluginTag* aPluginTag);
@@ -296,18 +300,16 @@ private:
// be filled in with the MIME type the plugin is registered for.
nsPluginTag* FindNativePluginForExtension(const nsACString & aExtension,
/* out */ nsACString & aMimeType,
bool aCheckEnabled);
nsresult
FindStoppedPluginForURL(nsIURI* aURL, nsIPluginInstanceOwner *aOwner);
- nsresult FindPluginsInContent(bool aCreatePluginList, bool * aPluginsChanged);
-
nsresult
FindPlugins(bool aCreatePluginList, bool * aPluginsChanged);
// FIXME revisit, no ns prefix
// Registers or unregisters the given mime type with the category manager
enum nsRegisterType { ePluginRegister,
ePluginUnregister,
// Checks if this type should still be registered first
@@ -363,16 +365,18 @@ private:
// To be used by the content process to get/set the last observed epoch value
// from the chrome process.
uint32_t ChromeEpochForContent();
void SetChromeEpochForContent(uint32_t aEpoch);
void UpdateInMemoryPluginInfo(nsPluginTag* aPluginTag);
+ nsresult ActuallyReloadPlugins();
+
RefPtr<nsPluginTag> mPlugins;
RefPtr<nsPluginTag> mCachedPlugins;
RefPtr<nsInvalidPluginTag> mInvalidPlugins;
nsTArray< RefPtr<nsFakePluginTag> > mFakePlugins;
bool mPluginsLoaded;
--- a/ipc/ipdl/sync-messages.ini
+++ b/ipc/ipdl/sync-messages.ini
@@ -860,18 +860,16 @@ description =
[PContent::BridgeToChildProcess]
description =
[PContent::LoadPlugin]
description =
[PContent::ConnectPluginBridge]
description =
[PContent::GetBlocklistState]
description =
-[PContent::FindPlugins]
-description =
[PContent::NSSU2FTokenIsCompatibleVersion]
description =
[PContent::NSSU2FTokenIsRegistered]
description =
[PContent::NSSU2FTokenRegister]
description =
[PContent::NSSU2FTokenSign]
description =