зеркало из https://github.com/mozilla/gecko-dev.git
Bug 558184 - Part 6 - Return fake plugins in e10s too. r=bz.
--HG-- extra : rebase_source : 262a496b92925dd29d5a39f58e606ef386558dc0 extra : source : d0b23431992ef9a66d9c93a173e766cdaea68082
This commit is contained in:
Родитель
4ce6580106
Коммит
cb4d3a4725
|
@ -1125,9 +1125,10 @@ 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, aNewPluginEpoch);
|
||||
*aRv = mozilla::plugins::FindPluginsForContent(aPluginEpoch, aPlugins, aFakePlugins, aNewPluginEpoch);
|
||||
return IPC_OK();
|
||||
}
|
||||
|
||||
|
|
|
@ -299,6 +299,7 @@ public:
|
|||
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;
|
||||
|
|
|
@ -658,7 +658,7 @@ parent:
|
|||
* 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, uint32_t newPluginEpoch);
|
||||
sync FindPlugins(uint32_t pluginEpoch) returns (nsresult aResult, PluginTag[] plugins, FakePluginTag[] fakePlugins, uint32_t newPluginEpoch);
|
||||
|
||||
async PJavaScript();
|
||||
|
||||
|
|
|
@ -57,6 +57,7 @@
|
|||
#include "mozilla/plugins/PluginBridge.h"
|
||||
#include "mozilla/plugins/PluginTypes.h"
|
||||
#include "mozilla/Preferences.h"
|
||||
#include "mozilla/ipc/URIUtils.h"
|
||||
|
||||
#include "nsEnumeratorUtils.h"
|
||||
#include "nsXPCOM.h"
|
||||
|
@ -116,6 +117,7 @@
|
|||
|
||||
using namespace mozilla;
|
||||
using mozilla::TimeStamp;
|
||||
using mozilla::plugins::FakePluginTag;
|
||||
using mozilla::plugins::PluginTag;
|
||||
using mozilla::plugins::PluginAsyncSurrogate;
|
||||
using mozilla::dom::FakePluginTagInit;
|
||||
|
@ -2280,8 +2282,9 @@ nsPluginHost::FindPluginsInContent(bool aCreatePluginList, bool* aPluginsChanged
|
|||
dom::ContentChild* cp = dom::ContentChild::GetSingleton();
|
||||
nsresult rv;
|
||||
nsTArray<PluginTag> plugins;
|
||||
nsTArray<FakePluginTag> fakePlugins;
|
||||
uint32_t parentEpoch;
|
||||
if (!cp->SendFindPlugins(ChromeEpochForContent(), &rv, &plugins, &parentEpoch) ||
|
||||
if (!cp->SendFindPlugins(ChromeEpochForContent(), &rv, &plugins, &fakePlugins, &parentEpoch) ||
|
||||
NS_FAILED(rv)) {
|
||||
return NS_ERROR_NOT_AVAILABLE;
|
||||
}
|
||||
|
@ -2323,6 +2326,24 @@ nsPluginHost::FindPluginsInContent(bool aCreatePluginList, bool* aPluginsChanged
|
|||
tag.sandboxLevel());
|
||||
AddPluginTag(pluginTag);
|
||||
}
|
||||
|
||||
for (const auto& tag : fakePlugins) {
|
||||
// Don't add the same plugin again.
|
||||
for (const auto& existingTag : mFakePlugins) {
|
||||
if (existingTag->Id() == tag.id()) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
mFakePlugins.AppendElement(new nsFakePluginTag(tag.id(),
|
||||
mozilla::ipc::DeserializeURI(tag.handlerURI()),
|
||||
tag.name().get(),
|
||||
tag.description().get(),
|
||||
tag.mimeTypes(),
|
||||
tag.mimeDescriptions(),
|
||||
tag.extensions(),
|
||||
tag.niceName()));
|
||||
}
|
||||
}
|
||||
|
||||
mPluginsLoaded = true;
|
||||
|
@ -2472,17 +2493,19 @@ nsresult nsPluginHost::FindPlugins(bool aCreatePluginList, bool * aPluginsChange
|
|||
nsresult
|
||||
mozilla::plugins::FindPluginsForContent(uint32_t aPluginEpoch,
|
||||
nsTArray<PluginTag>* aPlugins,
|
||||
nsTArray<FakePluginTag>* aFakePlugins,
|
||||
uint32_t* aNewPluginEpoch)
|
||||
{
|
||||
MOZ_ASSERT(XRE_IsParentProcess());
|
||||
|
||||
RefPtr<nsPluginHost> host = nsPluginHost::GetInst();
|
||||
return host->FindPluginsForContent(aPluginEpoch, aPlugins, aNewPluginEpoch);
|
||||
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());
|
||||
|
@ -2506,9 +2529,19 @@ nsPluginHost::FindPluginsForContent(uint32_t aPluginEpoch,
|
|||
|
||||
nsCOMPtr<nsIFakePluginTag> faketag = do_QueryInterface(basetag);
|
||||
if (faketag) {
|
||||
/// FIXME-jsplugins - We need to make content processes properly
|
||||
/// aware of jsplugins (and add a nsIInternalPluginTag->AsNative() to
|
||||
/// avoid this hacky static cast)
|
||||
/// 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()));
|
||||
continue;
|
||||
}
|
||||
|
||||
|
|
|
@ -34,6 +34,7 @@
|
|||
|
||||
namespace mozilla {
|
||||
namespace plugins {
|
||||
class FakePluginTag;
|
||||
class PluginAsyncSurrogate;
|
||||
class PluginTag;
|
||||
} // namespace plugins
|
||||
|
@ -118,6 +119,7 @@ public:
|
|||
|
||||
nsresult FindPluginsForContent(uint32_t aPluginEpoch,
|
||||
nsTArray<mozilla::plugins::PluginTag>* aPlugins,
|
||||
nsTArray<mozilla::plugins::FakePluginTag>* aFakePlugins,
|
||||
uint32_t* aNewPluginEpoch);
|
||||
|
||||
nsresult GetURL(nsISupports* pluginInst,
|
||||
|
|
|
@ -818,11 +818,30 @@ bool nsPluginTag::IsFromExtension() const
|
|||
|
||||
/* nsFakePluginTag */
|
||||
|
||||
uint32_t nsFakePluginTag::sNextId;
|
||||
|
||||
nsFakePluginTag::nsFakePluginTag()
|
||||
: mState(nsPluginTag::ePluginState_Disabled)
|
||||
: mId(sNextId++),
|
||||
mState(nsPluginTag::ePluginState_Disabled)
|
||||
{
|
||||
}
|
||||
|
||||
nsFakePluginTag::nsFakePluginTag(uint32_t aId,
|
||||
already_AddRefed<nsIURI>&& aHandlerURI,
|
||||
const char* aName,
|
||||
const char* aDescription,
|
||||
const nsTArray<nsCString>& aMimeTypes,
|
||||
const nsTArray<nsCString>& aMimeDescriptions,
|
||||
const nsTArray<nsCString>& aExtensions,
|
||||
const nsCString& aNiceName)
|
||||
: nsIInternalPluginTag(aName, aDescription, nullptr, nullptr,
|
||||
aMimeTypes, aMimeDescriptions, aExtensions),
|
||||
mId(aId),
|
||||
mHandlerURI(aHandlerURI),
|
||||
mNiceName(aNiceName),
|
||||
mState(nsPluginTag::ePluginState_Enabled)
|
||||
{}
|
||||
|
||||
nsFakePluginTag::~nsFakePluginTag()
|
||||
{
|
||||
}
|
||||
|
|
|
@ -211,6 +211,14 @@ public:
|
|||
|
||||
static nsresult Create(const mozilla::dom::FakePluginTagInit& aInitDictionary,
|
||||
nsFakePluginTag** aPluginTag);
|
||||
nsFakePluginTag(uint32_t aId,
|
||||
already_AddRefed<nsIURI>&& aHandlerURI,
|
||||
const char* aName,
|
||||
const char* aDescription,
|
||||
const nsTArray<nsCString>& aMimeTypes,
|
||||
const nsTArray<nsCString>& aMimeDescriptions,
|
||||
const nsTArray<nsCString>& aExtensions,
|
||||
const nsCString& aNiceName);
|
||||
|
||||
bool IsEnabled() override;
|
||||
const nsCString& GetNiceFileName() override;
|
||||
|
@ -219,10 +227,18 @@ public:
|
|||
|
||||
nsIURI* HandlerURI() const { return mHandlerURI; }
|
||||
|
||||
uint32_t Id() const { return mId; }
|
||||
|
||||
private:
|
||||
nsFakePluginTag();
|
||||
virtual ~nsFakePluginTag();
|
||||
|
||||
// A unique id for this JS-implemented plugin. Registering a plugin through
|
||||
// nsPluginHost::RegisterFakePlugin assigns a new id. The id is transferred
|
||||
// through IPC when getting the list of JS-implemented plugins from child
|
||||
// processes, so it should be consistent across processes.
|
||||
uint32_t mId;
|
||||
|
||||
// The URI of the handler for our fake plugin.
|
||||
// FIXME-jsplugins do we need to sanity check these?
|
||||
nsCOMPtr<nsIURI> mHandlerURI;
|
||||
|
@ -231,6 +247,10 @@ private:
|
|||
nsCString mNiceName;
|
||||
|
||||
nsPluginTag::PluginState mState;
|
||||
|
||||
// Stores the id to use for the JS-implemented plugin that gets registered
|
||||
// next through nsPluginHost::RegisterFakePlugin.
|
||||
static uint32_t sNextId;
|
||||
};
|
||||
|
||||
#endif // nsPluginTags_h_
|
||||
|
|
|
@ -32,6 +32,7 @@ SetupBridge(uint32_t aPluginId, dom::ContentParent* aContentParent,
|
|||
nsresult
|
||||
FindPluginsForContent(uint32_t aPluginEpoch,
|
||||
nsTArray<PluginTag>* aPlugins,
|
||||
nsTArray<FakePluginTag>* aFakePlugins,
|
||||
uint32_t* aNewPluginEpoch);
|
||||
|
||||
void
|
||||
|
|
|
@ -3,6 +3,8 @@
|
|||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
include URIParams;
|
||||
|
||||
namespace mozilla {
|
||||
namespace plugins {
|
||||
|
||||
|
@ -25,6 +27,18 @@ struct PluginTag
|
|||
int32_t sandboxLevel;
|
||||
};
|
||||
|
||||
struct FakePluginTag
|
||||
{
|
||||
uint32_t id;
|
||||
URIParams handlerURI;
|
||||
nsCString name;
|
||||
nsCString description;
|
||||
nsCString[] mimeTypes;
|
||||
nsCString[] mimeDescriptions;
|
||||
nsCString[] extensions;
|
||||
nsCString niceName;
|
||||
};
|
||||
|
||||
union PluginIdentifier
|
||||
{
|
||||
nsCString;
|
||||
|
|
Загрузка…
Ссылка в новой задаче