bug 1289670 - Show plugin activation icon when navigator.mimetypes is queried r=mrbkap

This commit is contained in:
Brad Lassey 2016-07-27 17:45:48 -04:00
parent 0026e79c41
commit c99449c15a
4 changed files with 45 additions and 11 deletions

View File

@ -30,7 +30,8 @@ NS_INTERFACE_MAP_END
NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(nsMimeTypeArray,
mWindow,
mMimeTypes)
mMimeTypes,
mCTPMimeTypes)
nsMimeTypeArray::nsMimeTypeArray(nsPIDOMWindowInner* aWindow)
: mWindow(aWindow)
@ -57,6 +58,7 @@ void
nsMimeTypeArray::Refresh()
{
mMimeTypes.Clear();
mCTPMimeTypes.Clear();
}
nsPIDOMWindowInner*
@ -133,6 +135,10 @@ nsMimeTypeArray::NamedGetter(const nsAString& aName, bool &aFound)
aFound = true;
return mimeType;
}
nsMimeType* hiddenType = FindMimeType(mCTPMimeTypes, lowerName);
if (hiddenType) {
nsPluginArray::NotifyHiddenPluginTouched(hiddenType->GetEnabledPlugin());
}
return nullptr;
}
@ -180,6 +186,7 @@ nsMimeTypeArray::EnsurePluginMimeTypes()
}
pluginArray->GetMimeTypes(mMimeTypes);
pluginArray->GetCTPMimeTypes(mCTPMimeTypes);
}
NS_IMPL_CYCLE_COLLECTION_ROOT_NATIVE(nsMimeType, AddRef)

View File

@ -48,6 +48,7 @@ protected:
// mMimeTypes contains MIME types handled by plugins or by an OS
// PreferredApplicationHandler.
nsTArray<RefPtr<nsMimeType> > mMimeTypes;
nsTArray<RefPtr<nsMimeType> > mCTPMimeTypes;
};
class nsMimeType final : public nsWrapperCache

View File

@ -114,6 +114,24 @@ nsPluginArray::GetMimeTypes(nsTArray<RefPtr<nsMimeType>>& aMimeTypes)
aMimeTypes.Sort();
}
void
nsPluginArray::GetCTPMimeTypes(nsTArray<RefPtr<nsMimeType>>& aMimeTypes)
{
aMimeTypes.Clear();
if (!AllowPlugins()) {
return;
}
EnsurePlugins();
GetPluginMimeTypes(mCTPPlugins, aMimeTypes);
// Alphabetize the enumeration order of non-hidden MIME types to reduce
// fingerprintable entropy based on plugins' installation file times.
aMimeTypes.Sort();
}
nsPluginElement*
nsPluginArray::Item(uint32_t aIndex)
{
@ -236,21 +254,26 @@ nsPluginArray::NamedGetter(const nsAString& aName, bool &aFound)
if (!aFound) {
nsPluginElement* hiddenPlugin = FindPlugin(mCTPPlugins, aName);
if (hiddenPlugin) {
HiddenPluginEventInit init;
init.mTag = hiddenPlugin->PluginTag();
nsCOMPtr<nsIDocument> doc = hiddenPlugin->GetParentObject()->GetDoc();
RefPtr<HiddenPluginEvent> event =
HiddenPluginEvent::Constructor(doc, NS_LITERAL_STRING("HiddenPlugin"), init);
event->SetTarget(doc);
event->SetTrusted(true);
event->WidgetEventPtr()->mFlags.mOnlyChromeDispatch = true;
bool dummy;
doc->DispatchEvent(event, &dummy);
NotifyHiddenPluginTouched(hiddenPlugin);
}
}
return plugin;
}
void nsPluginArray::NotifyHiddenPluginTouched(nsPluginElement* aHiddenElement)
{
HiddenPluginEventInit init;
init.mTag = aHiddenElement->PluginTag();
nsCOMPtr<nsIDocument> doc = aHiddenElement->GetParentObject()->GetDoc();
RefPtr<HiddenPluginEvent> event =
HiddenPluginEvent::Constructor(doc, NS_LITERAL_STRING("HiddenPlugin"), init);
event->SetTarget(doc);
event->SetTrusted(true);
event->WidgetEventPtr()->mFlags.mOnlyChromeDispatch = true;
bool dummy;
doc->DispatchEvent(event, &dummy);
}
uint32_t
nsPluginArray::Length()
{

View File

@ -41,6 +41,9 @@ public:
void Invalidate();
void GetMimeTypes(nsTArray<RefPtr<nsMimeType>>& aMimeTypes);
void GetCTPMimeTypes(nsTArray<RefPtr<nsMimeType>>& aMimeTypes);
static void NotifyHiddenPluginTouched(nsPluginElement* aElement);
// PluginArray WebIDL methods