Closed Bug 743098 Opened 12 years ago Closed 12 years ago

Check for migration before attempting to sync bookmarks or passwords

Categories

(Firefox for Android Graveyard :: Android Sync, defect, P1)

ARM
Android
defect

Tracking

(blocking-fennec1.0 beta+)

RESOLVED FIXED
mozilla14
Tracking Status
blocking-fennec1.0 --- beta+

People

(Reporter: rnewman, Assigned: nalexander)

References

Details

(Whiteboard: [qa+])

Attachments

(2 files)

See Bug 725150. At the start of each bookmark or history stage, make a call into the control URI. If migration isn't completed yet, skip that stage.

Ideally this will encourage another sync after an appropriate interval, but that can be a follow-up.

Flagging as beta? because without this Bug 725150 doesn't take effect, and that's a beta blocker.
Depends on: 742815
imho: this should be a beta blocker
blocking-fennec1.0: ? → beta+
Assignee: nobody → nalexander
As of today, BrowserContract.java.in gives an interface for querying migration of history and bookmarks but not for passwords or forms:

Both passwords and forms get all crashy if the db's don't exist, which is the case if Fennec is installed but not run before first sync.

+    public static final class Control {
+        private Control() {}
+
+        public static final Uri CONTENT_URI = Uri.withAppendedPath(AUTHORITY_URI, "control");
+
+        // Check if history was completely migrated, do a bunch if it wasn't.
+        public static final String ENSURE_HISTORY_MIGRATED = "ensure_history_migrated";
+        // Check if bookmarks were completely migrated, migrate them if not.
+        public static final String ENSURE_BOOKMARKS_MIGRATED = "ensure_bookmarks_migrated";
+    }
(In reply to Nick Alexander :nalexander from comment #2)
> As of today, BrowserContract.java.in gives an interface for querying
> migration of history and bookmarks but not for passwords or forms:
> 
> Both passwords and forms get all crashy if the db's don't exist, which is
> the case if Fennec is installed but not run before first sync.

Yeah, they shouldn't :)

A sqlite config change that I think just landed might help with this. Otherwise, that's a well-defined bug.

This bug is just to make sure we don't sync until Fennec is done migrating data, which is a different thing.
Perhaps this comment is on the wrong bug, then, but this is adding yet another way to crash Fennec: access the control provider before running Fennec.

I ActivityManager(212)        Start proc org.mozilla.gecko for added application org.mozilla.gecko: pid=18687 uid=10019 gids={3003}
I dalvikvm(18687)             Turning on JNI app bug workarounds for target SDK version 5...
I TestRunner(18687)           started: test(org.mozilla.gecko.sync.repositories.android.test.TestFennecControlHelper)
E DatabaseUtils(18589)        Writing exception to parcel
E DatabaseUtils(18589)        java.lang.NullPointerException
E DatabaseUtils(18589)        	at org.mozilla.gecko.ProfileMigrator.getPreferences(ProfileMigrator.java:224)
E DatabaseUtils(18589)        	at org.mozilla.gecko.ProfileMigrator.isBookmarksMigrated(ProfileMigrator.java:220)
E DatabaseUtils(18589)        	at org.mozilla.gecko.ProfileMigrator.hasMigrationFinished(ProfileMigrator.java:216)
E DatabaseUtils(18589)        	at org.mozilla.fennec_ncalexan.db.BrowserProvider.controlQuery(BrowserProvider.java:1503)
E DatabaseUtils(18589)        	at org.mozilla.fennec_ncalexan.db.BrowserProvider.query(BrowserProvider.java:1629)
E DatabaseUtils(18589)        	at android.content.ContentProvider$Transport.query(ContentProvider.java:178)
E DatabaseUtils(18589)        	at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:112)
E DatabaseUtils(18589)        	at android.os.Binder.execTransact(Binder.java:338)
E DatabaseUtils(18589)        	at dalvik.system.NativeStart.run(Native Method)
D dalvikvm(18687)             GC_EXPLICIT freed 109K, 4% free 6531K/6787K, paused 2ms+1ms
D dalvikvm(18687)             GC_EXPLICIT freed 2K, 4% free 6529K/6787K, paused 1ms+1ms
I TestRunner(18687)           failed: test(org.mozilla.gecko.sync.repositories.android.test.TestFennecControlHelper)
I TestRunner(18687)           ----- begin exception -----
I TestRunner(18687)           
I TestRunner(18687)           java.lang.NullPointerException
I TestRunner(18687)           	at android.os.Parcel.readException(Parcel.java:1333)
I TestRunner(18687)           	at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:181)
I TestRunner(18687)           	at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:135)
I TestRunner(18687)           	at android.content.ContentProviderProxy.query(ContentProviderNative.java:358)
I TestRunner(18687)           	at android.content.ContentProviderClient.query(ContentProviderClient.java:50)
I TestRunner(18687)           	at org.mozilla.gecko.sync.repositories.android.RepoUtils$QueryHelper.safeQuery(RepoUtils.java:62)
I TestRunner(18687)           	at org.mozilla.gecko.sync.repositories.android.FennecControlHelper.isColumnMigrated(FennecControlHelper.java:71)
I TestRunner(18687)           	at org.mozilla.gecko.sync.repositories.android.FennecControlHelper.isHistoryMigrated(FennecControlHelper.java:82)
I TestRunner(18687)           	at org.mozilla.gecko.sync.repositories.android.test.TestFennecControlHelper.test(TestFennecControlHelper.java:13)
I TestRunner(18687)           	at java.lang.reflect.Method.invokeNative(Native Method)
I TestRunner(18687)           	at java.lang.reflect.Method.invoke(Method.java:511)
I TestRunner(18687)           	at android.test.InstrumentationTestCase.runMethod(InstrumentationTestCase.java:214)
I TestRunner(18687)           	at android.test.InstrumentationTestCase.runTest(InstrumentationTestCase.java:199)
I TestRunner(18687)           	at android.test.ActivityInstrumentationTestCase2.runTest(ActivityInstrumentationTestCase2.java:186)
I TestRunner(18687)           	at junit.framework.TestCase.runBare(TestCase.java:127)
I TestRunner(18687)           	at junit.framework.TestResult$1.protect(TestResult.java:106)
I TestRunner(18687)           	at junit.framework.TestResult.runProtected(TestResult.java:124)
I TestRunner(18687)           	at junit.framework.TestResult.run(TestResult.java:109)
I TestRunner(18687)           	at junit.framework.TestCase.run(TestCase.java:118)
I TestRunner(18687)           	at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169)
I TestRunner(18687)           	at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154)
I TestRunner(18687)           	at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:537)
I TestRunner(18687)           	at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1551)
I TestRunner(18687)           ----- end exception -----
I TestRunner(18687)           finished: test(org.mozilla.gecko.sync.repositories.android.test.TestFennecControlHelper)
Depends on: 744644
Depends on: 744668
Wasn't sure if Bug 744644 was the same issue as in Comment 4, so in the spirit of "can always dupe" I filed Bug 744668.
https://hg.mozilla.org/integration/mozilla-inbound/rev/5f540a59b906

QA: in order to verify this you'll need a large XUL Fennec profile.

Upgrade to Native Fennec, set up Sync via the Android Settings window without launching Fennec.

Wait for a sync to occur after pairing.

Verify that you DO NOT see a log item like:

  Caught exception checking if Fennec has migrated column …

but you DO see:

  Not enabling history engine since Fennec history is not migrated.

You might see a similar message for bookmarks.

Launch Fennec. Repeat some reasonable number of syncs. Note that eventually Sync will sync your history, and the "Not enabling…" message will not appear.
Status: NEW → ASSIGNED
Flags: in-litmus?
Whiteboard: [qa+]
Target Milestone: --- → mozilla14
https://hg.mozilla.org/mozilla-central/rev/5f540a59b906
Status: ASSIGNED → RESOLVED
Closed: 12 years ago
Resolution: --- → FIXED
Flags: in-litmus? → in-litmus?(nhirata.bugzilla)
Attached file migration logcat
I'd like someone to take a look at this log to see if anything is fishy, before i launch fennec nightly.

In the midst of trying to verify this bug, i've done the following so far:
1) installed nightly xul fennec from: http://ftp.mozilla.org/pub/mozilla.org/mobile/nightly/latest-mozilla-central-android-xul/
2) launched xul fennec, and built up a large profile (using desktop sync to populate it)
3) shut down xul nightly, and then adb installed Native nightly fennec from: http://ftp.mozilla.org/pub/mozilla.org/mobile/nightly/latest-mozilla-central-android/
4) without launching fennec, went to Accounts and setup Android Firefox Sync to a large desktop profile
5) Watching logs, and here's the first one attached.
6) Still have NOT launched fennec native process yet.

Let me know if there's anything in the log at this point that needs investigation before i launch native fennec.   Things that stand out to me so far are:

04-18 18:39:11.353: WARN/RecordUploadRunnable(28443): Got request error: javax.net.ssl.SSLException: Write error: ssl=0x3da318: I/O error during system call, Broken pipe
04-18 18:39:11.353: WARN/RecordUploadRunnable(28443): javax.net.ssl.SSLException: Write error: ssl=0x3da318: I/O error during system call, Broken pipe
04-18 18:39:11.353: WARN/RecordUploadRunnable(28443):     at org.apache.harmony.xnet.provider.jsse.NativeCrypto.SSL_write(Native Method)
04-18 18:39:11.353: WARN/RecordUploadRunnable(28443):     at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl$SSLOutputStream.write(OpenSSLSocketImpl.java:839)
04-18 18:39:11.353: WARN/RecordUploadRunnable(28443):     at ch.boye.httpclientandroidlib.impl.io.AbstractSessionOutputBuffer.write(AbstractSessionOutputBuffer.java:153)
04-18 18:39:11.353: WARN/RecordUploadRunnable(28443):     at ch.boye.httpclientandroidlib.impl.io.ContentLengthOutputStream.write(ContentLengthOutputStream.java:114)
04-18 18:39:11.353: WARN/RecordUploadRunnable(28443):     at ch.boye.httpclientandroidlib.impl.io.ContentLengthOutputStream.write(ContentLengthOutputStream.java:120)
04-18 18:39:11.353: WARN/RecordUploadRunnable(28443):     at org.mozilla.gecko.sync.repositories.Server11RepositorySession$RecordUploadRunnable$ByteArraysContentProducer.writeTo(Server11RepositorySession.java:475)
04-18 18:39:11.353: WARN/RecordUploadRunnable(28443):     at ch.boye.httpclientandroidlib.entity.EntityTemplate.writeTo(EntityTemplate.java:68)
04-18 18:39:11.353: WARN/RecordUploadRunnable(28443):     at ch.boye.httpclientandroidlib.entity.HttpEntityWrapper.writeTo(HttpEntityWrapper.java:96)
04-18 18:39:11.353: WARN/RecordUploadRunnable(28443):     at ch.boye.httpclientandroidlib.impl.client.EntityEnclosingRequestWrapper$EntityWrapper.writeTo(EntityEnclosingRequestWrapper.java:108)
04-18 18:39:11.353: WARN/RecordUploadRunnable(28443):     at ch.boye.httpclientandroidlib.impl.entity.EntitySerializer.serialize(EntitySerializer.java:120)
04-18 18:39:11.353: WARN/RecordUploadRunnable(28443):     at ch.boye.httpclientandroidlib.impl.AbstractHttpClientConnection.sendRequestEntity(AbstractHttpClientConnection.java:263)
04-18 18:39:11.353: WARN/RecordUploadRunnable(28443):     at ch.boye.httpclientandroidlib.impl.conn.AbstractClientConnAdapter.sendRequestEntity(AbstractClientConnAdapter.java:227)
04-18 18:39:11.353: WARN/RecordUploadRunnable(28443):     at ch.boye.httpclientandroidlib.protocol.HttpRequestExecutor.doSendRequest(HttpRequestExecutor.java:255)
04-18 18:39:11.353: WARN/RecordUploadRunnable(28443):     at ch.boye.httpclientandroidlib.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:123)
04-18 18:39:11.353: WARN/RecordUploadRunnable(28443):     at ch.boye.httpclientandroidlib.impl.client.DefaultRequestDirector.tryExecute(DefaultRequestDirector.java:645)
04-18 18:39:11.353: WARN/RecordUploadRunnable(28443):     at ch.boye.httpclientandroidlib.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:464)
04-18 18:39:11.353: WARN/RecordUploadRunnable(28443):     at ch.boye.httpclientandroidlib.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:818)
04-18 18:39:11.353: WARN/RecordUploadRunnable(28443):     at ch.boye.httpclientandroidlib.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:752)
04-18 18:39:11.353: WARN/RecordUploadRunnable(28443):     at org.mozilla.gecko.sync.net.BaseResource.execute(BaseResource.java:247)
04-18 18:39:11.353: WARN/RecordUploadRunnable(28443):     at org.mozilla.gecko.sync.net.BaseResource.go(BaseResource.java:275)
04-18 18:39:11.353: WARN/RecordUploadRunnable(28443):     at org.mozilla.gecko.sync.net.BaseResource.post(BaseResource.java:295)
04-18 18:39:11.353: WARN/RecordUploadRunnable(28443):     at org.mozilla.gecko.sync.net.SyncStorageRequest.post(SyncStorageRequest.java:170)
04-18 18:39:11.353: WARN/RecordUploadRunnable(28443):     at org.mozilla.gecko.sync.repositories.Server11RepositorySession$RecordUploadRunnable.run(Server11RepositorySession.java:523)
04-18 18:39:11.353: WARN/RecordUploadRunnable(28443):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
04-18 18:39:11.353: WARN/RecordUploadRunnable(28443):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
04-18 18:39:11.353: WARN/RecordUploadRunnable(28443):     at java.lang.Thread.run(Thread.java:1027)
04-18 18:39:11.363: WARN/SynchronizerSession(28443): Second RecordsChannel onFlowStoreFailed. Ignoring store error.
04-18 18:39:11.363: WARN/SynchronizerSession(28443): javax.net.ssl.SSLException: Write error: ssl=0x3da318: I/O error during system call, Broken pipe
04-18 18:39:11.363: WARN/SynchronizerSession(28443):     at org.apache.harmony.xnet.provider.jsse.NativeCrypto.SSL_write(Native Method)
04-18 18:39:11.363: WARN/SynchronizerSession(28443):     at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl$SSLOutputStream.write(OpenSSLSocketImpl.java:839)
04-18 18:39:11.363: WARN/SynchronizerSession(28443):     at ch.boye.httpclientandroidlib.impl.io.AbstractSessionOutputBuffer.write(AbstractSessionOutputBuffer.java:153)
04-18 18:39:11.363: WARN/SynchronizerSession(28443):     at ch.boye.httpclientandroidlib.impl.io.ContentLengthOutputStream.write(ContentLengthOutputStream.java:114)
04-18 18:39:11.363: WARN/SynchronizerSession(28443):     at ch.boye.httpclientandroidlib.impl.io.ContentLengthOutputStream.write(ContentLengthOutputStream.java:120)
04-18 18:39:11.363: WARN/SynchronizerSession(28443):     at org.mozilla.gecko.sync.repositories.Server11RepositorySession$RecordUploadRunnable$ByteArraysContentProducer.writeTo(Server11RepositorySession.java:475)
04-18 18:39:11.363: WARN/SynchronizerSession(28443):     at ch.boye.httpclientandroidlib.entity.EntityTemplate.writeTo(EntityTemplate.java:68)
04-18 18:39:11.363: WARN/SynchronizerSession(28443):     at ch.boye.httpclientandroidlib.entity.HttpEntityWrapper.writeTo(HttpEntityWrapper.java:96)
04-18 18:39:11.363: WARN/SynchronizerSession(28443):     at ch.boye.httpclientandroidlib.impl.client.EntityEnclosingRequestWrapper$EntityWrapper.writeTo(EntityEnclosingRequestWrapper.java:108)
04-18 18:39:11.363: WARN/SynchronizerSession(28443):     at ch.boye.httpclientandroidlib.impl.entity.EntitySerializer.serialize(EntitySerializer.java:120)
04-18 18:39:11.363: WARN/SynchronizerSession(28443):     at ch.boye.httpclientandroidlib.impl.AbstractHttpClientConnection.sendRequestEntity(AbstractHttpClientConnection.java:263)
04-18 18:39:11.363: WARN/SynchronizerSession(28443):     at ch.boye.httpclientandroidlib.impl.conn.AbstractClientConnAdapter.sendRequestEntity(AbstractClientConnAdapter.java:227)
04-18 18:39:11.363: WARN/SynchronizerSession(28443):     at ch.boye.httpclientandroidlib.protocol.HttpRequestExecutor.doSendRequest(HttpRequestExecutor.java:255)
04-18 18:39:11.363: WARN/SynchronizerSession(28443):     at ch.boye.httpclientandroidlib.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:123)
04-18 18:39:11.363: WARN/SynchronizerSession(28443):     at ch.boye.httpclientandroidlib.impl.client.DefaultRequestDirector.tryExecute(DefaultRequestDirector.java:645)
04-18 18:39:11.363: WARN/SynchronizerSession(28443):     at ch.boye.httpclientandroidlib.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:464)
04-18 18:39:11.363: WARN/SynchronizerSession(28443):     at ch.boye.httpclientandroidlib.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:818)
04-18 18:39:11.363: WARN/SynchronizerSession(28443):     at ch.boye.httpclientandroidlib.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:752)
04-18 18:39:11.363: WARN/SynchronizerSession(28443):     at org.mozilla.gecko.sync.net.BaseResource.execute(BaseResource.java:247)
04-18 18:39:11.363: WARN/SynchronizerSession(28443):     at org.mozilla.gecko.sync.net.BaseResource.go(BaseResource.java:275)
04-18 18:39:11.363: WARN/SynchronizerSession(28443):     at org.mozilla.gecko.sync.net.BaseResource.post(BaseResource.java:295)
04-18 18:39:11.363: WARN/SynchronizerSession(28443):     at org.mozilla.gecko.sync.net.SyncStorageRequest.post(SyncStorageRequest.java:170)
04-18 18:39:11.363: WARN/SynchronizerSession(28443):     at org.mozilla.gecko.sync.repositories.Server11RepositorySession$RecordUploadRunnable.run(Server11RepositorySession.java:523)
04-18 18:39:11.363: WARN/SynchronizerSession(28443):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
04-18 18:39:11.363: WARN/SynchronizerSession(28443):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
04-18 18:39:11.363: WARN/SynchronizerSession(28443):     at java.lang.Thread.run(Thread.java:1027)
(In reply to Tony Chung [:tchung] from comment #8)

> Let me know if there's anything in the log at this point that needs
> investigation before i launch native fennec.   Things that stand out to me
> so far are:

You're on Mozilla wifi, and one of your uploads got dropped. That's the stack trace you see.

This log looks fine if migration of bookmarks took ten milliseconds and produced no errors or log output. But I see no evidence in this log that suggests a lot of history being uploaded (0), and the same for bookmarks (1 record, I think), so I'd be inclined to believe that migration isn't running, or isn't being poked.

Were you syncing to the same desktop profile that you used with XUL Fennec?

Please run

  adb shell

and inside that

  setprop log.tag.GeckoBrowserProvider VERBOSE
  setprop log.tag.FennecControlHelper VERBOSE
  kill 28443

then try forcing a sync again?
(In reply to Richard Newman [:rnewman] from comment #9)
> (In reply to Tony Chung [:tchung] from comment #8)
> 
> You're on Mozilla wifi, and one of your uploads got dropped. That's the
> stack trace you see.
> 
> This log looks fine if migration of bookmarks took ten milliseconds and
> produced no errors or log output. But I see no evidence in this log that
> suggests a lot of history being uploaded (0), and the same for bookmarks (1
> record, I think), so I'd be inclined to believe that migration isn't
> running, or isn't being poked.
> 
> Were you syncing to the same desktop profile that you used with XUL Fennec?
> 
> Please run
> 
>   adb shell
> 
> and inside that
> 
>   setprop log.tag.GeckoBrowserProvider VERBOSE
>   setprop log.tag.FennecControlHelper VERBOSE
>   kill 28443
> 
> then try forcing a sync again?

thanks for looking.  yeah, i was using the same profile (and made one bookmark edit) , so i will create 2 different large ones and try again.   good to confirm thats working so far.
Attached file migration logcat 2
Okay, i reran the test, this time making sure i'm syncing a different large profile.  This log captures a few errors, all before launching native fennec.  Richard, can you analyze this?

Notable logs:
04-19 09:06:19.736: DEBUG/PicasaAPI(14288): getAlbumPhotos for ********************* / *******************, etag: W/"C0UEQXo4fSp7ImA9WhVXGEw."
04-19 09:06:19.814: WARN/GeckoBrowserProvider(7918): SQLite Exception during applyBatch: 
04-19 09:06:19.814: WARN/GeckoBrowserProvider(7918): android.database.sqlite.SQLiteConstraintException: error code 19: constraint failed


04-19 09:06:27.517: ERROR/BrowserRepoSession(7918): No parent for record MZoyr8aQCjwq
04-19 09:06:27.517: WARN/BrowserRepoSession(7918): Bookmark record MZoyr8aQCjwq has a bad parent pointer. Reparenting now.
04-19 09:06:27.517: ERROR/BrowserRepoSession(7918): Store failed for menu
04-19 09:06:27.517: ERROR/BrowserRepoSession(7918): java.lang.NullPointerException
04-19 09:06:27.517: ERROR/BrowserRepoSession(7918):     at org.mozilla.gecko.sync.repositories.android.AndroidBrowserBookmarksRepositorySession.retrieveRecord(AndroidBrowserBookmarksRepositorySession.java:437)
04-19 09:06:27.517: ERROR/BrowserRepoSession(7918):     at org.mozilla.gecko.sync.repositories.android.AndroidBrowserBookmarksRepositorySession.retrieveDuringStore(AndroidBrowserBookmarksRepositorySession.java:374)
(In reply to Tony Chung [:tchung] from comment #11)
> Created attachment 616605 [details]
> migration logcat 2
> 
> Okay, i reran the test, this time making sure i'm syncing a different large
> profile.  This log captures a few errors, all before launching native
> fennec.  Richard, can you analyze this?

Well, this means that migration happened :D

This log with 

  setprop log.tag.BrowserRepoSession VERBOSE

and killing Fennec in Android Settings > Apps would be great.
Just to be clear are the STRs the following?:

1) installed nightly xul fennec from: http://ftp.mozilla.org/pub/mozilla.org/mobile/nightly/latest-mozilla-central-android-xul/
2) launched xul fennec, and built up a large profile (using desktop sync to populate it)
3) shut down xul nightly, and then adb installed Native nightly fennec from: http://ftp.mozilla.org/pub/mozilla.org/mobile/nightly/latest-mozilla-central-android/
4) without launching fennec, went to Accounts and setup Android Firefox Sync to a large desktop profile
5) adb shell
6) setprop log.tag.GeckoBrowserProvider VERBOSE
7) setprop log.tag.FennecControlHelper VERBOSE
8) setprop log.tag.BrowserRepoSession VERBOSE
9) Watching logs, and here's the first one attached.
10) Still have NOT launched fennec native process yet.
(In reply to Naoki Hirata :nhirata from comment #13)
> Just to be clear are the STRs the following?:

Perform step 4 after step 8.
Product: Mozilla Services → Android Background Services
Product: Android Background Services → Firefox for Android
Product: Firefox for Android → Firefox for Android Graveyard
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Created:
Updated:
Size: