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:
Peter Van der Beken 2015-05-21 15:15:08 +02:00
Родитель 4ce6580106
Коммит cb4d3a4725
9 изменённых файлов: 99 добавлений и 8 удалений

Просмотреть файл

@ -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;