[Pkg-mozext-commits] [SCM] iceweasel extension that enables customization of webpages with user scripts branch, master, updated. debian/0.9.11-1-2-g808196f

Andrea Veri av at src.gnome.org
Thu Sep 29 21:06:58 UTC 2011


The following commit has been merged in the master branch:
commit 808196f92227bbe802a9d82b766734ffc5e57ba5
Author: Andrea Veri <av at src.gnome.org>
Date:   Thu Sep 29 23:07:12 2011 +0200

    Import new upstream release. (0.9.12)

diff --git a/chrome.manifest b/chrome.manifest
index fba1675..6b95a6c 100644
--- a/chrome.manifest
+++ b/chrome.manifest
@@ -58,6 +58,7 @@ locale greasemonkey ru-RU jar:chrome/greasemonkey.jar!/locale/ru-RU/
 locale greasemonkey si-LK jar:chrome/greasemonkey.jar!/locale/si-LK/
 locale greasemonkey sr jar:chrome/greasemonkey.jar!/locale/sr/
 locale greasemonkey sv-SE jar:chrome/greasemonkey.jar!/locale/sv-SE/
+locale greasemonkey tr jar:chrome/greasemonkey.jar!/locale/tr/
 locale greasemonkey tr-TR jar:chrome/greasemonkey.jar!/locale/tr-TR/
 locale greasemonkey uk jar:chrome/greasemonkey.jar!/locale/uk/
 locale greasemonkey uk-UA jar:chrome/greasemonkey.jar!/locale/uk-UA/
diff --git a/chrome/greasemonkey.jar!/content/addons.js b/chrome/greasemonkey.jar!/content/addons.js
index 20ca7dd..ed33fa7 100644
--- a/chrome/greasemonkey.jar!/content/addons.js
+++ b/chrome/greasemonkey.jar!/content/addons.js
@@ -8,13 +8,13 @@ var gUserscriptsView = null;
 var GM_os;
 (function() {
 var xulRuntime = Components
-    .classes["@mozilla.org/xre/app-info;1"]
+    .classes['@mozilla.org/xre/app-info;1']
     .getService(Components.interfaces.nsIXULRuntime);
 
 GM_os = xulRuntime.OS;
 })();
 
-(function() {
+(function private_scope() {
 var _origShowView;
 function ourShowView(aView) {
   if ('userscripts' == aView) {
@@ -26,6 +26,8 @@ function ourShowView(aView) {
     if ('userscripts' == gView) gView = null;
 
     _origShowView(aView);
+
+    if ('updates' == aView) greasemonkeyAddons.showScriptUpdates();
   }
 };
 window.GM_overrideShowView = function() {
@@ -36,37 +38,110 @@ window.GM_overrideShowView = function() {
 };
 GM_overrideShowView();
 
-// Set up an "observer" on the config, to keep the displayed items up to date
+var _origInstallUpdates = installUpdatesAll;
+installUpdatesAll = function() {
+  var chromeWin = GM_util.getBrowserWindow();
+  var children = gExtensionsView.children;
+  for (var i = 0, child = null; child = children[i]; i++) {
+    if (!/^urn:greasemonkey:update:item:/.test(child.id)) continue;
+
+    var checkbox = document.getAnonymousElementByAttribute(
+        child, 'anonid', 'includeUpdate');
+    if (!checkbox) continue;
+
+    checkbox.setAttribute('anonid', 'includeScriptUpdate');
+    if (checkbox.checked) {
+      var script = GM_config.getScriptById(child.getAttribute('addonId'));
+      script.installUpdate(chromeWin);
+    }
+  }
+
+  _origInstallUpdates();
+};
+
+var _origBuildContextMenu = buildContextMenu;
+buildContextMenu = function(event) {
+  _origBuildContextMenu(event);
+
+  var selectedItem = gExtensionsView.selectedItem;
+  if (/^urn:greasemonkey:update:item:/.test(selectedItem.id)) {
+    document.getElementById('menuitem_homepage_clone')
+        .setAttribute('hidden', true);
+    document.getElementById('menuitem_about_clone')
+        .setAttribute('hidden', true);
+    document.getElementById('menuseparator_1_clone')
+        .setAttribute('hidden', true);
+    document.getElementById('menuitem_installUpdate_clone')
+        .setAttribute('command', 'cmd_userscript_installUpdate');
+  }
+};
+
+// Set up an 'observer' on the config, to keep the displayed items up to date
 // with their actual state.
 var observer = {
-  notifyEvent: function(script, event, data) {
-    if (event == "install") {
-      var beforeNode = data > -1 ? gUserscriptsView.childNodes[data] : null;
-      var item = greasemonkeyAddons.addScriptToList(script, beforeNode);
-      if (gView == "userscripts") gUserscriptsView.selectedItem = item;
+  notifyEvent: function(script, event, data, aView) {
+    if ('undefined' == typeof aView) var aView = gView;
+
+    var currentViewNode = null;
+    if ('updates' == aView) {
+      currentViewNode = gExtensionsView;
+      this.notifyEvent(script, event, data, 'userscripts');
+    } else if ('userscripts' == aView) {
+      currentViewNode = gUserscriptsView;
+    }
+
+    if ('userscripts' == aView && 'install' == event) {
+      var beforeNode = data > -1 ? currentViewNode.childNodes[data] : null;
+      var item = greasemonkeyAddons.listitemForScript(script);
       item.setAttribute('newAddon', 'true');
+      currentViewNode.insertBefore(item, beforeNode);
+      if ('userscripts' == gView) gUserscriptsView.selectedItem = item;
       return;
+    } else if ('updates' == aView && 'install' == event) {
+      var node = document.getElementById('urn:greasemonkey:'
+          + (aView == 'updates' ? 'update:' : '') + 'item:' + script.id);
+      if (node) currentViewNode.removeChild(node);
+      if (currentViewNode.children.length == 0) {
+        showView('userscripts');
+        document.getElementById('updates-view').hidden = true;
+      }
+      return;
+    } else if ('updates' == aView && 'update-found' == event) {
+      var node = greasemonkeyAddons.listitemForScript(script, true);
+      node.setAttribute('typeName', 'update');
+      currentViewNode.insertBefore(node, null);
     }
 
-    // find the script's node
-    var node = document.getElementById('urn:greasemonkey:item:'+script.id);
-    if (!node) return;
+    var node = document.getElementById('urn:greasemonkey:'
+        + (aView == 'updates' ? 'update:' : '') + 'item:' + script.id);
+    if (!node || !currentViewNode) return;
 
     switch (event) {
-      case "edit-enabled":
+      case 'edit-enabled':
         node.setAttribute('isDisabled', !data);
         break;
-      case "uninstall":
-        gUserscriptsView.removeChild(node);
+      case 'update-found':
+        node.setAttribute('updateable', 'true');
+        node.setAttribute('availableUpdateVersion', data.version);
+        node.setAttribute('availableUpdateURL', data.url);
+        node.setAttribute('providesUpdatesSecurely', data.secure.toString());
+        node.setAttribute('updateAvailableMsg',
+            'Version ' + data.version + ' is available.');
+        document.getElementById('updates-view').hidden = false;
+        showView('updates');
+        break;
+      case 'uninstall':
+        currentViewNode.removeChild(node);
         break;
-      case "move":
+      case 'move':
         gUserscriptsView.removeChild(node);
         gUserscriptsView.insertBefore(node, gUserscriptsView.childNodes[data]);
         greasemonkeyAddons.reselectLastSelected();
         break;
-      case "modified":
-        var item = greasemonkeyAddons.listitemForScript(script);
-        gUserscriptsView.replaceChild(item, node);
+      case 'modified':
+        var item = greasemonkeyAddons.listitemForScript(
+            script, 'updates' == aView);
+        currentViewNode.replaceChild(item, node);
         break;
     }
   }
@@ -114,6 +189,12 @@ window.addEventListener('load', function() {
       setTimeout(showView, 0, 'userscripts');
     }
   }
+
+  var scripts = GM_config.getMatchingScripts(
+      function (script) { return script.updateAvailable; });
+  if (scripts.length > 0) {
+    document.getElementById('updates-view').hidden = false;
+  }
 }, false);
 
 window.addEventListener('unload', function() {
@@ -137,7 +218,7 @@ var greasemonkeyAddons = {
     document.getElementById('viewGroup')
         .setAttribute('last-selected', 'userscripts');
     var userscriptsRadio = document.getElementById('userscripts-view');
-    var viewGroup = document.getElementById("viewGroup");
+    var viewGroup = document.getElementById('viewGroup');
     viewGroup.selectedItem = userscriptsRadio;
     greasemonkeyAddons.reselectLastSelected();
     gView='userscripts';
@@ -154,6 +235,18 @@ var greasemonkeyAddons = {
     gExtensionsView.focus();
   },
 
+  showScriptUpdates: function() {
+    var scripts = GM_config.getMatchingScripts(
+        function (script) { return script.updateAvailable; });
+
+    // Add a list item for each script.
+    for (var i = 0, script = null; script = scripts[i]; i++) {
+      var item = greasemonkeyAddons.listitemForScript(script, true);
+      item.setAttribute('typeName', 'update');
+      gExtensionsView.insertBefore(item, null);
+    }
+  },
+
   updateLastSelected: function() {
     if (!gUserscriptsView.selectedItem) return;
     var userscriptsRadio = document.getElementById('userscripts-view');
@@ -194,7 +287,7 @@ var greasemonkeyAddons = {
         }, 0);
   },
 
-  listitemForScript: function(script) {
+  listitemForScript: function(script, updateView) {
     var item = document.createElement('richlistitem');
 
     // Setting these attributes inherits the values into the same place they
@@ -204,8 +297,20 @@ var greasemonkeyAddons = {
     item.setAttribute('description', script.description);
     item.setAttribute('version', script.version);
     item.setAttribute('iconURL', script.icon.fileURL);
-    item.setAttribute('id', 'urn:greasemonkey:item:'+script.id);
+    item.setAttribute('id', 'urn:greasemonkey:'
+        + (updateView ? 'update:' : '') + 'item:' + script.id);
     item.setAttribute('isDisabled', !script.enabled);
+
+    if (script.updateAvailable) {
+      item.setAttribute('updateable', 'true');
+      item.setAttribute('availableUpdateVersion', script._updateVersion);
+      item.setAttribute('availableUpdateURL', script._downloadURL);
+      item.setAttribute('satisfiesDependencies', 'true');
+      item.setAttribute('updateAvailableMsg',
+          'Version ' + script._updateVersion + ' is available.');
+      item.setAttribute('providesUpdatesSecurely', script.updateIsSecure);
+    }
+
     if (script.id in GM_uninstallQueue) {
       item.setAttribute('opType', 'needs-uninstall');
     }
@@ -220,25 +325,32 @@ var greasemonkeyAddons = {
   },
 
   findSelectedScript: function() {
-    if (!gUserscriptsView.selectedItem) return null;
-    var scripts = GM_config.scripts;
-    var selectedScriptId = gUserscriptsView.selectedItem.getAttribute('addonId');
-    for (var i = 0, script = null; script = scripts[i]; i++) {
-      if (selectedScriptId == script.id) {
-        return script;
-      }
+    var currentViewNode = null;
+    if ('updates' == gView) {
+      currentViewNode = gExtensionsView;
+    } else if ('userscripts' == gView) {
+      currentViewNode = gUserscriptsView;
     }
-    return null;
+    if (!currentViewNode || !currentViewNode.selectedItem) return null;
+    var selectedScriptId = currentViewNode.selectedItem.getAttribute('addonId');
+    return GM_config.getScriptById(selectedScriptId) || null;
   },
 
   doCommand: function(command) {
     var script = greasemonkeyAddons.findSelectedScript();
     if (!script) {
-      dump("greasemonkeyAddons.doCommand() could not find selected script.\n");
+      dump('greasemonkeyAddons.doCommand() could not find selected script.\n');
       return;
     }
 
-    var selectedListitem = gUserscriptsView.selectedItem;
+    var currentViewNode = null;
+    if ('updates' == gView) {
+      currentViewNode = gExtensionsView;
+    } else if ('userscripts' == gView) {
+      currentViewNode = gUserscriptsView;
+    }
+
+    var selectedListitem = currentViewNode.selectedItem;
     switch (command) {
     case 'cmd_userscript_edit':
       GM_util.openInEditor(script);
@@ -290,13 +402,16 @@ var greasemonkeyAddons = {
       delete(GM_uninstallQueue[script.id]);
       GM_config.uninstall(script);
       break;
+    case 'cmd_userscript_checkUpdate':
+      script.checkForRemoteUpdate(true);
+      break;
     }
   },
 
   buildContextMenu: function(aEvent) {
     var script = greasemonkeyAddons.findSelectedScript();
     if (!script) {
-      dump("greasemonkeyAddons.buildContextMenu() could not find selected script.\n");
+      dump('greasemonkeyAddons.buildContextMenu() could not find selected script.\n');
       return;
     }
 
@@ -317,11 +432,12 @@ var greasemonkeyAddons = {
     }
 
     var standardItems = [
-      'move_up', 'move_down', 'move_top', 'move_bottom', 'sort',
-      'move_separator',
-      'edit', 'show',
-      'edit_separator',
-      'uninstall'];
+        'move_up', 'move_down', 'move_top', 'move_bottom', 'sort',
+        'move_separator',
+        'edit', 'show',
+        'edit_separator',
+        'checkUpdate',
+        'uninstall'];
     var uninstallItems = ['uninstall_now', 'cancelUninstall'];
 
     // Set everything hidden now, reveal the right selection below.
@@ -341,23 +457,24 @@ var greasemonkeyAddons = {
       // these values.
       // Todo: better fix.
       setTimeout(function() {
-            setElementDisabledByID('userscript_context_move_up', atTop);
-            setElementDisabledByID('userscript_context_move_down', atBottom);
-            setElementDisabledByID('userscript_context_move_top', atTop);
-            setElementDisabledByID('userscript_context_move_bottom', atBottom);
-            setElementDisabledByID('userscript_context_sort', (atTop && atBottom));
-          }, 0);
+        setElementDisabledByID('userscript_context_move_up', atTop);
+        setElementDisabledByID('userscript_context_move_down', atBottom);
+        setElementDisabledByID('userscript_context_move_top', atTop);
+        setElementDisabledByID('userscript_context_move_bottom', atBottom);
+        setElementDisabledByID('userscript_context_sort', (atTop && atBottom));
+      }, 0);
     }
   },
 
   onKeypress: function(aEvent) {
-    var viewGroup = document.getElementById("viewGroup");
+    var viewGroup = document.getElementById('viewGroup');
     switch (aEvent.keyCode) {
       case aEvent.DOM_VK_LEFT:
       case aEvent.DOM_VK_RIGHT:
-        let nextFlag = (aEvent.keyCode == aEvent.DOM_VK_RIGHT);
-        if (getComputedStyle(viewGroup, "").direction == "rtl")
+        var nextFlag = (aEvent.keyCode == aEvent.DOM_VK_RIGHT);
+        if ('rtl' == getComputedStyle(viewGroup, '').direction) {
           nextFlag = !nextFlag;
+        }
         viewGroup.checkAdjacentElement(nextFlag);
         break;
       default:
@@ -392,7 +509,7 @@ var greasemonkeyDragObserver = {
     } else if ('application/x-moz-file' == dropData.flavour.contentType) {
       url = GM_util.getUriFromFile(dropData.data).spec;
     }
-    dump("Dropped url: ["+url+"]\n");
+    dump('Dropped url: ['+url+']\n');
     if (url && url.match(/\.user\.js$/)) {
       // TODO: Make this UI appear in the add-ons win, rather than the browser?
       GM_util.installUri(GM_util.uriFromUrl(url));
diff --git a/chrome/greasemonkey.jar!/content/addons.xml b/chrome/greasemonkey.jar!/content/addons.xml
index 63e1c22..0abe5cc 100644
--- a/chrome/greasemonkey.jar!/content/addons.xml
+++ b/chrome/greasemonkey.jar!/content/addons.xml
@@ -66,16 +66,6 @@
             tooltiptext="&cmd.cancelUninstall.tooltip;"
             command="cmd_userscript_uninstall_cancel"
           />
-
-          <!--
-          Todo: Make install/upgrade buttons like extensions if/when added.
-          <xul:button class="installShow cancelInstallButton" label="&cancelInstall.label;"
-                      accesskey="&cancelInstall.accesskey;" tooltiptext="&cmd.cancelInstall.tooltip;"
-                      command="cmd_cancelInstall"/>
-          <xul:button class="upgradeShow cancelUpgradeButton" label="&cancelUpgrade.label;"
-                      accesskey="&cancelUpgrade.accesskey;" tooltiptext="&cmd.cancelUpgrade.tooltip;"
-                      command="cmd_cancelUpgrade"/>
-          -->
         </xul:hbox>
       </xul:vbox>
     </xul:hbox>
diff --git a/chrome/greasemonkey.jar!/content/addons.xul b/chrome/greasemonkey.jar!/content/addons.xul
index d9f8379..b7e9f52 100644
--- a/chrome/greasemonkey.jar!/content/addons.xul
+++ b/chrome/greasemonkey.jar!/content/addons.xul
@@ -42,14 +42,12 @@
 </notificationbox>
 
 <hbox id="commandBarBottom">
-  <!--
   <button id="findUpdatesUserscripts"
     insertafter="checkUpdatesAllButton"
     label="&cmd.checkUpdatesAll.label;"
     accesskey="&cmd.checkUpdatesAll.accesskey;"
-    disabled="true"
+    oncommand="GM_config.checkScriptsForRemoteUpdates();"
   />
-  -->
 
   <label id="getMoreUserscripts" class="text-link"
     insertafter="getMore"
@@ -72,6 +70,7 @@
     <command id="cmd_userscript_edit"/>
     <command id="cmd_userscript_options"/>
     <command id="cmd_userscript_show"/>
+    <command id="cmd_userscript_checkUpdate"/>
     <command id="cmd_userscript_enable"/>
     <command id="cmd_userscript_disable"/>
     <command id="cmd_userscript_uninstall"/>
@@ -128,14 +127,14 @@
 
     <menuseparator/>
 
+    <menuitem id="userscript_context_checkUpdate" command="cmd_userscript_checkUpdate"
+      label="&cmd.checkUpdate.label;" accesskey="&cmd.checkUpdate.accesskey;"/>
     <!--
     Todo: Make install/upgrade menu items like extensions if/when added.
     <menuitem id="userscript_context_cancelInstall" command="cmd_cancelInstall"
       label="&cmd.cancelInstall.label;" accesskey="&cmd.cancelInstall.accesskey;"/>
     <menuitem id="userscript_context_cancelUpgrade" command="cmd_cancelUpgrade"
       label="&cmd.cancelUpgrade.label;" accesskey="&cmd.cancelUpgrade.accesskey;"/>
-    <menuitem id="userscript_context_checkUpdate" command="cmd_checkUpdate"
-      label="&cmd.checkUpdate.label;" accesskey="&cmd.checkUpdate.accesskey;"/>
     -->
 
     <menuitem id="userscript_context_enable" command="cmd_userscript_enable"
@@ -145,8 +144,6 @@
 
     <!--
     Todo: as above.
-    <menuitem id="userscript_context_installUpdate" command="cmd_installUpdate"
-      label="&cmd.installUpdate.label;" accesskey="&cmd.installUpdate.accesskey;"/>
     <menuitem id="userscript_context_includeUpdate" command="cmd_includeUpdate"
       label="&cmd.includeUpdate.label;" accesskey="&cmd.includeUpdate.accesskey;"
       type="checkbox"/>
diff --git a/chrome/greasemonkey.jar!/content/addons4-overlay.js b/chrome/greasemonkey.jar!/content/addons4-overlay.js
index d1f0766..e83a4ec 100644
--- a/chrome/greasemonkey.jar!/content/addons4-overlay.js
+++ b/chrome/greasemonkey.jar!/content/addons4-overlay.js
@@ -39,7 +39,7 @@ gViewController.loadView = function(aViewId) {
 // with their actual state.
 var observer = {
   notifyEvent: function observer_notifyEvent(script, event, data) {
-    if (userScriptViewId != gViewController.currentViewId) return;
+    if (!isScriptView()) return;
 
     var addon = ScriptAddonFactoryByScript(script);
     switch (event) {
@@ -47,7 +47,7 @@ var observer = {
         gListView.addItem(addon);
         setEmptyWarningVisible();
         break;
-      case "edit-enabled":
+      case 'edit-enabled':
         addon.userDisabled = !data;
         var item = gListView.getListItemForID(addon.id);
         item.setAttribute('active', data);
@@ -76,6 +76,10 @@ function addonIsInstalledScript(aAddon) {
   return true;
 };
 
+function isScriptView() {
+  return 'addons://list/user-script' == gViewController.currentViewId;
+}
+
 function addonExecutesNonFirst(aAddon) {
   if (!aAddon) return false;
   if (SCRIPT_ADDON_TYPE != aAddon.type) return false;
diff --git a/chrome/greasemonkey.jar!/content/addons4-overlay.xul b/chrome/greasemonkey.jar!/content/addons4-overlay.xul
index cb00869..3133b3f 100644
--- a/chrome/greasemonkey.jar!/content/addons4-overlay.xul
+++ b/chrome/greasemonkey.jar!/content/addons4-overlay.xul
@@ -8,6 +8,8 @@
 %greasemonkeyDTD;
 <!ENTITY % greasemonkeyAddonsDTD SYSTEM "chrome://greasemonkey/locale/gm-addons.dtd">
 %greasemonkeyAddonsDTD;
+<!ENTITY % extensionsDTD SYSTEM "chrome://mozapps/locale/extensions/extensions.dtd">
+%extensionsDTD;
 ]>
 
 <overlay id="greasemonkey-browser-overlay"
@@ -30,32 +32,35 @@
   <command id="cmd_userscript_execute_sooner" />
   <command id="cmd_userscript_execute_later" />
   <command id="cmd_userscript_execute_last" />
+  <command id="cmd_userscript_showItemPreferences" />
 </commandset>
 
 <menupopup id="addonitem-popup">
-  <menuitem id="menuitem_userscript_edit" command="cmd_userscript_edit"
+  <menuitem command="cmd_userscript_edit"
     label="&Edit;" accesskey="&Edit.accesskey;" type="user-script"
   />
-  <menuitem id="menuitem_userscript_show" command="cmd_userscript_show"
+  <menuitem command="cmd_userscript_show"
     label="&Show;" accesskey="&Show.accesskey;" type="user-script"
   />
   <menuseparator type="user-script"/>
-  <menuitem id="menuitem_userscript_execute_first"
-    command="cmd_userscript_execute_first"
+  <menuitem command="cmd_userscript_execute_first"
     label="&ExecuteFirst;" type="user-script"
   />
-  <menuitem id="menuitem_userscript_execute_sooner"
-    command="cmd_userscript_execute_sooner"
+  <menuitem command="cmd_userscript_execute_sooner"
     label="&ExecuteSooner;" type="user-script"
   />
-  <menuitem id="menuitem_userscript_execute_later"
-    command="cmd_userscript_execute_later"
+  <menuitem command="cmd_userscript_execute_later"
     label="&ExecuteLater;" type="user-script"
   />
-  <menuitem id="menuitem_userscript_execute_last"
-    command="cmd_userscript_execute_last"
+  <menuitem command="cmd_userscript_execute_last"
     label="&ExecuteLast;" type="user-script"
   />
+
+  <menuseparator type="user-script"/>
+
+  <menuitem command="cmd_findItemUpdates" type="user-script"
+    label="&cmd.findUpdates.label;" accesskey="&cmd.findUpdates.accesskey;"
+  />
 </menupopup>
 
 <vbox id="list-view">
diff --git a/chrome/greasemonkey.jar!/content/addons4.xul b/chrome/greasemonkey.jar!/content/addons4.xul
index c00bb05..1265500 100755
--- a/chrome/greasemonkey.jar!/content/addons4.xul
+++ b/chrome/greasemonkey.jar!/content/addons4.xul
@@ -5,13 +5,19 @@
 <!-- Just injects the Firefox 4+ specific addons integration code. -->
 <script type="application/x-javascript"><![CDATA[
 window.addEventListener('load', function() {
-Components.utils.import("resource://greasemonkey/addons4.js");
-GM_addonsStartup();
+var addons = {};
+Components.utils.import("resource://greasemonkey/addons4.js", addons);
+addons.GM_addonsStartup();
 }, true);
 
-// Open the addons manager in Firefox >= 4.0
+// Open the scripts manager in Firefox >= 4.0
 function GM_OpenScriptsMgr() {
   BrowserOpenAddonsMgr('addons://list/user-script');
 }
+
+// Open the updates manager in Firefox >= 4.0
+function GM_OpenUpdatesMgr() {
+    BrowserOpenAddonsMgr('addons://updates/available');
+}
 ]]></script>
 </overlay>
diff --git a/chrome/greasemonkey.jar!/content/browser.js b/chrome/greasemonkey.jar!/content/browser.js
index 6d9c016..673e8ce 100644
--- a/chrome/greasemonkey.jar!/content/browser.js
+++ b/chrome/greasemonkey.jar!/content/browser.js
@@ -223,16 +223,6 @@ GM_BrowserUI.installCurrentScript = function() {
   GM_BrowserUI.scriptDownloader_.installScript();
 };
 
-GM_BrowserUI.installScript = function(script){
-  GM_util.getService().config.install(script);
-
-  var tools = {};
-  Components.utils.import("resource://greasemonkey/GM_notification.js", tools);
-  tools.GM_notification(
-      "'" + script.name + "' "
-      + GM_BrowserUI.bundle.getString("statusbar.installed"));
-};
-
 /**
  * The browser XUL has unloaded. Destroy references/watchers/listeners.
  */
diff --git a/chrome/greasemonkey.jar!/content/browser.xul b/chrome/greasemonkey.jar!/content/browser.xul
index 6b124d1..2f448f9 100644
--- a/chrome/greasemonkey.jar!/content/browser.xul
+++ b/chrome/greasemonkey.jar!/content/browser.xul
@@ -55,6 +55,7 @@
     <menupopup
       onpopupshowing="GM_showPopup(event);"
       onclick="GM_popupClicked(event);"
+      oncontextmenu="event.preventDefault();"
       oncommand="event.stopPropagation();"
     >
       <menuitem class='gm-enabled-item'
diff --git a/chrome/greasemonkey.jar!/content/config.js b/chrome/greasemonkey.jar!/content/config.js
index 5653255..9cd6437 100644
--- a/chrome/greasemonkey.jar!/content/config.js
+++ b/chrome/greasemonkey.jar!/content/config.js
@@ -174,8 +174,11 @@ Config.prototype.parse = function(source, uri, updateScript) {
         case "namespace":
         case "description":
         case "version":
+        case "updateURL":
           script["_" + header] = value;
           break;
+        case "installURL":
+          script._downloadURL = value;
         case "include":
           script._includes.push(value);
           break;
@@ -266,6 +269,10 @@ Config.prototype.parse = function(source, uri, updateScript) {
     }
   }
 
+  if (!script.updateURL && script._downloadURL) {
+    script.updateURL = script._downloadURL;
+  }
+
   // if no meta info, default to reasonable values
   if (!script._name) {
     var name = (uri && uri.spec) || (updateScript && updateScript.filename);
@@ -290,17 +297,18 @@ Config.prototype.parse = function(source, uri, updateScript) {
   return script;
 };
 
-Config.prototype.install = function(script) {
-  var existingIndex = this._find(script);
-  if (existingIndex > -1) {
+Config.prototype.install = function(script, oldScript) {
+  var existingIndex = this._find(oldScript || script);
+  if (!oldScript) oldScript = this.scripts[existingIndex];
+
+  if (oldScript) {
     // Save the old script's state.
-    var oldScript = this._scripts[existingIndex];
     script._enabled = oldScript.enabled;
     script.userExcludes = oldScript.userExcludes;
     script.userIncludes = oldScript.userIncludes;
 
     // Uninstall the old script.
-    this.uninstall(this._scripts[existingIndex], true);
+    this.uninstall(oldScript, true);
   }
 
   script._initFile(script._tempFile);
@@ -398,11 +406,12 @@ Config.prototype.getMatchingScripts = function(testFunc) {
   return this._scripts.filter(testFunc);
 };
 
-Config.prototype.updateModifiedScripts = function(safeWin, chromeWin) {
+Config.prototype.updateModifiedScripts = function(aWhen, aSafeWin, aChromeWin) {
   // Find any updated scripts or scripts with delayed injection
   var scripts = this.getMatchingScripts(
       function (script) {
-        return script.isModified() || 0 != script.pendingExec.length;
+        return script.runAt == aWhen
+            && (script.isModified() || 0 != script.pendingExec.length);
       });
   if (0 == scripts.length) return;
 
@@ -411,18 +420,50 @@ Config.prototype.updateModifiedScripts = function(safeWin, chromeWin) {
       var oldScriptId = new String(script.id);
       var parsedScript = this.parse(
           script.textContent, GM_util.uriFromUrl(script._downloadURL), !!script);
-      script.updateFromNewScript(parsedScript, safeWin, chromeWin);
+      script.updateFromNewScript(parsedScript, aSafeWin, aChromeWin);
       this._changed(script, "modified", oldScriptId, true);
     } else {
       // We are already downloading dependencies for this script
       // so add its window to the list
-      script.pendingExec.push({'safeWin': safeWin, 'chromeWin': chromeWin});
+      script.pendingExec.push({'safeWin': aSafeWin, 'chromeWin': aChromeWin});
     }
   }
 
   this._save();
 };
 
+Config.prototype._notifyUpdates = function() {
+  var scripts = this.getMatchingScripts(
+      function (script) { return script.updateAvailable; });
+  if (0 == scripts.length) return;
+
+  GM_util.getBrowserWindow().GM_OpenUpdatesMgr();
+};
+
+Config.prototype.checkScriptsForRemoteUpdates = function(scripts) {
+  var forced = false;
+  if ('undefined' == typeof scripts) {
+    forced = true;
+    var scripts = this.getMatchingScripts(function (script) {
+      return !script.updateAvailable &&
+          script.updateURL &&
+          script.enabled;
+    });
+  }
+
+  scripts.forEach(function(script) {
+    script.checkForRemoteUpdate(forced);
+  });
+};
+
+Config.prototype.getScriptById = function(scriptId) {
+  for (var i = 0, script = null; script = this.scripts[i]; i++) {
+    if (scriptId == script.id) {
+      return script;
+    }
+  }
+};
+
 /**
  * Checks whether the version has changed since the last run and performs
  * any necessary upgrades.
diff --git a/chrome/greasemonkey.jar!/content/menucommander.js b/chrome/greasemonkey.jar!/content/menucommander.js
index 8c6d263..4c61ad8 100644
--- a/chrome/greasemonkey.jar!/content/menucommander.js
+++ b/chrome/greasemonkey.jar!/content/menucommander.js
@@ -21,14 +21,18 @@ GM_MenuCommander.onPopupShowing = function(aMenuPopup) {
 
   // Add menu items for commands for the active window.
   var haveCommands = false;
-  GM_BrowserUI.gmSvc.withAllMenuCommandsForWindowId(
-      GM_util.windowId(gBrowser.contentWindow),
-      function(index, command) {
-        if (command.frozen) return;
-        aMenuPopup.insertBefore(
-            GM_MenuCommander.createMenuItem(command),
-            aMenuPopup.firstChild);
-        haveCommands = true;
-      });
+  var windowId = GM_util.windowId(gBrowser.contentWindow);
+
+  if(windowId) {
+    GM_BrowserUI.gmSvc.withAllMenuCommandsForWindowId(
+        windowId,
+        function(index, command) {
+          if (command.frozen) return;
+          aMenuPopup.insertBefore(
+              GM_MenuCommander.createMenuItem(command),
+              aMenuPopup.firstChild);
+          haveCommands = true;
+        });
+  }
   aMenuPopup.parentNode.disabled = !haveCommands;
 };
diff --git a/chrome/greasemonkey.jar!/content/options.js b/chrome/greasemonkey.jar!/content/options.js
index ad0ac08..3c99c02 100644
--- a/chrome/greasemonkey.jar!/content/options.js
+++ b/chrome/greasemonkey.jar!/content/options.js
@@ -2,15 +2,48 @@ Components.utils.import('resource://greasemonkey/prefmanager.js');
 Components.utils.import('resource://greasemonkey/util.js');
 
 function GM_loadOptions() {
-  document.getElementById("check-uninstall")
-      .checked = GM_prefRoot.getValue("uninstallPreferences");
-  document.getElementById("globalExcludes")
+  document.getElementById('check-uninstall')
+      .checked = GM_prefRoot.getValue('uninstallPreferences');
+
+  document.getElementById('globalExcludes')
       .pages = GM_util.getService().config.globalExcludes;
+
+  document.getElementById('check-update')
+      .checked = GM_prefRoot.getValue('enableUpdateChecking');
+  document.getElementById('secure-update')
+      .checked = GM_prefRoot.getValue('requireSecureUpdates');
+
+  document.getElementById('slide-updateInterval')
+      .value = GM_prefRoot.getValue('minDaysBetweenUpdateChecks');
+
+  GM_setMinUpdateIntervalLabel();
+  GM_onChangeUpdateChecking();
 }
 
 function GM_saveOptions(checkbox) {
-  GM_prefRoot.setValue("uninstallPreferences",
-      !!document.getElementById("check-uninstall").checked);
+  GM_prefRoot.setValue('uninstallPreferences',
+      !!document.getElementById('check-uninstall').checked);
   GM_util.getService().config.globalExcludes =
-      document.getElementById("globalExcludes").pages;
+      document.getElementById('globalExcludes').pages;
+  GM_prefRoot.setValue('enableUpdateChecking',
+      !!document.getElementById('check-update').checked);
+  GM_prefRoot.setValue('requireSecureUpdates',
+      !!document.getElementById('secure-update').checked);
+  GM_prefRoot.setValue("minDaysBetweenUpdateChecks", GM_getMinUpdateDays());
+}
+
+function GM_getMinUpdateDays() {
+  return parseInt(document.getElementById('slide-updateInterval').value);
+}
+
+function GM_onChangeUpdateChecking() {
+  var enabled = document.getElementById('check-update').checked;
+  document.getElementById('secure-update').disabled = !enabled;
+  document.getElementById('slide-updateInterval').disabled = !enabled;
+  document.getElementById('label-slide-updateInterval').disabled = !enabled;
+}
+
+function GM_setMinUpdateIntervalLabel() {
+  document.getElementById('txt-updateInterval')
+      .setAttribute('value', GM_getMinUpdateDays());
 }
diff --git a/chrome/greasemonkey.jar!/content/options.xul b/chrome/greasemonkey.jar!/content/options.xul
index 3f7f85f..d77a713 100644
--- a/chrome/greasemonkey.jar!/content/options.xul
+++ b/chrome/greasemonkey.jar!/content/options.xul
@@ -39,6 +39,24 @@
     <caption label="&options.globalExcludes;" />
     <cludes id="globalExcludes" />
   </groupbox>
+
+  <groupbox>
+    <caption label="&UpdateChecking;" />
+    <checkbox id="check-update" label="&EnableUpdateChecking;"
+        oncommand="GM_onChangeUpdateChecking()" />
+    <hbox>
+      <separator orient="vertical" />
+      <checkbox id="secure-update" label="&RequireSecureUpdates;" />
+    </hbox>
+    <label value="&UpdateInterval;" control="slide-updateInterval"
+        id="label-slide-updateInterval" />
+    <hbox>
+      <scale id="slide-updateInterval" flex="1"
+        orient="horizontal" min="1" max="30"
+        onchange="GM_setMinUpdateIntervalLabel()"/>
+      <label id="txt-updateInterval" />
+    </hbox>
+  </groupbox>
 </vbox>
 
 </dialog>
diff --git a/chrome/greasemonkey.jar!/content/script.js b/chrome/greasemonkey.jar!/content/script.js
index 09f2d2e..0246e1d 100644
--- a/chrome/greasemonkey.jar!/content/script.js
+++ b/chrome/greasemonkey.jar!/content/script.js
@@ -7,8 +7,9 @@ Components.utils.import('resource://greasemonkey/util.js');
 function Script(configNode) {
   this._observers = [];
 
-  this._downloadURL = null; // Only for scripts not installed
-  this._tempFile = null; // Only for scripts not installed
+  this._downloadURL = null;
+  this._updateURL = null;
+  this._tempFile = null;
   this._basedir = null;
   this._filename = null;
   this._modified = null;
@@ -34,6 +35,9 @@ function Script(configNode) {
   this._dependFail = false;
   this._runAt = null;
   this._rawMeta = null;
+  this._lastUpdateCheck = null;
+  this.updateAvailable = null;
+  this._updateVersion = null;
   this.pendingExec = [];
 
   if (configNode) this._loadFromConfigNode(configNode);
@@ -155,6 +159,30 @@ function Script_getFile() {
   return file;
 });
 
+Script.prototype.__defineGetter__('updateURL',
+function Script_getUpdateURL() { return this._updateURL; });
+Script.prototype.__defineSetter__('updateURL',
+function Script_setUpdateURL(url) {
+  if (!url && !this._downloadURL) return null;
+
+  if (!url) url = this._downloadURL;
+
+  // US.o gets special treatment for being so large
+  var usoURL = url.match(/^(https?:\/\/userscripts.org\/[^?]*\.user\.js)\??/);
+  if (usoURL) {
+    this._updateURL = usoURL[1].replace(/\.user\.js$/,".meta.js");
+  } else {
+    this._updateURL = url;
+  }
+});
+
+Script.prototype.__defineGetter__('updateIsSecure',
+function Script_getUpdateIsSecure() {
+  if (!this._downloadURL) return null;
+
+  return /^https/.test(this._downloadURL);
+});
+
 Script.prototype.__defineGetter__('_basedirFile',
 function Script_getBasedirFile() {
   var file = GM_util.scriptDir();
@@ -174,14 +202,6 @@ function Script_getFileURL() { return GM_util.getUriFromFile(this.file).spec; })
 Script.prototype.__defineGetter__('textContent',
 function Script_getTextContent() { return GM_util.getContents(this.file); });
 
-Script.prototype.__defineGetter__('size',
-function Script_getSize() {
-  var size = this.file.fileSize;
-  for each (var r in this._requires) size += r.file.fileSize;
-  for each (var r in this._resources) size += r.file.fileSize;
-  return size;
-});
-
 Script.prototype._initFileName = function(name, useExt) {
   var ext = "";
   name = name.toLowerCase();
@@ -210,6 +230,7 @@ Script.prototype._loadFromConfigNode = function(node) {
   this._filename = node.getAttribute("filename");
   this._basedir = node.getAttribute("basedir") || ".";
   this._downloadURL = node.getAttribute("installurl") || null;
+  this.updateURL = node.getAttribute("updateurl") || null;
 
   if (!this.fileExists(this._basedirFile)) return;
   if (!this.fileExists(this.file)) return;
@@ -232,6 +253,19 @@ Script.prototype._loadFromConfigNode = function(node) {
     this._version = node.getAttribute("version");
   }
 
+  if (!node.getAttribute("updateAvailable")
+      || !node.getAttribute("lastUpdateCheck")
+  ) {
+    this.updateAvailable = false;
+    this._lastUpdateCheck = this._modified;
+
+    GM_util.getService().config._changed(this, "modified", null);
+  } else {
+    this.updateAvailable = node.getAttribute("updateAvailable") == 'true';
+    this._updateVersion = node.getAttribute("updateVersion") || null;
+    this._lastUpdateCheck = node.getAttribute("lastUpdateCheck");
+  }
+
   for (var i = 0, childNode; childNode = node.childNodes[i]; i++) {
     switch (childNode.nodeName) {
     case "Include":
@@ -343,11 +377,21 @@ Script.prototype.toConfigNode = function(doc) {
   scriptNode.setAttribute("basedir", this._basedir);
   scriptNode.setAttribute("modified", this._modified);
   scriptNode.setAttribute("dependhash", this._dependhash);
+  scriptNode.setAttribute("updateAvailable", this.updateAvailable);
+  scriptNode.setAttribute("lastUpdateCheck", this._lastUpdateCheck);
 
   if (this._downloadURL) {
     scriptNode.setAttribute("installurl", this._downloadURL);
   }
 
+  if (this._updateURL) {
+    scriptNode.setAttribute("updateurl", this._updateURL);
+  }
+
+  if (this._updateVersion) {
+    scriptNode.setAttribute("updateVersion", this._updateVersion);
+  }
+
   if (this.icon.filename) {
     scriptNode.setAttribute("icon", this.icon.filename);
   }
@@ -355,6 +399,10 @@ Script.prototype.toConfigNode = function(doc) {
   return scriptNode;
 };
 
+Script.prototype.toString = function() {
+  return '[Greasemonkey Script ' + this.id + ']';
+};
+
 Script.prototype._initFile = function(tempFile) {
   var name = this._initFileName(this._name, false);
   this._basedir = name;
@@ -435,6 +483,8 @@ Script.prototype.updateFromNewScript = function(newScript, safeWin, chromeWin) {
   this._runAt = newScript._runAt;
   this._unwrap = newScript._unwrap;
   this._version = newScript._version;
+  this._downloadURL = newScript._downloadURL;
+  this._updateURL = newScript._updateURL;
 
   var dependhash = GM_util.sha1(newScript._rawMeta);
   if (dependhash != this._dependhash && !newScript._dependFail) {
@@ -452,13 +502,132 @@ Script.prototype.updateFromNewScript = function(newScript, safeWin, chromeWin) {
       if (!nextFile.equals(this.file)) nextFile.remove(true);
     }
 
-    // Store window references for late injection
-    this.pendingExec.push({'safeWin': safeWin, 'chromeWin': chromeWin});
+    // Store window references for late injection.
+    if ('document-start' == this._runAt) {
+      GM_util.logError(
+          this.id + "\nNot running at document-start; waiting for update ...",
+          true);
+      this.pendingExec.push('document-start update');
+    } else {
+      this.pendingExec.push({'safeWin': safeWin, 'chromeWin': chromeWin});
+    }
 
-    // Redownload dependencies.
+    // Re-download dependencies.  The timeout guarantees that it will
+    // reliably complete after the normal document-end time.  (See #1402; going
+    // from some -> no requires means this is a short-circuit call.)
     var scriptDownloader = new GM_ScriptDownloader(null, null, null);
-    scriptDownloader.startUpdateScript(this);
+    GM_util.timeout(0, GM_hitch(scriptDownloader, 'startUpdateScript', this));
+  }
+};
+
+Script.prototype.checkForRemoteUpdate = function(aForced, aCallback) {
+  var callback = aCallback || function() {};
+
+  if (this.updateAvailable) return callback(true);
+  if (!this._updateURL) return callback(false);
+
+  var ioService = Components.classes["@mozilla.org/network/io-service;1"]
+      .getService(Components.interfaces.nsIIOService);
+  var scheme = ioService.extractScheme(this._updateURL);
+  switch (scheme) {
+  case 'about':
+  case 'chrome':
+  case 'file':
+    // These schemes are explicitly never OK!
+    return callback(false);
+  case 'ftp':
+  case 'http':
+    // These schemes are OK only if the user opts in.
+    if (GM_prefRoot.getValue('requireSecureUpdates')) {
+      return callback(false);
+    }
+    break;
+  case 'https':
+    // HTTPs is always OK.
+    break;
+  default:
+    // Anything not listed: default to not allow.
+    return callback(false);
+  }
+
+  var currentTime = new Date().getTime();
+
+  if (!aForced) {
+    if (!GM_prefRoot.getValue("enableUpdateChecking")) return callback(false);
+
+    var minIntervalDays = GM_prefRoot.getValue("minDaysBetweenUpdateChecks");
+    if (isNaN(minIntervalDays) || minIntervalDays < 1) minIntervalDays = 1;
+    var minIntervalMs = 86400000 * minIntervalDays;
+    var nextUpdateTime = parseInt(this._lastUpdateCheck, 10) + minIntervalMs;
+    if (currentTime <= nextUpdateTime) return callback(false);
+  }
+
+  var lastCheck = this._lastUpdateCheck;
+  this._lastUpdateCheck = currentTime;
+
+
+  var req = Components.classes["@mozilla.org/xmlextras/xmlhttprequest;1"]
+      .createInstance(Components.interfaces.nsIXMLHttpRequest);
+  req.open("GET", this.updateURL, true);
+  req.onload = GM_util.hitch(
+      this, "checkRemoteVersion", req, callback);
+  req.onerror = GM_util.hitch(
+      this, "checkRemoteVersionErr", lastCheck, callback);
+  req.send(null);
+};
+
+Script.prototype.checkRemoteVersion = function(req, aCallback) {
+  if (req.status != 200 && req.status != 0) return aCallback(false);
+
+  var source = req.responseText;
+  var newScript = GM_util.getService().config.parse(source);
+  var remoteVersion = newScript.version;
+  if (!remoteVersion) return aCallback(false);
+
+  var versionChecker = Components
+      .classes["@mozilla.org/xpcom/version-comparator;1"]
+      .getService(Components.interfaces.nsIVersionComparator);
+
+  if (versionChecker.compare(this._version, remoteVersion) >= 0) {
+    return aCallback(false);
+  }
+
+  this.updateAvailable = true;
+  this._updateVersion = remoteVersion;
+  // TODO: Remove this _changed() call when em:minVersion >= 4.0.
+  this._changed("update-found", {
+    version: remoteVersion,
+    url: this._downloadURL,
+    secure: this.updateIsSecure
+  });
+  GM_util.getService().config._save();
+  aCallback(true);
+};
+
+Script.prototype.checkRemoteVersionErr = function(lastCheck, aCallback) {
+  // Set the time back.
+  this._lastUpdateCheck = lastCheck;
+  GM_util.getService().config._save();
+  aCallback(false);
+};
+
+Script.prototype.installUpdate = function(aChromeWin, aCallback) {
+  var oldScriptId = new String(this.id);
+  function updateAddons(aNewScript) {
+    // Timeout puts this update after core code has removed the download
+    // progress bar.  It causes an open add-ons manager to be updated with the
+    // new script details.
+    GM_util.timeout(
+        0, GM_util.hitch(GM_util.getService().config, '_changed',
+            aNewScript, 'modified', oldScriptId));
   }
+  var uri = GM_util.uriFromUrl(this._downloadURL);
+  var scriptDownloader = new GM_ScriptDownloader(aChromeWin, uri, null);
+  scriptDownloader.replacedScript = this;
+  scriptDownloader.installOnCompletion_ = true;
+  scriptDownloader.onInstall(GM_util.hitch(this, updateAddons));
+  if (aCallback) scriptDownloader.onInstall(aCallback);
+  scriptDownloader.startDownload();
 };
 
 Script.prototype.allFiles = function() {
diff --git a/chrome/greasemonkey.jar!/content/scriptdownloader.js b/chrome/greasemonkey.jar!/content/scriptdownloader.js
index 5557a8c..bfc8ff7 100644
--- a/chrome/greasemonkey.jar!/content/scriptdownloader.js
+++ b/chrome/greasemonkey.jar!/content/scriptdownloader.js
@@ -21,6 +21,9 @@ GM_ScriptDownloader = function(win, uri, bundle, contentWin) {
 
   this._oldScriptId = null;
   this.updateScript = false;
+  this.replacedScript = null;
+
+  this._onInstallCallbacks = [];
 };
 
 GM_ScriptDownloader.prototype.startInstall = function() {
@@ -43,7 +46,7 @@ GM_ScriptDownloader.prototype.startViewScript = function(uri) {
 GM_ScriptDownloader.prototype.startDownload = function() {
   GM_util.getService().ignoreNextScript();
 
-  this.req_ = new XMLHttpRequest();
+  this.req_ = new this.win_.XMLHttpRequest();
   this.req_.overrideMimeType("text/plain");
   this.req_.open("GET", this.uri_.spec, true);
   this.req_.onreadystatechange = GM_util.hitch(this, "checkContentTypeBeforeDownload");
@@ -88,17 +91,15 @@ GM_ScriptDownloader.prototype.checkContentTypeBeforeDownload = function () {
 
 GM_ScriptDownloader.prototype.handleScriptDownloadComplete = function() {
   try {
-    // If loading from file, status might be zero on success
+    // If loading from file, status might be zero on success.
     if (this.req_.status != 200 && this.req_.status != 0) {
-      // NOTE: Unlocalized string
+      // TODO: Unlocalized string.
       alert("Error loading user script:\n" +
-      this.req_.status + ": " +
-      this.req_.statusText);
+          this.req_.status + ": " + this.req_.statusText);
       return;
     }
 
     var source = this.req_.responseText;
-
     this.script = GM_util.getService().config.parse(source, this.uri_);
 
     var file = Components.classes["@mozilla.org/file/directory_service;1"]
@@ -111,9 +112,6 @@ GM_ScriptDownloader.prototype.handleScriptDownloadComplete = function() {
         Components.interfaces.nsILocalFile.NORMAL_FILE_TYPE, GM_constants.fileMask);
     this.tempFiles_.push(file);
 
-    function handleWriteComplete() {
-    }
-
     GM_util.writeToFile(source, file,
         GM_util.hitch(this, 'handleScriptDownloadWriteComplete', file));
   } catch (e) {
@@ -126,9 +124,11 @@ GM_ScriptDownloader.prototype.handleScriptDownloadComplete = function() {
 GM_ScriptDownloader.prototype.handleScriptDownloadWriteComplete = function(file) {
   this.script.setDownloadedFile(file);
 
-  window.setTimeout(GM_util.hitch(this, "fetchDependencies"), 0);
+  this.win_.setTimeout(GM_util.hitch(this, "fetchDependencies"), 0);
 
-  if (this.installing_) {
+  if (this.installOnCompletion_) {
+    // Unattended install (i.e. remote script update), no UI.
+  } else if (this.installing_) {
     this.showInstallDialog();
   } else {
     this.showScriptView();
@@ -271,9 +271,17 @@ GM_ScriptDownloader.prototype.finishInstall = function() {
     var pendingExecAry = this.script.pendingExec;
     this.script.pendingExec = [];
     while (pendingExec = pendingExecAry.shift()) {
+      if ('document-start update' == pendingExec) {
+        GM_util.logError(
+            this.script.id + '\n... script update complete (will run next time).',
+            true);
+        continue;
+      }
       if (pendingExec.safeWin.closed) continue;
       var url = pendingExec.safeWin.location.href;
-      if (GM_util.scriptMatchesUrlAndRuns(this.script, url)) {
+      var shouldRun = GM_util.scriptMatchesUrlAndRuns(
+          this.script, url, this.script.runAt);
+      if (shouldRun) {
         GM_util.getService().injectScripts(
             [this.script], url, pendingExec.safeWin, pendingExec.chromeWin);
       }
@@ -297,11 +305,21 @@ function(script, dep, msg) {
   }
 };
 
-GM_ScriptDownloader.prototype.installScript = function(){
+GM_ScriptDownloader.prototype.installScript = function() {
   if (this.dependencyError) {
     alert(this.dependencyError);
-  } else if(this.dependenciesLoaded_) {
-    this.win_.GM_BrowserUI.installScript(this.script);
+  } else if (this.dependenciesLoaded_) {
+    GM_util.getService().config.install(this.script, this.replacedScript);
+
+    var tools = {};
+    Components.utils.import("resource://greasemonkey/GM_notification.js", tools);
+    tools.GM_notification(
+        "'" + this.script.name + "' "
+        + this.win_.GM_BrowserUI.bundle.getString("statusbar.installed"));
+
+    this._onInstallCallbacks.forEach(GM_util.hitch(this, function(callback) {
+      callback(this.script);
+    }));
   } else {
     this.installOnCompletion_ = true;
   }
@@ -309,10 +327,18 @@ GM_ScriptDownloader.prototype.installScript = function(){
 
 GM_ScriptDownloader.prototype.cleanupTempFiles = function() {
   for (var i = 0, file = null; file = this.tempFiles_[i]; i++) {
-    file.remove(false);
+    try {
+      file.remove(false);
+    } catch (e) {
+      // Ignore, go to next.
+    }
   }
 };
 
+GM_ScriptDownloader.prototype.onInstall = function(callback) {
+  this._onInstallCallbacks.push(callback);
+};
+
 GM_ScriptDownloader.prototype.showInstallDialog = function(timer) {
   if (!timer) {
     // otherwise, the status bar stays in the loading state.
diff --git a/chrome/greasemonkey.jar!/content/scriptrequire.js b/chrome/greasemonkey.jar!/content/scriptrequire.js
index e208018..a807c65 100644
--- a/chrome/greasemonkey.jar!/content/scriptrequire.js
+++ b/chrome/greasemonkey.jar!/content/scriptrequire.js
@@ -4,8 +4,8 @@ Components.utils.import('resource://greasemonkey/util.js');
 function ScriptRequire(script) {
   this._script = script;
 
-  this._downloadURL = null; // Only for scripts not installed
-  this._tempFile = null; // Only for scripts not installed
+  this._downloadURL = null;
+  this._tempFile = null;
   this._filename = null;
   this.type = "require";
   this.updateScript = false;
diff --git a/chrome/greasemonkey.jar!/content/scriptresource.js b/chrome/greasemonkey.jar!/content/scriptresource.js
index 7ef3abb..5402b06 100644
--- a/chrome/greasemonkey.jar!/content/scriptresource.js
+++ b/chrome/greasemonkey.jar!/content/scriptresource.js
@@ -3,8 +3,8 @@ Components.utils.import('resource://greasemonkey/util.js');
 function ScriptResource(script) {
   this._script = script || null;
 
-  this._downloadURL = null; // Only for scripts not installed
-  this._tempFile = null; // Only for scripts not installed
+  this._downloadURL = null;
+  this._tempFile = null;
   this._filename = null;
   this._mimetype = null;
   this._charset = null;
diff --git a/chrome/greasemonkey.jar!/content/statusbar.xul b/chrome/greasemonkey.jar!/content/statusbar.xul
index c6e8536..efdeee7 100644
--- a/chrome/greasemonkey.jar!/content/statusbar.xul
+++ b/chrome/greasemonkey.jar!/content/statusbar.xul
@@ -17,6 +17,7 @@
     <menupopup id="gm-status-popup"
       onpopupshowing="GM_showPopup(event);"
       onclick="GM_popupClicked(event);"
+      oncontextmenu="event.preventDefault();"
     >
       <menuseparator class="scripts-framed-point" collapsed="true" />
       <menuseparator class="scripts-sep" />
diff --git a/chrome/greasemonkey.jar!/locale/ca-AD/gm-addons.dtd b/chrome/greasemonkey.jar!/locale/ca-AD/gm-addons.dtd
index d444a7d..bd35cf6 100644
--- a/chrome/greasemonkey.jar!/locale/ca-AD/gm-addons.dtd
+++ b/chrome/greasemonkey.jar!/locale/ca-AD/gm-addons.dtd
@@ -5,6 +5,8 @@
 <!ENTITY ExecuteLast "Execute last">
 <!ENTITY ExecuteLater "Execute later">
 <!ENTITY ExecuteSooner "Execute sooner">
+<!ENTITY FindUpdate "Find Update">
+<!ENTITY InstallUpdate "Install Update">
 <!ENTITY MoveDown "Move Down">
 <!ENTITY MoveDown.accesskey "D">
 <!ENTITY MoveToBottom "Move To Bottom">
diff --git a/chrome/greasemonkey.jar!/locale/ca-AD/gm-browser.properties b/chrome/greasemonkey.jar!/locale/ca-AD/gm-browser.properties
index 81d47ad..70d0b80 100644
--- a/chrome/greasemonkey.jar!/locale/ca-AD/gm-browser.properties
+++ b/chrome/greasemonkey.jar!/locale/ca-AD/gm-browser.properties
@@ -17,5 +17,5 @@ editor.prompt=Please choose your preferred text editor first
 editor.please_pick_executable=Please pick an executable application to use to edit user scripts.
 editor.could_not_launch=Could not launch editor.
 newscript.noname=Please provide a name for your script.
-newscript.nonamespace=Please provide a valid namespace URI for your script.\n(e.g. "http://userscripts.org/users/useridnumber")
-newscript.exists=A script with that name is already installed.\nOK to overwrite?
+newscript.nonamespace=Please provide a valid namespace URI for your script.n(e.g. "http://userscripts.org/users/useridnumber")
+newscript.exists=A script with that name is already installed.nOK to overwrite?
diff --git a/chrome/greasemonkey.jar!/locale/ca-AD/greasemonkey.dtd b/chrome/greasemonkey.jar!/locale/ca-AD/greasemonkey.dtd
index 6a60d07..820c8f1 100644
--- a/chrome/greasemonkey.jar!/locale/ca-AD/greasemonkey.dtd
+++ b/chrome/greasemonkey.jar!/locale/ca-AD/greasemonkey.dtd
@@ -29,6 +29,10 @@
 <!ENTITY userscripts "User Scripts">
 <!ENTITY Uninstall "Uninstall">
 <!ENTITY AlsoUninstallPrefs "Also uninstall associated preferences">
+<!ENTITY UpdateChecking "Update Checking">
+<!ENTITY EnableUpdateChecking "Enable automatic update checking of scripts">
+<!ENTITY UpdateInterval "Minimum number of days between update checks">
+<!ENTITY RequireSecureUpdates "Require secure updates">
 <!ENTITY greasemonkey.noscriptshere "No installed scripts run on this page.">
 <!ENTITY greasemonkey.youhavenoscripts "You don't have any user scripts installed">
 <!ENTITY greasemonkey.getuserscripts "Get user scripts">
diff --git a/chrome/greasemonkey.jar!/locale/cs/gm-addons.dtd b/chrome/greasemonkey.jar!/locale/cs/gm-addons.dtd
index 228d992..2bf28d0 100644
--- a/chrome/greasemonkey.jar!/locale/cs/gm-addons.dtd
+++ b/chrome/greasemonkey.jar!/locale/cs/gm-addons.dtd
@@ -5,6 +5,8 @@
 <!ENTITY ExecuteLast "Spustit poslední">
 <!ENTITY ExecuteLater "Spustit později">
 <!ENTITY ExecuteSooner "Spustit dříve">
+<!ENTITY FindUpdate "Find Update">
+<!ENTITY InstallUpdate "Install Update">
 <!ENTITY MoveDown "Posunout níže">
 <!ENTITY MoveDown.accesskey "n">
 <!ENTITY MoveToBottom "Posunout úplně dolů">
diff --git a/chrome/greasemonkey.jar!/locale/cs/gm-browser.properties b/chrome/greasemonkey.jar!/locale/cs/gm-browser.properties
index 94f9f4b..f58f080 100644
--- a/chrome/greasemonkey.jar!/locale/cs/gm-browser.properties
+++ b/chrome/greasemonkey.jar!/locale/cs/gm-browser.properties
@@ -17,5 +17,5 @@ editor.prompt=Nejprve zvolte váš oblíbený textový editor
 editor.please_pick_executable=Prosím vložte spustitelnou aplikaci, která se použije pro úprav textových souborů.
 editor.could_not_launch=Nelze spustit editor.
 newscript.noname=Prosím poskytněte název vašeho skriptu.
-newscript.nonamespace=Prosím poskytněte správný jmenný prostor pro váš skript.\n(např. "http://userscripts.org/users/useridnumber")
-newscript.exists=Skript s tímto jménem je již nainstalován.\nPřejete si ho přepsat?
+newscript.nonamespace=Prosím poskytněte správný jmenný prostor pro váš skript.n(např. "http://userscripts.org/users/useridnumber")
+newscript.exists=Skript s tímto jménem je již nainstalován.nPřejete si ho přepsat?
diff --git a/chrome/greasemonkey.jar!/locale/cs/greasemonkey.dtd b/chrome/greasemonkey.jar!/locale/cs/greasemonkey.dtd
index 7e5fc53..9e59efc 100644
--- a/chrome/greasemonkey.jar!/locale/cs/greasemonkey.dtd
+++ b/chrome/greasemonkey.jar!/locale/cs/greasemonkey.dtd
@@ -29,6 +29,10 @@
 <!ENTITY userscripts "Uživatelské skripty">
 <!ENTITY Uninstall "Odinstalovat">
 <!ENTITY AlsoUninstallPrefs "Odinstalovat i přidružená nastavení">
+<!ENTITY UpdateChecking "Update Checking">
+<!ENTITY EnableUpdateChecking "Enable automatic update checking of scripts">
+<!ENTITY UpdateInterval "Minimum number of days between update checks">
+<!ENTITY RequireSecureUpdates "Require secure updates">
 <!ENTITY greasemonkey.noscriptshere "No installed scripts run on this page.">
 <!ENTITY greasemonkey.youhavenoscripts "Nemáte nainstalované uživatelské skripty">
 <!ENTITY greasemonkey.getuserscripts "Získat uživatelské skripty">
diff --git a/chrome/greasemonkey.jar!/locale/da/gm-addons.dtd b/chrome/greasemonkey.jar!/locale/da/gm-addons.dtd
index d7bba38..8ba52aa 100644
--- a/chrome/greasemonkey.jar!/locale/da/gm-addons.dtd
+++ b/chrome/greasemonkey.jar!/locale/da/gm-addons.dtd
@@ -5,6 +5,8 @@
 <!ENTITY ExecuteLast "Kør sidst">
 <!ENTITY ExecuteLater "Kør senere">
 <!ENTITY ExecuteSooner "Kør før">
+<!ENTITY FindUpdate "Find Update">
+<!ENTITY InstallUpdate "Install Update">
 <!ENTITY MoveDown "Flyt op">
 <!ENTITY MoveDown.accesskey "D">
 <!ENTITY MoveToBottom "Flyt til bunden">
diff --git a/chrome/greasemonkey.jar!/locale/da/gm-browser.properties b/chrome/greasemonkey.jar!/locale/da/gm-browser.properties
index d8867c0..0a47c7e 100644
--- a/chrome/greasemonkey.jar!/locale/da/gm-browser.properties
+++ b/chrome/greasemonkey.jar!/locale/da/gm-browser.properties
@@ -17,5 +17,5 @@ editor.prompt=Venligst vælg dit foretrukne tekstredigeringsprogram først
 editor.please_pick_executable=Vælg venligst et program til at bruge til at redigere user sripts.
 editor.could_not_launch=Kunne ikke åbne tekstredigeringsprogram.
 newscript.noname=Venligst navngiv dit script.
-newscript.nonamespace=Giv venligst en valid "nameespace" URL til dit script.\n(e.g. "http://userscripts.org/users/useridnumber")
-newscript.exists=Et script med dette navn er allerede installeret.\nOK at overskrive?
+newscript.nonamespace=Giv venligst en valid "nameespace" URL til dit script.n(e.g. "http://userscripts.org/users/useridnumber")
+newscript.exists=Et script med dette navn er allerede installeret.nOK at overskrive?
diff --git a/chrome/greasemonkey.jar!/locale/da/greasemonkey.dtd b/chrome/greasemonkey.jar!/locale/da/greasemonkey.dtd
index 67fd225..08e85f5 100644
--- a/chrome/greasemonkey.jar!/locale/da/greasemonkey.dtd
+++ b/chrome/greasemonkey.jar!/locale/da/greasemonkey.dtd
@@ -29,6 +29,10 @@
 <!ENTITY userscripts "User Scripts">
 <!ENTITY Uninstall "Afinstaller">
 <!ENTITY AlsoUninstallPrefs "Også afinstallere tilhørende indstilliner">
+<!ENTITY UpdateChecking "Update Checking">
+<!ENTITY EnableUpdateChecking "Enable automatic update checking of scripts">
+<!ENTITY UpdateInterval "Minimum number of days between update checks">
+<!ENTITY RequireSecureUpdates "Require secure updates">
 <!ENTITY greasemonkey.noscriptshere "Ingen installerede scripts køres på denne side.">
 <!ENTITY greasemonkey.youhavenoscripts "Du har ikke nogen user scripts installeret">
 <!ENTITY greasemonkey.getuserscripts "Find user scripts">
diff --git a/chrome/greasemonkey.jar!/locale/de/gm-addons.dtd b/chrome/greasemonkey.jar!/locale/de/gm-addons.dtd
index 461b904..daa29b4 100644
--- a/chrome/greasemonkey.jar!/locale/de/gm-addons.dtd
+++ b/chrome/greasemonkey.jar!/locale/de/gm-addons.dtd
@@ -5,6 +5,8 @@
 <!ENTITY ExecuteLast "Zuletzt ausführen">
 <!ENTITY ExecuteLater "Später ausführen">
 <!ENTITY ExecuteSooner "Früher ausführen">
+<!ENTITY FindUpdate "Find Update">
+<!ENTITY InstallUpdate "Install Update">
 <!ENTITY MoveDown "Nach unten verschieben">
 <!ENTITY MoveDown.accesskey "u">
 <!ENTITY MoveToBottom "Ans Ende verschieben">
diff --git a/chrome/greasemonkey.jar!/locale/de/gm-browser.properties b/chrome/greasemonkey.jar!/locale/de/gm-browser.properties
index cfe46d8..cb06999 100644
--- a/chrome/greasemonkey.jar!/locale/de/gm-browser.properties
+++ b/chrome/greasemonkey.jar!/locale/de/gm-browser.properties
@@ -13,9 +13,9 @@ alert.fromURI=Benutzerskript wird heruntergeladen…
 alert.fromURI.failure=Das Benutzerskript konnte nicht heruntergeladen werden
 alert.success=wurde erfolgreich installiert.
 alert.failure=Fehler bei der Installation des Benutzerskripts:
-editor.prompt=Bitte wählen Sie zunächst Ihren bevorzugten Text-Editor aus (z.B. "C:\\Windows\\notepad.exe")
+editor.prompt=Bitte wählen Sie zunächst Ihren bevorzugten Text-Editor aus (z.B. "C:Windowsnotepad.exe")
 editor.please_pick_executable=Bitte wählen Sie eine ausführbare Anwendung zur Bearbeitung der Benutzerskripte aus.
 editor.could_not_launch=Text-Editor konnte nicht gestartet werden.
 newscript.noname=Bitte geben Sie einen Namen für Ihr Skript an.
 newscript.nonamespace=Bitte geben Sie einen Namensraum für Ihr Skript an.
-newscript.exists=Ein Skript gleichen Namens ist bereits installiert.\nMöchten Sie dieses überschreiben?
+newscript.exists=Ein Skript gleichen Namens ist bereits installiert.nMöchten Sie dieses überschreiben?
diff --git a/chrome/greasemonkey.jar!/locale/de/greasemonkey.dtd b/chrome/greasemonkey.jar!/locale/de/greasemonkey.dtd
index f659ac9..1de43cf 100644
--- a/chrome/greasemonkey.jar!/locale/de/greasemonkey.dtd
+++ b/chrome/greasemonkey.jar!/locale/de/greasemonkey.dtd
@@ -29,6 +29,10 @@
 <!ENTITY userscripts "Benutzerskripte">
 <!ENTITY Uninstall "Deinstallieren">
 <!ENTITY AlsoUninstallPrefs "Zugehörige Einstellungen ebenfalls entfernen">
+<!ENTITY UpdateChecking "Update Checking">
+<!ENTITY EnableUpdateChecking "Enable automatic update checking of scripts">
+<!ENTITY UpdateInterval "Minimum number of days between update checks">
+<!ENTITY RequireSecureUpdates "Require secure updates">
 <!ENTITY greasemonkey.noscriptshere "Es werden keine installierten Skripte auf dieser Seite ausgeführt.">
 <!ENTITY greasemonkey.youhavenoscripts "Sie haben noch keine Benutzerskripte installiert">
 <!ENTITY greasemonkey.getuserscripts "Benutzerskripte hinzufügen…">
diff --git a/chrome/greasemonkey.jar!/locale/en-US/gm-addons.dtd b/chrome/greasemonkey.jar!/locale/en-US/gm-addons.dtd
index d444a7d..bd35cf6 100644
--- a/chrome/greasemonkey.jar!/locale/en-US/gm-addons.dtd
+++ b/chrome/greasemonkey.jar!/locale/en-US/gm-addons.dtd
@@ -5,6 +5,8 @@
 <!ENTITY ExecuteLast "Execute last">
 <!ENTITY ExecuteLater "Execute later">
 <!ENTITY ExecuteSooner "Execute sooner">
+<!ENTITY FindUpdate "Find Update">
+<!ENTITY InstallUpdate "Install Update">
 <!ENTITY MoveDown "Move Down">
 <!ENTITY MoveDown.accesskey "D">
 <!ENTITY MoveToBottom "Move To Bottom">
diff --git a/chrome/greasemonkey.jar!/locale/en-US/gm-browser.properties b/chrome/greasemonkey.jar!/locale/en-US/gm-browser.properties
index 81d47ad..70d0b80 100644
--- a/chrome/greasemonkey.jar!/locale/en-US/gm-browser.properties
+++ b/chrome/greasemonkey.jar!/locale/en-US/gm-browser.properties
@@ -17,5 +17,5 @@ editor.prompt=Please choose your preferred text editor first
 editor.please_pick_executable=Please pick an executable application to use to edit user scripts.
 editor.could_not_launch=Could not launch editor.
 newscript.noname=Please provide a name for your script.
-newscript.nonamespace=Please provide a valid namespace URI for your script.\n(e.g. "http://userscripts.org/users/useridnumber")
-newscript.exists=A script with that name is already installed.\nOK to overwrite?
+newscript.nonamespace=Please provide a valid namespace URI for your script.n(e.g. "http://userscripts.org/users/useridnumber")
+newscript.exists=A script with that name is already installed.nOK to overwrite?
diff --git a/chrome/greasemonkey.jar!/locale/en-US/greasemonkey.dtd b/chrome/greasemonkey.jar!/locale/en-US/greasemonkey.dtd
index 6a60d07..820c8f1 100644
--- a/chrome/greasemonkey.jar!/locale/en-US/greasemonkey.dtd
+++ b/chrome/greasemonkey.jar!/locale/en-US/greasemonkey.dtd
@@ -29,6 +29,10 @@
 <!ENTITY userscripts "User Scripts">
 <!ENTITY Uninstall "Uninstall">
 <!ENTITY AlsoUninstallPrefs "Also uninstall associated preferences">
+<!ENTITY UpdateChecking "Update Checking">
+<!ENTITY EnableUpdateChecking "Enable automatic update checking of scripts">
+<!ENTITY UpdateInterval "Minimum number of days between update checks">
+<!ENTITY RequireSecureUpdates "Require secure updates">
 <!ENTITY greasemonkey.noscriptshere "No installed scripts run on this page.">
 <!ENTITY greasemonkey.youhavenoscripts "You don't have any user scripts installed">
 <!ENTITY greasemonkey.getuserscripts "Get user scripts">
diff --git a/chrome/greasemonkey.jar!/locale/es-AR/gm-addons.dtd b/chrome/greasemonkey.jar!/locale/es-AR/gm-addons.dtd
index 30ddc8a..ac0c712 100644
--- a/chrome/greasemonkey.jar!/locale/es-AR/gm-addons.dtd
+++ b/chrome/greasemonkey.jar!/locale/es-AR/gm-addons.dtd
@@ -5,6 +5,8 @@
 <!ENTITY ExecuteLast "Ejecutar último">
 <!ENTITY ExecuteLater "Ejecutar después">
 <!ENTITY ExecuteSooner "Ejecutar antes">
+<!ENTITY FindUpdate "Find Update">
+<!ENTITY InstallUpdate "Install Update">
 <!ENTITY MoveDown "Mover abajo">
 <!ENTITY MoveDown.accesskey "b">
 <!ENTITY MoveToBottom "Mover al final">
diff --git a/chrome/greasemonkey.jar!/locale/es-AR/gm-browser.properties b/chrome/greasemonkey.jar!/locale/es-AR/gm-browser.properties
index 6a966e0..8c6f787 100644
--- a/chrome/greasemonkey.jar!/locale/es-AR/gm-browser.properties
+++ b/chrome/greasemonkey.jar!/locale/es-AR/gm-browser.properties
@@ -17,5 +17,5 @@ editor.prompt=Por favor, primero elija su editor de texto preferido
 editor.please_pick_executable=Por favor, elija una aplicación ejecutable para editar los scripts.
 editor.could_not_launch=No se pudo iniciar el editor.
 newscript.noname=Por favor, proporcione un nombre para su script.
-newscript.nonamespace=Sírvase proporcionar una URI válida para su script.\n (por ejemplo, "http://userscripts.org/users/useridnumber")
-newscript.exists=Un script con ese nombre ya está instalado.\n¿Aceptar para sobrescribir?
+newscript.nonamespace=Sírvase proporcionar una URI válida para su script.n (por ejemplo, "http://userscripts.org/users/useridnumber")
+newscript.exists=Un script con ese nombre ya está instalado.n¿Aceptar para sobrescribir?
diff --git a/chrome/greasemonkey.jar!/locale/es-AR/greasemonkey.dtd b/chrome/greasemonkey.jar!/locale/es-AR/greasemonkey.dtd
index 361032d..5f5bcd9 100644
--- a/chrome/greasemonkey.jar!/locale/es-AR/greasemonkey.dtd
+++ b/chrome/greasemonkey.jar!/locale/es-AR/greasemonkey.dtd
@@ -29,6 +29,10 @@
 <!ENTITY userscripts "Scripts">
 <!ENTITY Uninstall "Desinstalar">
 <!ENTITY AlsoUninstallPrefs "También desinstalar las preferencias asociadas">
+<!ENTITY UpdateChecking "Update Checking">
+<!ENTITY EnableUpdateChecking "Enable automatic update checking of scripts">
+<!ENTITY UpdateInterval "Minimum number of days between update checks">
+<!ENTITY RequireSecureUpdates "Require secure updates">
 <!ENTITY greasemonkey.noscriptshere "No installed scripts run on this page.">
 <!ENTITY greasemonkey.youhavenoscripts "You don't have any user scripts installed">
 <!ENTITY greasemonkey.getuserscripts "Get user scripts">
diff --git a/chrome/greasemonkey.jar!/locale/es-ES/gm-addons.dtd b/chrome/greasemonkey.jar!/locale/es-ES/gm-addons.dtd
index 1cad5c2..9e8b12f 100644
--- a/chrome/greasemonkey.jar!/locale/es-ES/gm-addons.dtd
+++ b/chrome/greasemonkey.jar!/locale/es-ES/gm-addons.dtd
@@ -5,6 +5,8 @@
 <!ENTITY ExecuteLast "ejecutar al final">
 <!ENTITY ExecuteLater "ejecutar despues">
 <!ENTITY ExecuteSooner "ejecutar pronto">
+<!ENTITY FindUpdate "Find Update">
+<!ENTITY InstallUpdate "Install Update">
 <!ENTITY MoveDown "mover hacia abajo">
 <!ENTITY MoveDown.accesskey "D">
 <!ENTITY MoveToBottom "mover el boton">
diff --git a/chrome/greasemonkey.jar!/locale/es-ES/gm-browser.properties b/chrome/greasemonkey.jar!/locale/es-ES/gm-browser.properties
index 81d47ad..70d0b80 100644
--- a/chrome/greasemonkey.jar!/locale/es-ES/gm-browser.properties
+++ b/chrome/greasemonkey.jar!/locale/es-ES/gm-browser.properties
@@ -17,5 +17,5 @@ editor.prompt=Please choose your preferred text editor first
 editor.please_pick_executable=Please pick an executable application to use to edit user scripts.
 editor.could_not_launch=Could not launch editor.
 newscript.noname=Please provide a name for your script.
-newscript.nonamespace=Please provide a valid namespace URI for your script.\n(e.g. "http://userscripts.org/users/useridnumber")
-newscript.exists=A script with that name is already installed.\nOK to overwrite?
+newscript.nonamespace=Please provide a valid namespace URI for your script.n(e.g. "http://userscripts.org/users/useridnumber")
+newscript.exists=A script with that name is already installed.nOK to overwrite?
diff --git a/chrome/greasemonkey.jar!/locale/es-ES/greasemonkey.dtd b/chrome/greasemonkey.jar!/locale/es-ES/greasemonkey.dtd
index 6a60d07..820c8f1 100644
--- a/chrome/greasemonkey.jar!/locale/es-ES/greasemonkey.dtd
+++ b/chrome/greasemonkey.jar!/locale/es-ES/greasemonkey.dtd
@@ -29,6 +29,10 @@
 <!ENTITY userscripts "User Scripts">
 <!ENTITY Uninstall "Uninstall">
 <!ENTITY AlsoUninstallPrefs "Also uninstall associated preferences">
+<!ENTITY UpdateChecking "Update Checking">
+<!ENTITY EnableUpdateChecking "Enable automatic update checking of scripts">
+<!ENTITY UpdateInterval "Minimum number of days between update checks">
+<!ENTITY RequireSecureUpdates "Require secure updates">
 <!ENTITY greasemonkey.noscriptshere "No installed scripts run on this page.">
 <!ENTITY greasemonkey.youhavenoscripts "You don't have any user scripts installed">
 <!ENTITY greasemonkey.getuserscripts "Get user scripts">
diff --git a/chrome/greasemonkey.jar!/locale/es-MX/gm-addons.dtd b/chrome/greasemonkey.jar!/locale/es-MX/gm-addons.dtd
index 475f19b..6945f69 100644
--- a/chrome/greasemonkey.jar!/locale/es-MX/gm-addons.dtd
+++ b/chrome/greasemonkey.jar!/locale/es-MX/gm-addons.dtd
@@ -5,6 +5,8 @@
 <!ENTITY ExecuteLast "Ejecutar al final">
 <!ENTITY ExecuteLater "Ejecutar después">
 <!ENTITY ExecuteSooner "Ejecutar pronto">
+<!ENTITY FindUpdate "Find Update">
+<!ENTITY InstallUpdate "Install Update">
 <!ENTITY MoveDown "Mover hacia abajo">
 <!ENTITY MoveDown.accesskey "D">
 <!ENTITY MoveToBottom "Mover al final">
diff --git a/chrome/greasemonkey.jar!/locale/es-MX/gm-browser.properties b/chrome/greasemonkey.jar!/locale/es-MX/gm-browser.properties
index f3184be..50f7a22 100644
--- a/chrome/greasemonkey.jar!/locale/es-MX/gm-browser.properties
+++ b/chrome/greasemonkey.jar!/locale/es-MX/gm-browser.properties
@@ -17,5 +17,5 @@ editor.prompt=Por favor primero seleciona tu editor de texto preferido
 editor.please_pick_executable=Elija una aplicación ejecutable para editar los scripts.
 editor.could_not_launch=No se pudo cargar el Editor.
 newscript.noname=Dale nombre a tu Script.
-newscript.nonamespace=Da una URI válida para tu Script.\n(e.g. "http://userscripts.org/users/useridnumber")
-newscript.exists=Existe un Script con el mismo nombre .\n¿Reemplazarlo?
+newscript.nonamespace=Da una URI válida para tu Script.n(e.g. "http://userscripts.org/users/useridnumber")
+newscript.exists=Existe un Script con el mismo nombre .n¿Reemplazarlo?
diff --git a/chrome/greasemonkey.jar!/locale/es-MX/greasemonkey.dtd b/chrome/greasemonkey.jar!/locale/es-MX/greasemonkey.dtd
index 746cc56..87b47a4 100644
--- a/chrome/greasemonkey.jar!/locale/es-MX/greasemonkey.dtd
+++ b/chrome/greasemonkey.jar!/locale/es-MX/greasemonkey.dtd
@@ -29,6 +29,10 @@
 <!ENTITY userscripts "Scripts">
 <!ENTITY Uninstall "Desinstalar">
 <!ENTITY AlsoUninstallPrefs "También desinstalar preferencias asociadas">
+<!ENTITY UpdateChecking "Update Checking">
+<!ENTITY EnableUpdateChecking "Enable automatic update checking of scripts">
+<!ENTITY UpdateInterval "Minimum number of days between update checks">
+<!ENTITY RequireSecureUpdates "Require secure updates">
 <!ENTITY greasemonkey.noscriptshere "No installed scripts run on this page.">
 <!ENTITY greasemonkey.youhavenoscripts "You don't have any user scripts installed">
 <!ENTITY greasemonkey.getuserscripts "Get user scripts">
diff --git a/chrome/greasemonkey.jar!/locale/es/gm-addons.dtd b/chrome/greasemonkey.jar!/locale/es/gm-addons.dtd
index 69359fa..f9f88f0 100644
--- a/chrome/greasemonkey.jar!/locale/es/gm-addons.dtd
+++ b/chrome/greasemonkey.jar!/locale/es/gm-addons.dtd
@@ -5,6 +5,8 @@
 <!ENTITY ExecuteLast "Ejecutar al ultimo">
 <!ENTITY ExecuteLater "Ejecutar luego">
 <!ENTITY ExecuteSooner "Ejecutar pronto">
+<!ENTITY FindUpdate "Find Update">
+<!ENTITY InstallUpdate "Install Update">
 <!ENTITY MoveDown "Mover abajo">
 <!ENTITY MoveDown.accesskey "M">
 <!ENTITY MoveToBottom "Mover al Final">
diff --git a/chrome/greasemonkey.jar!/locale/es/greasemonkey.dtd b/chrome/greasemonkey.jar!/locale/es/greasemonkey.dtd
index 880ccd9..b5bd5fa 100644
--- a/chrome/greasemonkey.jar!/locale/es/greasemonkey.dtd
+++ b/chrome/greasemonkey.jar!/locale/es/greasemonkey.dtd
@@ -29,6 +29,10 @@
 <!ENTITY userscripts "Script de Usuario(secuencia de comandos)">
 <!ENTITY Uninstall "Desinstalar">
 <!ENTITY AlsoUninstallPrefs "También desinstalar preferencias asociadas">
+<!ENTITY UpdateChecking "Update Checking">
+<!ENTITY EnableUpdateChecking "Enable automatic update checking of scripts">
+<!ENTITY UpdateInterval "Minimum number of days between update checks">
+<!ENTITY RequireSecureUpdates "Require secure updates">
 <!ENTITY greasemonkey.noscriptshere "No installed scripts run on this page.">
 <!ENTITY greasemonkey.youhavenoscripts "You don't have any user scripts installed">
 <!ENTITY greasemonkey.getuserscripts "Get user scripts">
diff --git a/chrome/greasemonkey.jar!/locale/et-EE/gm-addons.dtd b/chrome/greasemonkey.jar!/locale/et-EE/gm-addons.dtd
index 9690675..40b9ef2 100644
--- a/chrome/greasemonkey.jar!/locale/et-EE/gm-addons.dtd
+++ b/chrome/greasemonkey.jar!/locale/et-EE/gm-addons.dtd
@@ -5,6 +5,8 @@
 <!ENTITY ExecuteLast "Execute last">
 <!ENTITY ExecuteLater "Execute later">
 <!ENTITY ExecuteSooner "Execute sooner">
+<!ENTITY FindUpdate "Find Update">
+<!ENTITY InstallUpdate "Install Update">
 <!ENTITY MoveDown "Liiguta Allapoole">
 <!ENTITY MoveDown.accesskey "D">
 <!ENTITY MoveToBottom "Liiguta Viimaseks">
diff --git a/chrome/greasemonkey.jar!/locale/et-EE/gm-browser.properties b/chrome/greasemonkey.jar!/locale/et-EE/gm-browser.properties
index 79233ec..fede79a 100644
--- a/chrome/greasemonkey.jar!/locale/et-EE/gm-browser.properties
+++ b/chrome/greasemonkey.jar!/locale/et-EE/gm-browser.properties
@@ -17,5 +17,5 @@ editor.prompt=Please choose your preferred text editor first
 editor.please_pick_executable=Please pick an executable application to use to edit user scripts.
 editor.could_not_launch=Could not launch editor.
 newscript.noname=Please provide a name for your script.
-newscript.nonamespace=Please provide a valid namespace URI for your script.\n(e.g. "http://userscripts.org/users/useridnumber")
-newscript.exists=A script with that name is already installed.\nOK to overwrite?
+newscript.nonamespace=Please provide a valid namespace URI for your script.n(e.g. "http://userscripts.org/users/useridnumber")
+newscript.exists=A script with that name is already installed.nOK to overwrite?
diff --git a/chrome/greasemonkey.jar!/locale/et-EE/greasemonkey.dtd b/chrome/greasemonkey.jar!/locale/et-EE/greasemonkey.dtd
index 6f22700..c4d6b1a 100644
--- a/chrome/greasemonkey.jar!/locale/et-EE/greasemonkey.dtd
+++ b/chrome/greasemonkey.jar!/locale/et-EE/greasemonkey.dtd
@@ -29,6 +29,10 @@
 <!ENTITY userscripts "Kasutajaskriptid">
 <!ENTITY Uninstall "Eemalda">
 <!ENTITY AlsoUninstallPrefs "Also uninstall associated preferences">
+<!ENTITY UpdateChecking "Update Checking">
+<!ENTITY EnableUpdateChecking "Enable automatic update checking of scripts">
+<!ENTITY UpdateInterval "Minimum number of days between update checks">
+<!ENTITY RequireSecureUpdates "Require secure updates">
 <!ENTITY greasemonkey.noscriptshere "No installed scripts run on this page.">
 <!ENTITY greasemonkey.youhavenoscripts "You don't have any user scripts installed">
 <!ENTITY greasemonkey.getuserscripts "Get user scripts">
diff --git a/chrome/greasemonkey.jar!/locale/fa-IR/gm-addons.dtd b/chrome/greasemonkey.jar!/locale/fa-IR/gm-addons.dtd
index 9ff07f2..2e3fa67 100644
--- a/chrome/greasemonkey.jar!/locale/fa-IR/gm-addons.dtd
+++ b/chrome/greasemonkey.jar!/locale/fa-IR/gm-addons.dtd
@@ -5,6 +5,8 @@
 <!ENTITY ExecuteLast "اجرای آخرین">
 <!ENTITY ExecuteLater "دیرتر اجرا شود">
 <!ENTITY ExecuteSooner "زود تر اجرا شود">
+<!ENTITY FindUpdate "Find Update">
+<!ENTITY InstallUpdate "Install Update">
 <!ENTITY MoveDown "حرکت به پایین">
 <!ENTITY MoveDown.accesskey "ح">
 <!ENTITY MoveToBottom "حرکت به انتها">
diff --git a/chrome/greasemonkey.jar!/locale/fa-IR/greasemonkey.dtd b/chrome/greasemonkey.jar!/locale/fa-IR/greasemonkey.dtd
index 8a85600..28f152b 100644
--- a/chrome/greasemonkey.jar!/locale/fa-IR/greasemonkey.dtd
+++ b/chrome/greasemonkey.jar!/locale/fa-IR/greasemonkey.dtd
@@ -29,6 +29,10 @@
 <!ENTITY userscripts "دستنویس های کاربری">
 <!ENTITY Uninstall "عزل">
 <!ENTITY AlsoUninstallPrefs "همچنین حذف تنظیمات وابسته">
+<!ENTITY UpdateChecking "Update Checking">
+<!ENTITY EnableUpdateChecking "Enable automatic update checking of scripts">
+<!ENTITY UpdateInterval "Minimum number of days between update checks">
+<!ENTITY RequireSecureUpdates "Require secure updates">
 <!ENTITY greasemonkey.noscriptshere "دستنویس ای که در این صفحه اجرا شود موجود نیست.">
 <!ENTITY greasemonkey.youhavenoscripts "شما هیچ دستنویس نسب شده ای ندارید">
 <!ENTITY greasemonkey.getuserscripts "دریافت دستنویس های کاربری">
diff --git a/chrome/greasemonkey.jar!/locale/fi-FI/gm-addons.dtd b/chrome/greasemonkey.jar!/locale/fi-FI/gm-addons.dtd
index 481c244..829ef2c 100644
--- a/chrome/greasemonkey.jar!/locale/fi-FI/gm-addons.dtd
+++ b/chrome/greasemonkey.jar!/locale/fi-FI/gm-addons.dtd
@@ -5,6 +5,8 @@
 <!ENTITY ExecuteLast "Suorita viimeisenä">
 <!ENTITY ExecuteLater "Suorita myöhemmin">
 <!ENTITY ExecuteSooner "Suorita aiemmin">
+<!ENTITY FindUpdate "Find Update">
+<!ENTITY InstallUpdate "Install Update">
 <!ENTITY MoveDown "Siirrä alaspäin">
 <!ENTITY MoveDown.accesskey "A">
 <!ENTITY MoveToBottom "Siirrä loppuun">
diff --git a/chrome/greasemonkey.jar!/locale/fi-FI/gm-browser.properties b/chrome/greasemonkey.jar!/locale/fi-FI/gm-browser.properties
index bd87a2a..ea82034 100644
--- a/chrome/greasemonkey.jar!/locale/fi-FI/gm-browser.properties
+++ b/chrome/greasemonkey.jar!/locale/fi-FI/gm-browser.properties
@@ -17,5 +17,5 @@ editor.prompt=Valitse ensin haluamasi tekstieditori
 editor.please_pick_executable=Valitse ohjelma jota haluat käyttää skriptien muokkaamiseen.
 editor.could_not_launch=Tekstieditorin käynnistys epäonnistui.
 newscript.noname=Anna skriptillesi nimi.
-newscript.nonamespace=Anna skriptillesi kelvollinen nimiavaruus-URI.\n(esim. "http://userscripts.org/users/<käyttäjänumero>")
-newscript.exists=Samanniminen skripti on jo asennettuna.\nKorvataanko?
+newscript.nonamespace=Anna skriptillesi kelvollinen nimiavaruus-URI.n(esim. "http://userscripts.org/users/<käyttäjänumero>")
+newscript.exists=Samanniminen skripti on jo asennettuna.nKorvataanko?
diff --git a/chrome/greasemonkey.jar!/locale/fi-FI/greasemonkey.dtd b/chrome/greasemonkey.jar!/locale/fi-FI/greasemonkey.dtd
index 9bd2824..db2d6b0 100644
--- a/chrome/greasemonkey.jar!/locale/fi-FI/greasemonkey.dtd
+++ b/chrome/greasemonkey.jar!/locale/fi-FI/greasemonkey.dtd
@@ -29,6 +29,10 @@
 <!ENTITY userscripts "Skriptit">
 <!ENTITY Uninstall "Poisto">
 <!ENTITY AlsoUninstallPrefs "Poista myös skriptin asetukset">
+<!ENTITY UpdateChecking "Update Checking">
+<!ENTITY EnableUpdateChecking "Enable automatic update checking of scripts">
+<!ENTITY UpdateInterval "Minimum number of days between update checks">
+<!ENTITY RequireSecureUpdates "Require secure updates">
 <!ENTITY greasemonkey.noscriptshere "Mitään skripteistä ei ajeta tällä sivulla.">
 <!ENTITY greasemonkey.youhavenoscripts "Sinulla ei ole yhtään skriptiä asennettuna">
 <!ENTITY greasemonkey.getuserscripts "Hanki skriptejä">
diff --git a/chrome/greasemonkey.jar!/locale/fr/gm-addons.dtd b/chrome/greasemonkey.jar!/locale/fr/gm-addons.dtd
index ee807e9..97df9ba 100644
--- a/chrome/greasemonkey.jar!/locale/fr/gm-addons.dtd
+++ b/chrome/greasemonkey.jar!/locale/fr/gm-addons.dtd
@@ -5,6 +5,8 @@
 <!ENTITY ExecuteLast "Exécuter en dernier">
 <!ENTITY ExecuteLater "Exécuter plus tard">
 <!ENTITY ExecuteSooner "Exécuter plus tôt">
+<!ENTITY FindUpdate "Find Update">
+<!ENTITY InstallUpdate "Install Update">
 <!ENTITY MoveDown "Descendre">
 <!ENTITY MoveDown.accesskey "D">
 <!ENTITY MoveToBottom "Descendre tout en bas">
diff --git a/chrome/greasemonkey.jar!/locale/fr/gm-browser.properties b/chrome/greasemonkey.jar!/locale/fr/gm-browser.properties
index b917ca2..4d5cf5d 100644
--- a/chrome/greasemonkey.jar!/locale/fr/gm-browser.properties
+++ b/chrome/greasemonkey.jar!/locale/fr/gm-browser.properties
@@ -17,5 +17,5 @@ editor.prompt=Veuillez d'abord choisir votre éditeur de texte préféré
 editor.please_pick_executable=Veuillez choisir l'application exécutable à utiliser pour modifier les scripts utilisateur.
 editor.could_not_launch=Lancement de l'éditeur impossible.
 newscript.noname=Veuillez donner un nom à votre script.
-newscript.nonamespace=Veuillez fournir un espace de nom URI valide pour votre script.\n(par exemple. "http://userscripts.org/users/useridnumber")
-newscript.exists=Un script avec ce nom est déjà installé.\nL'écraser?
+newscript.nonamespace=Veuillez fournir un espace de nom URI valide pour votre script.n(par exemple. "http://userscripts.org/users/useridnumber")
+newscript.exists=Un script avec ce nom est déjà installé.nL'écraser?
diff --git a/chrome/greasemonkey.jar!/locale/fr/greasemonkey.dtd b/chrome/greasemonkey.jar!/locale/fr/greasemonkey.dtd
index 57ef4d9..9b49c8b 100644
--- a/chrome/greasemonkey.jar!/locale/fr/greasemonkey.dtd
+++ b/chrome/greasemonkey.jar!/locale/fr/greasemonkey.dtd
@@ -29,6 +29,10 @@
 <!ENTITY userscripts "Scripts Utilisateur">
 <!ENTITY Uninstall "Désinstaller">
 <!ENTITY AlsoUninstallPrefs "Désinstalle également les préférences associées">
+<!ENTITY UpdateChecking "Update Checking">
+<!ENTITY EnableUpdateChecking "Enable automatic update checking of scripts">
+<!ENTITY UpdateInterval "Minimum number of days between update checks">
+<!ENTITY RequireSecureUpdates "Require secure updates">
 <!ENTITY greasemonkey.noscriptshere "Aucun script installé n'est exécuté sur cette page.">
 <!ENTITY greasemonkey.youhavenoscripts "Vous avez aucun scripts d'installé">
 <!ENTITY greasemonkey.getuserscripts "Obtenir des scripts utilisateur">
diff --git a/chrome/greasemonkey.jar!/locale/gl-ES/gm-addons.dtd b/chrome/greasemonkey.jar!/locale/gl-ES/gm-addons.dtd
index a0bab82..c2cfd50 100644
--- a/chrome/greasemonkey.jar!/locale/gl-ES/gm-addons.dtd
+++ b/chrome/greasemonkey.jar!/locale/gl-ES/gm-addons.dtd
@@ -5,6 +5,8 @@
 <!ENTITY ExecuteLast "Executar último">
 <!ENTITY ExecuteLater "Executar máis tarde">
 <!ENTITY ExecuteSooner "Executar antes">
+<!ENTITY FindUpdate "Find Update">
+<!ENTITY InstallUpdate "Install Update">
 <!ENTITY MoveDown "Mover abaixo">
 <!ENTITY MoveDown.accesskey "D">
 <!ENTITY MoveToBottom "Mover ao fondo">
diff --git a/chrome/greasemonkey.jar!/locale/gl-ES/gm-browser.properties b/chrome/greasemonkey.jar!/locale/gl-ES/gm-browser.properties
index c4a9a36..84cf404 100644
--- a/chrome/greasemonkey.jar!/locale/gl-ES/gm-browser.properties
+++ b/chrome/greasemonkey.jar!/locale/gl-ES/gm-browser.properties
@@ -17,5 +17,5 @@ editor.prompt=Escolla primeiro o editor de texto que prefira
 editor.please_pick_executable=Seleccione o executable do aplicativo que desexa para editar os scripts.
 editor.could_not_launch=Non foi posible iniciar o editor.
 newscript.noname=Introduza un nome para o script.
-newscript.nonamespace=Introduza un URI de espazo de nome válido para o script.\n(p.e. "http://userscripts.org/users/useridnumber")
-newscript.exists=Xa hai instalado un script con ese nome\nDesexa sobrescribilo?
+newscript.nonamespace=Introduza un URI de espazo de nome válido para o script.n(p.e. "http://userscripts.org/users/useridnumber")
+newscript.exists=Xa hai instalado un script con ese nomenDesexa sobrescribilo?
diff --git a/chrome/greasemonkey.jar!/locale/gl-ES/greasemonkey.dtd b/chrome/greasemonkey.jar!/locale/gl-ES/greasemonkey.dtd
index 82c477f..4563a34 100644
--- a/chrome/greasemonkey.jar!/locale/gl-ES/greasemonkey.dtd
+++ b/chrome/greasemonkey.jar!/locale/gl-ES/greasemonkey.dtd
@@ -29,6 +29,10 @@
 <!ENTITY userscripts "Scripts">
 <!ENTITY Uninstall "Desinstalar">
 <!ENTITY AlsoUninstallPrefs "Tamén desinstalar as preferencias asociadas">
+<!ENTITY UpdateChecking "Update Checking">
+<!ENTITY EnableUpdateChecking "Enable automatic update checking of scripts">
+<!ENTITY UpdateInterval "Minimum number of days between update checks">
+<!ENTITY RequireSecureUpdates "Require secure updates">
 <!ENTITY greasemonkey.noscriptshere "Ningún script instalado en execución.">
 <!ENTITY greasemonkey.youhavenoscripts "Non ten scripts de usuario instalados">
 <!ENTITY greasemonkey.getuserscripts "Obter scripts">
diff --git a/chrome/greasemonkey.jar!/locale/he-IL/gm-addons.dtd b/chrome/greasemonkey.jar!/locale/he-IL/gm-addons.dtd
index d85e800..cbc78e5 100644
--- a/chrome/greasemonkey.jar!/locale/he-IL/gm-addons.dtd
+++ b/chrome/greasemonkey.jar!/locale/he-IL/gm-addons.dtd
@@ -5,6 +5,8 @@
 <!ENTITY ExecuteLast "בצע בסוף">
 <!ENTITY ExecuteLater "בצע מאוחר יותר">
 <!ENTITY ExecuteSooner "בצע מוקדם יותר">
+<!ENTITY FindUpdate "Find Update">
+<!ENTITY InstallUpdate "Install Update">
 <!ENTITY MoveDown "הזז למטה">
 <!ENTITY MoveDown.accesskey "ט">
 <!ENTITY MoveToBottom "הזז לסוף הרשימה">
diff --git a/chrome/greasemonkey.jar!/locale/he-IL/gm-browser.properties b/chrome/greasemonkey.jar!/locale/he-IL/gm-browser.properties
index 90a71d8..7a3ac60 100644
--- a/chrome/greasemonkey.jar!/locale/he-IL/gm-browser.properties
+++ b/chrome/greasemonkey.jar!/locale/he-IL/gm-browser.properties
@@ -17,5 +17,5 @@ editor.prompt=נא בחר תחילה את עורך הטקסט המועדף על
 editor.please_pick_executable=נא לבחור יישום בר-הפעלה לשימוש עריכת סקריפטים של משתמש
 editor.could_not_launch=אין אפשרות להפעיל את העורך
 newscript.noname=נא לבחור שם עבור הסקריפט שלך
-newscript.nonamespace=נא לבחור כתובת אינטרנט תקינה עבור הסקריפט שלך.\n(כגון: "http://userscripts.org/users/useridnumber")
-newscript.exists=סקריפט עם שם זה כבר מותקן.\nלהחליף אותו?
+newscript.nonamespace=נא לבחור כתובת אינטרנט תקינה עבור הסקריפט שלך.n(כגון: "http://userscripts.org/users/useridnumber")
+newscript.exists=סקריפט עם שם זה כבר מותקן.nלהחליף אותו?
diff --git a/chrome/greasemonkey.jar!/locale/he-IL/gm-cludes.dtd b/chrome/greasemonkey.jar!/locale/he-IL/gm-cludes.dtd
index a2c1e4d..1fdb583 100644
--- a/chrome/greasemonkey.jar!/locale/he-IL/gm-cludes.dtd
+++ b/chrome/greasemonkey.jar!/locale/he-IL/gm-cludes.dtd
@@ -3,6 +3,24 @@
 
 
 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
 ">
 <!ENTITY promptForNewPage.title "הוסף דף">
 <!ENTITY promptForNewPage.defVal "http://example.com/*">
@@ -11,6 +29,24 @@
 
 
 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
 ">
 <!ENTITY promptForEdit.title "ערוך דף">
 <!ENTITY button.add "הוסף...">
diff --git a/chrome/greasemonkey.jar!/locale/he-IL/greasemonkey.dtd b/chrome/greasemonkey.jar!/locale/he-IL/greasemonkey.dtd
index 9b01f57..c445ae5 100644
--- a/chrome/greasemonkey.jar!/locale/he-IL/greasemonkey.dtd
+++ b/chrome/greasemonkey.jar!/locale/he-IL/greasemonkey.dtd
@@ -29,6 +29,10 @@
 <!ENTITY userscripts "סקריפטים של משתמש">
 <!ENTITY Uninstall "הסר">
 <!ENTITY AlsoUninstallPrefs "הסר גם את העדפות המשויכות לסקריפט משתמש זה">
+<!ENTITY UpdateChecking "Update Checking">
+<!ENTITY EnableUpdateChecking "Enable automatic update checking of scripts">
+<!ENTITY UpdateInterval "Minimum number of days between update checks">
+<!ENTITY RequireSecureUpdates "Require secure updates">
 <!ENTITY greasemonkey.noscriptshere "לא קיימים סקריפטים מותקנים פעילים בדף זה.">
 <!ENTITY greasemonkey.youhavenoscripts "לא מותקנים אצלך סקריפטים של משתמש">
 <!ENTITY greasemonkey.getuserscripts "השג סקריפטים של משתמש">
diff --git a/chrome/greasemonkey.jar!/locale/hu/gm-addons.dtd b/chrome/greasemonkey.jar!/locale/hu/gm-addons.dtd
index e040116..5bc5165 100644
--- a/chrome/greasemonkey.jar!/locale/hu/gm-addons.dtd
+++ b/chrome/greasemonkey.jar!/locale/hu/gm-addons.dtd
@@ -5,6 +5,8 @@
 <!ENTITY ExecuteLast "Végrehajtás utolsóként">
 <!ENTITY ExecuteLater "Végrehajtás később">
 <!ENTITY ExecuteSooner "Végrehajtás előbb">
+<!ENTITY FindUpdate "Find Update">
+<!ENTITY InstallUpdate "Install Update">
 <!ENTITY MoveDown "Mozgatás lefele">
 <!ENTITY MoveDown.accesskey "l">
 <!ENTITY MoveToBottom "Mozgatás legalulra">
diff --git a/chrome/greasemonkey.jar!/locale/hu/gm-browser.properties b/chrome/greasemonkey.jar!/locale/hu/gm-browser.properties
index 9a05acd..e9f1914 100644
--- a/chrome/greasemonkey.jar!/locale/hu/gm-browser.properties
+++ b/chrome/greasemonkey.jar!/locale/hu/gm-browser.properties
@@ -18,4 +18,4 @@ editor.please_pick_executable=Válasszon ki egy alkalmazást amivel a parancsfá
 editor.could_not_launch=A szerkesztő indítása sikertelen
 newscript.noname=Kérlek adjon egy nevet a parancsfájlnak.
 newscript.nonamespace=Kérlek adjon meg egy szabványos névtér URI-t a parancsfájlhoz.
-newscript.exists=Már létezik parancsfájl ezzel a névvel.\nOK a felülíráshoz?
+newscript.exists=Már létezik parancsfájl ezzel a névvel.nOK a felülíráshoz?
diff --git a/chrome/greasemonkey.jar!/locale/hu/greasemonkey.dtd b/chrome/greasemonkey.jar!/locale/hu/greasemonkey.dtd
index bd56252..8dd0668 100644
--- a/chrome/greasemonkey.jar!/locale/hu/greasemonkey.dtd
+++ b/chrome/greasemonkey.jar!/locale/hu/greasemonkey.dtd
@@ -29,6 +29,10 @@
 <!ENTITY userscripts "Parancsfájlok">
 <!ENTITY Uninstall "Eltávolítás">
 <!ENTITY AlsoUninstallPrefs "Hozzákapcsolódó beállítások eltávolítása">
+<!ENTITY UpdateChecking "Update Checking">
+<!ENTITY EnableUpdateChecking "Enable automatic update checking of scripts">
+<!ENTITY UpdateInterval "Minimum number of days between update checks">
+<!ENTITY RequireSecureUpdates "Require secure updates">
 <!ENTITY greasemonkey.noscriptshere "Ezen az oldalon nem futnak telepített parancsfájlok.">
 <!ENTITY greasemonkey.youhavenoscripts "Nincsenek parancsfájlok telepítve">
 <!ENTITY greasemonkey.getuserscripts "Töltsön le parancsfájlokat!">
diff --git a/chrome/greasemonkey.jar!/locale/it-IT/gm-addons.dtd b/chrome/greasemonkey.jar!/locale/it-IT/gm-addons.dtd
index d444a7d..bd35cf6 100644
--- a/chrome/greasemonkey.jar!/locale/it-IT/gm-addons.dtd
+++ b/chrome/greasemonkey.jar!/locale/it-IT/gm-addons.dtd
@@ -5,6 +5,8 @@
 <!ENTITY ExecuteLast "Execute last">
 <!ENTITY ExecuteLater "Execute later">
 <!ENTITY ExecuteSooner "Execute sooner">
+<!ENTITY FindUpdate "Find Update">
+<!ENTITY InstallUpdate "Install Update">
 <!ENTITY MoveDown "Move Down">
 <!ENTITY MoveDown.accesskey "D">
 <!ENTITY MoveToBottom "Move To Bottom">
diff --git a/chrome/greasemonkey.jar!/locale/it-IT/gm-browser.properties b/chrome/greasemonkey.jar!/locale/it-IT/gm-browser.properties
index 5997e14..9610ec0 100644
--- a/chrome/greasemonkey.jar!/locale/it-IT/gm-browser.properties
+++ b/chrome/greasemonkey.jar!/locale/it-IT/gm-browser.properties
@@ -17,5 +17,5 @@ editor.prompt=Come prima operazione, selezionare l'editor testuale desiderato
 editor.please_pick_executable=Selezionare un'applicazione eseguibile da utilizzare per la modifica degli script utente.
 editor.could_not_launch=Impossibile avviare l'editor.
 newscript.noname=Fornire un nome per lo script.
-newscript.nonamespace=Fornire un URI namespace valido per lo script.\n(es.: "http://userscripts.org/users/useridnumber")
-newscript.exists=Uno script con quel nome è già installato.\nSovrasciverlo?
+newscript.nonamespace=Fornire un URI namespace valido per lo script.n(es.: "http://userscripts.org/users/useridnumber")
+newscript.exists=Uno script con quel nome è già installato.nSovrasciverlo?
diff --git a/chrome/greasemonkey.jar!/locale/it-IT/greasemonkey.dtd b/chrome/greasemonkey.jar!/locale/it-IT/greasemonkey.dtd
index 9d868ae..7ad7b8e 100644
--- a/chrome/greasemonkey.jar!/locale/it-IT/greasemonkey.dtd
+++ b/chrome/greasemonkey.jar!/locale/it-IT/greasemonkey.dtd
@@ -29,6 +29,10 @@
 <!ENTITY userscripts "User Scripts">
 <!ENTITY Uninstall "Disinstalla">
 <!ENTITY AlsoUninstallPrefs "Disinstalla anche le preferenze associate">
+<!ENTITY UpdateChecking "Update Checking">
+<!ENTITY EnableUpdateChecking "Enable automatic update checking of scripts">
+<!ENTITY UpdateInterval "Minimum number of days between update checks">
+<!ENTITY RequireSecureUpdates "Require secure updates">
 <!ENTITY greasemonkey.noscriptshere "No installed scripts run on this page.">
 <!ENTITY greasemonkey.youhavenoscripts "You don't have any user scripts installed">
 <!ENTITY greasemonkey.getuserscripts "Get user scripts">
diff --git a/chrome/greasemonkey.jar!/locale/ja-JP/gm-addons.dtd b/chrome/greasemonkey.jar!/locale/ja-JP/gm-addons.dtd
index 63cd3e0..c2df07f 100644
--- a/chrome/greasemonkey.jar!/locale/ja-JP/gm-addons.dtd
+++ b/chrome/greasemonkey.jar!/locale/ja-JP/gm-addons.dtd
@@ -5,6 +5,8 @@
 <!ENTITY ExecuteLast "最後に実行">
 <!ENTITY ExecuteLater "後で実行">
 <!ENTITY ExecuteSooner "先に実行">
+<!ENTITY FindUpdate "Find Update">
+<!ENTITY InstallUpdate "Install Update">
 <!ENTITY MoveDown "下へ移動">
 <!ENTITY MoveDown.accesskey "D">
 <!ENTITY MoveToBottom "最後へ移動">
diff --git a/chrome/greasemonkey.jar!/locale/ja-JP/greasemonkey.dtd b/chrome/greasemonkey.jar!/locale/ja-JP/greasemonkey.dtd
index cd0dba7..f92a518 100644
--- a/chrome/greasemonkey.jar!/locale/ja-JP/greasemonkey.dtd
+++ b/chrome/greasemonkey.jar!/locale/ja-JP/greasemonkey.dtd
@@ -29,6 +29,10 @@
 <!ENTITY userscripts "ユーザスクリプト">
 <!ENTITY Uninstall "削除">
 <!ENTITY AlsoUninstallPrefs "関連付けられた設定も削除">
+<!ENTITY UpdateChecking "Update Checking">
+<!ENTITY EnableUpdateChecking "Enable automatic update checking of scripts">
+<!ENTITY UpdateInterval "Minimum number of days between update checks">
+<!ENTITY RequireSecureUpdates "Require secure updates">
 <!ENTITY greasemonkey.noscriptshere "このページで実行するスクリプトはインストールされていません。">
 <!ENTITY greasemonkey.youhavenoscripts "スクリプトが何もインストールされていません">
 <!ENTITY greasemonkey.getuserscripts "スクリプトを入手">
diff --git a/chrome/greasemonkey.jar!/locale/ko-KR/gm-addons.dtd b/chrome/greasemonkey.jar!/locale/ko-KR/gm-addons.dtd
index 5916a6f..93bffd3 100644
--- a/chrome/greasemonkey.jar!/locale/ko-KR/gm-addons.dtd
+++ b/chrome/greasemonkey.jar!/locale/ko-KR/gm-addons.dtd
@@ -5,6 +5,8 @@
 <!ENTITY ExecuteLast "마지막에 실행">
 <!ENTITY ExecuteLater "나중에 실행">
 <!ENTITY ExecuteSooner "일찍 실행">
+<!ENTITY FindUpdate "Find Update">
+<!ENTITY InstallUpdate "Install Update">
 <!ENTITY MoveDown "아래로 이동">
 <!ENTITY MoveDown.accesskey "D">
 <!ENTITY MoveToBottom "맨 아래로 이동">
diff --git a/chrome/greasemonkey.jar!/locale/ko-KR/greasemonkey.dtd b/chrome/greasemonkey.jar!/locale/ko-KR/greasemonkey.dtd
index 79cc5c6..c359576 100644
--- a/chrome/greasemonkey.jar!/locale/ko-KR/greasemonkey.dtd
+++ b/chrome/greasemonkey.jar!/locale/ko-KR/greasemonkey.dtd
@@ -29,6 +29,10 @@
 <!ENTITY userscripts "유저 스크립트">
 <!ENTITY Uninstall "삭제">
 <!ENTITY AlsoUninstallPrefs "관련된 환경 설정도 삭제">
+<!ENTITY UpdateChecking "Update Checking">
+<!ENTITY EnableUpdateChecking "Enable automatic update checking of scripts">
+<!ENTITY UpdateInterval "Minimum number of days between update checks">
+<!ENTITY RequireSecureUpdates "Require secure updates">
 <!ENTITY greasemonkey.noscriptshere "No installed scripts run on this page.">
 <!ENTITY greasemonkey.youhavenoscripts "You don't have any user scripts installed">
 <!ENTITY greasemonkey.getuserscripts "Get user scripts">
diff --git a/chrome/greasemonkey.jar!/locale/nl/gm-addons.dtd b/chrome/greasemonkey.jar!/locale/nl/gm-addons.dtd
index ff54805..fae8607 100644
--- a/chrome/greasemonkey.jar!/locale/nl/gm-addons.dtd
+++ b/chrome/greasemonkey.jar!/locale/nl/gm-addons.dtd
@@ -5,6 +5,8 @@
 <!ENTITY ExecuteLast "Als laatste uitvoeren">
 <!ENTITY ExecuteLater "Later uitvoeren">
 <!ENTITY ExecuteSooner "Eerder uitvoeren">
+<!ENTITY FindUpdate "Find Update">
+<!ENTITY InstallUpdate "Install Update">
 <!ENTITY MoveDown "Omlaag">
 <!ENTITY MoveDown.accesskey "L">
 <!ENTITY MoveToBottom "Onderaan plaatsen">
diff --git a/chrome/greasemonkey.jar!/locale/nl/gm-browser.properties b/chrome/greasemonkey.jar!/locale/nl/gm-browser.properties
index 1c4102e..a557640 100644
--- a/chrome/greasemonkey.jar!/locale/nl/gm-browser.properties
+++ b/chrome/greasemonkey.jar!/locale/nl/gm-browser.properties
@@ -17,5 +17,5 @@ editor.prompt=Kies eerst de tekstverwerker van uw voorkeur
 editor.please_pick_executable=Kies een uitvoerbare toepassing die u wilt gebruiken om gebruikersscripts te bewerken.
 editor.could_not_launch=Kan de tekstverwerker niet starten.
 newscript.noname=Geef een naam op voor uw script.
-newscript.nonamespace=Geef een geldige namespace-URI voor uw script op.\n(b.v. “http://userscripts.org/users/useridnumber”)
-newscript.exists=Er is al een script met die naam geïnstalleerd.\nMag dit overschreven worden?
+newscript.nonamespace=Geef een geldige namespace-URI voor uw script op.n(b.v. “http://userscripts.org/users/useridnumber”)
+newscript.exists=Er is al een script met die naam geïnstalleerd.nMag dit overschreven worden?
diff --git a/chrome/greasemonkey.jar!/locale/nl/greasemonkey.dtd b/chrome/greasemonkey.jar!/locale/nl/greasemonkey.dtd
index 545fb39..1c05247 100644
--- a/chrome/greasemonkey.jar!/locale/nl/greasemonkey.dtd
+++ b/chrome/greasemonkey.jar!/locale/nl/greasemonkey.dtd
@@ -29,6 +29,10 @@
 <!ENTITY userscripts "Gebruikersscripts">
 <!ENTITY Uninstall "Deïnstalleren">
 <!ENTITY AlsoUninstallPrefs "Bijbehorende instellingen ook verwijderen">
+<!ENTITY UpdateChecking "Update Checking">
+<!ENTITY EnableUpdateChecking "Enable automatic update checking of scripts">
+<!ENTITY UpdateInterval "Minimum number of days between update checks">
+<!ENTITY RequireSecureUpdates "Require secure updates">
 <!ENTITY greasemonkey.noscriptshere "Op deze pagina draaien geen geïnstalleerde scripts.">
 <!ENTITY greasemonkey.youhavenoscripts "Er zijn geen gebruikersscripts geïnstalleerd">
 <!ENTITY greasemonkey.getuserscripts "Verkrijg gebruikersscripts">
diff --git a/chrome/greasemonkey.jar!/locale/pl/gm-addons.dtd b/chrome/greasemonkey.jar!/locale/pl/gm-addons.dtd
index 45813a6..02a7d36 100644
--- a/chrome/greasemonkey.jar!/locale/pl/gm-addons.dtd
+++ b/chrome/greasemonkey.jar!/locale/pl/gm-addons.dtd
@@ -5,6 +5,8 @@
 <!ENTITY ExecuteLast "Wykonaj jako ostatni">
 <!ENTITY ExecuteLater "Wykonaj później">
 <!ENTITY ExecuteSooner "Wykonaj wcześniej">
+<!ENTITY FindUpdate "Find Update">
+<!ENTITY InstallUpdate "Install Update">
 <!ENTITY MoveDown "Przenieś w dół">
 <!ENTITY MoveDown.accesskey "P">
 <!ENTITY MoveToBottom "Przenieś na dół">
diff --git a/chrome/greasemonkey.jar!/locale/pl/gm-browser.properties b/chrome/greasemonkey.jar!/locale/pl/gm-browser.properties
index 0bbc7e5..19c55b6 100644
--- a/chrome/greasemonkey.jar!/locale/pl/gm-browser.properties
+++ b/chrome/greasemonkey.jar!/locale/pl/gm-browser.properties
@@ -12,10 +12,10 @@ greeting.btnAccess=I
 alert.fromURI=Pobieranie skryptu…
 alert.fromURI.failure=Nie można pobrać skryptu
 alert.success=Zainstalowano
-alert.failure=Wystąpił błąd podczas instalacji skryptu:\n
+alert.failure=Wystąpił błąd podczas instalacji skryptu:n
 editor.prompt=Wybierz najpierw preferowany edytor tekstu
 editor.please_pick_executable=Wskaż plik wykonywalny aplikacji używanej do edycji skryptów.
 editor.could_not_launch=Nie można otworzyć edytora.
 newscript.noname=Wprowadź nazwę skryptu.
-newscript.nonamespace=Wprowadź lokalizację skryptu.\n(Np. http://userscripts.org/users/useridnumber)
-newscript.exists=Skrypt o takiej nazwie jest już zainstalowany.\nZastąpić skrypt?
+newscript.nonamespace=Wprowadź lokalizację skryptu.n(Np. http://userscripts.org/users/useridnumber)
+newscript.exists=Skrypt o takiej nazwie jest już zainstalowany.nZastąpić skrypt?
diff --git a/chrome/greasemonkey.jar!/locale/pl/greasemonkey.dtd b/chrome/greasemonkey.jar!/locale/pl/greasemonkey.dtd
index 8f334be..242ead9 100644
--- a/chrome/greasemonkey.jar!/locale/pl/greasemonkey.dtd
+++ b/chrome/greasemonkey.jar!/locale/pl/greasemonkey.dtd
@@ -29,6 +29,10 @@
 <!ENTITY userscripts "Skrypty">
 <!ENTITY Uninstall "Odinstaluj">
 <!ENTITY AlsoUninstallPrefs "Odinstaluj również skojarzone ustawienia">
+<!ENTITY UpdateChecking "Update Checking">
+<!ENTITY EnableUpdateChecking "Enable automatic update checking of scripts">
+<!ENTITY UpdateInterval "Minimum number of days between update checks">
+<!ENTITY RequireSecureUpdates "Require secure updates">
 <!ENTITY greasemonkey.noscriptshere "Na tej stronie nie ma zainstalowanych skryptów do uruchomienia.">
 <!ENTITY greasemonkey.youhavenoscripts "Nie masz zainstalowanych żadnych skryptów użytkownika">
 <!ENTITY greasemonkey.getuserscripts "Pobierz skrypty">
diff --git a/chrome/greasemonkey.jar!/locale/pt-BR/gm-addons.dtd b/chrome/greasemonkey.jar!/locale/pt-BR/gm-addons.dtd
index 4ef9b0d..6e1bde7 100644
--- a/chrome/greasemonkey.jar!/locale/pt-BR/gm-addons.dtd
+++ b/chrome/greasemonkey.jar!/locale/pt-BR/gm-addons.dtd
@@ -5,6 +5,8 @@
 <!ENTITY ExecuteLast "Executar por último">
 <!ENTITY ExecuteLater "Executar depois">
 <!ENTITY ExecuteSooner "Executar antes">
+<!ENTITY FindUpdate "Find Update">
+<!ENTITY InstallUpdate "Install Update">
 <!ENTITY MoveDown "Mover Para Baixo">
 <!ENTITY MoveDown.accesskey "B">
 <!ENTITY MoveToBottom "Mover Para o Fim">
diff --git a/chrome/greasemonkey.jar!/locale/pt-BR/gm-browser.properties b/chrome/greasemonkey.jar!/locale/pt-BR/gm-browser.properties
index 684ec21..81c596b 100644
--- a/chrome/greasemonkey.jar!/locale/pt-BR/gm-browser.properties
+++ b/chrome/greasemonkey.jar!/locale/pt-BR/gm-browser.properties
@@ -17,5 +17,5 @@ editor.prompt=Favor escolher seu editor de texto preferido primeiro
 editor.please_pick_executable=Favor escolher um aplicativo executável para usar para editar scripts de usuário.
 editor.could_not_launch=Não foi possível abrir o editor.
 newscript.noname=Favor atribuir um nome ao seu script.
-newscript.nonamespace=Favor fornecer um namespace válido para seu script.\n(p. ex. "http://userscripts.org/users/useridnumber")
-newscript.exists=Um script com este nome já está instalado.\nSobrescrever?
+newscript.nonamespace=Favor fornecer um namespace válido para seu script.n(p. ex. "http://userscripts.org/users/useridnumber")
+newscript.exists=Um script com este nome já está instalado.nSobrescrever?
diff --git a/chrome/greasemonkey.jar!/locale/pt-BR/greasemonkey.dtd b/chrome/greasemonkey.jar!/locale/pt-BR/greasemonkey.dtd
index 0581b7f..9f31b30 100644
--- a/chrome/greasemonkey.jar!/locale/pt-BR/greasemonkey.dtd
+++ b/chrome/greasemonkey.jar!/locale/pt-BR/greasemonkey.dtd
@@ -29,6 +29,10 @@
 <!ENTITY userscripts "Scripts de Usuário">
 <!ENTITY Uninstall "Desinstalar">
 <!ENTITY AlsoUninstallPrefs "Desinstalar também configurações associadas">
+<!ENTITY UpdateChecking "Update Checking">
+<!ENTITY EnableUpdateChecking "Enable automatic update checking of scripts">
+<!ENTITY UpdateInterval "Minimum number of days between update checks">
+<!ENTITY RequireSecureUpdates "Require secure updates">
 <!ENTITY greasemonkey.noscriptshere "Nenhum script instalado será executado nessa página.">
 <!ENTITY greasemonkey.youhavenoscripts "Você não possui nenhum script de usuário instalado">
 <!ENTITY greasemonkey.getuserscripts "Obter scripts de usuário">
diff --git a/chrome/greasemonkey.jar!/locale/ro-RO/gm-addons.dtd b/chrome/greasemonkey.jar!/locale/ro-RO/gm-addons.dtd
index d444a7d..bd35cf6 100644
--- a/chrome/greasemonkey.jar!/locale/ro-RO/gm-addons.dtd
+++ b/chrome/greasemonkey.jar!/locale/ro-RO/gm-addons.dtd
@@ -5,6 +5,8 @@
 <!ENTITY ExecuteLast "Execute last">
 <!ENTITY ExecuteLater "Execute later">
 <!ENTITY ExecuteSooner "Execute sooner">
+<!ENTITY FindUpdate "Find Update">
+<!ENTITY InstallUpdate "Install Update">
 <!ENTITY MoveDown "Move Down">
 <!ENTITY MoveDown.accesskey "D">
 <!ENTITY MoveToBottom "Move To Bottom">
diff --git a/chrome/greasemonkey.jar!/locale/ro-RO/gm-browser.properties b/chrome/greasemonkey.jar!/locale/ro-RO/gm-browser.properties
index b09d669..60ab5f8 100644
--- a/chrome/greasemonkey.jar!/locale/ro-RO/gm-browser.properties
+++ b/chrome/greasemonkey.jar!/locale/ro-RO/gm-browser.properties
@@ -17,5 +17,5 @@ editor.prompt=Please choose your preferred text editor first
 editor.please_pick_executable=Please pick an executable application to use to edit user scripts.
 editor.could_not_launch=Could not launch editor.
 newscript.noname=Please provide a name for your script.
-newscript.nonamespace=Please provide a valid namespace URI for your script.\n(e.g. "http://userscripts.org/users/useridnumber")
-newscript.exists=A script with that name is already installed.\nOK to overwrite?
+newscript.nonamespace=Please provide a valid namespace URI for your script.n(e.g. "http://userscripts.org/users/useridnumber")
+newscript.exists=A script with that name is already installed.nOK to overwrite?
diff --git a/chrome/greasemonkey.jar!/locale/ro-RO/greasemonkey.dtd b/chrome/greasemonkey.jar!/locale/ro-RO/greasemonkey.dtd
index 6a60d07..820c8f1 100644
--- a/chrome/greasemonkey.jar!/locale/ro-RO/greasemonkey.dtd
+++ b/chrome/greasemonkey.jar!/locale/ro-RO/greasemonkey.dtd
@@ -29,6 +29,10 @@
 <!ENTITY userscripts "User Scripts">
 <!ENTITY Uninstall "Uninstall">
 <!ENTITY AlsoUninstallPrefs "Also uninstall associated preferences">
+<!ENTITY UpdateChecking "Update Checking">
+<!ENTITY EnableUpdateChecking "Enable automatic update checking of scripts">
+<!ENTITY UpdateInterval "Minimum number of days between update checks">
+<!ENTITY RequireSecureUpdates "Require secure updates">
 <!ENTITY greasemonkey.noscriptshere "No installed scripts run on this page.">
 <!ENTITY greasemonkey.youhavenoscripts "You don't have any user scripts installed">
 <!ENTITY greasemonkey.getuserscripts "Get user scripts">
diff --git a/chrome/greasemonkey.jar!/locale/ru-RU/gm-addons.dtd b/chrome/greasemonkey.jar!/locale/ru-RU/gm-addons.dtd
index b8cc1fe..c90de30 100644
--- a/chrome/greasemonkey.jar!/locale/ru-RU/gm-addons.dtd
+++ b/chrome/greasemonkey.jar!/locale/ru-RU/gm-addons.dtd
@@ -5,6 +5,8 @@
 <!ENTITY ExecuteLast "Выполнять последним">
 <!ENTITY ExecuteLater "Выполнять позднее">
 <!ENTITY ExecuteSooner "Выполнять ранее">
+<!ENTITY FindUpdate "Find Update">
+<!ENTITY InstallUpdate "Install Update">
 <!ENTITY MoveDown "Переместить ниже">
 <!ENTITY MoveDown.accesskey "и">
 <!ENTITY MoveToBottom "Переместить в конец">
diff --git a/chrome/greasemonkey.jar!/locale/ru-RU/gm-browser.properties b/chrome/greasemonkey.jar!/locale/ru-RU/gm-browser.properties
index f73eb8f..7daf9ce 100644
--- a/chrome/greasemonkey.jar!/locale/ru-RU/gm-browser.properties
+++ b/chrome/greasemonkey.jar!/locale/ru-RU/gm-browser.properties
@@ -13,9 +13,9 @@ alert.fromURI=Загружается скрипт...
 alert.fromURI.failure=Невозможно загрузить скрипт
 alert.success=успешно установлен.
 alert.failure=Ошибка при установке скрипта:
-editor.prompt=Выберите текстовый редактор (напр. "c:\\windows\\notepad.exe")
+editor.prompt=Выберите текстовый редактор (напр. "c:windowsnotepad.exe")
 editor.please_pick_executable=Выберите приложение для редактирования скриптов.
 editor.could_not_launch=Невозможно запустить редактор.
 newscript.noname=Задайте имя для вашего скрипта.
 newscript.nonamespace=Задайте пространство для вашего скрипта.
-newscript.exists=Скрипт с таким же названием уже установлен.\nПерезаписать?
+newscript.exists=Скрипт с таким же названием уже установлен.nПерезаписать?
diff --git a/chrome/greasemonkey.jar!/locale/ru-RU/greasemonkey.dtd b/chrome/greasemonkey.jar!/locale/ru-RU/greasemonkey.dtd
index 191e603..fb0b57b 100644
--- a/chrome/greasemonkey.jar!/locale/ru-RU/greasemonkey.dtd
+++ b/chrome/greasemonkey.jar!/locale/ru-RU/greasemonkey.dtd
@@ -29,6 +29,10 @@
 <!ENTITY userscripts "Пользовательские скрипты">
 <!ENTITY Uninstall "Удалить">
 <!ENTITY AlsoUninstallPrefs "Также удалить все связанные настройки">
+<!ENTITY UpdateChecking "Update Checking">
+<!ENTITY EnableUpdateChecking "Enable automatic update checking of scripts">
+<!ENTITY UpdateInterval "Minimum number of days between update checks">
+<!ENTITY RequireSecureUpdates "Require secure updates">
 <!ENTITY greasemonkey.noscriptshere "No installed scripts run on this page.">
 <!ENTITY greasemonkey.youhavenoscripts "You don't have any user scripts installed">
 <!ENTITY greasemonkey.getuserscripts "Get user scripts">
diff --git a/chrome/greasemonkey.jar!/locale/ru/gm-addons.dtd b/chrome/greasemonkey.jar!/locale/ru/gm-addons.dtd
index cd59b7a..8ac04f7 100644
--- a/chrome/greasemonkey.jar!/locale/ru/gm-addons.dtd
+++ b/chrome/greasemonkey.jar!/locale/ru/gm-addons.dtd
@@ -5,6 +5,8 @@
 <!ENTITY ExecuteLast "Выполнять последним">
 <!ENTITY ExecuteLater "Выполнять позднее">
 <!ENTITY ExecuteSooner "Выполнять ранее">
+<!ENTITY FindUpdate "Find Update">
+<!ENTITY InstallUpdate "Install Update">
 <!ENTITY MoveDown "Переместить ниже">
 <!ENTITY MoveDown.accesskey "и">
 <!ENTITY MoveToBottom "Переместить в конец">
diff --git a/chrome/greasemonkey.jar!/locale/ru/gm-browser.properties b/chrome/greasemonkey.jar!/locale/ru/gm-browser.properties
index 09e7eec..39f0000 100644
--- a/chrome/greasemonkey.jar!/locale/ru/gm-browser.properties
+++ b/chrome/greasemonkey.jar!/locale/ru/gm-browser.properties
@@ -13,9 +13,9 @@ alert.fromURI=Скрипт загружается…
 alert.fromURI.failure=Невозможно загрузить скрипт
 alert.success=успешно установлен.
 alert.failure=Ошибка при установке скрипта:
-editor.prompt=Выберите текстовый редактор (напр. "c:\\windows\\notepad.exe")
+editor.prompt=Выберите текстовый редактор (напр. "c:windowsnotepad.exe")
 editor.please_pick_executable=Выберите приложение для редактирования скриптов.
 editor.could_not_launch=Невозможно запустить редактор.
 newscript.noname=Задайте имя для вашего скрипта.
 newscript.nonamespace=Задайте пространство для вашего скрипта.
-newscript.exists=Скрипт с таким именем уже установлен.\nПерезаписать?
+newscript.exists=Скрипт с таким именем уже установлен.nПерезаписать?
diff --git a/chrome/greasemonkey.jar!/locale/ru/greasemonkey.dtd b/chrome/greasemonkey.jar!/locale/ru/greasemonkey.dtd
index 84233d2..4bcb694 100644
--- a/chrome/greasemonkey.jar!/locale/ru/greasemonkey.dtd
+++ b/chrome/greasemonkey.jar!/locale/ru/greasemonkey.dtd
@@ -29,6 +29,10 @@
 <!ENTITY userscripts "Пользовательские скрипты">
 <!ENTITY Uninstall "Удаление">
 <!ENTITY AlsoUninstallPrefs "Также удалять настройки скриптов">
+<!ENTITY UpdateChecking "Update Checking">
+<!ENTITY EnableUpdateChecking "Enable automatic update checking of scripts">
+<!ENTITY UpdateInterval "Minimum number of days between update checks">
+<!ENTITY RequireSecureUpdates "Require secure updates">
 <!ENTITY greasemonkey.noscriptshere "Для этой страницы нет скриптов">
 <!ENTITY greasemonkey.youhavenoscripts "У вас не установлено ни одного скрипта">
 <!ENTITY greasemonkey.getuserscripts "Скачать скрипты">
diff --git a/chrome/greasemonkey.jar!/locale/si-LK/gm-addons.dtd b/chrome/greasemonkey.jar!/locale/si-LK/gm-addons.dtd
index a3aa18f..1eeed0a 100644
--- a/chrome/greasemonkey.jar!/locale/si-LK/gm-addons.dtd
+++ b/chrome/greasemonkey.jar!/locale/si-LK/gm-addons.dtd
@@ -5,6 +5,8 @@
 <!ENTITY ExecuteLast "අවසානයට ක්‍රියාකරවන්න">
 <!ENTITY ExecuteLater "පසුව ක්‍රියාත්මක කරන්න">
 <!ENTITY ExecuteSooner "ඉක්මනින් ක්‍රියාත්මක කරන්න">
+<!ENTITY FindUpdate "Find Update">
+<!ENTITY InstallUpdate "Install Update">
 <!ENTITY MoveDown "පහලට යවන්න">
 <!ENTITY MoveDown.accesskey "D">
 <!ENTITY MoveToBottom "අවසානයට යවන්න">
diff --git a/chrome/greasemonkey.jar!/locale/si-LK/gm-browser.properties b/chrome/greasemonkey.jar!/locale/si-LK/gm-browser.properties
index 47ecc44..4f7a52f 100644
--- a/chrome/greasemonkey.jar!/locale/si-LK/gm-browser.properties
+++ b/chrome/greasemonkey.jar!/locale/si-LK/gm-browser.properties
@@ -18,4 +18,4 @@ editor.please_pick_executable=පරිශීලක ස්ක්‍රිප්
 editor.could_not_launch=වදන් සකසනය (Editor) ක්‍රියාත්මක කල නොහැක
 newscript.noname=කරුනාකර ඔබගේ ස්ක්‍රිප්ටයට නමක් ලබාදෙන්න
 newscript.nonamespace=කරුනාකර ඔබගේ පරිශීලක ස්ක්‍රිටයට වලංගු නාමාවකාශය URI යක් ලබාදෙන්න (උ.දා. "http://userscripts.org/users/useridnumber")
-newscript.exists=මෙම නමින් දැනටමත් වෙන ස්ක්‍රිප්ටයක් පවතී.\nඋඩින් ලිවීම සදහා OK  ක්ලික් කරන්න ?
+newscript.exists=මෙම නමින් දැනටමත් වෙන ස්ක්‍රිප්ටයක් පවතී.nඋඩින් ලිවීම සදහා OK  ක්ලික් කරන්න ?
diff --git a/chrome/greasemonkey.jar!/locale/si-LK/greasemonkey.dtd b/chrome/greasemonkey.jar!/locale/si-LK/greasemonkey.dtd
index 7f0d573..402fdcc 100644
--- a/chrome/greasemonkey.jar!/locale/si-LK/greasemonkey.dtd
+++ b/chrome/greasemonkey.jar!/locale/si-LK/greasemonkey.dtd
@@ -29,6 +29,10 @@
 <!ENTITY userscripts "පරිශීලක ස්ක්‍රිප්ට්">
 <!ENTITY Uninstall "ඉවත් කරන්න">
 <!ENTITY AlsoUninstallPrefs "එසේම ආශ්‍රිත අභිමතද ඉවත් කරන්න">
+<!ENTITY UpdateChecking "Update Checking">
+<!ENTITY EnableUpdateChecking "Enable automatic update checking of scripts">
+<!ENTITY UpdateInterval "Minimum number of days between update checks">
+<!ENTITY RequireSecureUpdates "Require secure updates">
 <!ENTITY greasemonkey.noscriptshere "No installed scripts run on this page.">
 <!ENTITY greasemonkey.youhavenoscripts "You don't have any user scripts installed">
 <!ENTITY greasemonkey.getuserscripts "Get user scripts">
diff --git a/chrome/greasemonkey.jar!/locale/sr/gm-addons.dtd b/chrome/greasemonkey.jar!/locale/sr/gm-addons.dtd
index 5eae54a..6593598 100644
--- a/chrome/greasemonkey.jar!/locale/sr/gm-addons.dtd
+++ b/chrome/greasemonkey.jar!/locale/sr/gm-addons.dtd
@@ -5,6 +5,8 @@
 <!ENTITY ExecuteLast "Изврши последњу">
 <!ENTITY ExecuteLater "Изврши касније">
 <!ENTITY ExecuteSooner "Изврши раније">
+<!ENTITY FindUpdate "Find Update">
+<!ENTITY InstallUpdate "Install Update">
 <!ENTITY MoveDown "Помери надоле">
 <!ENTITY MoveDown.accesskey "Д">
 <!ENTITY MoveToBottom "Помери на крај">
diff --git a/chrome/greasemonkey.jar!/locale/sr/gm-browser.properties b/chrome/greasemonkey.jar!/locale/sr/gm-browser.properties
index a08f791..c12a2dc 100644
--- a/chrome/greasemonkey.jar!/locale/sr/gm-browser.properties
+++ b/chrome/greasemonkey.jar!/locale/sr/gm-browser.properties
@@ -17,5 +17,5 @@ editor.prompt=Прво изаберите жељени уређивач текс
 editor.please_pick_executable=Изаберите извршну датотеку програма којег желите користити за уређивање корисничких скрипти.
 editor.could_not_launch=Није могуће покренути уређивач.
 newscript.noname=Унесите назив своје скрипте.
-newscript.nonamespace=Унесите важећу адресу ваше скрипте.\n(нпр. http://userscripts.org/users/useridnumber)
+newscript.nonamespace=Унесите важећу адресу ваше скрипте.n(нпр. http://userscripts.org/users/useridnumber)
 newscript.exists=Скрипта са тим именом већ постоји. Желите ли да је препишете?
diff --git a/chrome/greasemonkey.jar!/locale/sr/greasemonkey.dtd b/chrome/greasemonkey.jar!/locale/sr/greasemonkey.dtd
index 9548102..336a2b9 100644
--- a/chrome/greasemonkey.jar!/locale/sr/greasemonkey.dtd
+++ b/chrome/greasemonkey.jar!/locale/sr/greasemonkey.dtd
@@ -29,6 +29,10 @@
 <!ENTITY userscripts "Корисничке скрипте">
 <!ENTITY Uninstall "Уклони">
 <!ENTITY AlsoUninstallPrefs "Уклони и подешавања">
+<!ENTITY UpdateChecking "Update Checking">
+<!ENTITY EnableUpdateChecking "Enable automatic update checking of scripts">
+<!ENTITY UpdateInterval "Minimum number of days between update checks">
+<!ENTITY RequireSecureUpdates "Require secure updates">
 <!ENTITY greasemonkey.noscriptshere "Ни једна скрипта се не покреће на овој станици">
 <!ENTITY greasemonkey.youhavenoscripts "Није инсталирана ни једна корисничка скрипта">
 <!ENTITY greasemonkey.getuserscripts "Набави коприсничке скрипте">
diff --git a/chrome/greasemonkey.jar!/locale/sv-SE/gm-addons.dtd b/chrome/greasemonkey.jar!/locale/sv-SE/gm-addons.dtd
index 3967ecf..1d0858a 100644
--- a/chrome/greasemonkey.jar!/locale/sv-SE/gm-addons.dtd
+++ b/chrome/greasemonkey.jar!/locale/sv-SE/gm-addons.dtd
@@ -5,6 +5,8 @@
 <!ENTITY ExecuteLast "Kör sist">
 <!ENTITY ExecuteLater "Kör senare">
 <!ENTITY ExecuteSooner "Kör tidigare">
+<!ENTITY FindUpdate "Find Update">
+<!ENTITY InstallUpdate "Install Update">
 <!ENTITY MoveDown "Flytta nedåt">
 <!ENTITY MoveDown.accesskey "n">
 <!ENTITY MoveToBottom "Flytta nederst">
diff --git a/chrome/greasemonkey.jar!/locale/sv-SE/gm-browser.properties b/chrome/greasemonkey.jar!/locale/sv-SE/gm-browser.properties
index 591a5f2..48d1085 100644
--- a/chrome/greasemonkey.jar!/locale/sv-SE/gm-browser.properties
+++ b/chrome/greasemonkey.jar!/locale/sv-SE/gm-browser.properties
@@ -17,5 +17,5 @@ editor.prompt=Var vänlig välj först det textredigeringsprogram du föredrar
 editor.please_pick_executable=Var vänlig välj ett körbart program att använda till att redigera användarskript.
 editor.could_not_launch=Kunde inte starta redigeringsprogrammet.
 newscript.noname=Var vänlig ange ett namn på ditt skript.
-newscript.nonamespace=Var vänlig ange en giltig namnrymds-URI för ditt skript.\n(t.ex. "http://userscripts.org/users/användarensidnummer")
-newscript.exists=Ett skript med det namnet har redan installerats.\nSkall det ersättas?
+newscript.nonamespace=Var vänlig ange en giltig namnrymds-URI för ditt skript.n(t.ex. "http://userscripts.org/users/användarensidnummer")
+newscript.exists=Ett skript med det namnet har redan installerats.nSkall det ersättas?
diff --git a/chrome/greasemonkey.jar!/locale/sv-SE/greasemonkey.dtd b/chrome/greasemonkey.jar!/locale/sv-SE/greasemonkey.dtd
index 991377a..488c7bb 100644
--- a/chrome/greasemonkey.jar!/locale/sv-SE/greasemonkey.dtd
+++ b/chrome/greasemonkey.jar!/locale/sv-SE/greasemonkey.dtd
@@ -29,6 +29,10 @@
 <!ENTITY userscripts "Användarskript">
 <!ENTITY Uninstall "Avinstallera">
 <!ENTITY AlsoUninstallPrefs "Avinstallera även associerade inställningar">
+<!ENTITY UpdateChecking "Update Checking">
+<!ENTITY EnableUpdateChecking "Enable automatic update checking of scripts">
+<!ENTITY UpdateInterval "Minimum number of days between update checks">
+<!ENTITY RequireSecureUpdates "Require secure updates">
 <!ENTITY greasemonkey.noscriptshere "Inga installerade skript körs på denna sida.">
 <!ENTITY greasemonkey.youhavenoscripts "Du har inga installerade användarskript">
 <!ENTITY greasemonkey.getuserscripts "Hämta användarskript">
diff --git a/chrome/greasemonkey.jar!/locale/tr-TR/gm-addons.dtd b/chrome/greasemonkey.jar!/locale/tr-TR/gm-addons.dtd
index 030e6f5..7a2d8a9 100644
--- a/chrome/greasemonkey.jar!/locale/tr-TR/gm-addons.dtd
+++ b/chrome/greasemonkey.jar!/locale/tr-TR/gm-addons.dtd
@@ -5,6 +5,8 @@
 <!ENTITY ExecuteLast "Son Yürüt">
 <!ENTITY ExecuteLater "Sonra yürüt">
 <!ENTITY ExecuteSooner "Er geç yürüt">
+<!ENTITY FindUpdate "Find Update">
+<!ENTITY InstallUpdate "Install Update">
 <!ENTITY MoveDown "Aşağı Taşı">
 <!ENTITY MoveDown.accesskey "D">
 <!ENTITY MoveToBottom "En alta Taşı">
diff --git a/chrome/greasemonkey.jar!/locale/tr-TR/gm-browser.properties b/chrome/greasemonkey.jar!/locale/tr-TR/gm-browser.properties
index 7a472c1..e8f9ffb 100644
--- a/chrome/greasemonkey.jar!/locale/tr-TR/gm-browser.properties
+++ b/chrome/greasemonkey.jar!/locale/tr-TR/gm-browser.properties
@@ -17,5 +17,5 @@ editor.prompt=Lütfen önce tercih edilen metin editörünü seçin
 editor.please_pick_executable=Lütfen kullanıcı betiklerini düzenlemek için çalıştırılabilir bir uygulama alın.
 editor.could_not_launch=Editör başlatılamadı.
 newscript.noname=Betiğinize bir isim verin.
-newscript.nonamespace=Betiğiniz için geçerli bir URL verin.\n(örneğin "http://userscripts.org/users/useridnumber")
-newscript.exists=Bu isimde bir betik zaten yüklü.\nÜzerine yazılsın mı?
+newscript.nonamespace=Betiğiniz için geçerli bir URL verin.n(örneğin "http://userscripts.org/users/useridnumber")
+newscript.exists=Bu isimde bir betik zaten yüklü.nÜzerine yazılsın mı?
diff --git a/chrome/greasemonkey.jar!/locale/tr-TR/greasemonkey.dtd b/chrome/greasemonkey.jar!/locale/tr-TR/greasemonkey.dtd
index 60e5e05..0d29a1f 100644
--- a/chrome/greasemonkey.jar!/locale/tr-TR/greasemonkey.dtd
+++ b/chrome/greasemonkey.jar!/locale/tr-TR/greasemonkey.dtd
@@ -29,6 +29,10 @@
 <!ENTITY userscripts "Kullanıcı Betikleri">
 <!ENTITY Uninstall "Kaldır">
 <!ENTITY AlsoUninstallPrefs "Ayrıca ilişkili tercihleri kaldır">
+<!ENTITY UpdateChecking "Update Checking">
+<!ENTITY EnableUpdateChecking "Enable automatic update checking of scripts">
+<!ENTITY UpdateInterval "Minimum number of days between update checks">
+<!ENTITY RequireSecureUpdates "Require secure updates">
 <!ENTITY greasemonkey.noscriptshere "Bu sayfada çalışan yüklenmiş betikler yok">
 <!ENTITY greasemonkey.youhavenoscripts "Yüklü bir kullanıcı betiğiniz yok">
 <!ENTITY greasemonkey.getuserscripts "Kullanıcı betikleri al">
diff --git a/chrome/greasemonkey.jar!/locale/tr-TR/gm-addons.dtd b/chrome/greasemonkey.jar!/locale/tr/gm-addons.dtd
similarity index 95%
copy from chrome/greasemonkey.jar!/locale/tr-TR/gm-addons.dtd
copy to chrome/greasemonkey.jar!/locale/tr/gm-addons.dtd
index 030e6f5..7a2d8a9 100644
--- a/chrome/greasemonkey.jar!/locale/tr-TR/gm-addons.dtd
+++ b/chrome/greasemonkey.jar!/locale/tr/gm-addons.dtd
@@ -5,6 +5,8 @@
 <!ENTITY ExecuteLast "Son Yürüt">
 <!ENTITY ExecuteLater "Sonra yürüt">
 <!ENTITY ExecuteSooner "Er geç yürüt">
+<!ENTITY FindUpdate "Find Update">
+<!ENTITY InstallUpdate "Install Update">
 <!ENTITY MoveDown "Aşağı Taşı">
 <!ENTITY MoveDown.accesskey "D">
 <!ENTITY MoveToBottom "En alta Taşı">
diff --git a/chrome/greasemonkey.jar!/locale/tr-TR/gm-addons.properties b/chrome/greasemonkey.jar!/locale/tr/gm-addons.properties
similarity index 100%
copy from chrome/greasemonkey.jar!/locale/tr-TR/gm-addons.properties
copy to chrome/greasemonkey.jar!/locale/tr/gm-addons.properties
diff --git a/chrome/greasemonkey.jar!/locale/tr-TR/gm-browser.properties b/chrome/greasemonkey.jar!/locale/tr/gm-browser.properties
similarity index 80%
copy from chrome/greasemonkey.jar!/locale/tr-TR/gm-browser.properties
copy to chrome/greasemonkey.jar!/locale/tr/gm-browser.properties
index 7a472c1..b708759 100644
--- a/chrome/greasemonkey.jar!/locale/tr-TR/gm-browser.properties
+++ b/chrome/greasemonkey.jar!/locale/tr/gm-browser.properties
@@ -3,7 +3,7 @@ menuitem.new=Yeni Kullanıcı Betiği
 menuitem.install=Bu Kullanıcı Betiğini Yükle
 tooltip.disabled=Greasemonkey devre dışı.
 tooltip.enabled=Greasemonkey etkin.
-tooltip.loading=Yükleniyor ...
+tooltip.loading=Yükleniyor...
 statusbar.installed=başarıyla yüklendi
 install.msg=Aşağıdaki Greasemonkey kullanıcı betiğini yüklemek için:
 greeting.msg=Bu bir Greasemonkey kullacı betiği.Kullanmaya başlamak için kura tıklayın.
@@ -17,5 +17,5 @@ editor.prompt=Lütfen önce tercih edilen metin editörünü seçin
 editor.please_pick_executable=Lütfen kullanıcı betiklerini düzenlemek için çalıştırılabilir bir uygulama alın.
 editor.could_not_launch=Editör başlatılamadı.
 newscript.noname=Betiğinize bir isim verin.
-newscript.nonamespace=Betiğiniz için geçerli bir URL verin.\n(örneğin "http://userscripts.org/users/useridnumber")
-newscript.exists=Bu isimde bir betik zaten yüklü.\nÜzerine yazılsın mı?
+newscript.nonamespace=Betiğiniz için geçerli bir URL verin.n(örneğin "http://userscripts.org/users/useridnumber")
+newscript.exists=Bu isimde bir betik zaten yüklü.nÜzerine yazılsın mı?
diff --git a/chrome/greasemonkey.jar!/locale/tr-TR/gm-cludes.dtd b/chrome/greasemonkey.jar!/locale/tr/gm-cludes.dtd
similarity index 90%
copy from chrome/greasemonkey.jar!/locale/tr-TR/gm-cludes.dtd
copy to chrome/greasemonkey.jar!/locale/tr/gm-cludes.dtd
index c1fcc8f..ebe7cd2 100644
--- a/chrome/greasemonkey.jar!/locale/tr-TR/gm-cludes.dtd
+++ b/chrome/greasemonkey.jar!/locale/tr/gm-cludes.dtd
@@ -3,10 +3,10 @@
 <!ENTITY promptForNewPage.defVal "http://example.com/*">
 <!ENTITY promptForEdit.msg "Aşağıdaki sayfanın URL'sini değiştirin. Joker (*) karakteri kullanarak birden fazla sayfa belirtebilirsiniz.">
 <!ENTITY promptForEdit.title "Sayfa Düzenle">
-<!ENTITY button.add "Ekle ...">
+<!ENTITY button.add "Ekle...">
 <!ENTITY button.addUserExclude "Bir kullanıcı ekle">
 <!ENTITY button.addUserInclude "Bir kullanıcı ekle">
-<!ENTITY button.edit "Düzenle ...">
+<!ENTITY button.edit "Düzenle...">
 <!ENTITY button.remove "Kaldır">
 <!ENTITY label.grpIncluded "Dahil Sayfalar">
 <!ENTITY label.grpExcluded "Hariç Sayfalar">
diff --git a/chrome/greasemonkey.jar!/locale/tr-TR/greasemonkey.dtd b/chrome/greasemonkey.jar!/locale/tr/greasemonkey.dtd
similarity index 82%
copy from chrome/greasemonkey.jar!/locale/tr-TR/greasemonkey.dtd
copy to chrome/greasemonkey.jar!/locale/tr/greasemonkey.dtd
index 60e5e05..4788de8 100644
--- a/chrome/greasemonkey.jar!/locale/tr-TR/greasemonkey.dtd
+++ b/chrome/greasemonkey.jar!/locale/tr/greasemonkey.dtd
@@ -2,9 +2,9 @@
 <!ENTITY menu.install.accesskey "I">
 <!ENTITY menu.show "Kullanıcı betik kaynağını gör">
 <!ENTITY menu.show.accesskey "V">
-<!ENTITY menu.commands "Kullanıcı Betik Komutları ...">
+<!ENTITY menu.commands "Kullanıcı Betik Komutları...">
 <!ENTITY menu.commands.accesskey "C">
-<!ENTITY menu.new "Yeni Kullanıcı Betiği ...">
+<!ENTITY menu.new "Yeni Kullanıcı Betiği...">
 <!ENTITY menu.new.accesskey "N">
 <!ENTITY menu.manage "Kullanıcı Betiklerini Yönet...">
 <!ENTITY menu.manage.accesskey "M">
@@ -29,9 +29,13 @@
 <!ENTITY userscripts "Kullanıcı Betikleri">
 <!ENTITY Uninstall "Kaldır">
 <!ENTITY AlsoUninstallPrefs "Ayrıca ilişkili tercihleri kaldır">
-<!ENTITY greasemonkey.noscriptshere "Bu sayfada çalışan yüklenmiş betikler yok">
+<!ENTITY UpdateChecking "Update Checking">
+<!ENTITY EnableUpdateChecking "Enable automatic update checking of scripts">
+<!ENTITY UpdateInterval "Minimum number of days between update checks">
+<!ENTITY RequireSecureUpdates "Require secure updates">
+<!ENTITY greasemonkey.noscriptshere "Bu sayfada çalışan yüklenmiş betikler yok.">
 <!ENTITY greasemonkey.youhavenoscripts "Yüklü bir kullanıcı betiğiniz yok">
 <!ENTITY greasemonkey.getuserscripts "Kullanıcı betikleri al">
-<!ENTITY scriptprefs.title "Greasemonkey Kullanıcı Betik Tercihleri -!">
+<!ENTITY scriptprefs.title "Greasemonkey Kullanıcı Betik Tercihleri -!!">
 <!ENTITY scriptprefs.usersettings "Kullanıcı Ayarları">
 <!ENTITY scriptprefs.scriptsettings "Betik Ayarları">
diff --git a/chrome/greasemonkey.jar!/locale/tr-TR/greasemonkey.properties b/chrome/greasemonkey.jar!/locale/tr/greasemonkey.properties
similarity index 100%
copy from chrome/greasemonkey.jar!/locale/tr-TR/greasemonkey.properties
copy to chrome/greasemonkey.jar!/locale/tr/greasemonkey.properties
diff --git a/chrome/greasemonkey.jar!/locale/uk-UA/gm-addons.dtd b/chrome/greasemonkey.jar!/locale/uk-UA/gm-addons.dtd
index d444a7d..bd35cf6 100644
--- a/chrome/greasemonkey.jar!/locale/uk-UA/gm-addons.dtd
+++ b/chrome/greasemonkey.jar!/locale/uk-UA/gm-addons.dtd
@@ -5,6 +5,8 @@
 <!ENTITY ExecuteLast "Execute last">
 <!ENTITY ExecuteLater "Execute later">
 <!ENTITY ExecuteSooner "Execute sooner">
+<!ENTITY FindUpdate "Find Update">
+<!ENTITY InstallUpdate "Install Update">
 <!ENTITY MoveDown "Move Down">
 <!ENTITY MoveDown.accesskey "D">
 <!ENTITY MoveToBottom "Move To Bottom">
diff --git a/chrome/greasemonkey.jar!/locale/uk-UA/gm-browser.properties b/chrome/greasemonkey.jar!/locale/uk-UA/gm-browser.properties
index 81d47ad..70d0b80 100644
--- a/chrome/greasemonkey.jar!/locale/uk-UA/gm-browser.properties
+++ b/chrome/greasemonkey.jar!/locale/uk-UA/gm-browser.properties
@@ -17,5 +17,5 @@ editor.prompt=Please choose your preferred text editor first
 editor.please_pick_executable=Please pick an executable application to use to edit user scripts.
 editor.could_not_launch=Could not launch editor.
 newscript.noname=Please provide a name for your script.
-newscript.nonamespace=Please provide a valid namespace URI for your script.\n(e.g. "http://userscripts.org/users/useridnumber")
-newscript.exists=A script with that name is already installed.\nOK to overwrite?
+newscript.nonamespace=Please provide a valid namespace URI for your script.n(e.g. "http://userscripts.org/users/useridnumber")
+newscript.exists=A script with that name is already installed.nOK to overwrite?
diff --git a/chrome/greasemonkey.jar!/locale/uk-UA/greasemonkey.dtd b/chrome/greasemonkey.jar!/locale/uk-UA/greasemonkey.dtd
index e38b1da..547d7d5 100644
--- a/chrome/greasemonkey.jar!/locale/uk-UA/greasemonkey.dtd
+++ b/chrome/greasemonkey.jar!/locale/uk-UA/greasemonkey.dtd
@@ -29,6 +29,10 @@
 <!ENTITY userscripts "User Scripts">
 <!ENTITY Uninstall "Uninstall">
 <!ENTITY AlsoUninstallPrefs "Also uninstall associated preferences">
+<!ENTITY UpdateChecking "Update Checking">
+<!ENTITY EnableUpdateChecking "Enable automatic update checking of scripts">
+<!ENTITY UpdateInterval "Minimum number of days between update checks">
+<!ENTITY RequireSecureUpdates "Require secure updates">
 <!ENTITY greasemonkey.noscriptshere "Жоден зі встановлених скриптів не працює на цій сторінці.">
 <!ENTITY greasemonkey.youhavenoscripts "You don't have any user scripts installed">
 <!ENTITY greasemonkey.getuserscripts "Get user scripts">
diff --git a/chrome/greasemonkey.jar!/locale/uk/gm-addons.dtd b/chrome/greasemonkey.jar!/locale/uk/gm-addons.dtd
index 3c7463a..3ef1d23 100644
--- a/chrome/greasemonkey.jar!/locale/uk/gm-addons.dtd
+++ b/chrome/greasemonkey.jar!/locale/uk/gm-addons.dtd
@@ -5,6 +5,8 @@
 <!ENTITY ExecuteLast "Виконувати останнім">
 <!ENTITY ExecuteLater "Виконувати пізніше">
 <!ENTITY ExecuteSooner "Виконувати раніше">
+<!ENTITY FindUpdate "Find Update">
+<!ENTITY InstallUpdate "Install Update">
 <!ENTITY MoveDown "Нижче">
 <!ENTITY MoveDown.accesskey "Н">
 <!ENTITY MoveToBottom "Донизу">
diff --git a/chrome/greasemonkey.jar!/locale/uk/gm-browser.properties b/chrome/greasemonkey.jar!/locale/uk/gm-browser.properties
index 6c20c5d..3df3be4 100644
--- a/chrome/greasemonkey.jar!/locale/uk/gm-browser.properties
+++ b/chrome/greasemonkey.jar!/locale/uk/gm-browser.properties
@@ -13,9 +13,9 @@ alert.fromURI=Завантажується скрипт…
 alert.fromURI.failure=Неможливо завантажити скрипт
 alert.success=успішно встановлено.
 alert.failure=Помилка під час встановлення скрипту:
-editor.prompt=Виберіть текстовий редактор (напр. "c:\\windows\\notepad.exe")
+editor.prompt=Виберіть текстовий редактор (напр. "c:windowsnotepad.exe")
 editor.please_pick_executable=Будь ласка вкажіть програму котрою редагувати скрипти.
 editor.could_not_launch=Не можу запустити редактора.
 newscript.noname=Будь ласка, назвіть ваш скрипт.
-newscript.nonamespace=Будь ласка, вкажіть простір імен для вашого скрипту.\n(напр. "http://userscripts.org/users/номер")
-newscript.exists=Скрипт з таким іменем вже встановлено.\nБажаєте перезаписати?
+newscript.nonamespace=Будь ласка, вкажіть простір імен для вашого скрипту.n(напр. "http://userscripts.org/users/номер")
+newscript.exists=Скрипт з таким іменем вже встановлено.nБажаєте перезаписати?
diff --git a/chrome/greasemonkey.jar!/locale/uk/greasemonkey.dtd b/chrome/greasemonkey.jar!/locale/uk/greasemonkey.dtd
index 5570f51..9554809 100644
--- a/chrome/greasemonkey.jar!/locale/uk/greasemonkey.dtd
+++ b/chrome/greasemonkey.jar!/locale/uk/greasemonkey.dtd
@@ -29,6 +29,10 @@
 <!ENTITY userscripts "Скрипти">
 <!ENTITY Uninstall "Вилучити">
 <!ENTITY AlsoUninstallPrefs "Вилучити також пов'язані налаштування">
+<!ENTITY UpdateChecking "Update Checking">
+<!ENTITY EnableUpdateChecking "Enable automatic update checking of scripts">
+<!ENTITY UpdateInterval "Minimum number of days between update checks">
+<!ENTITY RequireSecureUpdates "Require secure updates">
 <!ENTITY greasemonkey.noscriptshere "Жоден зі встановлених скриптів не працює на цій сторінці.">
 <!ENTITY greasemonkey.youhavenoscripts "Жодних скриптів не встановлено">
 <!ENTITY greasemonkey.getuserscripts "Отримати користувацькі скрипти">
diff --git a/chrome/greasemonkey.jar!/locale/zh-CN/gm-addons.dtd b/chrome/greasemonkey.jar!/locale/zh-CN/gm-addons.dtd
index ca11889..3ca4756 100644
--- a/chrome/greasemonkey.jar!/locale/zh-CN/gm-addons.dtd
+++ b/chrome/greasemonkey.jar!/locale/zh-CN/gm-addons.dtd
@@ -5,6 +5,8 @@
 <!ENTITY ExecuteLast "最后执行">
 <!ENTITY ExecuteLater "稍后执行">
 <!ENTITY ExecuteSooner "稍早执行">
+<!ENTITY FindUpdate "Find Update">
+<!ENTITY InstallUpdate "Install Update">
 <!ENTITY MoveDown "下移">
 <!ENTITY MoveDown.accesskey "D">
 <!ENTITY MoveToBottom "移至最后">
diff --git a/chrome/greasemonkey.jar!/locale/zh-CN/gm-browser.properties b/chrome/greasemonkey.jar!/locale/zh-CN/gm-browser.properties
index a9da510..fcf95bc 100644
--- a/chrome/greasemonkey.jar!/locale/zh-CN/gm-browser.properties
+++ b/chrome/greasemonkey.jar!/locale/zh-CN/gm-browser.properties
@@ -17,5 +17,5 @@ editor.prompt=请先选择您喜欢用的文本编辑器
 editor.please_pick_executable=请选择一个可执行程序用来编辑用户脚本。
 editor.could_not_launch=无法启动编辑器。
 newscript.noname=请为您的脚本命名。
-newscript.nonamespace=请为您的脚本提供一个有效的命名空间。\n(例如 [http://userscripts.org/users/useridnumber])
-newscript.exists=已安装了同名的脚本。\n覆盖同名的脚本?
+newscript.nonamespace=请为您的脚本提供一个有效的命名空间。n(例如 [http://userscripts.org/users/useridnumber])
+newscript.exists=已安装了同名的脚本。n覆盖同名的脚本?
diff --git a/chrome/greasemonkey.jar!/locale/zh-CN/greasemonkey.dtd b/chrome/greasemonkey.jar!/locale/zh-CN/greasemonkey.dtd
index 53d646f..55f89b9 100644
--- a/chrome/greasemonkey.jar!/locale/zh-CN/greasemonkey.dtd
+++ b/chrome/greasemonkey.jar!/locale/zh-CN/greasemonkey.dtd
@@ -29,6 +29,10 @@
 <!ENTITY userscripts "用户脚本">
 <!ENTITY Uninstall "卸载">
 <!ENTITY AlsoUninstallPrefs "同时清除相关的首选项设置">
+<!ENTITY UpdateChecking "Update Checking">
+<!ENTITY EnableUpdateChecking "Enable automatic update checking of scripts">
+<!ENTITY UpdateInterval "Minimum number of days between update checks">
+<!ENTITY RequireSecureUpdates "Require secure updates">
 <!ENTITY greasemonkey.noscriptshere "在此页面上没有已安装的脚本运行。">
 <!ENTITY greasemonkey.youhavenoscripts "您没有安装任何用户脚本">
 <!ENTITY greasemonkey.getuserscripts "获取用户脚本">
diff --git a/chrome/greasemonkey.jar!/locale/zh-TW/gm-addons.dtd b/chrome/greasemonkey.jar!/locale/zh-TW/gm-addons.dtd
index ffc81c1..b18f2f4 100644
--- a/chrome/greasemonkey.jar!/locale/zh-TW/gm-addons.dtd
+++ b/chrome/greasemonkey.jar!/locale/zh-TW/gm-addons.dtd
@@ -5,6 +5,8 @@
 <!ENTITY ExecuteLast "最後執行">
 <!ENTITY ExecuteLater "較晚執行">
 <!ENTITY ExecuteSooner "較早執行">
+<!ENTITY FindUpdate "Find Update">
+<!ENTITY InstallUpdate "Install Update">
 <!ENTITY MoveDown "下移">
 <!ENTITY MoveDown.accesskey "D">
 <!ENTITY MoveToBottom "移到最下面">
diff --git a/chrome/greasemonkey.jar!/locale/zh-TW/gm-browser.properties b/chrome/greasemonkey.jar!/locale/zh-TW/gm-browser.properties
index 8c82593..9a24247 100644
--- a/chrome/greasemonkey.jar!/locale/zh-TW/gm-browser.properties
+++ b/chrome/greasemonkey.jar!/locale/zh-TW/gm-browser.properties
@@ -17,5 +17,5 @@ editor.prompt=請先選擇您常用的純文字編輯器
 editor.please_pick_executable=請挑一個可執行程式來編輯使用者腳本。
 editor.could_not_launch=無法執行編輯器。
 newscript.noname=請輸入您的使用者腳本的名稱。
-newscript.nonamespace=請為您的腳本提供一個有效的命名空間 URI。\n(例如「http://userscripts.org/users/useridnumber」)
-newscript.exists=已安裝了一個同名的腳本。\n確定要覆蓋嗎?
+newscript.nonamespace=請為您的腳本提供一個有效的命名空間 URI。n(例如「http://userscripts.org/users/useridnumber」)
+newscript.exists=已安裝了一個同名的腳本。n確定要覆蓋嗎?
diff --git a/chrome/greasemonkey.jar!/locale/zh-TW/greasemonkey.dtd b/chrome/greasemonkey.jar!/locale/zh-TW/greasemonkey.dtd
index bfd6627..10fb81c 100644
--- a/chrome/greasemonkey.jar!/locale/zh-TW/greasemonkey.dtd
+++ b/chrome/greasemonkey.jar!/locale/zh-TW/greasemonkey.dtd
@@ -29,6 +29,10 @@
 <!ENTITY userscripts "使用者腳本">
 <!ENTITY Uninstall "腳本移除設定">
 <!ENTITY AlsoUninstallPrefs "同時移除相關偏好設定">
+<!ENTITY UpdateChecking "Update Checking">
+<!ENTITY EnableUpdateChecking "Enable automatic update checking of scripts">
+<!ENTITY UpdateInterval "Minimum number of days between update checks">
+<!ENTITY RequireSecureUpdates "Require secure updates">
 <!ENTITY greasemonkey.noscriptshere "沒有任何在此頁面執行的腳本。">
 <!ENTITY greasemonkey.youhavenoscripts "您尚未安裝任何腳本">
 <!ENTITY greasemonkey.getuserscripts "取得使用者腳本">
diff --git a/components/greasemonkey.js b/components/greasemonkey.js
index 1c15669..121f661 100644
--- a/components/greasemonkey.js
+++ b/components/greasemonkey.js
@@ -25,7 +25,9 @@ var gExtensionPath = (function() {
   } catch (e) { dump(e+'\n'+uneval(e)+'\n\n'); return 'x'; }
 })();
 
-var gMaxJSVersion = "1.6";
+// Only a particular set of strings are allowed.  See: http://goo.gl/ex2LJ
+var gMaxJSVersion = "1.8";
+
 var gMenuCommands = [];
 var gStartupHasRun = false;
 
@@ -64,6 +66,53 @@ function GM_apiLeakCheck(apiName) {
   return true;
 }
 
+function createSandbox(
+    aScript, aContentWin, aChromeWin, aFirebugConsole, aUrl
+) {
+  var unsafeWin = aContentWin.wrappedJSObject;
+  var sandbox = new Components.utils.Sandbox(aContentWin);
+
+  if (GM_util.compareFirefoxVersion("4.0") < 0) {
+    // Fixes .. something confusing.  Must be before __proto__ assignment.
+    //  See #1192
+    sandbox.document = aContentWin.document;
+  }
+
+  sandbox.__proto__ = aContentWin;
+  sandbox.unsafeWindow = unsafeWin;
+  sandbox.XPathResult = Ci.nsIDOMXPathResult;
+
+  // Temporary workaround for #1318.  TODO: Remove when upstream bug fixed.
+  sandbox.alert = alert;
+
+  sandbox.console = aFirebugConsole ? aFirebugConsole : new GM_console(aScript);
+
+  var imp = sandbox.importFunction;
+  imp(function(css) { GM_addStyle(aContentWin.document, css); }, 'GM_addStyle');
+  imp(GM_util.hitch(new GM_ScriptLogger(aScript), 'log'), 'GM_log');
+  imp(GM_util.hitch(null, openInTab, aContentWin, aChromeWin), 'GM_openInTab');
+  imp(GM_util.hitch(null, registerMenuCommand, aContentWin, aChromeWin, aScript),
+      'GM_registerMenuCommand');
+
+  var scriptStorage = new GM_ScriptStorage(aScript);
+  imp(GM_util.hitch(scriptStorage, 'deleteValue'), 'GM_deleteValue');
+  imp(GM_util.hitch(scriptStorage, 'getValue'), 'GM_getValue');
+  imp(GM_util.hitch(scriptStorage, 'setValue'), 'GM_setValue');
+
+  var scriptResources = new GM_Resources(aScript);
+  imp(GM_util.hitch(scriptResources, 'getResourceURL'), 'GM_getResourceURL');
+  imp(GM_util.hitch(scriptResources, 'getResourceText'), 'GM_getResourceText');
+
+  // The .importMethod() is safe because it can't return object values (I
+  // think?) -- but sometimes we want to, so in that case do a straight assign.
+  sandbox.GM_listValues = GM_util.hitch(scriptStorage, 'listValues');
+  sandbox.GM_xmlhttpRequest = GM_util.hitch(
+      new GM_xmlhttpRequester(aContentWin, aChromeWin, aUrl),
+      'contentStartRequest');
+
+  return sandbox;
+}
+
 function findError(script, lineNumber) {
   var start = 0;
   var end = 1;
@@ -110,6 +159,66 @@ function isTempScript(uri) {
   return file.parent.equals(tmpDir) && file.leafName != "newscript.user.js";
 }
 
+function openInTab(safeContentWin, chromeWin, url, aLoadInBackground) {
+  if (!GM_apiLeakCheck("GM_openInTab")) {
+    return undefined;
+  }
+  if ('undefined' == typeof aLoadInBackground) aLoadInBackground = null;
+
+  var browser = chromeWin.gBrowser;
+  var tabs = browser.mTabs /* Firefox <=3.6 */ || browser.tabs /* >=4.0 */;
+  var currentTab = tabs[
+      browser.getBrowserIndexForDocument(safeContentWin.document)];
+  var newTab = browser.loadOneTab(url, {'inBackground': aLoadInBackground});
+  var newWin = GM_windowForTab(newTab, browser);
+
+  var afterCurrent = Cc["@mozilla.org/preferences-service;1"]
+      .getService(Ci.nsIPrefService)
+      .getBranch("browser.tabs.")
+      .getBoolPref("insertRelatedAfterCurrent");
+  if (afterCurrent) {
+    browser.moveTabTo(newTab, currentTab._tPos + 1);
+  }
+
+  return newWin;
+};
+
+function registerMenuCommand(
+    wrappedContentWin, chromeWin, script,
+    commandName, commandFunc, accessKey, unused, accessKey2
+) {
+  if (!GM_apiLeakCheck("GM_registerMenuCommand")) {
+    return;
+  }
+
+  if (wrappedContentWin.top != wrappedContentWin) {
+    // Only register menu commands for the top level window.
+    return;
+  }
+
+  // Legacy support: if all five parameters were specified, (from when two
+  // were for accelerators) use the last one as the access key.
+  if ('undefined' != typeof accessKey2) {
+    accessKey = accessKey2;
+  }
+
+  if (accessKey
+      && (("string" != typeof accessKey) || (accessKey.length != 1))
+  ) {
+    throw new Error('Error with menu command "'
+        + commandName + '": accessKey must be a single character');
+  }
+
+  var command = {
+      name: commandName,
+      accessKey: accessKey,
+      commandFunc: commandFunc,
+      contentWindow: wrappedContentWin,
+      contentWindowId: GM_util.windowId(wrappedContentWin),
+      frozen: false};
+  gMenuCommands.push(command);
+};
+
 function runScriptInSandbox(code, sandbox, script) {
   try {
     GM_runScript(code, sandbox, gMaxJSVersion);
@@ -165,9 +274,8 @@ function startup() {
   loader.loadSubScript("chrome://greasemonkey/content/scriptdownloader.js");
   loader.loadSubScript("chrome://greasemonkey/content/third-party/mpl-utils.js");
 
-  // Firefox 3.6 and higher supports 1.8.
-  if (GM_util.compareFirefoxVersion("3.6") >= 0) {
-    gMaxJSVersion = "1.8";
+  if (GM_util.compareFirefoxVersion("4.0") >= 0) {
+    gMaxJSVersion = "ECMAv5";
   }
 
   // Firefox <4 reports a different stack.fileName for the module.
@@ -208,70 +316,6 @@ service.prototype.QueryInterface = XPCOMUtils.generateQI([
       Ci.nsIContentPolicy
     ]);
 
-/////////////////////////////////// Privates ///////////////////////////////////
-
-service.prototype._openInTab = function(
-    safeContentWin, chromeWin, url, aLoadInBackground
-) {
-  if (!GM_apiLeakCheck("GM_openInTab")) {
-    return undefined;
-  }
-  if ('undefined' == typeof aLoadInBackground) aLoadInBackground = null;
-
-  var browser = chromeWin.gBrowser;
-  var tabs = browser.mTabs /* Firefox <=3.6 */ || browser.tabs /* >=4.0 */;
-  var currentTab = tabs[
-      browser.getBrowserIndexForDocument(safeContentWin.document)];
-  var newTab = browser.loadOneTab(url, {'inBackground': aLoadInBackground});
-  var newWin = GM_windowForTab(newTab, browser);
-
-  var afterCurrent = Cc["@mozilla.org/preferences-service;1"]
-      .getService(Ci.nsIPrefService)
-      .getBranch("browser.tabs.")
-      .getBoolPref("insertRelatedAfterCurrent");
-  if (afterCurrent) {
-    browser.moveTabTo(newTab, currentTab._tPos + 1);
-  }
-
-  return newWin;
-};
-
-service.prototype._registerMenuCommand = function(
-    wrappedContentWin, chromeWin, script,
-    commandName, commandFunc, accessKey, unused, accessKey2
-) {
-  if (!GM_apiLeakCheck("GM_registerMenuCommand")) {
-    return;
-  }
-
-  if (wrappedContentWin.top != wrappedContentWin) {
-    // Only register menu commands for the top level window.
-    return;
-  }
-
-  // Legacy support: if all five parameters were specified, (from when two
-  // were for accelerators) use the last one as the access key.
-  if ('undefined' != typeof accessKey2) {
-    accessKey = accessKey2;
-  }
-
-  if (accessKey
-      && (("string" != typeof accessKey) || (accessKey.length != 1))
-  ) {
-    throw new Error('Error with menu command "'
-        + commandName + '": accessKey must be a single character');
-  }
-
-  var command = {
-      name: commandName,
-      accessKey: accessKey,
-      commandFunc: commandFunc,
-      contentWindow: wrappedContentWin,
-      contentWindowId: GM_util.windowId(wrappedContentWin),
-      frozen: false};
-  gMenuCommands.push(command);
-};
-
 /////////////////////////////// nsIContentPolicy ///////////////////////////////
 
 service.prototype.shouldLoad = function(ct, cl, org, ctx, mt, ext) {
@@ -343,7 +387,7 @@ service.prototype.contentDestroyed = function(contentWindowId) {
     if (closed || (command.contentWindowId == contentWindowId)) {
       gMenuCommands.splice(index, 1);
     }
-  });
+  }, true);
 };
 
 service.prototype.contentFrozen = function(contentWindowId) {
@@ -365,14 +409,15 @@ service.prototype.runScripts = function(
   if (!GM_util.getEnabled() || !GM_util.isGreasemonkeyable(url)) return;
 
   if (GM_prefRoot.getValue('enableScriptRefreshing')) {
-    this._config.updateModifiedScripts(aWrappedContentWin, aChromeWin);
+    this._config.updateModifiedScripts(aRunWhen, aWrappedContentWin, aChromeWin);
   }
 
   var scripts = this.config.getMatchingScripts(function(script) {
-        return GM_util.scriptMatchesUrlAndRuns(script, url, aRunWhen);
-    });
+    return GM_util.scriptMatchesUrlAndRuns(script, url, aRunWhen);
+  });
   if (scripts.length > 0) {
     this.injectScripts(scripts, url, aWrappedContentWin, aChromeWin);
+    this._config.checkScriptsForRemoteUpdates(scripts);
   }
 };
 
@@ -383,62 +428,11 @@ service.prototype.ignoreNextScript = function() {
 service.prototype.injectScripts = function(
     scripts, url, wrappedContentWin, chromeWin
 ) {
-  var sandbox;
-  var script;
-  var logger;
-  var console;
-  var storage;
-  var xmlhttpRequester;
-  var resources;
-  var unsafeContentWin = wrappedContentWin.wrappedJSObject;
   var firebugConsole = getFirebugConsole(wrappedContentWin, chromeWin);
 
-  for (var i = 0; script = scripts[i]; i++) {
-    sandbox = new Components.utils.Sandbox(wrappedContentWin);
-
-    logger = new GM_ScriptLogger(script);
-
-    console = firebugConsole ? firebugConsole : new GM_console(script);
-
-    storage = new GM_ScriptStorage(script);
-    xmlhttpRequester = new GM_xmlhttpRequester(
-        wrappedContentWin, chromeWin, url);
-    resources = new GM_Resources(script);
-
-    sandbox.unsafeWindow = unsafeContentWin;
-
-    // hack XPathResult since that is so commonly used
-    sandbox.XPathResult = Ci.nsIDOMXPathResult;
-
-    // add our own APIs
-    sandbox.GM_addStyle = function(css) {
-          GM_addStyle(wrappedContentWin.document, css);
-        };
-    sandbox.GM_log = GM_util.hitch(logger, "log");
-    sandbox.console = console;
-    sandbox.GM_setValue = GM_util.hitch(storage, "setValue");
-    sandbox.GM_getValue = GM_util.hitch(storage, "getValue");
-    sandbox.GM_deleteValue = GM_util.hitch(storage, "deleteValue");
-    sandbox.GM_listValues = GM_util.hitch(storage, "listValues");
-    sandbox.GM_getResourceURL = GM_util.hitch(resources, "getResourceURL");
-    sandbox.GM_getResourceText = GM_util.hitch(resources, "getResourceText");
-    sandbox.GM_openInTab = GM_util.hitch(
-        this, "_openInTab", wrappedContentWin, chromeWin);
-    sandbox.GM_xmlhttpRequest = GM_util.hitch(xmlhttpRequester,
-                                         "contentStartRequest");
-    sandbox.GM_registerMenuCommand = GM_util.hitch(
-        this, "_registerMenuCommand", wrappedContentWin, chromeWin, script);
-
-    // Re-wrap the window before assigning it to the sandbox.__proto__
-    // This is a workaround for a bug in which the Security Manager
-    // vetoes the use of eval.
-    sandbox.__proto__ = new XPCNativeWrapper(unsafeContentWin);
-
-    Components.utils.evalInSandbox(
-        "var document = window.document;", sandbox);
-
-    // Temporary workaround for #1318.  TODO: Remove when upstream bug fixed.
-    sandbox.alert = alert;
+  for (var i = 0, script = null; script = scripts[i]; i++) {
+    var sandbox = createSandbox(
+        script, wrappedContentWin, chromeWin, firebugConsole, url);
 
     var requires = [];
     var offsets = [];
@@ -468,14 +462,16 @@ service.prototype.injectScripts = function(
 };
 
 service.prototype.withAllMenuCommandsForWindowId = function(
-    contentWindowId, callback
+    aContentWindowId, aCallback, aForce
 ) {
+  if(!aContentWindowId && !aForce) return;
+
   var l = gMenuCommands.length - 1;
   for (var i = l, command = null; command = gMenuCommands[i]; i--) {
-    if (!contentWindowId
-        || (command.contentWindowId == contentWindowId)
+    if (aForce
+        || (command.contentWindowId == aContentWindowId)
     ) {
-      callback(i, command);
+      aCallback(i, command);
     }
   }
 };
diff --git a/defaults/preferences/greasemonkey.js b/defaults/preferences/greasemonkey.js
index af7ce6c..166ef40 100644
--- a/defaults/preferences/greasemonkey.js
+++ b/defaults/preferences/greasemonkey.js
@@ -4,5 +4,8 @@ pref("greasemonkey.globalExcludes", '[]');
 pref("greasemonkey.unmhtIsGreaseable", false);
 pref("greasemonkey.enableScriptRefreshing", true);
 pref("greasemonkey.uninstallPreferences", true);
+pref("greasemonkey.enableUpdateChecking", false);
+pref("greasemonkey.minDaysBetweenUpdateChecks", 7);
+pref("greasemonkey.requireSecureUpdates", true);
 pref("greasemonkey.haveInsertedToolbarbutton", false);
 pref("greasemonkey.logChrome", false);
diff --git a/install.rdf b/install.rdf
index dc6c2f6..e9977c4 100644
--- a/install.rdf
+++ b/install.rdf
@@ -6,7 +6,7 @@
   <Description about="urn:mozilla:install-manifest">
 
     <em:id>{e4a8a97b-f2ed-450b-b12d-ee082ba24781}</em:id>
-    <em:version>0.9.11</em:version>
+    <em:version>0.9.12</em:version>
     <em:creator>Aaron Boodman; http://youngpup.net/</em:creator>
     <em:homepageURL>http://www.greasespot.net/</em:homepageURL>
     <em:optionsURL>chrome://greasemonkey/content/options.xul</em:optionsURL>
@@ -38,6 +38,7 @@
     <em:contributor>Nikolas Coukouma; http://atrus.org/</em:contributor>
     <em:contributor>Ori Avtallon</em:contributor>
     <em:contributor>Pak Kei (logo); http://arkidect.com/</em:contributor>
+    <em:contributor>Sam Larison; http://samlarison.com/</em:contributor>
     <em:contributor>Sergio Abreu; http://sitedosergio.sitesbr.net/</em:contributor>
     <em:contributor>Tommi Rautava</em:contributor>
 
diff --git a/modules/addons4.js b/modules/addons4.js
index 482facc..6f2e7fb 100755
--- a/modules/addons4.js
+++ b/modules/addons4.js
@@ -8,7 +8,9 @@
 // Module exported symbols.
 var EXPORTED_SYMBOLS = [
     'GM_addonsStartup', 'SCRIPT_ADDON_TYPE',
-    'ScriptAddonFactoryByScript', 'ScriptAddonReplaceScript'];
+    'ScriptAddonFactoryByScript', 'ScriptAddonReplaceScript',
+    'ScriptInstallFactoryByAddon',
+    ];
 
 ////////////////////////////////////////////////////////////////////////////////
 // Module level imports / constants / globals.
@@ -44,6 +46,19 @@ var AddonProvider = {
       });
       aCallback(scriptAddons);
     }
+  },
+
+  getInstallsByTypes: function(aTypes, aCallback) {
+    var scriptInstalls = [];
+    GM_util.getService().config.scripts.forEach(function(script) {
+      if (!script.updateAvailable) return;
+
+      var aAddon = ScriptAddonFactoryByScript(script);
+      var scriptInstall = aAddon._installer || new ScriptInstall(aAddon);
+
+      scriptInstalls.push(scriptInstall);
+    });
+    aCallback(scriptInstalls);
   }
 };
 
@@ -79,7 +94,6 @@ function ScriptAddon(aScript) {
   this.version = this._script.version;
   this.description = this._script.description;
   this.iconURL = this._script.icon.fileURL;
-  this.size = this._script.size;
   this.updateDate = this._script.modifiedDate;
 }
 
@@ -95,13 +109,15 @@ ScriptAddon.prototype.scope = AddonManager.SCOPE_PROFILE;
 ScriptAddon.prototype.name = null;
 ScriptAddon.prototype.creator = null;
 ScriptAddon.prototype.pendingOperations = 0;
+ScriptAddon.prototype.applyBackgroundUpdates = AddonManager.AUTOUPDATE_DISABLE;
+ScriptAddon.prototype.operationsRequiringRestart = AddonManager.OP_NEEDS_RESTART_NONE;
 
 // Optional attributes
 ScriptAddon.prototype.description = null;
-ScriptAddon.prototype.size = null;
 
 // Private and custom attributes.
 ScriptAddon.prototype._script = null;
+ScriptAddon.prototype._installer = null;
 
 ScriptAddon.prototype.__defineGetter__('executionIndex',
 function ScriptAddon_getExecutionIndex() {
@@ -115,7 +131,7 @@ function ScriptAddon_getIsActive() {
 });
 
 ScriptAddon.prototype.__defineGetter__('optionsURL',
-function ScriptAddon_getIsActive() {
+function ScriptAddon_getOptionsURL() {
   return 'chrome://greasemonkey/content/scriptprefs.xul#' + this._script.id;
 });
 
@@ -143,6 +159,7 @@ function ScriptAddon_getPermissions() {
   perms |= this.userDisabled
       ? AddonManager.PERM_CAN_ENABLE
       : AddonManager.PERM_CAN_DISABLE;
+  if (this._script.updateURL) perms |= AddonManager.PERM_CAN_UPGRADE;
   return perms;
 });
 
@@ -150,16 +167,21 @@ ScriptAddon.prototype.isCompatibleWith = function() {
   return true;
 };
 
-ScriptAddon.prototype.findUpdates = function(aListener) {
-  if ('onNoCompatibilityUpdateAvailable' in aListener) {
-    aListener.onNoCompatibilityUpdateAvailable(this);
-  }
-  if ('onNoUpdateAvailable' in aListener) {
-    aListener.onNoUpdateAvailable(this);
-  }
-  if ('onUpdateFinished' in aListener) {
-    aListener.onUpdateFinished(this);
+ScriptAddon.prototype.findUpdates = function(aListener, aReason) {
+  function updateCallback(aAvailable) {
+    if (aAvailable) {
+      var scriptInstall = ScriptInstallFactoryByAddon(this);
+      AddonManagerPrivate.callAddonListeners("onNewInstall", scriptInstall);
+      aListener.onUpdateAvailable(this, scriptInstall);
+    } else {
+      aListener.onNoUpdateAvailable(this);
+    }
   }
+  this._script.checkForRemoteUpdate(true, GM_util.hitch(this, updateCallback));
+};
+
+ScriptAddon.prototype.toString = function() {
+  return '[ScriptAddon object ' + this.id + ']';
 };
 
 ScriptAddon.prototype.uninstall = function() {
@@ -179,6 +201,60 @@ ScriptAddon.prototype.performUninstall = function() {
   delete ScriptAddonCache[this.id];
 };
 
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+var ScriptInstallCache = {};
+function ScriptInstallFactoryByAddon(aAddon) {
+  if (!(aAddon.id in ScriptInstallCache)) {
+    ScriptInstallCache[aAddon.id] = new ScriptInstall(aAddon);
+  }
+  return ScriptInstallCache[aAddon.id];
+}
+
+function ScriptInstall(aAddon) {
+  this._script = aAddon._script;
+  aAddon._installer = this;
+
+  this.name = this._script.name;
+  this.version = this._script.version;
+  this.iconURL = this._script.icon.fileURL;
+  this.existingAddon = aAddon;
+}
+
+// Required attributes.
+ScriptInstall.prototype.addon = null;
+ScriptInstall.prototype.error = null;
+ScriptInstall.prototype.file = null;
+ScriptInstall.prototype.maxProgress = -1;
+ScriptInstall.prototype.pendingOperations = 0;
+ScriptInstall.prototype.progress = -1;
+ScriptInstall.prototype.releaseNotesURI = null;
+ScriptInstall.prototype.sourceURI = null;
+ScriptInstall.prototype.state = AddonManager.STATE_AVAILABLE;
+ScriptInstall.prototype.type = 'user-script';
+
+// Private and custom attributes.
+ScriptInstall.prototype._script = null;
+
+ScriptInstall.prototype.install = function() {
+  function installCallback() {
+    AddonManagerPrivate.callAddonListeners(
+        'onInstallEnded', this, this.existingAddon);
+  }
+
+  AddonManagerPrivate.callAddonListeners('onInstallStarted', this);
+  var chromeWin = GM_util.getBrowserWindow();
+  this._script.installUpdate(chromeWin, GM_util.hitch(this, installCallback));
+};
+
+ScriptInstall.prototype.cancel = function() {};
+ScriptInstall.prototype.addListener = function() {};
+ScriptInstall.prototype.removeListener = function() {};
+
+ScriptInstall.prototype.toString = function() {
+  return '[ScriptInstall object ' + this._script.id + ']';
+};
+
 ////////////////////////////////////////////////////////////////////////////////
 
 var WindowObserver = {
diff --git a/modules/third-party/MatchPattern.js b/modules/third-party/MatchPattern.js
index 1be4f39..e95e639 100644
--- a/modules/third-party/MatchPattern.js
+++ b/modules/third-party/MatchPattern.js
@@ -40,8 +40,8 @@
 
 var EXPORTED_SYMBOLS = ['MatchPattern'];
 
-Components.utils.import("resource://gre/modules/NetUtil.jsm");
 Components.utils.import("resource://greasemonkey/third-party/convert2RegExp.js");
+Components.utils.import("resource://greasemonkey/util.js");
 
 var validSchemes = ['http', 'https', 'ftp', 'file'];
 var REG_HOST = /^(?:\*\.)?[^*\/]+$|^\*$|^$/;
diff --git a/modules/util/getEditor.js b/modules/util/getEditor.js
index b2cd81f..d47c392 100644
--- a/modules/util/getEditor.js
+++ b/modules/util/getEditor.js
@@ -1,6 +1,13 @@
 Components.utils.import('resource://greasemonkey/prefmanager.js');
+Components.utils.import('resource://greasemonkey/util.js');
 
 const EXPORTED_SYMBOLS = ['getEditor'];
+var stringBundle = Components
+    .classes["@mozilla.org/intl/stringbundle;1"]
+    .getService(Components.interfaces.nsIStringBundleService)
+    .createBundle("chrome://greasemonkey/locale/gm-browser.properties");
+const EDITOR_PROMPT = stringBundle.GetStringFromName("editor.prompt");
+const PICK_EXE = stringBundle.GetStringFromName("editor.please_pick_executable");
 
 function getEditor(change) {
   var editorPath = GM_prefRoot.getValue("editor");
@@ -9,7 +16,7 @@ function getEditor(change) {
     var editor;
     try {
       editor = Components.classes["@mozilla.org/file/local;1"]
-                   .createInstance(Components.interfaces.nsILocalFile);
+          .createInstance(Components.interfaces.nsILocalFile);
       editor.followLinks = true;
       editor.initWithPath(editorPath);
     } catch (e) {
@@ -30,10 +37,10 @@ function getEditor(change) {
   while (true) {
     var nsIFilePicker = Components.interfaces.nsIFilePicker;
     var filePicker = Components.classes["@mozilla.org/filepicker;1"]
-                               .createInstance(nsIFilePicker);
+        .createInstance(nsIFilePicker);
 
-    filePicker.init(window, GM_stringBundle.GetStringFromName("editor.prompt"),
-                    nsIFilePicker.modeOpen);
+    filePicker.init(
+        GM_util.getBrowserWindow(), EDITOR_PROMPT, nsIFilePicker.modeOpen);
     filePicker.appendFilters(nsIFilePicker.filterApplication);
     filePicker.appendFilters(nsIFilePicker.filterAll);
 
@@ -46,7 +53,7 @@ function getEditor(change) {
       GM_prefRoot.setValue("editor", filePicker.file.path);
       return filePicker.file;
     } else {
-      alert(GM_stringBundle.GetStringFromName("editor.please_pick_executable"));
+      alert(PICK_EXE);
     }
   }
 }
diff --git a/modules/util/hitch.js b/modules/util/hitch.js
index ba53619..b0ad646 100644
--- a/modules/util/hitch.js
+++ b/modules/util/hitch.js
@@ -1,8 +1,15 @@
 const EXPORTED_SYMBOLS = ['hitch'];
 
-function hitch(obj, meth) {
-  if (!obj[meth]) {
-    throw "method '" + meth + "' does not exist on object '" + obj + "'";
+function hitch(obj, method) {
+  if (obj && method && ('string' == typeof method)) {
+    if (!obj[method]) {
+      throw "method '" + method + "' does not exist on object '" + obj + "'";
+    }
+    method = obj[method];
+  } else if ('function' == typeof method) {
+    obj = obj || {};
+  } else {
+    throw "Invalid arguments to GM_util.hitch().";
   }
 
   var staticArgs = Array.prototype.splice.call(arguments, 2, arguments.length);
@@ -17,6 +24,6 @@ function hitch(obj, meth) {
 
     // invoke the original function with the correct this obj and the combined
     // list of static and dynamic arguments.
-    return obj[meth].apply(obj, args);
+    return method.apply(obj, args);
   };
 }
diff --git a/modules/util/timeout.js b/modules/util/timeout.js
new file mode 100644
index 0000000..a2d3d42
--- /dev/null
+++ b/modules/util/timeout.js
@@ -0,0 +1,11 @@
+Components.utils.import('resource://greasemonkey/util.js');
+
+const EXPORTED_SYMBOLS = ['timeout'];
+
+function timeout(aDelay, aCallback) {
+  var timer = Components.classes["@mozilla.org/timer;1"]
+      .createInstance(Components.interfaces.nsITimer);
+  timer.initWithCallback(
+      {'notify': aCallback}, aDelay,
+      Components.interfaces.nsITimer.TYPE_ONE_SHOT);
+}
diff --git a/modules/util/writeToFile.js b/modules/util/writeToFile.js
index 29da4ad..07f93f7 100644
--- a/modules/util/writeToFile.js
+++ b/modules/util/writeToFile.js
@@ -12,9 +12,6 @@ const converter = Components
     .createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
 converter.charset = "UTF-8";
 
-const ostream = Components
-    .classes["@mozilla.org/network/safe-file-output-stream;1"]
-    .createInstance(Components.interfaces.nsIFileOutputStream);
 
 /** Given string data and an nsIFile, write it safely to that file. */
 function writeToFile(aData, aFile, aCallback) {
@@ -24,6 +21,9 @@ function writeToFile(aData, aFile, aCallback) {
   // Create a temporary file (stream) to hold the data.
   var tmpFile = aFile.clone();
   tmpFile.createUnique(NORMAL_FILE_TYPE, GM_constants.fileMask);
+  var ostream = Components
+      .classes["@mozilla.org/network/safe-file-output-stream;1"]
+      .createInstance(Components.interfaces.nsIFileOutputStream);
   ostream.init(tmpFile, STREAM_FLAGS, GM_constants.fileMask, 0);
 
   NetUtil.asyncCopy(istream, ostream, function(status) {

-- 
iceweasel extension that enables customization of webpages with user scripts



More information about the Pkg-mozext-commits mailing list