From e19abc0c3d7976eca47bc4c2c6546036aa14487e Mon Sep 17 00:00:00 2001 From: Dietrich Ayala Date: Thu, 18 Dec 2008 17:09:25 -0800 Subject: [PATCH] imported patch backout-bug414715 --- browser/base/content/browser-places.js | 6 +- browser/base/content/browser.js | 6 +- browser/base/content/tabbrowser.xml | 9 +- browser/components/nsBrowserGlue.js | 142 +++++------------- .../chrome/browser/places/places.properties | 7 - .../places/public/nsINavHistoryService.idl | 10 -- .../components/places/src/nsNavHistory.cpp | 22 +-- toolkit/components/places/src/nsNavHistory.h | 1 - .../tests/unit/test_history_notifications.js | 108 ------------- 9 files changed, 48 insertions(+), 263 deletions(-) delete mode 100644 toolkit/components/places/tests/unit/test_history_notifications.js diff --git a/browser/base/content/browser-places.js b/browser/base/content/browser-places.js index 045217f0089..ffb521235fa 100644 --- a/browser/base/content/browser-places.js +++ b/browser/base/content/browser-places.js @@ -951,11 +951,7 @@ var PlacesMenuDNDController = { var PlacesStarButton = { init: function PSB_init() { - try { - PlacesUtils.bookmarks.addObserver(this, false); - } catch(ex) { - Components.utils.reportError("PlacesStarButton.init(): error adding bookmark observer: " + ex); - } + PlacesUtils.bookmarks.addObserver(this, false); }, uninit: function PSB_uninit() { diff --git a/browser/base/content/browser.js b/browser/base/content/browser.js index 39d49200d2d..37c391bfd41 100644 --- a/browser/base/content/browser.js +++ b/browser/base/content/browser.js @@ -1144,11 +1144,7 @@ function prepareForStartup() { gBrowser.browsers[0].removeAttribute("disablehistory"); // enable global history - try { - gBrowser.docShell.QueryInterface(Components.interfaces.nsIDocShellHistory).useGlobalHistory = true; - } catch(ex) { - Components.utils.reportError("Places database may be locked: " + ex); - } + gBrowser.docShell.QueryInterface(Components.interfaces.nsIDocShellHistory).useGlobalHistory = true; // hook up UI through progress listener gBrowser.addProgressListener(window.XULBrowserWindow, Components.interfaces.nsIWebProgress.NOTIFY_ALL); diff --git a/browser/base/content/tabbrowser.xml b/browser/base/content/tabbrowser.xml index 06c2b056b9f..7787bfc7d9b 100644 --- a/browser/base/content/tabbrowser.xml +++ b/browser/base/content/tabbrowser.xml @@ -628,9 +628,8 @@ .getService(Components.interfaces.nsIIOService); aURI = ios.newURI(aURI, null, null); } - if (this.mFaviconService) - this.mFaviconService.setAndLoadFaviconForPage(browser.currentURI, - aURI, false); + this.mFaviconService.setAndLoadFaviconForPage(browser.currentURI, + aURI, false); } this.updateIcon(aTab); @@ -729,9 +728,7 @@ aURI = ios.newURI(aURI, null, null); } - if (this.mFaviconService) - return this.mFaviconService.isFailedFavicon(aURI); - return null; + return this.mFaviconService.isFailedFavicon(aURI); ]]> diff --git a/browser/components/nsBrowserGlue.js b/browser/components/nsBrowserGlue.js index 06339e7907e..24ff06f945b 100644 --- a/browser/components/nsBrowserGlue.js +++ b/browser/components/nsBrowserGlue.js @@ -74,39 +74,12 @@ function BrowserGlue() { } BrowserGlue.prototype = { + __prefs: null, get _prefs() { - var prefs = Cc["@mozilla.org/preferences-service;1"]. - getService(Ci.nsIPrefBranch); - this.__defineGetter__("_prefs", function() prefs); - return this._prefs; - }, - - get _bundleService() { - var bundleService = Cc["@mozilla.org/intl/stringbundle;1"]. - getService(Ci.nsIStringBundleService); - this.__defineGetter__("_bundleService", function() bundleService); - return this._bundleService; - }, - - get _placesBundle() { - var strings = this._bundleService. - createBundle("chrome://browser/locale/places/places.properties"); - this.__defineGetter__("_placesBundle", function() strings); - return this._placesBundle; - }, - - get _idleService() { - var idleSvc = Cc["@mozilla.org/widget/idleservice;1"]. - getService(Ci.nsIIdleService); - this.__defineGetter__("_idleService", function() idleSvc); - return this._idleService; - }, - - get _observerService() { - const obssvc = Cc['@mozilla.org/observer-service;1']. - getService(Ci.nsIObserverService); - this.__defineGetter__("_observerService", function() obssvc); - return this._observerService; + if (!this.__prefs) + this.__prefs = Cc["@mozilla.org/preferences-service;1"]. + getService(Ci.nsIPrefBranch); + return this.__prefs; }, _saveSession: false, @@ -157,18 +130,9 @@ BrowserGlue.prototype = { break; case "places-init-complete": this._initPlaces(); - this._observerService.removeObserver(this, "places-init-complete"); - // no longer needed, since history was initialized completely. - this._observerService.removeObserver(this, "places-database-locked"); - break; - case "places-database-locked": - this._isPlacesDatabaseLocked = true; - // stop observing, so further attempts to load history service - // do not show the prompt. - this._observerService.removeObserver(this, "places-database-locked"); break; case "idle": - if (this._idleService.idleTime > BOOKMARKS_ARCHIVE_IDLE_TIME * 1000) { + if (this.idleService.idleTime > BOOKMARKS_ARCHIVE_IDLE_TIME * 1000) { // Back up bookmarks. this._archiveBookmarks(); } @@ -180,7 +144,8 @@ BrowserGlue.prototype = { _init: function() { // observer registration - const osvr = this._observerService; + const osvr = Cc['@mozilla.org/observer-service;1']. + getService(Ci.nsIObserverService); osvr.addObserver(this, "quit-application", false); osvr.addObserver(this, "xpcom-shutdown", false); osvr.addObserver(this, "prefservice:after-app-defaults", false); @@ -191,14 +156,14 @@ BrowserGlue.prototype = { osvr.addObserver(this, "quit-application-granted", false); osvr.addObserver(this, "session-save", false); osvr.addObserver(this, "places-init-complete", false); - osvr.addObserver(this, "places-database-locked", false); }, // cleanup (called on application shutdown) _dispose: function() { // observer removal - const osvr = this._observerService; + const osvr = Cc['@mozilla.org/observer-service;1']. + getService(Ci.nsIObserverService); osvr.removeObserver(this, "quit-application"); osvr.removeObserver(this, "xpcom-shutdown"); osvr.removeObserver(this, "prefservice:after-app-defaults"); @@ -208,6 +173,7 @@ BrowserGlue.prototype = { osvr.removeObserver(this, "quit-application-requested"); osvr.removeObserver(this, "quit-application-granted"); osvr.removeObserver(this, "session-save"); + osvr.removeObserver(this, "places-init-complete"); }, _onAppDefaults: function() @@ -240,14 +206,16 @@ BrowserGlue.prototype = { // handle any UI migration this._migrateUI(); - this._observerService.notifyObservers(null, "browser-ui-startup-complete", ""); + const osvr = Cc['@mozilla.org/observer-service;1']. + getService(Ci.nsIObserverService); + osvr.notifyObservers(null, "browser-ui-startup-complete", ""); }, // profile shutdown handler (contains profile cleanup routines) _onProfileShutdown: function() { this._shutdownPlaces(); - this._idleService.removeIdleObserver(this, BOOKMARKS_ARCHIVE_IDLE_TIME); + this.idleService.removeIdleObserver(this, BOOKMARKS_ARCHIVE_IDLE_TIME); this.Sanitizer.onShutdown(); }, @@ -277,15 +245,6 @@ BrowserGlue.prototype = { ww.openWindow(null, EMURL, "_blank", EMFEATURES, args); this._prefs.clearUserPref(PREF_EM_NEW_ADDONS_LIST); } - - // Load the "more info" page for a locked places.sqlite - // This property is set earlier in the startup process: - // nsPlacesDBFlush loads after profile-after-change and initializes - // the history service, which sends out places-database-locked - // which sets this property. - if (this._isPlacesDatabaseLocked) { - this._showPlacesLockedNotificationBox(); - } }, _onQuitRequest: function(aCancelQuit, aQuitType) @@ -336,12 +295,14 @@ BrowserGlue.prototype = { return false; var buttonChoice = 0; - var quitBundle = this._bundleService.createBundle("chrome://browser/locale/quitDialog.properties"); - var brandBundle = this._bundleService.createBundle("chrome://branding/locale/brand.properties"); + var bundleService = Cc["@mozilla.org/intl/stringbundle;1"]. + getService(Ci.nsIStringBundleService); + var quitBundle = bundleService.createBundle("chrome://browser/locale/quitDialog.properties"); + var brandBundle = bundleService.createBundle("chrome://branding/locale/brand.properties"); var appName = brandBundle.GetStringFromName("brandShortName"); var quitDialogTitle = quitBundle.formatStringFromName(aQuitType + "DialogTitle", - [appName], 1); + [appName], 1); var message; if (aQuitType == "restart") @@ -447,8 +408,10 @@ BrowserGlue.prototype = { var browser = win.gBrowser; // for closure in notification bar callback var notifyBox = browser.getNotificationBox(); - var brandBundle = this._bundleService.createBundle("chrome://branding/locale/brand.properties"); - var rightsBundle = this._bundleService.createBundle("chrome://browser/locale/aboutRights.properties"); + var bundleService = Cc["@mozilla.org/intl/stringbundle;1"]. + getService(Ci.nsIStringBundleService); + var brandBundle = bundleService.createBundle("chrome://branding/locale/brand.properties"); + var rightsBundle = bundleService.createBundle("chrome://browser/locale/aboutRights.properties"); var buttonLabel = rightsBundle.GetStringFromName("buttonLabel"); var buttonAccessKey = rightsBundle.GetStringFromName("buttonAccessKey"); @@ -485,6 +448,14 @@ BrowserGlue.prototype = { return Sanitizer; }, + _idleService: null, + get idleService() { + if (!this._idleService) + this._idleService = Cc["@mozilla.org/widget/idleservice;1"]. + getService(Ci.nsIIdleService); + return this._idleService; + }, + /** * Initialize Places * - imports the bookmarks html file if bookmarks database is empty, try to @@ -511,12 +482,11 @@ BrowserGlue.prototype = { // forced migration (due to a major schema change). var histsvc = Cc["@mozilla.org/browser/nav-history-service;1"]. getService(Ci.nsINavHistoryService); + var databaseStatus = histsvc.databaseStatus; // If the database is corrupt or has been newly created we should // import bookmarks. - var databaseStatus = histsvc.databaseStatus; - var importBookmarks = databaseStatus == histsvc.DATABASE_STATUS_CREATE || - databaseStatus == histsvc.DATABASE_STATUS_CORRUPT; + var importBookmarks = databaseStatus != histsvc.DATABASE_STATUS_OK; // Check if user or an extension has required to import bookmarks.html var importBookmarksHTML = false; @@ -614,7 +584,7 @@ BrowserGlue.prototype = { // Initialize bookmark archiving on idle. // Once a day, either on idle or shutdown, bookmarks are backed up. - this._idleService.addIdleObserver(this, BOOKMARKS_ARCHIVE_IDLE_TIME); + this.idleService.addIdleObserver(this, BOOKMARKS_ARCHIVE_IDLE_TIME); }, /** @@ -666,43 +636,6 @@ BrowserGlue.prototype = { } }, - /** - * Show the notificationBox for a locked places database. - */ - _showPlacesLockedNotificationBox: function nsBrowserGlue__showPlacesLockedNotificationBox() { - var brandBundle = this._bundleService.createBundle("chrome://branding/locale/brand.properties"); - var applicationName = brandBundle.GetStringFromName("brandShortName"); - var title = this._placesBundle.GetStringFromName("lockPrompt.title"); - var text = this._placesBundle.formatStringFromName("lockPrompt.text", [applicationName], 1); - var buttonText = this._placesBundle.GetStringFromName("lockPromptInfoButton.label"); - var accessKey = this._placesBundle.GetStringFromName("lockPromptInfoButton.accessKey"); - - var helpTopic = "places-locked"; - var url = Cc["@mozilla.org/toolkit/URLFormatterService;1"]. - getService(Components.interfaces.nsIURLFormatter). - formatURLPref("app.support.baseURL"); - url += helpTopic; - - var browser = this.getMostRecentBrowserWindow().gBrowser; - - var buttons = [ - { - label: buttonText, - accessKey: accessKey, - popup: null, - callback: function(aNotificationBar, aButton) { - browser.selectedTab = browser.addTab(url); - } - } - ]; - - var notifyBox = browser.getNotificationBox(); - var box = notifyBox.appendNotification(text, title, null, - notifyBox.PRIORITY_CRITICAL_MEDIUM, - buttons); - box.persistence = -1; // Until user closes it - }, - _migrateUI: function bg__migrateUI() { var migration = 0; try { @@ -811,10 +744,11 @@ BrowserGlue.prototype = { getService(Ci.nsINavBookmarksService); var annosvc = Cc["@mozilla.org/browser/annotation-service;1"]. getService(Ci.nsIAnnotationService); - var strings = this._placesBundle; var callback = { - _placesBundle: strings, + _placesBundle: Cc["@mozilla.org/intl/stringbundle;1"]. + getService(Ci.nsIStringBundleService). + createBundle("chrome://browser/locale/places/places.properties"), _uri: function(aSpec) { return Cc["@mozilla.org/network/io-service;1"]. diff --git a/browser/locales/en-US/chrome/browser/places/places.properties b/browser/locales/en-US/chrome/browser/places/places.properties index 9a93aa21c9b..cc66fcc0c53 100644 --- a/browser/locales/en-US/chrome/browser/places/places.properties +++ b/browser/locales/en-US/chrome/browser/places/places.properties @@ -118,10 +118,3 @@ tagResultLabel=Tag # for url bar autocomplete results of type "bookmark" # See createResultLabel() in urlbarBindings.xml bookmarkResultLabel=Bookmark - -# LOCALIZATION NOTE (lockPrompt.text) -# %S will be replaced with the application name. -lockPrompt.title=Browser Startup Error -lockPrompt.text=The bookmarks and history system will not be functional because one of %S's files is in use by another application. Some security software can cause this problem. -lockPromptInfoButton.label=Learn More -lockPromptInfoButton.accessKey=L diff --git a/toolkit/components/places/public/nsINavHistoryService.idl b/toolkit/components/places/public/nsINavHistoryService.idl index a5e828b57b6..59347e43efb 100644 --- a/toolkit/components/places/public/nsINavHistoryService.idl +++ b/toolkit/components/places/public/nsINavHistoryService.idl @@ -1062,16 +1062,6 @@ interface nsINavHistoryQueryOptions : nsISupports [scriptable, uuid(437f539b-d541-4a0f-a200-6f9a6d45cce2)] interface nsINavHistoryService : nsISupports { - /** - * System Notifications: - * - * places-init-complete - Sent once the History service is completely - * initialized successfully. - * places-database-locked - Sent if initialization of the History service - * failed due to the inability to open the places.sqlite - * for access reasons. - */ - /** * This transition type means the user followed a link and got a new toplevel * window. diff --git a/toolkit/components/places/src/nsNavHistory.cpp b/toolkit/components/places/src/nsNavHistory.cpp index b7b5e649c7d..d5211a9407a 100644 --- a/toolkit/components/places/src/nsNavHistory.cpp +++ b/toolkit/components/places/src/nsNavHistory.cpp @@ -282,25 +282,21 @@ protected: nsNavHistory& mNavHistory; }; -class PlacesEvent : public nsRunnable { +class PlacesInitCompleteEvent : public nsRunnable { public: - PlacesEvent(const char* aTopic) { - mTopic = aTopic; - } - NS_IMETHOD Run() { nsresult rv; nsCOMPtr observerService = do_GetService("@mozilla.org/observer-service;1", &rv); NS_ENSURE_SUCCESS(rv, rv); - rv = observerService->NotifyObservers(nsnull, mTopic, nsnull); + rv = observerService->NotifyObservers(nsnull, + PLACES_INIT_COMPLETE_EVENT_TOPIC, + nsnull); NS_ENSURE_SUCCESS(rv, rv); return NS_OK; } - protected: - const char* mTopic; }; // if adding a new one, be sure to update nsNavBookmarks statements and @@ -451,7 +447,7 @@ nsNavHistory::Init() // Notify we have finished database initialization // Enqueue the notification, so if we init another service that requires // nsNavHistoryService we don't recursive try to get it. - nsCOMPtr completeEvent = new PlacesEvent(PLACES_INIT_COMPLETE_EVENT_TOPIC); + nsCOMPtr completeEvent = new PlacesInitCompleteEvent(); rv = NS_DispatchToMainThread(completeEvent); NS_ENSURE_SUCCESS(rv, rv); @@ -634,14 +630,6 @@ nsNavHistory::InitDBFile(PRBool aForceInit) NS_ENSURE_SUCCESS(rv, rv); rv = mDBService->OpenUnsharedDatabase(mDBFile, getter_AddRefs(mDBConn)); } - - if (rv != NS_OK && rv != NS_ERROR_FILE_CORRUPTED) { - // If the database cannot be opened for any reason other than corruption, - // send out a notification and do not continue initialization. - // Note: We swallow errors here, since we want service init to fail anyway. - nsCOMPtr lockedEvent = new PlacesEvent(PLACES_DB_LOCKED_EVENT_TOPIC); - (void)NS_DispatchToMainThread(lockedEvent); - } NS_ENSURE_SUCCESS(rv, rv); return NS_OK; diff --git a/toolkit/components/places/src/nsNavHistory.h b/toolkit/components/places/src/nsNavHistory.h index c80397c4d0d..c64b605c5d4 100644 --- a/toolkit/components/places/src/nsNavHistory.h +++ b/toolkit/components/places/src/nsNavHistory.h @@ -122,7 +122,6 @@ #define PRIVATEBROWSING_NOTINITED (PRBool(0xffffffff)) #define PLACES_INIT_COMPLETE_EVENT_TOPIC "places-init-complete" -#define PLACES_DB_LOCKED_EVENT_TOPIC "places-database-locked" struct AutoCompleteIntermediateResult; class AutoCompleteResultComparator; diff --git a/toolkit/components/places/tests/unit/test_history_notifications.js b/toolkit/components/places/tests/unit/test_history_notifications.js deleted file mode 100644 index 6b1aae220ba..00000000000 --- a/toolkit/components/places/tests/unit/test_history_notifications.js +++ /dev/null @@ -1,108 +0,0 @@ -/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim:set ts=2 sw=2 sts=2 et: */ -/* ***** 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.org code. - * - * The Initial Developer of the Original Code is - * Mozilla Corporation. - * Portions created by the Initial Developer are Copyright (C) 2008 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * Marco Bonardo (Original Author) - * - * 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 ***** */ - -const NS_PLACES_INIT_COMPLETE_TOPIC = "places-init-complete"; -const NS_PLACES_DATABASE_LOCKED_TOPIC = "places-database-locked"; - -function run_test() { - do_test_pending(); - - // Create an observer for the Places notifications - var os = Cc["@mozilla.org/observer-service;1"]. - getService(Ci.nsIObserverService); - var observer = { - _lockedNotificationReceived: false, - observe: function thn_observe(aSubject, aTopic, aData) - { - switch (aTopic) { - case NS_PLACES_INIT_COMPLETE_TOPIC: - do_check_true(this._lockedNotificationReceived); - os.removeObserver(this, NS_PLACES_INIT_COMPLETE_TOPIC); - os.removeObserver(this, NS_PLACES_DATABASE_LOCKED_TOPIC); - do_test_finished(); - break; - case NS_PLACES_DATABASE_LOCKED_TOPIC: - if (this._lockedNotificationReceived) - do_throw("Locked notification should be observed only one time"); - this._lockedNotificationReceived = true; - break; - } - } - }; - os.addObserver(observer, NS_PLACES_INIT_COMPLETE_TOPIC, false); - os.addObserver(observer, NS_PLACES_DATABASE_LOCKED_TOPIC, false); - - // Create a dummy places.sqlite and open an unshared connection on it - var dirSvc = Cc["@mozilla.org/file/directory_service;1"]. - getService(Ci.nsIProperties); - var db = dirSvc.get('ProfD', Ci.nsIFile); - db.append("places.sqlite"); - var storage = Cc["@mozilla.org/storage/service;1"]. - getService(Ci.mozIStorageService); - var dbConn = storage.openUnsharedDatabase(db); - do_check_true(db.exists()); - - // We need an exclusive lock on the db - dbConn.executeSimpleSQL("PRAGMA locking_mode = EXCLUSIVE"); - // Exclusive locking is lazy applied, we need to make a write to activate it - dbConn.executeSimpleSQL("PRAGMA USER_VERSION = 1"); - - // Try to create history service while the db is locked - try { - var hs1 = Cc["@mozilla.org/browser/nav-history-service;1"]. - getService(Ci.nsINavHistoryService); - do_throw("Creating an instance of history service on a locked db should throw"); - } catch (ex) {} - - // Close our connection and try to cleanup the file (could fail on Windows) - dbConn.close(); - if (db.exists()) { - try { - db.remove(false); - } catch(e) { dump("Unable to remove dummy places.sqlite"); } - } - - // Create history service correctly - try { - var hs2 = Cc["@mozilla.org/browser/nav-history-service;1"]. - getService(Ci.nsINavHistoryService); - } catch (ex) { - do_throw("Creating an instance of history service on a not locked db should not throw"); - } -}