From c18cf04dbc264139f2d467dec26ca9489eedb76d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabrice=20Desr=C3=A9?= Date: Wed, 26 Oct 2011 13:21:51 -0700 Subject: [PATCH] Bug 696520 - Enable add-on installation : part 2/2 XPInstallObserver [r=mfinkle] --- embedding/android/GeckoApp.java | 3 + .../android/locales/en-US/android_strings.dtd | 2 + .../android/resources/drawable/addons.png | Bin 0 -> 1039 bytes .../android/resources/layout/gecko_menu.xml | 4 + embedding/android/strings.xml.in | 2 + mobile/chrome/content/browser.js | 74 ++++++++++++++++++ mobile/chrome/content/downloads.js | 5 -- mobile/components/XPIDialogService.js | 9 --- 8 files changed, 85 insertions(+), 14 deletions(-) create mode 100644 embedding/android/resources/drawable/addons.png diff --git a/embedding/android/GeckoApp.java b/embedding/android/GeckoApp.java index d39ac15c2de7..ed72a81cef35 100644 --- a/embedding/android/GeckoApp.java +++ b/embedding/android/GeckoApp.java @@ -485,6 +485,9 @@ abstract public class GeckoApp intent = new Intent(this, GeckoPreferences.class); startActivity(intent); return true; + case R.id.addons: + GeckoAppShell.sendEventToGecko(new GeckoEvent("about:addons")); + return true; default: return super.onOptionsItemSelected(item); } diff --git a/embedding/android/locales/en-US/android_strings.dtd b/embedding/android/locales/en-US/android_strings.dtd index 9f226a3a678b..0012a9281fd8 100644 --- a/embedding/android/locales/en-US/android_strings.dtd +++ b/embedding/android/locales/en-US/android_strings.dtd @@ -55,6 +55,8 @@ + + diff --git a/embedding/android/resources/drawable/addons.png b/embedding/android/resources/drawable/addons.png new file mode 100644 index 0000000000000000000000000000000000000000..25f09906e011be78b7feebc4ff9323aaacf99561 GIT binary patch literal 1039 zcmV+q1n~QbP)Px#0%A)?L;(MXkIcUS000SaNLh0L01FcU01FcV0GgZ_000A~NklzL{#oiwI@;BB&SnLZV6jZWI2EQMb0C8~461^#>F~i<8G7BC*N~^zxzAC z3;!1rttR8+JhCzPJvrSj)ZGGkY9cZosg0%&Fvi8?+_shwKlRn;vcaami@o07vx<}7 z^t^bi(e>!l_w`2lwgK%@O<&gE=*tirc8zWWy5h3bc`aM#$&%x@h5TIW(6(N_K)LX( zS?4f0Kb6(*thNJnIru$`>D#*x_(lh6j!VCO^wW(mC{o%&O2r#A-!e5#7-}6rEeXT5 z?kn#X_p~OhmeBagM)!llR1ICoy8V!@(&$SrojPBfY7mO~r{1~xF|wl6 znmwoNL?EpaItXiRNwxtU+S?f9uAt%X@~&tVs1f$;d|nD6%^No_p@_2ICp(I}r5f(q zo|Z$;eE0;wtq0BqEzgsoU16)kyq8K9+OJ3@@f<*cgVF5LV~5()c@=;`g4OZgNFhZP zTJ!|{HD!^55uiPtR`ozE(t}BXLVcbZZcBC2mZuE(=&_l5`F(&hMbcr zMGAZ9ZSvKt5FwlSKfewQzsK>+!y}rOoc-o{?jlxQ^4l*s$80LU4EBHLGMC9?*c6mT`(bJ_Rk=Eo*qdmA8cNP85lCM^MN+0nf%2x%$z{P3mA1dP$A=HINItOdg=q6^waZv%i3Ju|Myu@NCQ6S! zdwGVi=sr9ci#z77q)geio~9k1@CTFt(h%uRiu9_(4Z3Q0q3l`RDpa@NvoGy$_+vgl z2Q%~b^Sb5S^9R^H@VGs+aJ`s@?%|$@&8zVZrAl5peewu|Lpy6BD^0M?A4>a7{0AHBn&#fPHI4uP002ov JPDHLkV1m!P1UUcz literal 0 HcmV?d00001 diff --git a/embedding/android/resources/layout/gecko_menu.xml b/embedding/android/resources/layout/gecko_menu.xml index 11fe4635cb62..5f036feb7eaa 100644 --- a/embedding/android/resources/layout/gecko_menu.xml +++ b/embedding/android/resources/layout/gecko_menu.xml @@ -24,4 +24,8 @@ android:icon="@drawable/quit" android:title="@string/quit" /> + diff --git a/embedding/android/strings.xml.in b/embedding/android/strings.xml.in index 7ba3e83f1bf0..f9be5cdc59e3 100644 --- a/embedding/android/strings.xml.in +++ b/embedding/android/strings.xml.in @@ -64,4 +64,6 @@ &pref_category_history; &pref_clear_history; &pref_clear_history_confirm; + + &addons; diff --git a/mobile/chrome/content/browser.js b/mobile/chrome/content/browser.js index 18efbf88b57d..09ab1f72493c 100644 --- a/mobile/chrome/content/browser.js +++ b/mobile/chrome/content/browser.js @@ -95,6 +95,20 @@ function resolveGeckoURI(aURI) { return aURI; } +/** + * Cache of commonly used string bundles. + */ +var Strings = {}; +[ + ["brand", "chrome://branding/locale/brand.properties"], + ["browser", "chrome://browser/locale/browser.properties"] +].forEach(function (aStringBundle) { + let [name, bundle] = aStringBundle; + XPCOMUtils.defineLazyGetter(Strings, name, function() { + return Services.strings.createBundle(bundle); + }); +}); + var BrowserApp = { _tabs: [], _selectedTab: null, @@ -118,6 +132,9 @@ var BrowserApp = { Services.obs.addObserver(this, "Preferences:Get", false); Services.obs.addObserver(this, "Preferences:Set", false); + Services.obs.addObserver(XPInstallObserver, "addon-install-blocked", false); + Services.obs.addObserver(XPInstallObserver, "addon-install-started", false); + NativeWindow.init(); let uri = "about:support"; @@ -146,6 +163,9 @@ var BrowserApp = { shutdown: function shutdown() { NativeWindow.uninit(); + + Services.obs.removeObserver(XPInstallObserver, "addon-install-blocked"); + Services.obs.removeObserver(XPInstallObserver, "addon-install-started"); }, get tabs() { @@ -1218,3 +1238,57 @@ var BrowserEventHandler = { return scrollX || scrollY; } }; + +var XPInstallObserver = { + observe: function xpi_observer(aSubject, aTopic, aData) { + switch (aTopic) { + case "addon-install-started": + NativeWindow.toast.show(Strings.browser.GetStringFromName("alertAddonsDownloading"), "short"); + break; + case "addon-install-blocked": + dump("XPInstallObserver addon-install-blocked"); + let installInfo = aSubject.QueryInterface(Ci.amIWebInstallInfo); + let host = installInfo.originatingURI.host; + + let brandShortName = Strings.brand.GetStringFromName("brandShortName"); + let notificationName, buttons, messageString; + let strings = Strings.browser; + let enabled = true; + try { + enabled = Services.prefs.getBoolPref("xpinstall.enabled"); + } + catch (e) {} + + if (!enabled) { + notificationName = "xpinstall-disabled"; + if (Services.prefs.prefIsLocked("xpinstall.enabled")) { + messageString = strings.GetStringFromName("xpinstallDisabledMessageLocked"); + buttons = []; + } else { + messageString = strings.formatStringFromName("xpinstallDisabledMessage2", [brandShortName, host], 2); + buttons = [{ + label: strings.GetStringFromName("xpinstallDisabledButton"), + callback: function editPrefs() { + Services.prefs.setBoolPref("xpinstall.enabled", true); + return false; + } + }]; + } + } else { + notificationName = "xpinstall"; + messageString = strings.formatStringFromName("xpinstallPromptWarning2", [brandShortName, host], 2); + + buttons = [{ + label: strings.GetStringFromName("xpinstallPromptAllowButton"), + callback: function() { + // Kick off the install + installInfo.install(); + return false; + } + }]; + } + NativeWindow.doorhanger.show(messageString, buttons); + break; + } + } +}; diff --git a/mobile/chrome/content/downloads.js b/mobile/chrome/content/downloads.js index 1972a58b0285..fba2a429114a 100644 --- a/mobile/chrome/content/downloads.js +++ b/mobile/chrome/content/downloads.js @@ -37,11 +37,6 @@ * * ***** END LICENSE BLOCK ***** */ -var Strings = {}; -XPCOMUtils.defineLazyGetter(Strings, "browser", function() { - return Services.strings.createBundle("chrome://browser/locale/browser.properties"); -}); - const URI_GENERIC_ICON_DOWNLOAD = "drawable://alertdownloads"; var Downloads = { diff --git a/mobile/components/XPIDialogService.js b/mobile/components/XPIDialogService.js index db070e6b2785..796abad325f9 100644 --- a/mobile/components/XPIDialogService.js +++ b/mobile/components/XPIDialogService.js @@ -51,15 +51,6 @@ WebInstallPrompt.prototype = { QueryInterface: XPCOMUtils.generateQI([Ci.amIWebInstallPrompt]), confirm: function(aWindow, aURL, aInstalls) { - // first check if the extensions panel is open : fast path to return true - let browser = Services.wm.getMostRecentWindow("navigator:browser"); - if (browser.ExtensionsView.visible) { - aInstalls.forEach(function(install) { - install.install(); - }); - return; - } - let bundle = Services.strings.createBundle("chrome://browser/locale/browser.properties"); let prompt = Services.prompt;