More 170006 Extension Manager Front End - not used yet

This commit is contained in:
ben%bengoodger.com 2004-03-30 04:13:40 +00:00
Родитель 4f7945028c
Коммит c9e795b0f0
10 изменённых файлов: 321 добавлений и 137 удалений

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

@ -45,14 +45,14 @@ interface nsIRDFDataSource;
interface nsIExtensionManager : nsISupports
{
void installExtensionFromStream(in nsIInputStream aStream, in boolean aUseProfile);
void uninstallExtension(in wstring aExtensionID);
void enableExtension(in wstring aExtensionID);
void disableExtension(in wstring aExtensionID);
void uninstallExtension(in string aExtensionID);
void enableExtension(in string aExtensionID);
void disableExtension(in string aExtensionID);
void installTheme(in wstring aThemeID);
void uninstallTheme(in wstring aThemeID);
void enableTheme(in wstring aThemeID);
void disableTheme(in wstring aThemeID);
void installTheme(in string aThemeID);
void uninstallTheme(in string aThemeID);
void enableTheme(in string aThemeID);
void disableTheme(in string aThemeID);
readonly attribute nsIRDFDataSource datasource;
};

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

@ -86,43 +86,43 @@ nsExtensionManager::InstallExtensionFromStream(nsIInputStream* aStream,
}
NS_IMETHODIMP
nsExtensionManager::UninstallExtension(const PRUnichar* aExtensionID)
nsExtensionManager::UninstallExtension(const char* aExtensionID)
{
return mDataSource->SetToBeUninstalled(aExtensionID);
return mDataSource->UninstallExtension(aExtensionID);
}
NS_IMETHODIMP
nsExtensionManager::EnableExtension(const PRUnichar* aExtensionID)
nsExtensionManager::EnableExtension(const char* aExtensionID)
{
return mDataSource->SetToBeEnabled(aExtensionID);
return mDataSource->EnableExtension(aExtensionID);
}
NS_IMETHODIMP
nsExtensionManager::DisableExtension(const PRUnichar* aExtensionID)
nsExtensionManager::DisableExtension(const char* aExtensionID)
{
return mDataSource->SetToBeDisabled(aExtensionID);
return mDataSource->DisableExtension(aExtensionID);
}
NS_IMETHODIMP
nsExtensionManager::InstallTheme(const PRUnichar* aThemeID)
nsExtensionManager::InstallTheme(const char* aThemeID)
{
return NS_OK;
}
NS_IMETHODIMP
nsExtensionManager::UninstallTheme(const PRUnichar* aThemeID)
nsExtensionManager::UninstallTheme(const char* aThemeID)
{
return NS_OK;
}
NS_IMETHODIMP
nsExtensionManager::EnableTheme(const PRUnichar* aThemeID)
nsExtensionManager::EnableTheme(const char* aThemeID)
{
return NS_OK;
}
NS_IMETHODIMP
nsExtensionManager::DisableTheme(const PRUnichar* aThemeID)
nsExtensionManager::DisableTheme(const char* aThemeID)
{
return NS_OK;
}

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

@ -59,6 +59,7 @@ static nsIRDFResource* gNameArc = nsnull;
static nsIRDFResource* gDescriptionArc = nsnull;
static nsIRDFResource* gCreatorArc = nsnull;
static nsIRDFResource* gContributorArc = nsnull;
static nsIRDFResource* gDisabledArc = nsnull;
static nsIRDFResource* gHomepageURLArc = nsnull;
static nsIRDFResource* gUpdateURLArc = nsnull;
static nsIRDFResource* gVersionArc = nsnull;
@ -88,7 +89,19 @@ nsExtensionManagerDataSource::nsExtensionManagerDataSource()
if (!gRDFService)
CallGetService("@mozilla.org/rdf/rdf-service;1", &gRDFService);
gRDFService->GetResource(NS_LITERAL_CSTRING(EM_RDF_URI "name"), &gNameArc);
gRDFService->GetResource(NS_LITERAL_CSTRING(EM_RDF_URI "version"), &gVersionArc);
gRDFService->GetResource(NS_LITERAL_CSTRING(EM_RDF_URI "iconURL"), &gIconURLArc);
gRDFService->GetResource(NS_LITERAL_CSTRING(EM_RDF_URI "toBeEnabled"), &gToBeEnabledArc);
gRDFService->GetResource(NS_LITERAL_CSTRING(EM_RDF_URI "toBeDisabled"), &gToBeDisabledArc);
gRDFService->GetResource(NS_LITERAL_CSTRING(EM_RDF_URI "toBeUninstalled"), &gToBeUninstalledArc);
gRDFService->GetResource(NS_LITERAL_CSTRING(EM_RDF_URI "disabled"), &gDisabledArc);
gRDFService->GetResource(NS_LITERAL_CSTRING(EM_RDF_URI "installLocation"), &gInstallLocationArc);
gRDFService->GetLiteral(NS_LITERAL_STRING("profile").get(), &gInstallProfile);
gRDFService->GetLiteral(NS_LITERAL_STRING("global").get(), &gInstallGlobal);
gRDFService->GetLiteral(NS_LITERAL_STRING("true").get(), &gTrueValue);
gRDFService->GetLiteral(NS_LITERAL_STRING("false").get(), &gFalseValue);
}
nsExtensionManagerDataSource::~nsExtensionManagerDataSource()
@ -99,6 +112,7 @@ nsExtensionManagerDataSource::~nsExtensionManagerDataSource()
NS_IF_RELEASE(gDescriptionArc);
NS_IF_RELEASE(gCreatorArc);
NS_IF_RELEASE(gContributorArc);
NS_IF_RELEASE(gDisabledArc);
NS_IF_RELEASE(gHomepageURLArc);
NS_IF_RELEASE(gUpdateURLArc);
NS_IF_RELEASE(gVersionArc);
@ -269,15 +283,17 @@ nsExtensionManagerDataSource::InstallExtension(nsIRDFDataSource* aSourceDataSour
}
nsresult
nsExtensionManagerDataSource::SetExtensionProperty(const PRUnichar* aExtensionID,
nsExtensionManagerDataSource::SetExtensionProperty(const char* aExtensionID,
nsIRDFResource* aPropertyArc,
nsIRDFNode* aPropertyValue)
{
nsresult rv = NS_OK;
nsCString resourceURI = NS_LITERAL_CSTRING("urn:mozilla:extension:");
resourceURI += aExtensionID;
nsCOMPtr<nsIRDFResource> extension;
gRDFService->GetUnicodeResource(nsDependentString(aExtensionID),
getter_AddRefs(extension));
gRDFService->GetResource(resourceURI, getter_AddRefs(extension));
nsCOMPtr<nsIRDFNode> installLocation;
rv |= GetTarget(extension, gInstallLocationArc, PR_TRUE,
@ -288,7 +304,11 @@ nsExtensionManagerDataSource::SetExtensionProperty(const PRUnichar* aExtensionID
nsCOMPtr<nsIRDFDataSource> ds = isProfile ? mProfileExtensions : mAppExtensions;
nsCOMPtr<nsIRDFNode> oldNode;
SET_PROPERTY(ds, extension, aPropertyArc, aPropertyValue)
rv |= ds->GetTarget(extension, aPropertyArc, PR_FALSE, getter_AddRefs(oldNode));
if (oldNode)
rv |= ds->Change(extension, aPropertyArc, oldNode, aPropertyValue);
else
rv |= ds->Assert(extension, aPropertyArc, aPropertyValue, PR_FALSE);
// Write out the extensions datasource
nsCOMPtr<nsIRDFRemoteDataSource> rds(do_QueryInterface(ds));
@ -299,19 +319,23 @@ nsExtensionManagerDataSource::SetExtensionProperty(const PRUnichar* aExtensionID
}
nsresult
nsExtensionManagerDataSource::SetToBeEnabled(const PRUnichar* aExtensionID)
nsExtensionManagerDataSource::EnableExtension(const char* aExtensionID)
{
return SetExtensionProperty(aExtensionID, gToBeEnabledArc, gTrueValue);
nsresult rv = SetExtensionProperty(aExtensionID, gToBeEnabledArc, gTrueValue);
rv |= SetExtensionProperty(aExtensionID, gDisabledArc, gFalseValue);
return rv;
}
nsresult
nsExtensionManagerDataSource::SetToBeDisabled(const PRUnichar* aExtensionID)
nsExtensionManagerDataSource::DisableExtension(const char* aExtensionID)
{
return SetExtensionProperty(aExtensionID, gToBeDisabledArc, gTrueValue);
nsresult rv = SetExtensionProperty(aExtensionID, gToBeDisabledArc, gTrueValue);
rv |= SetExtensionProperty(aExtensionID, gDisabledArc, gTrueValue);
return rv;
}
nsresult
nsExtensionManagerDataSource::SetToBeUninstalled(const PRUnichar* aExtensionID)
nsExtensionManagerDataSource::UninstallExtension(const char* aExtensionID)
{
return SetExtensionProperty(aExtensionID, gToBeUninstalledArc, gTrueValue);
}
@ -353,8 +377,7 @@ nsExtensionManagerDataSource::GetTarget(nsIRDFResource* aSource,
PRBool aTruthValue,
nsIRDFNode** aResult)
{
nsresult rv;
nsCOMPtr<nsIRDFNode> result;
nsresult rv = NS_OK;
if (aProperty == gIconURLArc) {
PRBool hasIconURLArc;
@ -367,15 +390,22 @@ nsExtensionManagerDataSource::GetTarget(nsIRDFResource* aSource,
nsCOMPtr<nsIRDFResource> res;
gRDFService->GetResource(NS_LITERAL_CSTRING("chrome://mozapps/skin/xpinstall/xpinstallItemGeneric.png"),
getter_AddRefs(res));
result = do_QueryInterface(res);
*aResult = result;
*aResult = res;
NS_IF_ADDREF(*aResult);
}
}
else if (aProperty == gInstallLocationArc) {
PRBool hasNameArc, hasVersionArc;
rv |= mProfileExtensions->HasArcOut(aSource, gNameArc, &hasNameArc);
rv |= mProfileExtensions->HasArcOut(aSource, gVersionArc, &hasVersionArc);
if (!result)
rv = mComposite->GetTarget(aSource, aProperty, aTruthValue, aResult);
*aResult = (hasNameArc && hasVersionArc) ? gInstallProfile : gInstallGlobal;
NS_IF_ADDREF(*aResult);
}
if (!*aResult)
rv |= mComposite->GetTarget(aSource, aProperty, aTruthValue, aResult);
return rv;
}

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

@ -57,14 +57,14 @@ public:
nsresult InstallExtension(nsIRDFDataSource* aSourceDataSource,
PRBool aProfile);
nsresult SetToBeEnabled(const PRUnichar* aExtensionID);
nsresult SetToBeDisabled(const PRUnichar* aExtensionID);
nsresult SetToBeUninstalled(const PRUnichar* aExtensionID);
nsresult EnableExtension(const char* aExtensionID);
nsresult DisableExtension(const char* aExtensionID);
nsresult UninstallExtension(const char* aExtensionID);
nsresult LoadExtensions(PRBool aProfile);
protected:
nsresult SetExtensionProperty(const PRUnichar* aExtensionID,
nsresult SetExtensionProperty(const char* aExtensionID,
nsIRDFResource* aPropertyArc,
nsIRDFNode* aPropertyValue);
void InitLexicalResources();

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

@ -1,40 +1,3 @@
# -*- 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 *****
///////////////////////////////////////////////////////////////////////////////
// Globals
@ -45,6 +8,11 @@ var gDownloadListener = null;
var gExtensionssView = null;
var gWindowState = "";
function stripPrefix(aResourceURI)
{
return aResourceURI.substr("urn:mozilla:extension:".length, aResourceURI.length);
}
///////////////////////////////////////////////////////////////////////////////
// Utility Functions
function setRDFProperty(aID, aProperty, aValue)
@ -203,7 +171,44 @@ function onExtensionUpdate(aEvent)
function onExtensionEnableDisable(aEvent)
{
var titleKey = null;
var disabling;
if (aEvent.target.getAttribute("disabled") == "true") {
disabling = false;
if (gWindowState == "extensions") {
gExtensionManager.enableExtension(stripPrefix(aEvent.target.id));
titleKey = "restartBeforeEnableExtensionTitle";
}
else if (gWindowState == "themes") {
gExtensionManager.enableTheme(stripPrefix(aEvent.target.id));
titleKey = "restartBeforeEnableThemeTitle";
}
}
else {
disabling = true;
if (gWindowState == "extensions") {
gExtensionManager.disableExtension(stripPrefix(aEvent.target.id));
titleKey = "restartBeforeDisableExtensionTitle";
}
else if (gWindowState == "themes") {
gExtensionManager.disableTheme(stripPrefix(aEvent.target.id));
titleKey = "restartBeforeDisableThemeTitle";
}
}
if (titleKey) {
var promptSvc = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
.getService(Components.interfaces.nsIPromptService);
var extensionsStrings = document.getElementById("extensionsStrings");
var messageKey = disabling ? "restartBeforeDisableMessage" : "restartBeforeEnableMessage";
var brandStrings = document.getElementById("brandStrings");
var message = extensionsStrings.getFormattedString(messageKey,
[aEvent.target.getAttribute("name"),
brandStrings.getString("brandShortName")]);
promptSvc.alert(window, extensionsStrings.getString(titleKey), message);
}
}
function onExtensionUninstall(aEvent)
@ -331,29 +336,103 @@ var gExtensionsDNDObserver =
var gExtensionsViewController = {
supportsCommand: function (aCommand)
{
return aCommand == "cmd_cleanUp";
var commandNode = document.getElementById(aCommand);
return commandNode && (commandNode.parentNode == document.getElementById("extensionsCommands"));
},
isCommandEnabled: function (aCommand)
{
if (aCommand == "cmd_cleanUp")
return gDownloadManager.canCleanUp;
var selectedItem = gExtensionsView.selected;
var i;
switch (aCommand) {
case "cmd_close":
return true;
case "cmd_options":
dump("*** ice = " + selectedItem.disabled + "\n");
return !selectedItem.disabled;
case "cmd_about":
return !selectedItem || selectedItem.disabled ? selectedItem.getAttribute("aboutURL") == "" : true;
case "cmd_homepage":
return (selectedItem && selectedItem.getAttribute("homepageURL") != "");
case "cmd_uninstall":
return selectedItem.getAttribute("blockUninstall") != "true";
case "cmd_update":
return true;
case "cmd_disable":
return !selectedItem.disabled;
case "cmd_movetop":
return (gExtensionsView.children[0] != selectedItem);
case "cmd_moveup":
return (gExtensionsView.children[0] != selectedItem);
case "cmd_movedn":
var children = gExtensionsView.children;
return (children[children.length-1] != selectedItem);
}
return false;
},
doCommand: function (aCommand)
{
if (aCommand == "cmd_cleanUp" && this.isCommandEnabled(aCommand)) {
gDownloadManager.cleanUp();
this.onCommandUpdate();
dump("*** doCommand = " + aCommand + "\n");
switch (aCommand) {
case "cmd_close":
case "cmd_options":
case "cmd_about":
case "cmd_homepage":
case "cmd_uninstall":
case "cmd_update":
case "cmd_disable":
case "cmd_movetop":
case "cmd_moveup":
case "cmd_movedn":
}
},
onCommandUpdate: function ()
{
var command = "cmd_cleanUp";
var enabled = this.isCommandEnabled(command);
goSetCommandEnabled(command, enabled);
var extensionsCommands = document.getElementById("extensionsCommands");
for (var i = 0; i < extensionsCommands.childNodes.length; ++i) {
var command = extensionsCommands.childNodes[i];
if (this.isCommandEnabled(command.id))
command.removeAttribute("disabled");
else
command.setAttribute("disabled", "true");
}
}
};
# -*- 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 *****

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

@ -47,7 +47,7 @@
xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
xmlns:xbl="http://www.mozilla.org/xbl">
<binding id="extension">
<binding id="extension" extends="chrome://mozapps/content/shared/richview.xml#richview-item">
<resources>
<stylesheet src="chrome://mozapps/skin/extensions/extensions.css"/>
</resources>
@ -79,17 +79,7 @@
</xul:hbox>
</content>
<implementation>
<method name="fireEvent">
<parameter name="aEventType"/>
<body>
<![CDATA[
var e = document.createEvent("Events");
e.initEvent("extension-" + aEventType, false, true);
this.dispatchEvent(e);
]]>
</body>
</method>
<field name="eventPrefix">"extension-"</field>
</implementation>
</binding>

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

@ -63,41 +63,48 @@
</stringbundleset>
<keyset id="extensionsKeys">
<key id="key_close" key="&cmd.close.commandKey;" oncommand="closeWindow(true);" modifiers="accel"/>
<key id="key_info" key="&cmd.info.commandKey;" oncommand="onExtensionViewAbout();" modifiers="accel"/>
<key id="key_options" key="&cmd.options.commandKey;" oncommand="onExtensionViewOptions();" modifiers="accel"/>
<key id="key_close" key="&cmd.close.commandKey;" modifiers="accel" command="cmd_close"/>
<key id="key_about" key="&cmd.info.commandKey;" modifiers="accel" command="cmd_about"/>
<key id="key_options" key="&cmd.options.commandKey;" modifiers="accel" command="cmd_options"/>
</keyset>
<commandset id="extensionsCommands"
events="richview-select"
commandupdater="true"
oncommandupdate="gExtensionsViewController.onCommandUpdate();">
<command id="cmd_close" oncommand="closeWindow(true);"/>
<command id="cmd_options" oncommand="onExtensionViewOptions();"/>
<command id="cmd_about" oncommand="onExtensionViewAbout();"/>
<command id="cmd_homepage" oncommand="onExtensionViewHomepage();"/>
<command id="cmd_uninstall" oncommand="onExtensionUninstall();"/>
<command id="cmd_update" oncommand="onExtensionUpdate();"/>
<command id="cmd_disable" oncommand="onExtensionEnableDisable();"/>
<command id="cmd_movetop" oncommand="onExtensionMoveTop();"/>
<command id="cmd_moveup" oncommand="onExtensionMoveUp();"/>
<command id="cmd_movedn" oncommand="onExtensionMoveDn();"/>
</commandset>
<vbox id="contextMenuPalette" hidden="true">
<menuitem id="menuitem_options" default="true"
label="&cmd.options.label;" accesskey="&cmd.options.accesskey;"
oncommand="fireEventForElement(gExtensionsView.selected, 'show-options');"/>
<menuitem id="menuitem_homepage"
label="&cmd.homepage.label;" accesskey="&cmd.homepage.accesskey;"
oncommand="fireEventForElement(gExtensionsView.selected, 'show-homepage');"/>
<menuitem id="menuitem_about"
label="&cmd.about.label;" accesskey="&cmd.about.accesskey;"
oncommand="fireEventForElement(gExtensionsView.selected, 'show-info');"/>
<menuitem id="menuitem_options" default="true" command="cmd_options"
label="&cmd.options.label;" accesskey="&cmd.options.accesskey;"/>
<menuitem id="menuitem_homepage" command="cmd_homepage"
label="&cmd.homepage.label;" accesskey="&cmd.homepage.accesskey;"/>
<menuitem id="menuitem_about" command="cmd_about"
label="&cmd.about.label;" accesskey="&cmd.about.accesskey;"/>
<menuseparator id="menuseparator_1"/>
<menuitem id="menuitem_uninstall"
label="&cmd.uninstall.label;" accesskey="&cmd.uninstall.accesskey;"
oncommand="fireEventForElement(gExtensionsView.selected, 'uninstall');"/>
<menuitem id="menuitem_update"
label="&cmd.update.label;" accesskey="&cmd.update.accesskey;"
oncommand="fireEventForElement(gExtensionsView.selected, 'update');"/>
<menuitem id="menuitem_disable"
label="&cmd.disable.label;" accesskey="&cmd.disable.accesskey;"
oncommand="fireEventForElement(gExtensionsView.selected, 'disable');"/>
<menuitem id="menuitem_uninstall" command="cmd_uninstall"
label="&cmd.uninstall.label;" accesskey="&cmd.uninstall.accesskey;"/>
<menuitem id="menuitem_update" command="cmd_update"
label="&cmd.update.label;" accesskey="&cmd.update.accesskey;"/>
<menuitem id="menuitem_disable" command="cmd_disable"
label="&cmd.disable.label;" accesskey="&cmd.disable.accesskey;"/>
<menuseparator id="menuseparator_2"/>
<menuitem id="menuitem_moveTop"
label="&cmd.moveToTop.label;" accesskey="&cmd.moveToTop.accesskey;"
oncommand="fireEventForElement(gExtensionsView.selected, 'move-top');"/>
<menuitem id="menuitem_moveUp"
label="&cmd.moveUp.label;" accesskey="&cmd.moveUp.accesskey;"
oncommand="fireEventForElement(gExtensionsView.selected, 'move-up');"/>
<menuitem id="menuitem_moveDn"
label="&cmd.moveDn.label;" accesskey="&cmd.moveDn.accesskey;"
oncommand="fireEventForElement(gExtensionsView.selected, 'move-dn');"/>
<menuitem id="menuitem_moveTop" command="cmd_movetop"
label="&cmd.moveToTop.label;" accesskey="&cmd.moveToTop.accesskey;"/>
<menuitem id="menuitem_moveUp" command="cmd_moveup"
label="&cmd.moveUp.label;" accesskey="&cmd.moveUp.accesskey;"/>
<menuitem id="menuitem_moveDn" command="cmd_movedn"
label="&cmd.moveDn.label;" accesskey="&cmd.moveDn.accesskey;"/>
</vbox>
<popup id="extensionContextMenu" onpopupshowing="return buildContextMenu(event);"/>
@ -132,17 +139,24 @@
<binding subject="?extension"
predicate="http://www.mozilla.org/2004/em-rdf#updateURL"
object="?update-url"/>
<binding subject="?extension"
predicate="http://www.mozilla.org/2004/em-rdf#disabled"
object="?disabled"/>
<binding subject="?extension"
predicate="http://www.mozilla.org/2004/em-rdf#homepageURL"
object="?homepage-url"/>
<binding subject="?extension"
predicate="http://www.mozilla.org/2004/em-rdf#description"
object="?description"/>
<binding subject="?extension"
predicate="http://www.mozilla.org/2004/em-rdf#blockUninstall"
object="?block-uninstall"/>
</bindings>
<action>
<extension uri="?extension" context="extensionContextMenu"
image="?icon" name="?name" version="?version"
description="?description" creator="?creator"
disabled="?disabled" blockUninstall="?block-uninstall"
optionsURL="?options-url" homepageURL="?homepage-url"
aboutURL="?about-url" updateURL="?update-url"/>
</action>

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

@ -2,3 +2,10 @@ aboutWindowTitle=About %S
aboutWindowCloseButton=Close
aboutWindowVersionString=version %S
aboutExtension=About %S...
restartBeforeEnableExtensionTitle=Enable Extension
restartBeforeDisableExtensionTitle=Disable Extension
restartBeforeEnableThemeTitle=Enable Theme
restartBeforeDisableThemeTitle=Disable Theme
restartBeforeEnableMessage=%S will be enabled the next time you restart %S.
restartBeforeDisableMessage=%S will be disabled the next time you restart %S.

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

@ -64,6 +64,15 @@ extension {
extension[disabled="true"] {
color: GrayText;
background-image: none;
}
extension[disabled="true"][selected="true"] {
background-image: url("chrome://mozapps/skin/shared/itemSelected.png");
}
extension[disabled="true"] .extension-icon {
opacity: 0.3;
}
.extension-item-name {

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

@ -49,17 +49,33 @@
<body>
<![CDATA[
var e = document.createEvent("Events");
e.initEvent("extension-" + aEventType, false, true);
e.initEvent(this.eventPrefix + aEventType, false, true);
this.dispatchEvent(e);
]]>
</body>
</method>
<property name="disabled" onget="return this.getAttribute('disabled') == 'true'"
onset="this.setAttribute('disabled', val); return val;"/>
</implementation>
</binding>
<binding id="richview">
<implementation>
<method name="fireEvent">
<parameter name="aEventType"/>
<body>
<![CDATA[
var e = document.createEvent("Events");
var eventType = "richview-" + aEventType;
e.initEvent(eventType, false, true);
this.dispatchEvent(e);
document.commandDispatcher.updateCommands(eventType);
]]>
</body>
</method>
<field name="_selected">null</field>
<property name="selected">
<setter>
@ -69,6 +85,8 @@
this._selected = val;
if (this._selected)
this._selected.setAttribute("selected", "true");
this.fireEvent("select");
]]>
</setter>
<getter>
@ -78,17 +96,43 @@
</getter>
</property>
<method name="selectForwardInternal">
<parameter name="aElement"/>
<body>
<![CDATA[
for (var temp = aElement; temp; temp = temp.nextSibling) {
if ("fireEvent" in temp) {
this.selected = temp;
break;
}
}
]]>
</body>
</method>
<method name="selectBackwardInternal">
<parameter name="aElement"/>
<body>
<![CDATA[
for (var temp = aElement; temp; temp = temp.previousSibling) {
if ("fireEvent" in temp) {
this.selected = temp;
break;
}
}
]]>
</body>
</method>
<method name="selectionForward">
<parameter name="aEvent"/>
<body>
<![CDATA[
if (this.selected) {
if (this.selected.nextSibling)
this.selected = this.selected.nextSibling;
}
if (this.selected)
this.selectForwardInternal(this.selected.nextSibling);
else {
if (this.hasChildNodes())
this.selected = this.firstChild.nextSibling;
this.selectForwardInternal(this.firstChild);
}
]]>
</body>
@ -98,17 +142,28 @@
<parameter name="aEvent"/>
<body>
<![CDATA[
if (this.selected) {
if (this.selected.previousSibling)
this.selected = this.selected.previousSibling;
}
if (this.selected)
this.selectBackwardInternal(this.selected.previousSibling);
else {
if (this.hasChildNodes())
this.selected = this.lastChild;
this.selectBackwardInternal(this.lastChild);
}
]]>
</body>
</method>
<property name="children">
<getter>
<![CDATA[
var childNodes = [];
for (var i = 0; i < this.childNodes.length; ++i) {
if ("fireEvent" in this.childNodes[i])
childNodes.push(this.childNodes[i]);
}
return childNodes;
]]>
</getter>
</property>
</implementation>
<handlers>
<handler event="click">