Mozilla Home
Privacy
Cookies
Legal
Bugzilla
Browse
Advanced Search
New Bug
Reports
Documentation
Log In
Log In with GitHub
or
Remember me
Browse
Advanced Search
New Bug
Reports
Documentation
Attachment 639179 Details for
Bug 718280
[patch]
patch
decom_migration.diff (text/plain), 21.90 KB, created by
Asaf Romano (gone)
(
hide
)
Description:
patch
Filename:
MIME Type:
Creator:
Asaf Romano (gone)
Size:
21.90 KB
patch
obsolete
>diff --git a/browser/components/migration/src/ChromeProfileMigrator.js b/browser/components/migration/content/ChromeMigrator.js >rename from browser/components/migration/src/ChromeProfileMigrator.js >rename to browser/components/migration/content/ChromeMigrator.js >--- a/browser/components/migration/src/ChromeProfileMigrator.js >+++ b/browser/components/migration/content/ChromeMigrator.js >@@ -1,34 +1,22 @@ > /* -*- Mode: js; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- > * vim: sw=2 ts=2 sts=2 et */ > /* This Source Code Form is subject to the terms of the Mozilla Public > * License, v. 2.0. If a copy of the MPL was not distributed with this > * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ > > "use strict"; > >-const Cc = Components.classes; >-const Ci = Components.interfaces; >-const Cu = Components.utils; >-const Cr = Components.results; >- > const FILE_INPUT_STREAM_CID = "@mozilla.org/network/file-input-stream;1"; > > const S100NS_FROM1601TO1970 = 0x19DB1DED53E8000; > const S100NS_PER_MS = 10; > >-Cu.import("resource://gre/modules/XPCOMUtils.jsm"); >-Cu.import("resource://gre/modules/Services.jsm"); >-Cu.import("resource://gre/modules/NetUtil.jsm"); > Cu.import("resource://gre/modules/FileUtils.jsm"); >-Cu.import("resource:///modules/MigrationUtils.jsm"); >- >-XPCOMUtils.defineLazyModuleGetter(this, "PlacesUtils", >- "resource://gre/modules/PlacesUtils.jsm"); > > /** > * Convert Chrome time format to Date object > * > * @param aTime > * Chrome time > * @return converted Date object > * @note Google Chrome uses FILETIME / 10 as time. >@@ -68,48 +56,48 @@ > } > } catch (e) { > Cu.reportError(e); > } > } > } > > >-function ChromeProfileMigrator() { >+function Migrator() { > let chromeUserDataFolder = FileUtils.getDir( > #ifdef XP_WIN > "LocalAppData", ["Google", "Chrome", "User Data"] > #elifdef XP_MACOSX > "ULibDir", ["Application Support", "Google", "Chrome"] > #else > "Home", [".config", "google-chrome"] > #endif > , false); > this._chromeUserDataFolder = chromeUserDataFolder.exists() ? > chromeUserDataFolder : null; > } > >-ChromeProfileMigrator.prototype = Object.create(MigratorPrototype); >+Migrator.prototype = Object.create(MigratorPrototype); > >-ChromeProfileMigrator.prototype.getResources = >+Migrator.prototype.getResources = > function Chrome_getResources(aProfile) { > if (this._chromeUserDataFolder) { > let profileFolder = this._chromeUserDataFolder.clone(); > profileFolder.append(aProfile); > if (profileFolder.exists()) { > let possibleResources = [GetBookmarksResource(profileFolder), > GetHistoryResource(profileFolder), > GetCookiesResource(profileFolder)]; > return [r for each (r in possibleResources) if (r != null)]; > } > } > return []; > }; > >-Object.defineProperty(ChromeProfileMigrator.prototype, "sourceProfiles", { >+Object.defineProperty(Migrator.prototype, "sourceProfiles", { > get: function Chrome_sourceProfiles() { > if ("__sourceProfiles" in this) > return this.__sourceProfiles; > > if (!this._chromeUserDataFolder) > return []; > > let profiles; >@@ -141,17 +129,17 @@ > // Only list profiles from which any data can be imported > return this.__sourceProfiles = profiles.filter(function(profileName) { > let resources = this.getResources(profileName); > return resources && resources.length > 0; > }, this); > } > }); > >-Object.defineProperty(ChromeProfileMigrator.prototype, "sourceHomePageURL", { >+Object.defineProperty(Migrator.prototype, "sourceHomePageURL", { > get: function Chrome_sourceHomePageURL() { > let prefsFile = this._chromeUserDataFolder.clone(); > prefsFile.append("Preferences"); > if (prefsFile.exists()) { > // XXX reading and parsing JSON is synchronous. > let fstream = Cc[FILE_INPUT_STREAM_CID]. > createInstance(Ci.nsIFileInputStream); > fstream.init(file, -1, 0, 0); >@@ -330,14 +318,8 @@ > dbConn.asyncClose(); > aCallback(aReason == Ci.mozIStorageStatementCallback.REASON_FINISHED); > }, > }); > stmt.finalize(); > } > } > } >- >-ChromeProfileMigrator.prototype.classDescription = "Chrome Profile Migrator"; >-ChromeProfileMigrator.prototype.contractID = "@mozilla.org/profile/migrator;1?app=browser&type=chrome"; >-ChromeProfileMigrator.prototype.classID = Components.ID("{4cec1de4-1671-4fc3-a53e-6c539dc77a26}"); >- >-const NSGetFactory = XPCOMUtils.generateNSGetFactory([ChromeProfileMigrator]); >diff --git a/browser/components/migration/src/FirefoxProfileMigrator.js b/browser/components/migration/content/FirefoxMigrator.js >rename from browser/components/migration/src/FirefoxProfileMigrator.js >rename to browser/components/migration/content/FirefoxMigrator.js >--- a/browser/components/migration/src/FirefoxProfileMigrator.js >+++ b/browser/components/migration/content/FirefoxMigrator.js >@@ -7,33 +7,25 @@ > "use strict"; > > /* > * Migrates from a Firefox profile in a lossy manner in order to clean up a > * user's profile. Data is only migrated where the benefits outweigh the > * potential problems caused by importing undesired/invalid configurations > * from the source profile. > */ >+function Migrator() { } > >-Components.utils.import("resource://gre/modules/XPCOMUtils.jsm"); >-Components.utils.import("resource:///modules/MigrationUtils.jsm"); >-XPCOMUtils.defineLazyModuleGetter(this, "PlacesUtils", >- "resource://gre/modules/PlacesUtils.jsm"); >+Migrator.prototype = Object.create(MigratorPrototype); > >-function FirefoxProfileMigrator() { } >- >-FirefoxProfileMigrator.prototype = Object.create(MigratorPrototype); >- >-FirefoxProfileMigrator.prototype.getResources = function() { >+Migrator.prototype.getResources = function() { > // Only allow migrating from the default (selected) profile since this will > // be the only one returned by the toolkit profile service after bug 214675. >- let sourceProfile = >- Components.classes["@mozilla.org/toolkit/profile-service;1"] >- .getService(Components.interfaces.nsIToolkitProfileService) >- .selectedProfile; >+ let sourceProfile = Cc["@mozilla.org/toolkit/profile-service;1"]. >+ getService(Ci.nsIToolkitProfileService).selectedProfile; > if (!sourceProfile) > return null; > > let sourceProfileDir = sourceProfile.rootDir; > if (!sourceProfileDir || !sourceProfileDir.exists() || > !sourceProfileDir.isReadable()) > return null; > >@@ -77,18 +69,11 @@ > let formData = getFileResource(types.FORMDATA, ["formhistory.sqlite"]); > let bookmarksBackups = getFileResource(types.OTHERDATA, > [PlacesUtils.backups.profileRelativeFolderPath]); > > return [r for each (r in [places, cookies, passwords, formData, > bookmarksBackups]) if (r)]; > } > >-Object.defineProperty(FirefoxProfileMigrator.prototype, "startupOnlyMigrator", { >+Object.defineProperty(Migrator.prototype, "startupOnlyMigrator", { > get: function() true > }); >- >- >-FirefoxProfileMigrator.prototype.classDescription = "Firefox Profile Migrator"; >-FirefoxProfileMigrator.prototype.contractID = "@mozilla.org/profile/migrator;1?app=browser&type=firefox"; >-FirefoxProfileMigrator.prototype.classID = Components.ID("{91185366-ba97-4438-acba-48deaca63386}"); >- >-const NSGetFactory = XPCOMUtils.generateNSGetFactory([FirefoxProfileMigrator]); >diff --git a/browser/components/migration/src/IEProfileMigrator.js b/browser/components/migration/content/IEMigrator.js >rename from browser/components/migration/src/IEProfileMigrator.js >rename to browser/components/migration/content/IEMigrator.js >--- a/browser/components/migration/src/IEProfileMigrator.js >+++ b/browser/components/migration/content/IEMigrator.js >@@ -623,33 +623,33 @@ > throw new Error("Unexpected value type: " + typeof(value)); > } > } > }; > > //////////////////////////////////////////////////////////////////////////////// > //// Migrator > >-function IEProfileMigrator() >+function Migrator() > { > } > >-IEProfileMigrator.prototype = Object.create(MigratorPrototype); >+Migrator.prototype = Object.create(MigratorPrototype); > >-IEProfileMigrator.prototype.getResources = function IE_getResources() { >+Migrator.prototype.getResources = function IE_getResources() { > let resources = [ > new Bookmarks() > , new History() > , new Cookies() > , new Settings() > ]; > return [r for each (r in resources) if (r.exists)]; > }; > >-Object.defineProperty(IEProfileMigrator.prototype, "sourceHomePageURL", { >+Object.defineProperty(Migrator.prototype, "sourceHomePageURL", { > get: function IE_get_sourceHomePageURL() { > let defaultStartPage = readRegKey(Ci.nsIWindowsRegKey.ROOT_KEY_LOCAL_MACHINE, > kMainKey, "Default_Page_URL"); > let startPage = readRegKey(Ci.nsIWindowsRegKey.ROOT_KEY_CURRENT_USER, > kMainKey, "Start Page"); > // If the user didn't customize the Start Page, he is still on the default > // page, that may be considered the equivalent of our about:home. There's > // no reason to retain it, since it is heavily targeted to IE. >@@ -665,14 +665,8 @@ > if (homepage) > secondaryPages.unshift(homepage); > homepage = secondaryPages.join("|"); > } > > return homepage; > } > }); >- >-IEProfileMigrator.prototype.classDescription = "IE Profile Migrator"; >-IEProfileMigrator.prototype.contractID = "@mozilla.org/profile/migrator;1?app=browser&type=ie"; >-IEProfileMigrator.prototype.classID = Components.ID("{3d2532e3-4932-4774-b7ba-968f5899d3a4}"); >- >-const NSGetFactory = XPCOMUtils.generateNSGetFactory([IEProfileMigrator]); >diff --git a/browser/components/migration/src/SafariProfileMigrator.js b/browser/components/migration/content/SafariMigrator.js >rename from browser/components/migration/src/SafariProfileMigrator.js >rename to browser/components/migration/content/SafariMigrator.js >--- a/browser/components/migration/src/SafariProfileMigrator.js >+++ b/browser/components/migration/content/SafariMigrator.js >@@ -1,29 +1,18 @@ > /* This Source Code Form is subject to the terms of the Mozilla Public > * License, v. 2.0. If a copy of the MPL was not distributed with this > * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ > > "use strict"; > >-let Cc = Components.classes; >-let Ci = Components.interfaces; >-let Cu = Components.utils; >- >-Cu.import("resource://gre/modules/XPCOMUtils.jsm"); > Cu.import("resource://gre/modules/FileUtils.jsm"); >-Cu.import("resource://gre/modules/Services.jsm"); >-Cu.import("resource:///modules/MigrationUtils.jsm"); > > XPCOMUtils.defineLazyModuleGetter(this, "PropertyListUtils", > "resource://gre/modules/PropertyListUtils.jsm"); >-XPCOMUtils.defineLazyModuleGetter(this, "PlacesUtils", >- "resource://gre/modules/PlacesUtils.jsm"); >-XPCOMUtils.defineLazyModuleGetter(this, "NetUtil", >- "resource://gre/modules/NetUtil.jsm"); > > function Bookmarks(aBookmarksFile) { > this._file = aBookmarksFile; > } > Bookmarks.prototype = { > type: MigrationUtils.resourceTypes.BOOKMARKS, > > migrate: function B_migrate(aCallback) { >@@ -578,22 +567,22 @@ > Services.prefs.setIntPref("network.cookie.cookieBehavior", > cookieValue); > } > }.bind(this), aCallback)); > } > }; > #endif > >-function SafariProfileMigrator() { >+function Migrator() { > } > >-SafariProfileMigrator.prototype = Object.create(MigratorPrototype); >+Migrator.prototype = Object.create(MigratorPrototype); > >-SafariProfileMigrator.prototype.getResources = function SM_getResources() { >+Migrator.prototype.getResources = function SM_getResources() { > let profileDir = > #ifdef XP_MACOSX > FileUtils.getDir("ULibDir", ["Safari"], false); > #else > FileUtils.getDir("AppData", ["Apple Computer", "Safari"], false); > #endif > if (!profileDir.exists()) > return null; >@@ -635,17 +624,17 @@ > let wfFile = FileUtils.getFile("UsrPrfs", ["com.apple.WebFoundation.plist"]); > if (wfFile.exists()) > resources.push(new WebFoundationCookieBehavior(wfFile)); > #endif > > return resources; > }; > >-Object.defineProperty(SafariProfileMigrator.prototype, "mainPreferencesPropertyList", { >+Object.defineProperty(Migrator.prototype, "mainPreferencesPropertyList", { > get: function get_mainPreferencesPropertyList() { > if (this._mainPreferencesPropertyList === undefined) { > let file = > #ifdef XP_MACOSX > FileUtils.getDir("UsrPrfs", [], false); > #else > FileUtils.getDir("AppData", ["Apple Computer", "Preferences"], false); > #endif >@@ -657,24 +646,18 @@ > } > } > return this._mainPreferencesPropertyList = null; > } > return this._mainPreferencesPropertyList; > } > }); > >-Object.defineProperty(SafariProfileMigrator.prototype, "sourceHomePageURL", { >+Object.defineProperty(Migrator.prototype, "sourceHomePageURL", { > get: function get_sourceHomePageURL() { > if (this.mainPreferencesPropertyList) { > let dict = this.mainPreferencesPropertyList._readSync(); > if (dict.has("HomePage")) > return dict.get("HomePage"); > } > return ""; > } > }); >- >-SafariProfileMigrator.prototype.classDescription = "Safari Profile Migrator"; >-SafariProfileMigrator.prototype.contractID = "@mozilla.org/profile/migrator;1?app=browser&type=safari"; >-SafariProfileMigrator.prototype.classID = Components.ID("{4b609ecf-60b2-4655-9df4-dc149e474da1}"); >- >-const NSGetFactory = XPCOMUtils.generateNSGetFactory([SafariProfileMigrator]); >diff --git a/browser/components/migration/jar.mn b/browser/components/migration/jar.mn >--- a/browser/components/migration/jar.mn >+++ b/browser/components/migration/jar.mn >@@ -1,7 +1,15 @@ > # This Source Code Form is subject to the terms of the Mozilla Public > # License, v. 2.0. If a copy of the MPL was not distributed with this > # file, You can obtain one at http://mozilla.org/MPL/2.0/. > > browser.jar: > * content/browser/migration/migration.xul (content/migration.xul) > * content/browser/migration/migration.js (content/migration.js) >+* content/browser/migration/ChromeMigrator.js (content/ChromeMigrator.js) >+* content/browser/migration/FirefoxMigrator.js (content/FirefoxMigrator.js) >+#ifdef XP_WIN >+* content/browser/migration/IEMigrator.js (content/IEMigrator.js) >+* content/browser/migration/SafariMigrator.js (content/SafariMigrator.js) >+#elifdef XP_MACOSX >+* content/browser/migration/SafariMigrator.js (content/SafariMigrator.js) >+#endif >diff --git a/browser/components/migration/src/BrowserProfileMigrators.manifest b/browser/components/migration/src/BrowserProfileMigrators.manifest >--- a/browser/components/migration/src/BrowserProfileMigrators.manifest >+++ b/browser/components/migration/src/BrowserProfileMigrators.manifest >@@ -1,14 +1,2 @@ > component {6F8BB968-C14F-4D6F-9733-6C6737B35DCE} ProfileMigrator.js > contract @mozilla.org/toolkit/profile-migrator;1 {6F8BB968-C14F-4D6F-9733-6C6737B35DCE} >-component {4cec1de4-1671-4fc3-a53e-6c539dc77a26} ChromeProfileMigrator.js >-contract @mozilla.org/profile/migrator;1?app=browser&type=chrome {4cec1de4-1671-4fc3-a53e-6c539dc77a26} >-component {91185366-ba97-4438-acba-48deaca63386} FirefoxProfileMigrator.js >-contract @mozilla.org/profile/migrator;1?app=browser&type=firefox {91185366-ba97-4438-acba-48deaca63386} >-#ifdef HAS_IE_MIGRATOR >-component {3d2532e3-4932-4774-b7ba-968f5899d3a4} IEProfileMigrator.js >-contract @mozilla.org/profile/migrator;1?app=browser&type=ie {3d2532e3-4932-4774-b7ba-968f5899d3a4} >-#endif >-#ifdef HAS_SAFARI_MIGRATOR >-component {4b609ecf-60b2-4655-9df4-dc149e474da1} SafariProfileMigrator.js >-contract @mozilla.org/profile/migrator;1?app=browser&type=safari {4b609ecf-60b2-4655-9df4-dc149e474da1} >-#endif >diff --git a/browser/components/migration/src/Makefile.in b/browser/components/migration/src/Makefile.in >--- a/browser/components/migration/src/Makefile.in >+++ b/browser/components/migration/src/Makefile.in >@@ -12,37 +12,23 @@ > MODULE = migration > LIBRARY_NAME = migration_s > > FORCE_STATIC_LIB = 1 > USE_STATIC_LIBS = 1 > > EXTRA_PP_COMPONENTS = \ > ProfileMigrator.js \ >- ChromeProfileMigrator.js \ >- FirefoxProfileMigrator.js \ > $(NULL) > > ifeq ($(OS_ARCH),WINNT) > CPPSRCS += nsIEHistoryEnumerator.cpp >- >-EXTRA_PP_COMPONENTS += IEProfileMigrator.js \ >- SafariProfileMigrator.js \ >- $(NULL) >-DEFINES += -DHAS_IE_MIGRATOR -DHAS_SAFARI_MIGRATOR >-endif >- >-ifeq (cocoa,$(MOZ_WIDGET_TOOLKIT)) >-EXTRA_PP_COMPONENTS += SafariProfileMigrator.js \ >- $(NULL) >-DEFINES += -DHAS_SAFARI_MIGRATOR > endif > > EXTRA_PP_COMPONENTS += \ > BrowserProfileMigrators.manifest \ > $(NULL) > > EXTRA_PP_JS_MODULES = \ > MigrationUtils.jsm \ > $(NULL) > > include $(topsrcdir)/config/rules.mk >- >diff --git a/browser/components/migration/src/MigrationUtils.jsm b/browser/components/migration/src/MigrationUtils.jsm >--- a/browser/components/migration/src/MigrationUtils.jsm >+++ b/browser/components/migration/src/MigrationUtils.jsm >@@ -69,27 +69,29 @@ > } > return ""; > } > > /** > * Shared prototype for migrators, implementing nsIBrowserProfileMigrator. > * > * To implement a migrator: >- * 1. Import this module. >- * 2. Create the prototype for the migrator, extending MigratorPrototype. >- * Namely: MosaicMigrator.prototype = Object.create(MigratorPrototype); >- * 3. Set classDescription, contractID and classID for your migrator, and set >- * NSGetFactory appropriately. >- * 4. If the migrator supports multiple profiles, override the sourceProfiles >+ * 1. Create a js file for the new migrator in browser/components/migration/content, >+ * and list in browser/components/migration/jar.mn. >+ * 2. Define a Migrator objectm extending MigratorPrototype. >+ * Namely: Migrator.prototype = Object.create(MigratorPrototype); >+ * 3. If the migrator supports multiple profiles, override the sourceProfiles > * Here we default for single-profile migrator. >- * 5. Implement getResources(aProfile) (see below). >- * 6. If the migrator supports reading the home page of the source browser, >+ * 4. Implement getResources(aProfile) (see below). >+ * 5. If the migrator supports reading the home page of the source browser, > * override |sourceHomePageURL| getter. >- * 7. For startup-only migrators, override |startupOnlyMigrator|. >+ * 6. For startup-only migrators, override |startupOnlyMigrator|. >+ * 7. Add a key for the migrator in MigrationUtils.getMigrator >+ * 8. Add the key to the the MigrationUtils.migrators iterator. >+ * 9. List the migrator in migration.xul. > */ > let MigratorPrototype = { > QueryInterface: XPCOMUtils.generateQI([Ci.nsIBrowserProfileMigrator]), > > /** > * OVERRIDE IF AND ONLY IF the source supports multiple profiles. > * > * Returns array of profiles (by names) from which data may be imported. >@@ -452,27 +454,39 @@ > * for the given migrator, or aMigratorKey is invalid (e.g. ie on mac, > * or mosaic everywhere). This method should be used rather than direct > * getService for future compatibility (see bug 718280). > * > * @return profile migrator implementing nsIBrowserProfileMigrator, if it can > * import any data, null otherwise. > */ > getMigrator: function MU_getMigrator(aKey) { >+ const MIGRATORS = { >+ "chrome": "ChromeMigrator.js" >+ , "firefox": "FirefoxMigrator.js" >+#ifdef XP_WIN >+ , "ie": "IEMigrator.js" >+ , "safari": "SafariMigrator.js" >+#elifdef XP_MACOSX >+ , "safari": "SafariMigrator.js" >+#endif >+ }; > let migrator = null; > if (this._migrators.has(aKey)) { > migrator = this._migrators.get(aKey); > } >+ else if (aKey in MIGRATORS) { >+ let scope = { }; >+ Services.scriptloader.loadSubScript("chrome://browser/content/migration/" + >+ MIGRATORS[aKey], scope); >+ migrator = new scope.Migrator(); >+ this._migrators.set(aKey, migrator); >+ } > else { >- try { >- migrator = Cc["@mozilla.org/profile/migrator;1?app=browser&type=" + >- aKey].createInstance(Ci.nsIBrowserProfileMigrator); >- } >- catch(ex) { } >- this._migrators.set(aKey, migrator); >+ throw new Error("Invalid migrator key passed to getMigrator: " + aKey); > } > > return migrator && migrator.sourceExists ? migrator : null; > }, > > // Iterates the available migrators, in the most suitable > // order for the running platform. > get migrators() { >@@ -623,10 +637,12 @@ > > /** > * Cleans up references to migrators and nsIProfileInstance instances. > */ > finishMigration: function MU_finishMigration() { > gMigrators = null; > gProfileStartup = null; > gMigrationBundle = null; >- } >+ }, >+ >+ get resetSupported() true > }); >diff --git a/toolkit/content/resetProfile.js b/toolkit/content/resetProfile.js >--- a/toolkit/content/resetProfile.js >+++ b/toolkit/content/resetProfile.js >@@ -27,31 +27,20 @@ > } > > /** > * Check if reset is supported for the currently running profile. > * > * @return boolean whether reset is supported. > */ > function resetSupported() { >- let profileService = Cc["@mozilla.org/toolkit/profile-service;1"]. >- getService(Ci.nsIToolkitProfileService); >- let currentProfileDir = Services.dirsvc.get("ProfD", Ci.nsIFile); >- >-#expand const MOZ_APP_NAME = "__MOZ_APP_NAME__"; >-#expand const MOZ_BUILD_APP = "__MOZ_BUILD_APP__"; >- >- // Reset is only supported for the default profile if the self-migrator used for reset exists. > try { >- return currentProfileDir.equals(profileService.selectedProfile.rootDir) && >- ("@mozilla.org/profile/migrator;1?app=" + MOZ_BUILD_APP + "&type=" + MOZ_APP_NAME in Cc); >- } catch (e) { >- // Catch exception when there is no selected profile. >- Cu.reportError(e); >- } >+ Components.utils.import("resource:///modules/MigrationUtils.jsm"); >+ return MigrationUtils.resetSupported; >+ } catch (e) { } > return false; > } > > function getMigratedData() { > Components.utils.import("resource:///modules/MigrationUtils.jsm"); > > #expand const MOZ_BUILD_APP = "__MOZ_BUILD_APP__"; > #expand const MOZ_APP_NAME = "__MOZ_APP_NAME__";
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
Flags:
MattN
: review-
Actions:
View
|
Diff
|
Review
Attachments on
bug 718280
:
639178
| 639179 |
9307182
|
9307183
|
9307184
|
9307186
|
9307187
|
9307188
|
9307189