diff --git a/mozilla/toolkit/components/Makefile.in b/mozilla/toolkit/components/Makefile.in index 41e77e7ef95..642dd8f1bb6 100644 --- a/mozilla/toolkit/components/Makefile.in +++ b/mozilla/toolkit/components/Makefile.in @@ -51,7 +51,6 @@ else DIRS = \ autocomplete \ console \ - extensions \ filepicker \ help \ history \ diff --git a/mozilla/toolkit/components/build/Makefile.in b/mozilla/toolkit/components/build/Makefile.in index 99e7f6f031e..34732fa4bac 100644 --- a/mozilla/toolkit/components/build/Makefile.in +++ b/mozilla/toolkit/components/build/Makefile.in @@ -45,7 +45,6 @@ REQUIRES = \ docshell \ autocomplete \ downloads \ - extensions \ mimetype \ webbrowserpersist \ progressDlg \ @@ -68,7 +67,6 @@ CPPSRCS = nsModule.cpp LOCAL_INCLUDES = \ -I$(srcdir)/../autocomplete/src \ -I$(srcdir)/../downloads/src \ - -I$(srcdir)/../extensions/src \ -I$(srcdir)/../history/src \ -I$(srcdir)/../satchel/src \ -I$(srcdir)/../passwordmgr/base \ @@ -81,7 +79,6 @@ endif SHARED_LIBRARY_LIBS = \ $(DIST)/lib/$(LIB_PREFIX)autocomplete_s.$(LIB_SUFFIX) \ $(DIST)/lib/$(LIB_PREFIX)download_s.$(LIB_SUFFIX) \ - $(DIST)/lib/$(LIB_PREFIX)extensions_s.$(LIB_SUFFIX) \ $(DIST)/lib/$(LIB_PREFIX)history_s.$(LIB_SUFFIX) \ $(DIST)/lib/$(LIB_PREFIX)satchel_s.$(LIB_SUFFIX) \ $(DIST)/lib/$(LIB_PREFIX)passwordmgr_s.$(LIB_SUFFIX) \ diff --git a/mozilla/toolkit/components/build/nsModule.cpp b/mozilla/toolkit/components/build/nsModule.cpp index 057a89b5501..e6cc81b4188 100644 --- a/mozilla/toolkit/components/build/nsModule.cpp +++ b/mozilla/toolkit/components/build/nsModule.cpp @@ -46,7 +46,6 @@ #include "nsAutoCompleteMdbResult.h" #include "nsDownloadManager.h" #include "nsDownloadProxy.h" -#include "nsExtensionManager.h" #include "nsFormHistory.h" #include "nsFormFillController.h" #include "nsGlobalHistory.h" @@ -62,7 +61,6 @@ NS_GENERIC_FACTORY_CONSTRUCTOR(nsAutoCompleteController) NS_GENERIC_FACTORY_CONSTRUCTOR(nsAutoCompleteMdbResult) NS_GENERIC_FACTORY_CONSTRUCTOR(nsDownloadProxy) NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsDownloadManager, Init) -NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsExtensionManager, Init) NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(nsFormHistory, nsFormHistory::GetInstance) NS_GENERIC_FACTORY_CONSTRUCTOR(nsFormFillController) NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsGlobalHistory, Init) @@ -108,13 +106,6 @@ static const nsModuleComponentInfo components[] = NS_DOWNLOAD_CONTRACTID, nsDownloadProxyConstructor }, - { "Extension Manager", - NS_EXTENSIONMANAGER_CID, - NS_EXTENSIONMANAGER_CONTRACTID, - nsExtensionManagerConstructor, - nsExtensionManager::Register, - nsnull }, - { "HTML Form History", NS_FORMHISTORY_CID, NS_FORMHISTORY_CONTRACTID, diff --git a/mozilla/toolkit/components/build/nsToolkitCompsCID.h b/mozilla/toolkit/components/build/nsToolkitCompsCID.h index fe93cddd720..c01e71751dd 100644 --- a/mozilla/toolkit/components/build/nsToolkitCompsCID.h +++ b/mozilla/toolkit/components/build/nsToolkitCompsCID.h @@ -50,9 +50,6 @@ #define NS_DOWNLOADMANAGER_CONTRACTID \ "@mozilla.org/download-manager;1" -#define NS_EXTENSIONMANAGER_CONTRACTID \ - "@mozilla.org/extension-manager;1" - #define NS_FORMHISTORY_CONTRACTID \ "@mozilla.org/satchel/form-history;1" @@ -85,10 +82,6 @@ #define NS_DOWNLOADMANAGER_CID \ { 0xedb0490e, 0x1dd1, 0x11b2, { 0x83, 0xb8, 0xdb, 0xf8, 0xd8, 0x59, 0x06, 0xa6 } } -// {8A115FAA-7DCB-4e8f-979B-5F53472F51CF} -#define NS_EXTENSIONMANAGER_CID \ -{ 0x8a115faa, 0x7dcb, 0x4e8f, { 0x97, 0x9b, 0x5f, 0x53, 0x47, 0x2f, 0x51, 0xcf } } - // {895DB6C7-DBDF-40ea-9F64-B175033243DC} #define NS_FORMFILLCONTROLLER_CID \ { 0x895db6c7, 0xdbdf, 0x40ea, { 0x9f, 0x64, 0xb1, 0x75, 0x3, 0x32, 0x43, 0xdc } } diff --git a/mozilla/toolkit/components/extensions/public/nsIExtensionManager.idl b/mozilla/toolkit/components/extensions/public/nsIExtensionManager.idl index 0b081cc6534..6547a657e12 100644 --- a/mozilla/toolkit/components/extensions/public/nsIExtensionManager.idl +++ b/mozilla/toolkit/components/extensions/public/nsIExtensionManager.idl @@ -48,11 +48,11 @@ interface nsIExtensionManager : nsISupports void uninstallExtension(in string aExtensionID); void enableExtension(in string aExtensionID); void disableExtension(in string aExtensionID); + void updateExtension(in string aExtensionID); void installTheme(in string aThemeID); void uninstallTheme(in string aThemeID); - void enableTheme(in string aThemeID); - void disableTheme(in string aThemeID); + void updateTheme(in string aThemeID); readonly attribute nsIRDFDataSource datasource; }; diff --git a/mozilla/toolkit/components/extensions/src/nsExtensionManager.cpp b/mozilla/toolkit/components/extensions/src/nsExtensionManager.cpp index 2f8a9f3444e..672fb51e4de 100644 --- a/mozilla/toolkit/components/extensions/src/nsExtensionManager.cpp +++ b/mozilla/toolkit/components/extensions/src/nsExtensionManager.cpp @@ -103,6 +103,20 @@ nsExtensionManager::DisableExtension(const char* aExtensionID) return mDataSource->DisableExtension(aExtensionID); } +NS_IMETHODIMP +nsExtensionManager::UpdateExtension(const char* aExtensionID) +{ + nsXPIDLString updateURL; + mDataSource->GetUpdateURL(getter_Copies(updateURL)); + + if (str) { + + + } + + return NS_OK; +} + NS_IMETHODIMP nsExtensionManager::InstallTheme(const char* aThemeID) { @@ -127,6 +141,12 @@ nsExtensionManager::DisableTheme(const char* aThemeID) return NS_OK; } +NS_IMETHODIMP +nsExtensionManager::UpdateTheme(const char* aThemeID) +{ + return NS_OK; +} + NS_METHOD nsExtensionManager::Register(nsIComponentManager* aCompMgr, nsIFile* aPath, diff --git a/mozilla/toolkit/components/extensions/src/nsExtensionManagerDataSource.cpp b/mozilla/toolkit/components/extensions/src/nsExtensionManagerDataSource.cpp index a4fcff38dd9..ebb2175743c 100644 --- a/mozilla/toolkit/components/extensions/src/nsExtensionManagerDataSource.cpp +++ b/mozilla/toolkit/components/extensions/src/nsExtensionManagerDataSource.cpp @@ -43,14 +43,12 @@ #include "nsIIOService.h" #include "nsILocalFile.h" #include "nsIProtocolHandler.h" +#include "nsIRDFContainer.h" #include "nsIRDFRemoteDataSource.h" #include "nsIRDFService.h" #include "nsLiteralString.h" #include "rdf.h" -/////////////////////////////////////////////////////////////////////////////// -// nsIRDFDataSource - NS_IMPL_ISUPPORTS2(nsExtensionManagerDataSource, nsIRDFDataSource, nsIRDFRemoteDataSource) static nsIRDFService* gRDFService = nsnull; @@ -82,9 +80,17 @@ static nsIRDFLiteral* gTrueValue = nsnull; static nsIRDFLiteral* gFalseValue = nsnull; static nsIRDFLiteral* gInstallProfile = nsnull; static nsIRDFLiteral* gInstallGlobal = nsnull; +static nsIRDFResource* gExtensionsRoot = nsnull; +static nsIRDFResource* gThemesRoot = nsnull; #define EM_RDF_URI "http://www.mozilla.org/2004/em-rdf#" +#define PREF_EM_DEFAULTUPDATEURL "update.url.extensions" +#define PREF_EM_APP_ID "app.id" + +/////////////////////////////////////////////////////////////////////////////// +// nsIRDFDataSource + nsExtensionManagerDataSource::nsExtensionManagerDataSource() { if (!gRDFService) @@ -103,6 +109,9 @@ nsExtensionManagerDataSource::nsExtensionManagerDataSource() gRDFService->GetLiteral(NS_LITERAL_STRING("global").get(), &gInstallGlobal); gRDFService->GetLiteral(NS_LITERAL_STRING("true").get(), &gTrueValue); gRDFService->GetLiteral(NS_LITERAL_STRING("false").get(), &gFalseValue); + + gRDFService->GetResource(NS_LITERAL_CSTRING("urn:mozilla:extension:root"), &gExtensionsRoot); + gRDFService->GetResource(NS_LITERAL_CSTRING("urn:mozilla:themes:root"), &gThemesRoot); } nsExtensionManagerDataSource::~nsExtensionManagerDataSource() @@ -135,6 +144,8 @@ nsExtensionManagerDataSource::~nsExtensionManagerDataSource() NS_IF_RELEASE(gFalseValue); NS_IF_RELEASE(gInstallProfile); NS_IF_RELEASE(gInstallGlobal); + NS_IF_RELEASE(gExtensionsRoot); + NS_IF_RELEASE(gThemesRoot); } /////////////////////////////////////////////////////////////////////////////// @@ -330,9 +341,115 @@ nsExtensionManagerDataSource::DisableExtension(const char* aExtensionID) nsresult nsExtensionManagerDataSource::UninstallExtension(const char* aExtensionID) { + nsCOMPtr ctr(do_CreateInstance("@mozilla.org/rdf/container;1")); + ctr->Init(this, gExtensionsRoot); + + nsCString resourceURI = NS_LITERAL_CSTRING("urn:mozilla:extension:"); + resourceURI += aExtensionID; + + nsCOMPtr extension; + gRDFService->GetResource(resourceURI, getter_AddRefs(extension)); + + ctr->RemoveElement(extension, PR_TRUE); + return SetExtensionProperty(aExtensionID, gToBeUninstalledArc, gTrueValue); } +// This returns an array of URIs in the form: +// http://www.foo.com/software/ext1/update.cgi +// http://www.bar.com/update.php?ext=%7B0e4007ea-0b6b-4487-8e1b-479f65599e74%7D +// http://update.mozilla.org/genericUpdate.php?ext=%7B0e4007ea-0b6b-4487-8e1b-479f65599e74%7D%2C%7B0e4007ea-0b6b-4487-8e1b-479f65599e74%7D&app=%7Bec8030f7-c20a-464f-9b0e-13a3a9e97384%7D +// (specific URLs first, followed by a generic +nsresult +nsExtensionManagerDataSource::GetConsolidatedUpdateURLs(nsISupportsArray* aURIs) +{ + nsCOMPtr ctr(do_CreateInstance("@mozilla.org/rdf/container;1")); + ctr->Init(this, gExtensionsRoot); + + nsCOMPtr e; + ctr->GetElements(getter_AddRefs(e)); + + do { + e->HasMoreElements(&hasMore); + if (!hasMore) + break; + + nsCOMPtr res; + e->GetNext(getter_AddRefs(res)); + + nsCAutoString url; + GetUpdateURLForExtensionInternal(res, url); + + // If there's no specific Update URL specified for this extension, we want to + // add this extension to the list that we'll pass to the generic update server. + if (url.IsEmpty()) { + + } + + + } + while (PR_TRUE); +} + +nsresult +nsExtensionManagerDataSource::GetUpdateURLForExtension(const char* aExtensionID, PRUnichar* aResult) +{ + nsCString resourceURI = NS_LITERAL_CSTRING("urn:mozilla:extension:"); + resourceURI += aExtensionID; + + nsCOMPtr extension; + gRDFService->GetResource(resourceURI, getter_AddRefs(extension)); + + nsCAutoString url; + GetUpdateURLForExtensionInternal(extension, url); + +} + +void +nsExtensionManagerDataSource::GetUpdateURLForExtensionInternal(nsIRDFResource* aResource, nsACString& aResult) +{ + PRBool hasUpdateURLArc; + mDataSource->HasArcOut(extension, gUpdateURLArc, &hasUpdateURLArc); + if (hasUpdateURLArc) { + nsCOMPtr updateURL; + mDataSource->GetTarget(extension, gUpdateURLArc, PR_TRUE, getter_AddRefs(updateURL)); + + nsCOMPtr updateURLResource(do_QueryInterface(updateURL)); + + if (updateURLResource) { + nsXPIDLCString value; + updateURLResource->GetValueConst(getter_Shares(value)); + + nsXPIDLCString app; + nsCOMPtr prefSvc(do_GetService(NS_PREFSERVICE_CONTRACTID)); + prefSvc->GetCharPref(PREF_EM_APP_ID, getter_Copies(app)); + + nsXPIDLCString id; + extension->GetValue(getter_Copies(id)); + const nsACString& extensionPrefix = NS_LITERAL_CSTRING("urn:mozilla:extension:"); + PRInt32 prefixLength = extensionPrefix.Length(); + id.Cut(prefixLength, id.Length() - prefixLength); + + ReplaceAll(value, NS_LITERAL_CSTRING("%APP%"), app); + ReplaceAll(value, NS_LITERAL_CSTRING("%ITEM%"), id); + + aResult = value; + } + } +} + +void +nsExtensionManagerDataSource::ReplaceAll(nsACString& aString, const nsACString& aKey, const nsACString& aReplace) +{ + nsACString::const_iterator startString, startSubstring, end; + aString.BeginReading(startString); + aString.BeginReading(startSubstring); + aString.EndReading(end); + + while (FindInReadable(aKey, startSubstring, end)) + aString.Replace(Distance(startString, startSubstring), aKey.Length(), aReplace); +} + /////////////////////////////////////////////////////////////////////////////// // nsIRDFDataSource diff --git a/mozilla/toolkit/components/extensions/src/nsExtensionManagerDataSource.h b/mozilla/toolkit/components/extensions/src/nsExtensionManagerDataSource.h index 17c71284544..fa29125024b 100644 --- a/mozilla/toolkit/components/extensions/src/nsExtensionManagerDataSource.h +++ b/mozilla/toolkit/components/extensions/src/nsExtensionManagerDataSource.h @@ -66,6 +66,12 @@ public: nsresult LoadExtensions(PRBool aProfile); + nsresult GetUpdateURL(PRUnichar** aResult); + void GetUpdateURLForExtensionInternal(nsIRDFResource* aResource, + nsACString& aResult); + void ReplaceAll(nsACString& aString, const nsACString& aKey, + const nsACString& aReplace); + protected: nsresult SetExtensionProperty(const char* aExtensionID, nsIRDFResource* aPropertyArc, diff --git a/mozilla/toolkit/mozapps/Makefile.in b/mozilla/toolkit/mozapps/Makefile.in index ff5ff2ff943..199f7ac2bfa 100755 --- a/mozilla/toolkit/mozapps/Makefile.in +++ b/mozilla/toolkit/mozapps/Makefile.in @@ -42,7 +42,7 @@ VPATH = @srcdir@ include $(DEPTH)/config/autoconf.mk -DIRS = downloads xpinstall +DIRS = downloads extensions xpinstall ifneq (,$(filter mac cocoa,$(MOZ_WIDGET_TOOLKIT))) # XXXben this is temporary, until Thunderbird is converted to Pinstripe on MacOS X. For now, diff --git a/mozilla/toolkit/mozapps/extensions/content/extensions.js b/mozilla/toolkit/mozapps/extensions/content/extensions.js index bb994f9e89e..1b7f7c7097d 100644 --- a/mozilla/toolkit/mozapps/extensions/content/extensions.js +++ b/mozilla/toolkit/mozapps/extensions/content/extensions.js @@ -44,7 +44,10 @@ function flushDataSource() // Event Handlers function onExtensionSelect(aEvent) { - aEvent.target.setAttribute("last-selected", aEvent.target.selected.id); + if (aEvent.target.selected) + aEvent.target.setAttribute("last-selected", aEvent.target.selected.id); + else + aEvent.target.removeAttribute("last-selected"); } /////////////////////////////////////////////////////////////////////////////// @@ -270,7 +273,6 @@ var gExtensionsViewController = { commands: { cmd_close: function () { - dump("*** close \n"); closeWindow(true); }, @@ -363,24 +365,61 @@ var gExtensionsViewController = { cmd_update: function () { - var updateURL = gExtensionsView.selected.getAttribute("updateURL"); - if (updateURL) { - - } - else { - "smartupdate.update.extensions" - } + 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); }, cmd_uninstall: function () { - + // Confirm the uninstall + var extensionsStrings = document.getElementById("extensionsStrings"); + var brandStrings = document.getElementById("brandStrings"); + + var name = gExtensionsView.selected.getAttribute("name"); + var title = extensionsStrings.getFormattedString("queryUninstallTitle", [name]); + if (gWindowState == "extensions") + message = extensionsStrings.getFormattedString("queryUninstallExtensionMessage", [name, name]); + else if (gWindowState == "themes") + message = extensionsStrings.getFormattedString("queryUninstallThemeMessage", [name]); + + // XXXben - improve the wording on the buttons here! + var promptSvc = Components.classes["@mozilla.org/embedcomp/prompt-service;1"] + .getService(Components.interfaces.nsIPromptService); + if (!promptSvc.confirm(window, title, message)) + return; + + var selectedID = gExtensionsView.selected.id; + var selectedElement = document.getElementById(selectedID); + var nextElement = selectedElement.nextSibling; + if (!nextElement) + nextElement = selectedElement.previousSibling; + nextElement = nextElement.id; + + if (gWindowState == "extensions") + gExtensionManager.uninstallExtension(stripPrefix(selectedID)); + else if (gWindowState == "themes") + gExtensionManager.uninstallTheme(stripPrefix(selectedID)); + + gExtensionsView.selected = document.getElementById(nextElement); + +#if ANNOYING_ASS_ALERTS + // Show an alert message telling the user they need to restart for the + // action to take effect. + message = extensionsStrings.getFormattedString("restartBeforeUninstallMessage", + [gExtensionsView.selected.getAttribute("name"), + brandStrings.getString("brandShortName")]); + + promptSvc.alert(window, extensionsStrings.getString("restartBeforeUninstallTitle"), message); +#endif }, cmd_disable: function () { gExtensionManager.disableExtension(stripPrefix(gExtensionsView.selected.id)); +#if ANNOYING_ASS_ALERTS // Show an alert message telling the user they need to restart for the // action to take effect. var extensionsStrings = document.getElementById("extensionsStrings"); @@ -393,12 +432,14 @@ var gExtensionsViewController = { var promptSvc = Components.classes["@mozilla.org/embedcomp/prompt-service;1"] .getService(Components.interfaces.nsIPromptService); promptSvc.alert(window, extensionsStrings.getString("restartBeforeDisableTitle"), message); +#endif }, cmd_enable: function () { gExtensionManager.enableExtension(stripPrefix(gExtensionsView.selected.id)); +#if ANNOYING_ASS_ALERTS // Show an alert message telling the user they need to restart for the // action to take effect. var extensionsStrings = document.getElementById("extensionsStrings"); @@ -411,6 +452,7 @@ var gExtensionsViewController = { var promptSvc = Components.classes["@mozilla.org/embedcomp/prompt-service;1"] .getService(Components.interfaces.nsIPromptService); promptSvc.alert(window, extensionsStrings.getString("restartBeforeEnableTitle"), message); +#endif }, } }; diff --git a/mozilla/toolkit/mozapps/extensions/content/extensions.xul b/mozilla/toolkit/mozapps/extensions/content/extensions.xul index 86334f2ddcc..790f4a4f2d4 100644 --- a/mozilla/toolkit/mozapps/extensions/content/extensions.xul +++ b/mozilla/toolkit/mozapps/extensions/content/extensions.xul @@ -186,7 +186,7 @@