Merge mobile-browser to mobile2
authorMatt Brubeck <mbrubeck@mozilla.com>
Mon, 13 Sep 2010 09:54:59 -0700
changeset 2001 5012211c43775f03976ebdef0077343975189ccb
parent 2000 1cc777ca3bd76946af69cd834174321109b9973a (current diff)
parent 1931 15511aa0d39e00d3899a182182dd26c1d45e43a8 (diff)
child 2002 c42cd3d22e0b764738213eb213096e9d7cf8f145
push id1714
push userdougt@mozilla.com
push dateThu, 16 Sep 2010 02:04:21 +0000
Merge mobile-browser to mobile2
chrome/content/bindings.xml
chrome/content/browser-ui.js
themes/core/browser.css
themes/core/images/geo-16.png
--- a/app/Makefile.in
+++ b/app/Makefile.in
@@ -37,16 +37,18 @@
 
 DEPTH     = ../..
 topsrcdir = @top_srcdir@
 srcdir    = @srcdir@
 VPATH     = @srcdir@
 
 include $(DEPTH)/config/autoconf.mk
 
+DIRS = profile/extensions
+
 PREF_JS_EXPORTS = $(srcdir)/mobile.js
 DIST_FILES = application.ini
 
 ifndef LIBXUL_SDK
 PROGRAM=$(MOZ_APP_NAME)$(BIN_SUFFIX)
 
 CPPSRCS = nsBrowserApp.cpp
 
new file mode 100644
--- /dev/null
+++ b/app/profile/extensions/Makefile.in
@@ -0,0 +1,59 @@
+# ***** BEGIN LICENSE BLOCK *****
+# Version: MPL 1.1/GPL 2.0/LGPL 2.1
+#
+# The contents of this file are subject to the Mozilla Public License Version
+# 1.1 (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+# http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS IS" basis,
+# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+# for the specific language governing rights and limitations under the
+# License.
+#
+# The Original Code is Mozilla.
+#
+# The Initial Developer of the Original Code is
+# the Mozilla Foundation <http://www.mozilla.org/>.
+# Portions created by the Initial Developer are Copyright (C) 2010
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Finkle <mfinkle@mozilla.com>
+#
+# Alternatively, the contents of this file may be used under the terms of
+# either the GNU General Public License Version 2 or later (the "GPL"), or
+# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+# in which case the provisions of the GPL or the LGPL are applicable instead
+# of those above. If you wish to allow use of your version of this file only
+# under the terms of either the GPL or the LGPL, and not to allow others to
+# use your version of this file under the terms of the MPL, indicate your
+# decision by deleting the provisions above and replace them with the notice
+# and other provisions required by the GPL or the LGPL. If you do not delete
+# the provisions above, a recipient may use your version of this file under
+# the terms of any one of the MPL, the GPL or the LGPL.
+#
+# ***** END LICENSE BLOCK *****
+
+DEPTH		= ../../../..
+topsrcdir	= @top_srcdir@
+srcdir		= @srcdir@
+VPATH		= @srcdir@
+
+include $(DEPTH)/config/autoconf.mk
+
+include $(topsrcdir)/config/rules.mk
+
+ifeq (beta,$(MOZ_UPDATE_CHANNEL))
+EXTENSIONS = \
+  feedback@mobile.mozilla.org \
+  $(NULL)
+
+define _INSTALL_EXTENSIONS
+$(PYTHON) $(topsrcdir)/config/nsinstall.py $(wildcard $(srcdir)/$(dir)/*) $(DIST)/bin/extensions/$(dir)
+
+endef # do not remove the blank line!
+
+libs::
+	$(foreach dir,$(EXTENSIONS),$(_INSTALL_EXTENSIONS))
+endif
new file mode 100644
--- /dev/null
+++ b/app/profile/extensions/feedback@mobile.mozilla.org/chrome.manifest
@@ -0,0 +1,5 @@
+content feedback content/
+skin    feedback classic/1.0 skin/
+locale  feedback en-US       locale/en-US/
+
+overlay	chrome://browser/content/browser.xul  chrome://feedback/content/overlay.xul
new file mode 100644
--- /dev/null
+++ b/app/profile/extensions/feedback@mobile.mozilla.org/content/overlay.js
@@ -0,0 +1,84 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is Feedback.
+ *
+ * The Initial Developer of the Original Code is
+ * Mozilla Corporation.
+ * Portions created by the Initial Developer are Copyright (C) 2010
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *   Mark Finkle <mark.finkle@gmail.com>
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+var Feedback = {
+  init: function(aEvent) {
+    let appInfo = Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULAppInfo);
+    document.getElementById("feedback-about").setAttribute("desc", appInfo.version);
+  },
+
+  openReadme: function() {
+    let formatter = Cc["@mozilla.org/toolkit/URLFormatterService;1"].getService(Ci.nsIURLFormatter);
+    let url = formatter.formatURLPref("app.releaseNotesURL");
+    BrowserUI.newTab(url);
+  },
+
+  updateRestart: function updateRestart() {
+    let msg = document.getElementById("feedback-messages");
+    if (msg) {
+      let strings = Elements.browserBundle;
+
+      let value = "restart-app";
+      let notification = msg.getNotificationWithValue(value);
+      if (notification)
+        return;
+  
+      let restartCallback = function(aNotification, aDescription) {
+        // Notify all windows that an application quit has been requested
+        var cancelQuit = Cc["@mozilla.org/supports-PRBool;1"].createInstance(Ci.nsISupportsPRBool);
+        Services.obs.notifyObservers(cancelQuit, "quit-application-requested", "restart");
+  
+        // If nothing aborted, quit the app
+        if (cancelQuit.data == false) {
+          let appStartup = Cc["@mozilla.org/toolkit/app-startup;1"].getService(Ci.nsIAppStartup);
+          appStartup.quit(Ci.nsIAppStartup.eRestart | Ci.nsIAppStartup.eAttemptQuit);
+        }
+      };
+
+      let buttons = [ {
+        label: strings.getString("notificationRestart.button"),
+        accessKey: "",
+        callback: restartCallback
+      } ];
+  
+      let message = strings.getString("notificationRestart.normal");
+      msg.appendNotification(message, value, "", msg.PRIORITY_WARNING_LOW, buttons);
+    }
+  }
+};
+
+window.addEventListener("load", Feedback.init, false);
new file mode 100644
--- /dev/null
+++ b/app/profile/extensions/feedback@mobile.mozilla.org/content/overlay.xul
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!-- ***** BEGIN LICENSE BLOCK *****
+   - Version: MPL 1.1/GPL 2.0/LGPL 2.1
+   -
+   - The contents of this file are subject to the Mozilla Public License Version
+   - 1.1 (the "License"); you may not use this file except in compliance with
+   - the License. You may obtain a copy of the License at
+   - http://www.mozilla.org/MPL/
+   -
+   - Software distributed under the License is distributed on an "AS IS" basis,
+   - WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+   - for the specific language governing rights and limitations under the
+   - License.
+   -
+   - The Original Code is Feedback.
+   -
+   - The Initial Developer of the Original Code is
+   - Mozilla Corporation.
+   - Portions created by the Initial Developer are Copyright (C) 2010
+   - the Initial Developer. All Rights Reserved.
+   -
+   - Contributor(s):
+   -   Mark Finkle <mark.finkle@gmail.com>
+   -
+   - Alternatively, the contents of this file may be used under the terms of
+   - either the GNU General Public License Version 2 or later (the "GPL"), or
+   - the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+   - in which case the provisions of the GPL or the LGPL are applicable instead
+   - of those above. If you wish to allow use of your version of this file only
+   - under the terms of either the GPL or the LGPL, and not to allow others to
+   - use your version of this file under the terms of the MPL, indicate your
+   - decision by deleting the provisions above and replace them with the notice
+   - and other provisions required by the LGPL or the GPL. If you do not delete
+   - the provisions above, a recipient may use your version of this file under
+   - the terms of any one of the MPL, the GPL or the LGPL.
+   -
+   - ***** END LICENSE BLOCK ***** -->
+
+<?xml-stylesheet href="chrome://feedback/skin/overlay.css" type="text/css"?>
+
+<!DOCTYPE window [
+<!ENTITY % feedbackDTD SYSTEM "chrome://feedback/locale/overlay.dtd">
+%feedbackDTD;
+]>
+
+<overlay id="feedback-overlay" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+  <script type="application/javascript" src="chrome://feedback/content/overlay.js"/>
+
+  <box id="panel-controls">
+    <toolbarbutton id="tool-feedback" autocheck="true" type="radio" group="1" class="panel-button button-dark" linkedpanel="feedback-container" insertbefore="tool-addons"/>
+  </box>
+
+  <deck id="panel-items">
+    <vbox id="feedback-container" flex="1">
+      <hbox id="feedback-header" class="panel-header">
+        <label value="&feedbackHeader.label;" flex="1"/>
+      </hbox>
+      <notificationbox id="feedback-messages" flex="1">
+        <richlistbox id="feedback-list" flex="1" onselect="this.ensureSelectedElementIsVisible()">
+          <settings id="feedback-communicate" label="&feedback.communicate.title;">
+            <setting title="&feedback.feedback.title;" type="control">
+              <button id="feedback-feedback-happy" class="button-dark" oncommand="BrowserUI.newTab('http://m.input.mozilla.com/en-US/happy');"/>
+              <button id="feedback-feedback-sad" class="button-dark" oncommand="BrowserUI.newTab('http://m.input.mozilla.com/en-US/sad');"/>
+            </setting>
+          </settings>
+          <settings id="feedback-information" label="&feedback.information.title;">
+            <setting id="feedback-about" title="&feedback.about.title;" type="control">
+              <button id="feedback-about-button" label="&feedback.about.button;" oncommand="Feedback.openReadme();"/>
+            </setting>
+          </settings>
+          <settings id="feedback-tools" label="&feedback.tools.title;">
+            <setting pref="extensions.checkCompatibility.2.0b" title="&feedback.forceCompat.title;" type="bool" inverted="true" oninputchanged="Feedback.updateRestart();"/>
+            <setting pref="browser.console.showInPanel" title="&feedback.errorConsole.title;" type="bool" oninputchanged="Feedback.updateRestart();"/>
+          </settings>
+        </richlistbox>
+      </notificationbox>
+    </vbox>
+  </deck>
+</overlay>
new file mode 100644
--- /dev/null
+++ b/app/profile/extensions/feedback@mobile.mozilla.org/install.rdf
@@ -0,0 +1,26 @@
+<?xml version="1.0"?>
+
+<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+     xmlns:em="http://www.mozilla.org/2004/em-rdf#">
+  <Description about="urn:mozilla:install-manifest">
+    <em:id>feedback@mobile.mozilla.org</em:id>
+    <em:version>1.0.0</em:version>
+    <em:type>2</em:type>
+
+    <!-- Target Application this extension can install into, 
+         with minimum and maximum supported versions. --> 
+    <em:targetApplication>
+      <Description>
+        <em:id>{a23983c0-fd0e-11dc-95ff-0800200c9a66}</em:id>
+        <em:minVersion>2.0b1pre</em:minVersion>
+        <em:maxVersion>2.*</em:maxVersion>
+      </Description>
+    </em:targetApplication>
+   
+    <!-- Front End MetaData -->
+    <em:name>Beta Tester Tools</em:name>
+    <em:description>Help make Firefox better by giving feedback.</em:description>
+    <em:creator>Mozilla Corporation</em:creator>
+    <em:iconURL>chrome://feedback/skin/dino-32.png</em:iconURL>
+  </Description>
+</RDF>
new file mode 100644
--- /dev/null
+++ b/app/profile/extensions/feedback@mobile.mozilla.org/locale/en-US/overlay.dtd
@@ -0,0 +1,14 @@
+<!ENTITY feedbackHeader.label           "Beta Tester Tools">
+
+<!ENTITY feedback.communicate.title     "Communicate to Us!">
+<!ENTITY feedback.feedback.title        "Give feedback">
+<!ENTITY feedback.feedback.good         "Good">
+<!ENTITY feedback.feedback.bad          "Bad">
+
+<!ENTITY feedback.information.title     "More Information">
+<!ENTITY feedback.about.title           "About this Beta">
+<!ENTITY feedback.about.button          "Go to Page">
+
+<!ENTITY feedback.tools.title           "Tools">
+<!ENTITY feedback.forceCompat.title     "Force add-ons compatibility">
+<!ENTITY feedback.errorConsole.title    "Enable the Error Console">
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..1f047258fc9c58983111e5b588ac143eec86b51f
GIT binary patch
literal 453
zc$@*n0XqJPP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800001b5ch_0Itp)
z=>Px#24YJ`L;wH)0002_L%V+f000SaNLh0L01FcU01FcV0GgZ_00044Nkl<ZSi|kt
zzbox=9LI4#LJ6t6Q2qieWUxuPf5X{bbqAZlu53(JgJMz^v6_@JU}Lbk-K$$DoeX~D
zVfm(aI$utFzUQRQYx>sf^?tvfz5Dj=`)z7!=sO8Nv4L}xagV>)MhPuN4erIRkF|&1
z)We&z#?@*kH9+ajfK7~}6YUtr%A3qoN`Rfvc>SH+V#uwf1h@>1hu_Kdhum38fXC3d
zt%5&-Rs0FL+mryW%31q!X5V2QGpXN!iU9Z>tV8q{bp!GMPJ=aA<n_w~cnDV4XZwHU
zbp8v^v-Q}(T(F+8{FP072B0|`8g+?MO#p&Ff#VA2y1OO-S*8Wk_#fg&Ng%2L2-zRl
z4<*Yr1<3M4q2!_-03D&^p~yRsr^)bqQ^*Ezf_aRg2d(JCFI<I^t)c*`(G$k%1yD|Q
vka7S<v6LO4a`w@3jRP!Tpz#ya(6`YGzhFPZ74@$_00000NkvXXu0mjfG9bzL
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..35b3a174a5585a0f92f491066ef92dabb975cae9
GIT binary patch
literal 1583
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
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..49e38c58680a16fc5bc06019df4201907ee8c727
GIT binary patch
literal 2497
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
LNkvXXu0mjfwkp;v
new file mode 100644
--- /dev/null
+++ b/app/profile/extensions/feedback@mobile.mozilla.org/skin/overlay.css
@@ -0,0 +1,16 @@
+#tool-feedback {
+  list-style-image: url("chrome://feedback/skin/beta-32.png");
+}
+
+#tool-feedback[checked="true"] {
+  -moz-border-image: url("chrome://browser/skin/images/toggledarkboth-active-64.png") 10 repeat repeat;
+}
+
+
+#feedback-feedback-happy {
+  list-style-image: url("chrome://feedback/skin/happy-32.png");
+}
+
+#feedback-feedback-sad {
+  list-style-image: url("chrome://feedback/skin/sad-32.png");
+}
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..a59db1ffbf433213346f489938a93ef370f3c611
GIT binary patch
literal 2394
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
M07*qoM6N<$f?Z66lK=n!
--- a/chrome/content/bindings.xml
+++ b/chrome/content/bindings.xml
@@ -8,17 +8,17 @@
 <bindings
     xmlns="http://www.mozilla.org/xbl"
     xmlns:xbl="http://www.mozilla.org/xbl"
     xmlns:svg="http://www.w3.org/2000/svg"
     xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
 
   <binding id="autocomplete-aligned" extends="chrome://global/content/bindings/autocomplete.xml#autocomplete">
     <implementation>
-      <property name="mIgnoreFocus" onget="return true;"/>
+      <property name="mIgnoreFocus" onget="return true;" onset="val;"/>
       <method name="openPopup">
         <body><![CDATA[
           this.popup.openAutocompletePopup(this, null);
         ]]></body>
       </method>
       <method name="closePopup">
         <body><![CDATA[
           // hack! we want to revert to the "all results" popup when the
@@ -386,21 +386,35 @@
           window.clearTimeout(this._badgesTimeout);
 
           this._badgesTimeout = window.setTimeout(function(self) {
             for (let i = 0; i < self._items.childNodes.length; i++) {
               let item = self._items.childNodes[i];
               if (!item.hasAttribute("url"))
                 continue;
 
-              let itemHost = self._getEffectiveHost(Services.io.newURI(item.getAttribute("url"), null, null));
+              let currentURL = item.getAttribute("url");
+              let itemHost = self._getEffectiveHost(Services.io.newURI(currentURL, null, null));
               for (let badgeHost in self._badges) {
                 if (itemHost == badgeHost) {
+                  // wrap the item to prevent setting a badge on a wrong item
+                  let wrapper = {
+                    set: function(aBadge) {
+                      if (item.getAttribute("url") != currentURL)
+                        return;
+
+                      if (!aBadge || aBadge == "")
+                        item.removeAttribute("badge");
+                      else
+                        item.setAttribute("badge", aBadge);
+                    }
+                  };
+
                   let handler = self._badges[badgeHost];
-                  handler.updateBadge ? handler.updateBadge(item) : handler(item);
+                  handler.updateBadge ? handler.updateBadge(wrapper) : handler(wrapper);
                   break;
                 }
               }
             }
           }, 300, this);
         ]]></body>
       </method>
 
@@ -1211,25 +1225,25 @@
           };
 
           // Generate the list of tabs
           let tabs = [];
           for (let [guid, client] in Iterator(engine.getAllClients())) {
             tabs.push({ name: client.clientName });
 
             client.tabs.forEach(function({title, urlHistory, icon}) {
-              let pageUrl = urlHistory[0];
+              let pageURL = urlHistory[0];
 
               // Skip tabs that are already open
-              if (engine.locallyOpenTabMatchesURL(pageUrl))
+              if (engine.locallyOpenTabMatchesURL(pageURL))
                 return;
 
               tabs.push({
-                title: title || pageUrl,
-                uri: pageUrl,
+                title: title || pageURL,
+                uri: pageURL,
                 icon: Weave.Utils.getIcon(icon, "chrome://browser/skin/images/tab.png")
               });
             });
           };
 
           return tabs;
         ]]></body>
       </method>
@@ -1445,14 +1459,14 @@
           ]]>
         </setter>
       </property>
     </implementation>
   </binding>
 
   <binding id="select-button" extends="xul:box">
     <content>
-      <svg:svg width="11px" version="1.1" xmlns="http://www.w3.org/2000/svg" style="position: absolute; top: 35%; margin-left: 4px;">
+      <svg:svg width="11px" version="1.1" xmlns="http://www.w3.org/2000/svg" style="position: absolute; top: -moz-calc(50% - 2px); margin-left: 4px;">
         <svg:polyline points="1 1 5 6 9 1" stroke="#414141" stroke-width="2" stroke-linecap="round" fill="transparent" stroke-linejoin="round"/>
       </svg:svg>
     </content>
   </binding>
 </bindings>
--- a/chrome/content/browser-ui.js
+++ b/chrome/content/browser-ui.js
@@ -2492,21 +2492,21 @@ var SharingUI = {
 
 
 var BadgeHandlers = {
   _handlers: [
     {
       _lastUpdate: 0,
       _lastCount: 0,
       url: "http://mail.google.com",
-      updateBadge: function(aItem) {
+      updateBadge: function(aBadge) {
         // Use the cache if possible
         let now = Date.now();
         if (this._lastCount && this._lastUpdate > now - 1000) {
-          aItem.setAttribute("badge", this._lastCount);
+          aBadge.set(this._lastCount);
           return;
         }
 
         this._lastUpdate = now;
 
         // Use any saved username and password. If we don't have any login and we are not
         // currently logged into Gmail, we won't get any count.
         let login = BadgeHandlers.getLogin("https://www.google.com");
@@ -2518,17 +2518,17 @@ var BadgeHandlers = {
         req.open("GET", "https://mail.google.com/mail/feed/atom", true, login.username, login.password);
         req.onreadystatechange = function(aEvent) {
           if (req.readyState == 4) {
             if (req.status == 200) {
               this._lastCount = req.responseXML.getElementsByTagName("fullcount")[0].childNodes[0].nodeValue;
             } else {
               this._lastCount = 0;
             }
-            this._lastCount = BadgeHandlers.setNumberBadge(aItem, this._lastCount);
+            this._lastCount = BadgeHandlers.setNumberBadge(aBadge, this._lastCount);
           }
         };
         req.send(null);
       }
     }
   ],
 
   register: function(aPopup) {
@@ -2546,18 +2546,18 @@ var BadgeHandlers = {
   },
 
   clampBadge: function(aValue) {
     if (aValue > 100)
       aValue = "99+";
     return aValue;
   },
 
-  setNumberBadge: function(aItem, aValue) {
+  setNumberBadge: function(aBadge, aValue) {
     if (parseInt(aValue) != 0) {
       aValue = this.clampBadge(aValue);
-      aItem.setAttribute("badge", aValue);
+      aBadge.set(aValue);
     } else {
-      aItem.removeAttribute("badge");
+      aBadge.set("");
     }
     return aValue;
   }
 };
--- a/chrome/content/downloads.js
+++ b/chrome/content/downloads.js
@@ -68,33 +68,36 @@ var DownloadsView = {
   },
 
   _getReferrerOrSource: function dv__getReferrerOrSource(aItem) {
     // Give the referrer if we have it set, otherwise, provide the source
     return aItem.getAttribute("referrer") || aItem.getAttribute("uri");
   },
 
   _createItem: function dv__createItem(aAttrs) {
-    let item = document.createElement("richlistitem");
-
-    // Copy the attributes from the argument into the item
-    for (let attr in aAttrs)
-      item.setAttribute(attr, aAttrs[attr]);
+    // Make sure this doesn't already exist
+    let item = this.getElementForDownload(aAttrs.id);
+    if (!item) {
+      item = document.createElement("richlistitem");
 
-    // Initialize other attributes
-    item.setAttribute("typeName", "download");
-    item.setAttribute("id", "dl-" + aAttrs.id);
-    item.setAttribute("downloadID", aAttrs.id);
-    item.setAttribute("iconURL", "moz-icon://" + aAttrs.file + "?size=32");
-    item.setAttribute("lastSeconds", Infinity);
-
-    // Initialize more complex attributes
-    this._updateTime(item);
-    this._updateStatus(item);
-
+      // Copy the attributes from the argument into the item
+      for (let attr in aAttrs)
+        item.setAttribute(attr, aAttrs[attr]);
+  
+      // Initialize other attributes
+      item.setAttribute("typeName", "download");
+      item.setAttribute("id", "dl-" + aAttrs.id);
+      item.setAttribute("downloadID", aAttrs.id);
+      item.setAttribute("iconURL", "moz-icon://" + aAttrs.file + "?size=32");
+      item.setAttribute("lastSeconds", Infinity);
+  
+      // Initialize more complex attributes
+      this._updateTime(item);
+      this._updateStatus(item);
+    }
     return item;
   },
 
   _removeItem: function dv__removeItem(aItem) {
     // Make sure we have an item to remove
     if (!aItem)
       return;
 
@@ -365,21 +368,24 @@ var DownloadsView = {
       f.launch();
     } catch (ex) { }
 
     // TODO: add back the code for "dontAsk"?
   },
 
   removeDownload: function dv_removeDownload(aItem) {
     this._dlmgr.removeDownload(aItem.getAttribute("downloadID"));
+    let f = this._getLocalFile(aItem.getAttribute("file"));
+    if (f.exists())
+      f.remove(false);
   },
 
   cancelDownload: function dv_cancelDownload(aItem) {
     this._dlmgr.cancelDownload(aItem.getAttribute("downloadID"));
-    var f = this._getLocalFile(aItem.getAttribute("file"));
+    let f = this._getLocalFile(aItem.getAttribute("file"));
     if (f.exists())
       f.remove(false);
   },
 
   pauseDownload: function dv_pauseDownload(aItem) {
     this._dlmgr.pauseDownload(aItem.getAttribute("downloadID"));
   },
 
--- a/chrome/content/forms.js
+++ b/chrome/content/forms.js
@@ -60,19 +60,18 @@ function FormAssistant() {
   addMessageListener("FormAssist:Closed", this);
   addMessageListener("FormAssist:Previous", this);
   addMessageListener("FormAssist:Next", this);
   addMessageListener("FormAssist:ChoiceSelect", this);
   addMessageListener("FormAssist:ChoiceChange", this);
   addMessageListener("FormAssist:AutoComplete", this);
 
   addEventListener("keyup", this, false);
-
-  // change on rotation/resize
   addEventListener("resize", this, false);
+  addEventListener("focus", this, true);
 };
 
 FormAssistant.prototype = {
   _selectWrapper: null,
 
   get currentElement() {
     return this._elements[this._currentIndex];
   },
@@ -184,64 +183,70 @@ FormAssistant.prototype = {
     }
     return false;
   },
 
   handleEvent: function formHelperHandleEvent(aEvent) {
     if (!this._enabled || !this.currentElement)
       return;
 
-    // change zoom on resize/rotation
-    if (aEvent.type == "resize") {
-      sendAsyncMessage("FormAssist:Resize");
-    } else {
-      let currentElement = this.currentElement;
-      switch (aEvent.keyCode) {
-        case aEvent.DOM_VK_DOWN:
-          if (currentElement instanceof HTMLInputElement && !this._isAutocomplete(currentElement)) {
-            if (this._hasKeyListener(currentElement))
-              return;
-          }
-          else if (currentElement instanceof HTMLTextAreaElement) {
-            let existSelection = currentElement.selectionEnd - currentElement.selectionStart;
-            let isEnd = (currentElement.textLength == currentElement.selectionEnd);
-            if (!isEnd || existSelection)
-              return;
-          }
+    switch (aEvent.type) {
+      case "resize":
+        sendAsyncMessage("FormAssist:Resize");
+        break;
+      case "focus":
+        let focusedIndex = this._getIndexForElement(gFocusManager.focusedElement);
+        if (focusedIndex != -1 && this.currentIndex != focusedIndex)
+          this.currentIndex = focusedIndex;
+        break;
+      case "keyup":
+        let currentElement = this.currentElement;
+        switch (aEvent.keyCode) {
+          case aEvent.DOM_VK_DOWN:
+            if (currentElement instanceof HTMLInputElement && !this._isAutocomplete(currentElement)) {
+              if (this._hasKeyListener(currentElement))
+                return;
+            }
+            else if (currentElement instanceof HTMLTextAreaElement) {
+              let existSelection = currentElement.selectionEnd - currentElement.selectionStart;
+              let isEnd = (currentElement.textLength == currentElement.selectionEnd);
+              if (!isEnd || existSelection)
+                return;
+            }
 
-          this.currentIndex++;
-          break;
+            this.currentIndex++;
+            break;
 
-        case aEvent.DOM_VK_UP:
-          if (currentElement instanceof HTMLInputElement && !this._isAutocomplete(currentElement)) {
-            if (this._hasKeyListener(currentElement))
-              return;
-          }
-          else if (currentElement instanceof HTMLTextAreaElement) {
-            let existSelection = currentElement.selectionEnd - currentElement.selectionStart;
-            let isStart = (currentElement.selectionEnd == 0);
-            if (!isStart || existSelection)
-              return;
-          }
+          case aEvent.DOM_VK_UP:
+            if (currentElement instanceof HTMLInputElement && !this._isAutocomplete(currentElement)) {
+              if (this._hasKeyListener(currentElement))
+                return;
+            }
+            else if (currentElement instanceof HTMLTextAreaElement) {
+              let existSelection = currentElement.selectionEnd - currentElement.selectionStart;
+              let isStart = (currentElement.selectionEnd == 0);
+              if (!isStart || existSelection)
+                return;
+            }
 
-          this.currentIndex--;
-          break;
+            this.currentIndex--;
+            break;
 
-        case aEvent.DOM_VK_RETURN:
-          break;
+          case aEvent.DOM_VK_RETURN:
+            break;
 
-        default:
-          if (this._isAutocomplete(aEvent.target))
-            sendAsyncMessage("FormAssist:AutoComplete", this._getJSON());
-          break;
-      }
+          default:
+            if (this._isAutocomplete(aEvent.target))
+              sendAsyncMessage("FormAssist:AutoComplete", this._getJSON());
+            break;
+        }
 
-      let caretRect = this._getCaretRect();
-      if (!caretRect.isEmpty())
-        sendAsyncMessage("FormAssist:Update", { caretRect: caretRect });
+        let caretRect = this._getCaretRect();
+        if (!caretRect.isEmpty())
+          sendAsyncMessage("FormAssist:Update", { caretRect: caretRect });
     }
   },
 
   _isAutocomplete: function formHelperIsAutocomplete(aElement) {
     if (aElement instanceof HTMLInputElement) {
       let autocomplete = aElement.getAttribute("autocomplete");
       let allowedValues = ["off", "false", "disabled"];
       if (allowedValues.indexOf(autocomplete) == -1)
@@ -376,24 +381,28 @@ FormAssistant.prototype = {
       if (a.tabIndex == 0 || b.tabIndex == 0)
         return b.tabIndex;
 
       return a.tabIndex > b.tabIndex;
     }
     elements = elements.sort(orderByTabIndex);
 
     // retrieve the correct index
+    let currentIndex = this._getIndexForElement(aElement);
+    return currentIndex;
+  },
+
+  _getIndexForElement: function(aElement) {
     let currentIndex = -1;
+    let elements = this._elements;
     for (let i = 0; i < elements.length; i++) {
-      if (elements[i] == aElement) {
-        currentIndex = i;
-        break;
-      }
+      if (elements[i] == aElement)
+        return i;
     }
-    return currentIndex;
+    return -1;
   },
 
   _getJSON: function() {
     let element = this.currentElement;
     let list = getListForElement(element);
     return {
       current: {
         id: element.id,
--- a/components/AutoCompleteCache.js
+++ b/components/AutoCompleteCache.js
@@ -203,16 +203,17 @@ var AutoCompleteUtils = {
         this.fetch(this.query);
         return;
       }
 
       let result = cache.result;
 
       // Add back functions to the result
       result.getValueAt = function(index) this.data[index][0];
+      result.getLabelAt = function(index) this.data[index][0];
       result.getCommentAt = function(index) this.data[index][1];
       result.getStyleAt = function(index) this.data[index][2];
       result.getImageAt = function(index) this.data[index][3];
 
       this.cache = result;
     } catch (ex) {
       Cu.reportError("AutoCompleteUtils: Could not read from cache file: " + ex);
     }
--- a/components/ContentPermissionPrompt.js
+++ b/components/ContentPermissionPrompt.js
@@ -2,111 +2,116 @@ const Ci = Components.interfaces;
 const Cr = Components.results;
 const Cu = Components.utils;
 
 Cu.import("resource://gre/modules/XPCOMUtils.jsm");
 Cu.import("resource://gre/modules/Services.jsm");
 
 const kCountBeforeWeRemember = 5;
 
+function setPagePermission(type, uri, allow) {
+  let pm = Services.perms;
+  let contentPrefs = Services.contentPrefs;
+  let contentPrefName = type + ".request.remember";
+
+  if (!contentPrefs.hasPref(uri, contentPrefName))
+      contentPrefs.setPref(uri, contentPrefName, 0);
+
+  let count = contentPrefs.getPref(uri, contentPrefName);
+
+  if (allow == false)
+    count--;
+  else
+    count++;
+    
+  contentPrefs.setPref(uri, contentPrefName, count);
+  if (count == kCountBeforeWeRemember)
+    pm.add(uri, type, Ci.nsIPermissionManager.ALLOW_ACTION);
+  else if (count == -kCountBeforeWeRemember)
+    pm.add(uri, type, Ci.nsIPermissionManager.DENY_ACTION);
+}
+
 function ContentPermissionPrompt() {}
 
 ContentPermissionPrompt.prototype = {
   classID: Components.ID("{C6E8C44D-9F39-4AF7-BCC0-76E38A8310F5}"),
 
   QueryInterface: XPCOMUtils.generateQI([Ci.nsIContentPermissionPrompt]),
 
-  prompt: function(aRequest) {
-    if (aRequest.type != "geolocation")
-      return;
-
-    let pm = Services.perms;
-    let result = pm.testExactPermission(aRequest.uri, "geo");
-
-    if (result == Ci.nsIPermissionManager.ALLOW_ACTION) {
-      aRequest.allow();
-      return;
-    } else if (result == Ci.nsIPermissionManager.DENY_ACTION) {
-      aRequest.cancel();
-      return;
-    }
+  getChromeWindow: function getChromeWindow(aWindow) {
+     let chromeWin = aWindow.QueryInterface(Ci.nsIInterfaceRequestor)
+                            .getInterface(Ci.nsIWebNavigation)
+                            .QueryInterface(Ci.nsIDocShellTreeItem)
+                            .rootTreeItem
+                            .QueryInterface(Ci.nsIInterfaceRequestor)
+                            .getInterface(Ci.nsIDOMWindow)
+                            .QueryInterface(Ci.nsIDOMChromeWindow);
+     return chromeWin;
+  },
 
-    function setPagePermission(aUri, aAllow) {
-      let contentPrefs = Services.contentPrefs;
-
-      if (!contentPrefs.hasPref(aRequest.uri, "geo.request.remember"))
-        contentPrefs.setPref(aRequest.uri, "geo.request.remember", 0);
-
-      let count = contentPrefs.getPref(aRequest.uri, "geo.request.remember");
-
-      if (aAllow == false)
-        count--;
-      else
-        count++;
-
-      contentPrefs.setPref(aRequest.uri, "geo.request.remember", count);
-
-      if (count == kCountBeforeWeRemember)
-        pm.add(aUri, "geo", Ci.nsIPermissionManager.ALLOW_ACTION);
-      else if (count == -kCountBeforeWeRemember)
-        pm.add(aUri, "geo", Ci.nsIPermissionManager.DENY_ACTION);
+  getNotificationBoxForRequest: function getNotificationBoxForRequest(request) {
+    let notificationBox = null;
+    if (request.window) {
+      let requestingWindow = request.window.top;
+      let chromeWin = this.getChromeWindow(requestingWindow).wrappedJSObject;
+      return chromeWin.getNotificationBox(requestingWindow);
     }
 
-    function getChromeWindow(aWindow) {
-      let chromeWin = aWindow
-        .QueryInterface(Ci.nsIInterfaceRequestor)
-        .getInterface(Ci.nsIWebNavigation)
-        .QueryInterface(Ci.nsIDocShellTreeItem)
-        .rootTreeItem
-        .QueryInterface(Ci.nsIInterfaceRequestor)
-        .getInterface(Ci.nsIDOMWindow)
-        .QueryInterface(Ci.nsIDOMChromeWindow);
-      return chromeWin;
-    }
+    let chromeWin = request.element.ownerDocument.defaultView;
+    return chromeWin.Browser.getNotificationBox();
+  },
 
-    let notificationBox = null;
-    if (aRequest.window) {
-      let requestingWindow = aRequest.window.top;
-      let chromeWin = getChromeWindow(requestingWindow).wrappedJSObject;
-      notificationBox = chromeWin.getNotificationBox(requestingWindow);
-    } else {
-      let chromeWin = aRequest.element.ownerDocument.defaultView;
-      notificationBox = chromeWin.Browser.getNotificationBox();
+  handleExistingPermission: function handleExistingPermission(request) {
+    let result = Services.perms.testExactPermission(request.uri, request.type);
+    if (result == Ci.nsIPermissionManager.ALLOW_ACTION) {
+      request.allow();
+      return true;
     }
+    if (result == Ci.nsIPermissionManager.DENY_ACTION) {
+      request.cancel();
+      return true;
+    }
+    return false;
+  },
 
-    let notification = notificationBox.getNotificationWithValue("geolocation");
-    if (!notification) {
-      let browserBundle = Services.strings.createBundle("chrome://browser/locale/browser.properties");
+  prompt: function(request) {
+    // returns true if the request was handled
+    if (this.handleExistingPermission(request))
+       return;
 
-      let buttons = [{
-        label: browserBundle.GetStringFromName("geolocation.share"),
-        accessKey: null,
-        callback: function(notification) {
-          setPagePermission(aRequest.uri, true);
-          aRequest.allow();
-        },
-      },
-      {
-        label: browserBundle.GetStringFromName("geolocation.dontShare"),
-        accessKey: null,
-        callback: function(notification) {
-          setPagePermission(aRequest.uri, false);
-          aRequest.cancel();
-        },
-      }];
+    let pm = Services.perms;
+    let notificationBox = this.getNotificationBoxForRequest(request);
+    let browserBundle = Services.strings.createBundle("chrome://browser/locale/browser.properties");
+    
+    let notification = notificationBox.getNotificationWithValue(request.type);
+    if (notification)
+      return;
 
-      let message = browserBundle.formatStringFromName("geolocation.siteWantsToKnow",
-                                                       [aRequest.uri.host], 1);
+    let buttons = [{
+      label: browserBundle.GetStringFromName(request.type + ".allow"),
+      accessKey: null,
+      callback: function(notification) {
+                setPagePermission(request.type, request.uri, true);
+                request.allow();},
+    },
+    {
+      label: browserBundle.GetStringFromName(request.type + ".dontAllow"),
+      accessKey: null,
+      callback: function(notification) {
+            setPagePermission(request.type, request.uri, false);
+            request.cancel();},
+    }];
 
-      let newBar = notificationBox.appendNotification(message,
-                                                      "geolocation",
-                                                      "chrome://browser/skin/images/geo-16.png",
-                                                      notificationBox.PRIORITY_WARNING_MEDIUM,
-                                                      buttons);
-      // Make this a geolocation notification.
-      newBar.setAttribute("type", "geo");
-    }
-  }
+    let message = browserBundle.formatStringFromName(request.type + ".siteWantsTo",
+                                                     [request.uri.host], 1);
+    let newBar = notificationBox.appendNotification(message,
+                                                    request.type,
+                                                    "", // Notifications in Fennec do not display images.
+                                                    notificationBox.PRIORITY_WARNING_MEDIUM,
+                                                    buttons);
+    return;
+  },
+
 };
 
 
 //module initialization
 const NSGetFactory = XPCOMUtils.generateNSGetFactory([ContentPermissionPrompt]);
--- a/components/FormAutoComplete.js
+++ b/components/FormAutoComplete.js
@@ -134,18 +134,20 @@ FormAutoComplete.prototype = {
       }
       catch(ex) {
         LOG("findContact error", ex);
       }
     });
   },
 
   autoCompleteSearch: function autoCompleteSearch(aName, aQuery, aField, aPrev) {
+    if (!Services.prefs.getBoolPref("browser.formfill.enable"))
+      return;
+
     LOG("autocomplete search", Array.slice(arguments));
-
     let result = Cc["@mozilla.org/autocomplete/simple-result;1"].createInstance(Ci.nsIAutoCompleteSimpleResult);
     result.setSearchString(aQuery);
 
     // Don't allow duplicates get merged into the final results
     let dupCheck = {};
 
     // Use the base form autocomplete for non-contact searches
     let normal = FAC.autoCompleteSearch(aName, aQuery, aField, aPrev);
--- a/components/LoginManager.js
+++ b/components/LoginManager.js
@@ -679,16 +679,20 @@ UserAutoCompleteResult.prototype = {
 
     getValueAt : function (index) {
         if (index < 0 || index >= this.logins.length)
             throw "Index out of range.";
 
         return this.logins[index].username;
     },
 
+    getLabelAt : function (index) {
+      return this.getValueAt(index);
+    },
+
     getCommentAt : function (index) {
         return "";
     },
 
     getStyleAt : function (index) {
         return "";
     },
 
--- a/components/MobileComponents.manifest
+++ b/components/MobileComponents.manifest
@@ -37,16 +37,17 @@ category app-startup BrowserStartup serv
 category agent-style-sheets browser-content-stylesheet chrome://browser/content/content.css
 category agent-style-sheets browser-cursor-stylesheet chrome://browser/content/cursor.css
 
 # ContentPermissionPrompt.js
 component {C6E8C44D-9F39-4AF7-BCC0-76E38A8310F5} ContentPermissionPrompt.js
 contract @mozilla.org/content-permission/prompt;1 {C6E8C44D-9F39-4AF7-BCC0-76E38A8310F5}
 
 # AlertsService.js
+
 component {fe33c107-82a4-41d6-8c64-5353267e04c9} AlertsService.js
 contract @mozilla.org/system-alerts-service;1 {fe33c107-82a4-41d6-8c64-5353267e04c9}
 
 # XPIDialogService.js
 component {c1242012-27d8-477e-a0f1-0b098ffc329b} XPIDialogService.js
 contract @mozilla.org/addons/web-install-prompt;1 {c1242012-27d8-477e-a0f1-0b098ffc329b}
 
 # DownloadManagerUI.js
--- a/locales/en-US/chrome/browser.properties
+++ b/locales/en-US/chrome/browser.properties
@@ -117,19 +117,24 @@ identity.identified.verified_by_you=You 
 identity.identified.state_and_country=%S, %S
 identity.identified.title_with_country=%S (%S)
 identity.encrypted2=Encrypted
 identity.unencrypted2=Not encrypted
 identity.unknown.tooltip=This web site does not supply identity information.
 identity.ownerUnknown2=(unknown)
 
 # Geolocation UI
-geolocation.share=Share
-geolocation.dontShare=Don't share
-geolocation.siteWantsToKnow=%S wants your location.
+geolocation.allow=Share
+geolocation.dontAllow=Don't share
+geolocation.siteWantsTo=%S wants your location.
+
+# Desktop notification UI
+desktop-notification.allow=Allow
+desktop-notification.dontAllow=Don't allow
+desktop-notification.siteWantsTo=%S wants use notifications.
 
 # New Tab Popup
 # LOCALIZATION NOTE (newtabpopup): Semi-colon list of plural forms.
 # See: http://developer.mozilla.org/en/docs/Localization_and_Plurals
 # #1 number of tabs
 newtabpopup.opened=New tab opened;#1 new tabs opened
 
 # Error Console
--- a/makefiles.sh
+++ b/makefiles.sh
@@ -36,16 +36,17 @@
 # ***** END LICENSE BLOCK *****
 
 add_makefiles "
 netwerk/locales/Makefile
 dom/locales/Makefile
 toolkit/locales/Makefile
 security/manager/locales/Makefile
 mobile/app/Makefile
+mobile/app/profile/extensions/Makefile
 $MOZ_BRANDING_DIRECTORY/Makefile
 $MOZ_BRANDING_DIRECTORY/locales/Makefile
 mobile/chrome/Makefile
 mobile/chrome/tests/Makefile
 mobile/components/Makefile
 mobile/components/phone/Makefile
 mobile/modules/Makefile
 mobile/installer/Makefile
--- a/themes/core/browser.css
+++ b/themes/core/browser.css
@@ -688,59 +688,16 @@ placeitem > .bookmark-manage .bookmark-c
 placeitem[ui="manage"] {
   border-bottom: 0;
 }
 
 placeitem[ui="manage"] > .bookmark-manage > image {
   visibility: collapse;
 }
 
-.tool-search {
-  list-style-image: url("chrome://browser/skin/images/navigation-magnifier-30.png");
-  -moz-margin-end: 8px;
-}
-
-.searchengine {
-  -moz-box-orient: horizontal;
-  min-width: 140px !important;
-}
-
-.searchengine .radio-icon {
-  display: block;
-  width: 32px;
-  height: 32px;
-  -moz-margin-end: 8px;
-}
-
-#autocomplete_navbuttons {
-  padding: 4px 0; /* half core spacing & none (autorepeat arrows compensate) */
-}
-
-#autocomplete_navbuttons .autorepeatbutton-down {
-  list-style-image: url(images/arrowrightdark-16.png);
-}
-
-#autocomplete_navbuttons .autorepeatbutton-down:-moz-locale-dir(rtl) {
-  list-style-image: url(images/arrowleftdark-16.png);
-}
-
-#autocomplete_navbuttons .autorepeatbutton-up {
-  list-style-image: url(images/arrowleftdark-16.png);
-}
-
-#autocomplete_navbuttons .autorepeatbutton-up:-moz-locale-dir(rtl) {
-  list-style-image: url(images/arrowrightdark-16.png);
-}
-
-/* force the autorepeat buttons to create a 'padding' when collapsed */
-#autocomplete_navbuttons autorepeatbutton[collapsed="true"],
-#autocomplete_navbuttons autorepeatbutton[disabled="true"] {
-  visibility: hidden;
-}
-
 .autocomplete-items {
   background-color: white;
 }
 
 autocompleteresult,
 placeitem {
   color: black;
   background-color: white;
@@ -850,17 +807,19 @@ autocompleteresult:not([badge]) .autocom
 autocompleteresult[class="history-item-title"],
 autocompleteresult[class="remotetabs-item-title"] {
   -moz-box-pack: center;
   background-color: #E9E9E9;
   min-height: 0px;
 }
 
 autocompleteresult[class="history-item-title"] .bookmark-item-url,
-autocompleteresult[class="remotetabs-item-title"] .bookmark-item-url {
+autocompleteresult[class="history-item-title"] .autocomplete-item-tags,
+autocompleteresult[class="remotetabs-item-title"] .bookmark-item-url,
+autocompleteresult[class="remotetabs-item-title"] .autocomplete-item-tags {
   display: none;
 }
 
 autocompleteresult[class="history-item-title"] .bookmark-item-container,
 autocompleteresult[class="remotetabs-item-title"] .bookmark-item-container {
   font-size: 24px !important;
 }
 
deleted file mode 100644
index 9ae4c5a25748e66d9298b971b9fdbc5a45bf4669..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
--- a/themes/core/jar.mn
+++ b/themes/core/jar.mn
@@ -135,9 +135,8 @@ chrome.jar:
   skin/images/search-glass-30.png           (images/search-glass-30.png)
   skin/images/search-clear-30.png           (images/search-clear-30.png)
   skin/images/section-expanded-16.png       (images/section-expanded-16.png)
   skin/images/section-collapsed-16.png      (images/section-collapsed-16.png)
   skin/images/task-switch-40.png            (images/task-switch-40.png)
   skin/images/task-close-40.png             (images/task-close-40.png)
   skin/images/task-back-40.png              (images/task-back-40.png)
   skin/images/task-back-rtl-40.png          (images/task-back-rtl-40.png)
-  skin/images/geo-16.png                    (images/geo-16.png)