Bug 964272 - Expose last modified time on plugin tags. r=bsmedberg

This commit is contained in:
Georg Fritzsche 2014-02-18 11:45:47 +01:00
parent 35457cf147
commit f6e4d8b047
6 changed files with 36 additions and 12 deletions

View File

@ -5,7 +5,7 @@
#include "nsISupports.idl"
[scriptable, uuid(0354d96d-3fd3-4365-a0a2-6c807ec1ce95)]
[scriptable, uuid(0e56f04d-cda4-4a55-ab83-e5e29ddd370e)]
interface nsIPluginTag : nsISupports
{
// enabledState is stored as one of the following as an integer in prefs,
@ -29,6 +29,8 @@ interface nsIPluginTag : nsISupports
readonly attribute boolean clicktoplay;
attribute unsigned long enabledState;
readonly attribute PRTime lastModifiedTime;
void getMimeTypes([optional] out unsigned long aCount,
[retval, array, size_is(aCount)] out wstring aResults);
void getMimeDescriptions([optional] out unsigned long aCount,

View File

@ -1776,13 +1776,12 @@ nsresult nsPluginHost::ScanPluginsDirectory(nsIFile *pluginsDir,
continue;
}
pluginTag = new nsPluginTag(&info);
pluginTag = new nsPluginTag(&info, fileModTime);
pluginFile.FreePluginInfo(info);
if (!pluginTag)
return NS_ERROR_OUT_OF_MEMORY;
pluginTag->mLibrary = library;
pluginTag->mLastModifiedTime = fileModTime;
uint32_t state = pluginTag->GetBlocklistState();
// If the blocklist says it is risky and we have never seen this

View File

@ -62,7 +62,7 @@ GetStatePrefNameForPlugin(nsPluginTag* aTag)
/* nsPluginTag */
nsPluginTag::nsPluginTag(nsPluginInfo* aPluginInfo)
nsPluginTag::nsPluginTag(nsPluginInfo* aPluginInfo, int64_t aLastModifiedTime)
: mName(aPluginInfo->fName),
mDescription(aPluginInfo->fDescription),
mLibrary(nullptr),
@ -71,7 +71,7 @@ nsPluginTag::nsPluginTag(nsPluginInfo* aPluginInfo)
mFileName(aPluginInfo->fFileName),
mFullPath(aPluginInfo->fFullPath),
mVersion(aPluginInfo->fVersion),
mLastModifiedTime(0),
mLastModifiedTime(aLastModifiedTime),
mNiceFileName(),
mCachedBlocklistState(nsIBlocklistService::STATE_NOT_BLOCKED),
mCachedBlocklistStateValid(false)
@ -566,3 +566,11 @@ nsPluginTag::InvalidateBlocklistState()
{
mCachedBlocklistStateValid = false;
}
nsresult
nsPluginTag::GetLastModifiedTime(PRTime* aLastModifiedTime)
{
MOZ_ASSERT(aLastModifiedTime);
*aLastModifiedTime = mLastModifiedTime;
return NS_OK;
}

View File

@ -36,7 +36,7 @@ public:
ePluginState_MaxValue = 3,
};
nsPluginTag(nsPluginInfo* aPluginInfo);
nsPluginTag(nsPluginInfo* aPluginInfo, int64_t aLastModifiedTime);
nsPluginTag(const char* aName,
const char* aDescription,
const char* aFileName,
@ -46,7 +46,7 @@ public:
const char* const* aMimeDescriptions,
const char* const* aExtensions,
int32_t aVariants,
int64_t aLastModifiedTime = 0,
int64_t aLastModifiedTime,
bool aArgsAreUTF8 = false);
virtual ~nsPluginTag();

View File

@ -420,10 +420,8 @@ function PluginWrapper(aId, aName, aDescription, aTags) {
this.__defineGetter__("installDate", function() {
let date = 0;
let file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
for (let tag of aTags) {
file.initWithPath(tag.fullpath);
date = Math.max(date, file.lastModifiedTime);
date = Math.max(date, tag.lastModifiedTime);
}
return new Date(date);
});

View File

@ -74,6 +74,21 @@ function getFileSize(aFile) {
return size;
}
function getPluginLastModifiedTime(aPluginFile) {
// On OS X we use the bundle contents last modified time as using
// the package directories modified date may be outdated.
// See bug 313700.
try {
let localFileMac = aPluginFile.QueryInterface(AM_Ci.nsILocalFileMac);
if (localFileMac) {
return localFileMac.bundleContentsLastModifiedTime;
}
} catch (e) {
}
return aPluginFile.lastModifiedTime;
}
// Tests that the test plugin exists
function run_test_1() {
var testPlugin = get_test_plugin();
@ -111,11 +126,13 @@ function run_test_1() {
do_check_true(p.size > 0);
do_check_eq(p.size, getFileSize(testPlugin));
do_check_true(p.updateDate > 0);
do_check_eq(p.updateDate.getTime(), testPlugin.lastModifiedTime);
do_check_eq(p.installDate.getTime(), testPlugin.lastModifiedTime);
do_check_true("isCompatibleWith" in p);
do_check_true("findUpdates" in p);
let lastModifiedTime = getPluginLastModifiedTime(testPlugin);
do_check_eq(p.updateDate.getTime(), lastModifiedTime);
do_check_eq(p.installDate.getTime(), lastModifiedTime);
run_test_2(p);
});
});