зеркало из https://github.com/mozilla/pjs.git
Extension Manager UI and updater web service - not enabled yet - bug 170006
This commit is contained in:
Родитель
a7ad5b9cfc
Коммит
60266e36f7
|
@ -365,10 +365,9 @@ var gExtensionsViewController = {
|
|||
|
||||
cmd_update: function ()
|
||||
{
|
||||
if (gWindowState == "extensions")
|
||||
gExtensionManager.updateExtension(gExtensionsView.selected ? stripPrefix(gExtensionsView.selected.id) : null);
|
||||
else if (gWindowState == "themes")
|
||||
gExtensionManager.updateTheme(gExtensionsView.selected ? stripPrefix(gExtensionsView.selected.id) : null);
|
||||
openDialog("chrome://mozapps/content/extensions/update.xul", "", "chrome,modal",
|
||||
gWindowState, gExtensionManager,
|
||||
gExtensionsView.selected ? stripPrefix(gExtensionsView.selected.id) : null);
|
||||
},
|
||||
|
||||
cmd_uninstall: function ()
|
||||
|
|
|
@ -0,0 +1,104 @@
|
|||
|
||||
var gUpdateDialog = {
|
||||
_updateType: "",
|
||||
_extensionManager: "",
|
||||
_extensionID: "",
|
||||
|
||||
_messages: ["update-start",
|
||||
"update-end",
|
||||
"update-item-network-start",
|
||||
"update-item-network-end",
|
||||
"update-item-processing-start",
|
||||
"update-item-processing-end",
|
||||
"update-item-error"],
|
||||
|
||||
init: function ()
|
||||
{
|
||||
this._updateType = window.arguments[0];
|
||||
this._extensionManager = window.arguments[1];
|
||||
this._extensionID = window.arguments[2];
|
||||
|
||||
var os = Components.classes["@mozilla.org/observer-service;1"]
|
||||
.getService(Components.interfaces.nsIObserverService);
|
||||
for (var i = 0; i < this._messages.length; ++i)
|
||||
os.addObserver(this, this._messages[i], false);
|
||||
|
||||
if (this._updateType == "extensions")
|
||||
this._extensionManager.updateExtension(this._extensionID);
|
||||
else if (gUpdateType == "themes")
|
||||
this._extensionManager.updateTheme(this._extensionID);
|
||||
},
|
||||
|
||||
observe: function (aSubject, aTopic, aData)
|
||||
{
|
||||
switch (aTopic) {
|
||||
case "update-start":
|
||||
dump("*** update-start: " + aSubject + ", " + aData + "\n");
|
||||
break;
|
||||
case "update-item-network-start":
|
||||
dump("*** update-item-network-start: " + aSubject + ", " + aData + "\n");
|
||||
break;
|
||||
case "update-item-network-end":
|
||||
dump("*** update-item-network-end: " + aSubject + ", " + aData + "\n");
|
||||
break;
|
||||
case "update-item-processing-start":
|
||||
dump("*** update-item-processing-start: " + aSubject + ", " + aData + "\n");
|
||||
break;
|
||||
case "update-item-processing-end":
|
||||
dump("*** update-item-processing-end: " + aSubject + ", " + aData + "\n");
|
||||
break;
|
||||
case "update-item-error":
|
||||
dump("*** update-item-error: " + aSubject + ", " + aData + "\n");
|
||||
break;
|
||||
case "update-end":
|
||||
dump("*** update-end: " + aSubject + ", " + aData + "\n");
|
||||
|
||||
// Report Status
|
||||
|
||||
// Unhook observers
|
||||
var os = Components.classes["@mozilla.org/observer-service;1"]
|
||||
.getService(Components.interfaces.nsIObserverService);
|
||||
for (var i = 0; i < this._messages.length; ++i)
|
||||
os.removeObserver(this, this._messages[i]);
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
# -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
# Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
#
|
||||
# The contents of this file are subject to the Mozilla Public License Version
|
||||
# 1.1 (the "License"); you may not use this file except in compliance with
|
||||
# the License. You may obtain a copy of the License at
|
||||
# http://www.mozilla.org/MPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS IS" basis,
|
||||
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
# for the specific language governing rights and limitations under the
|
||||
# License.
|
||||
#
|
||||
# The Original Code is The Extension Manager.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Ben Goodger.
|
||||
# Portions created by the Initial Developer are Copyright (C) 2004
|
||||
# the Initial Developer. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Ben Goodger <ben@bengoodger.com>
|
||||
#
|
||||
# Alternatively, the contents of this file may be used under the terms of
|
||||
# either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
# in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
# of those above. If you wish to allow use of your version of this file only
|
||||
# under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
# use your version of this file under the terms of the MPL, indicate your
|
||||
# decision by deleting the provisions above and replace them with the notice
|
||||
# and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
# the provisions above, a recipient may use your version of this file under
|
||||
# the terms of any one of the MPL, the GPL or the LGPL.
|
||||
#
|
||||
# ***** END LICENSE BLOCK *****
|
|
@ -0,0 +1,69 @@
|
|||
<?xml version="1.0"?>
|
||||
|
||||
# -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
# Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
#
|
||||
# The contents of this file are subject to the Mozilla Public License Version
|
||||
# 1.1 (the "License"); you may not use this file except in compliance with
|
||||
# the License. You may obtain a copy of the License at
|
||||
# http://www.mozilla.org/MPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS IS" basis,
|
||||
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
# for the specific language governing rights and limitations under the
|
||||
# License.
|
||||
#
|
||||
# The Original Code is The Extension Manager.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Ben Goodger.
|
||||
# Portions created by the Initial Developer are Copyright (C) 2004
|
||||
# the Initial Developer. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Ben Goodger <ben@bengoodger.com>
|
||||
#
|
||||
# Alternatively, the contents of this file may be used under the terms of
|
||||
# either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
# in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
# of those above. If you wish to allow use of your version of this file only
|
||||
# under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
# use your version of this file under the terms of the MPL, indicate your
|
||||
# decision by deleting the provisions above and replace them with the notice
|
||||
# and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
# the provisions above, a recipient may use your version of this file under
|
||||
# the terms of any one of the MPL, the GPL or the LGPL.
|
||||
#
|
||||
# ***** END LICENSE BLOCK *****
|
||||
|
||||
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
|
||||
<?xml-stylesheet href="chrome://mozapps/skin/extensions/about.css" type="text/css"?>
|
||||
|
||||
<!DOCTYPE dialog [
|
||||
<!ENTITY % updateDTD SYSTEM "chrome://mozapps/locale/extensions/update.dtd">
|
||||
<!ENTITY % brandDTD SYSTEM "chrome://global/locale/brand.dtd">
|
||||
%updateDTD;
|
||||
%brandDTD;
|
||||
]>
|
||||
|
||||
<dialog id="updateProgress" title="&update.title;"
|
||||
style="width: 30em;"
|
||||
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
|
||||
buttons="cancel" onload="gUpdateDialog.init();" oncancel="onCancelUpdateCheck();">
|
||||
|
||||
<script type="application/x-javascript" src="chrome://mozapps/content/extensions/update.js"/>
|
||||
|
||||
<stringbundleset id="updateSet">
|
||||
<stringbundle id="extensionsStrings" src="chrome://mozapps/locale/extensions/extensions.properties"/>
|
||||
</stringbundleset>
|
||||
|
||||
<label>&intro.label;</label>
|
||||
|
||||
<description id="items"/>
|
||||
|
||||
<progressmeter id="progress"/>
|
||||
|
||||
<description id="status"/>
|
||||
|
||||
</dialog>
|
||||
|
|
@ -11,3 +11,8 @@ restartBeforeUninstallMessage=%S will be uninstalled the next time you restart %
|
|||
queryUninstallExtensionMessage=If you uninstall %S, the functionality it offers will no longer be available. Do you want to uninstall %S?
|
||||
queryUninstallThemeMessage=Do you want to uninstall %S?
|
||||
queryUninstallTitle=Uninstall %S
|
||||
statusConnecting=Connecting to %S, please wait...
|
||||
statusProcessing=Processing data...
|
||||
statusConnectionFailed=Connection to %S failed, skipping...
|
||||
progress=(%S of %S items complete)
|
||||
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
<!ENTITY update.title "Checking for Updates">
|
||||
<!ENTITY intro.label "&brandShortName; is now checking for updates to:">
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,84 @@
|
|||
import java.sql.*;
|
||||
|
||||
public class VersionCheck
|
||||
{
|
||||
protected Connection getConnection()
|
||||
{
|
||||
Class.forName("com.mysql.jdbc.Driver");
|
||||
return DriverManager.getConnection("jdbc:mysql://localhost/", "", "");
|
||||
}
|
||||
|
||||
public class VersionResult
|
||||
{
|
||||
public String xpiURL;
|
||||
public int version;
|
||||
}
|
||||
|
||||
public VersionResult checkVersion(String aExtensionGUID, String aInstalledVersion, String aTargetApp, String aTargetAppVersion)
|
||||
{
|
||||
int extensionVersionParts = getPartCount(aInstalledVersion);
|
||||
int extensionVersion = parseVersion(aInstalledVersion, extensionVersionParts);
|
||||
int targetAppVersionParts = getPartCount(aTargetAppVersion);
|
||||
int targetAppVersion = parseVersion(aTargetAppVersion, targetAppVersionParts);
|
||||
|
||||
Connection c = getConnection();
|
||||
|
||||
Statement s = c.createStatement();
|
||||
|
||||
// We need to find all rows matching aExtensionGUID, and filter like so:
|
||||
// 1) version > extensionVersion
|
||||
// 2) targetapp == aTargetApp
|
||||
// 3) mintargetappversion <= targetAppVersion <= maxtargetappversion
|
||||
String sql = "SELECT * FROM extensions WHERE targetapp = '" + aTargetAppVersion + "'AND guid = '" + aExtensionGUID + "'";
|
||||
|
||||
ResultSet rs = s.executeQuery(sql);
|
||||
|
||||
String xpiURL = "";
|
||||
int newestExtensionVersion = extensionVersion;
|
||||
|
||||
while (rs.next())
|
||||
{
|
||||
int minTargetAppVersion = parseVersion(rs.getObject("mintargetappversion").toString(), targetAppVersionParts);
|
||||
int maxTargetAppVersion = parseVersion(rs.getObject("maxtargetappversion").toString(), targetAppVersionParts);
|
||||
|
||||
int version = parseVersion(rs.getObject("version").toString(), extensionVersionParts);
|
||||
if (version > extensionVersion &&
|
||||
version > newestExtensionVersion &&
|
||||
minTargetAppVersion <= targetAppVersion &&
|
||||
targetAppVersion < maxTargetAppVersion)
|
||||
{
|
||||
newestExtensionVersion = version;
|
||||
xpiURL = rs.getObject("xpiurl").toString();
|
||||
}
|
||||
}
|
||||
rs.close();
|
||||
|
||||
VersionResult vr = new VersionResult();
|
||||
vr.xpiURL = xpiURL;
|
||||
vr.version = newestExtensionVersion;
|
||||
|
||||
return vr;
|
||||
}
|
||||
|
||||
protected int parseVersion(String aVersionString, int aPower)
|
||||
{
|
||||
int version = 0;
|
||||
String[] parts = aVersionString.split(".");
|
||||
|
||||
if (aPower == 0)
|
||||
aPower = parts.length;
|
||||
|
||||
for (int i = 0; i < parts.length; ++i)
|
||||
{
|
||||
if (parts[i] != "+")
|
||||
{
|
||||
version += Integer.parseInt(parts[i]) * Math.pow(10, aPower - i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected int getPartCount(String aVersionString)
|
||||
{
|
||||
return aVersionString.split(".").length;
|
||||
}
|
||||
}
|
|
@ -101,9 +101,112 @@ nsExtensionManager.prototype = {
|
|||
|
||||
updateExtension: function (aExtensionID)
|
||||
{
|
||||
this._ds.getUpdateURLs(aExtensionID);
|
||||
},
|
||||
var os = Components.classes["@mozilla.org/observer-service;1"]
|
||||
.getService(Components.interfaces.nsIObserverService);
|
||||
var itemCount = 0;
|
||||
|
||||
var proxy = null;
|
||||
function getResults()
|
||||
{
|
||||
if (proxy) {
|
||||
proxy.count();
|
||||
proxy.contents();
|
||||
}
|
||||
}
|
||||
|
||||
if (!proxy) {
|
||||
var listener = {
|
||||
onLoad: function (aProxy)
|
||||
{
|
||||
proxy = aProxy;
|
||||
proxy.setListener(this);
|
||||
getResults();
|
||||
},
|
||||
|
||||
onError: function (aError)
|
||||
{
|
||||
dump("*** onError ERROR = " + aError + "\n");
|
||||
},
|
||||
|
||||
countCallback: function (aResult)
|
||||
{
|
||||
this._count = aResult;
|
||||
},
|
||||
|
||||
contentsCallback: function (aResult)
|
||||
{
|
||||
for (var i = 0; i < this._count; ++i)
|
||||
dump("*** quote " + i + " = " + aResult[i] + "\n");
|
||||
},
|
||||
};
|
||||
|
||||
var wspFactory = Components.classes["@mozilla.org/xmlextras/proxy/webserviceproxyfactory;1"]
|
||||
.getService(Components.interfaces.nsIWebServiceProxyFactory);
|
||||
wspFactory.createProxyAsync("http://localhost:8080/axis/quote.wsdl",
|
||||
"Quote", "", true, listener);
|
||||
}
|
||||
else
|
||||
getResults();
|
||||
|
||||
return;
|
||||
|
||||
function RDFSinkObserver()
|
||||
{
|
||||
}
|
||||
RDFSinkObserver.prototype = {
|
||||
onBeginLoad: function (aSink)
|
||||
{
|
||||
os.notifyObservers(aSink, "update-item-network-start", "");
|
||||
},
|
||||
onInterrupt: function (aSink) { },
|
||||
onResume: function (aSink) { },
|
||||
onError: function (aSink, aStatus, aErrorMsg)
|
||||
{
|
||||
dump("*** error; status = " + aStatus + ", msg = " + aErrorMsg + "\n");
|
||||
if (aStatus == Components.results.NS_ERROR_FILE_NOT_FOUND)
|
||||
dump("*** FILE NOT FOUND BOZO\n");
|
||||
aSink.removeXMLSinkObserver(this);
|
||||
os.notifyObservers(aSink, "update-item-error", aErrorMsg);
|
||||
this._checkLastItem();
|
||||
},
|
||||
onEndLoad: function (aSink)
|
||||
{
|
||||
dump("*** done!\n");
|
||||
os.notifyObservers(aSink, "update-item-network-end", "");
|
||||
aSink.removeXMLSinkObserver(this);
|
||||
os.notifyObservers(aSink, "update-item-processing-start", "");
|
||||
dump("*** processing...\n");
|
||||
os.notifyObservers(aSink, "update-item-processing-end", "");
|
||||
this._checkLastItem();
|
||||
},
|
||||
|
||||
_checkLastItem: function ()
|
||||
{
|
||||
if (--itemCount == 0)
|
||||
os.notifyObservers(null, "update-end", "");
|
||||
}
|
||||
};
|
||||
|
||||
os.notifyObservers(null, "update-start", "");
|
||||
|
||||
var urls = this._ds.getUpdateURLs(aExtensionID);
|
||||
var rdfs = Components.classes["@mozilla.org/rdf/rdf-service;1"]
|
||||
.getService(Components.interfaces.nsIRDFService);
|
||||
itemCount = urls.length;
|
||||
for (var i = 0; i < urls.length; ++i) {
|
||||
var observer = new RDFSinkObserver();
|
||||
|
||||
var ds = rdfs.GetDataSource(urls[i]);
|
||||
dump("*** starting " + ds.URI + "\n");
|
||||
var sink = ds.QueryInterface(Components.interfaces.nsIRDFXMLSink);
|
||||
var rds = ds.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource);
|
||||
if (rds.loaded)
|
||||
observer.onEndLoad(sink);
|
||||
else
|
||||
sink.addXMLSinkObserver(observer);
|
||||
}
|
||||
},
|
||||
|
||||
// Themes
|
||||
installTheme: function (aThemeID)
|
||||
{
|
||||
|
@ -262,13 +365,11 @@ nsExtensionsDataSource.prototype = {
|
|||
var urlCount = urlHash[url].length;
|
||||
for (var i = 0; i < urlCount; ++i)
|
||||
guidString += escape(urlHash[url][i] + (i < urlCount - 1 ? "," : ""));
|
||||
dump("*** guidString = " + guidString + "\n");
|
||||
url = url.replace(/%APP%/g, appID);
|
||||
url = url.replace(/%ITEM%/g, guidString);
|
||||
urls.push(url);
|
||||
}
|
||||
}
|
||||
dump("*** urls = " + urls + "\n");
|
||||
return urls;
|
||||
},
|
||||
|
||||
|
|
|
@ -19,6 +19,8 @@ toolkit.jar:
|
|||
* content/mozapps/extensions/extensions.css (extensions/content/extensions.css)
|
||||
* content/mozapps/extensions/about.xul (extensions/content/about.xul)
|
||||
* content/mozapps/extensions/about.js (extensions/content/about.js)
|
||||
* content/mozapps/extensions/update.xul (extensions/content/update.xul)
|
||||
* content/mozapps/extensions/update.js (extensions/content/update.js)
|
||||
* content/mozapps/shared/richview.xml (shared/content/richview.xml)
|
||||
content/mozapps/contents.rdf (contents-content.rdf)
|
||||
|
||||
|
@ -33,6 +35,7 @@ en-US.jar:
|
|||
locale/en-US/mozapps/extensions/extensions.dtd (extensions/locale/extensions.dtd)
|
||||
locale/en-US/mozapps/extensions/extensions.properties (extensions/locale/extensions.properties)
|
||||
locale/en-US/mozapps/extensions/about.dtd (extensions/locale/about.dtd)
|
||||
locale/en-US/mozapps/extensions/update.dtd (extensions/locale/update.dtd)
|
||||
locale/en-US/mozapps/contents.rdf (contents-locale.rdf)
|
||||
|
||||
classic.jar:
|
||||
|
|
Загрузка…
Ссылка в новой задаче