Closed Bug 627772 Opened 14 years ago Closed 14 years ago

AutocompleteCache should read from disk async

Categories

(Firefox for Android Graveyard :: General, defect)

x86
Windows 7
defect
Not set
normal

Tracking

(Not tracked)

RESOLVED FIXED

People

(Reporter: sdwilsh, Assigned: mfinkle)

Details

(Keywords: main-thread-io)

Attachments

(1 file, 1 obsolete file)

In loadCache (https://hg.mozilla.org/mobile-browser/annotate/ad6d810a22bc/components/AutoCompleteCache.js#l196), we should be using async disk I/O to read the data in instead of doing it synchronously.

Fix is fairly straightforward (I say this without knowing how the dependent code uses this, of course):
loadCache: function loadCache() {
  try {
    NetUtil.asyncFetch(this.cacheFile, function(aInputStream, aResultCode) {
      if (Components.isSuccessCode(aResultCode) {
        let cache = Cc["@mozilla.org/dom/json;1"].createInstance(Ci.nsIJSON).
                    decodeFromStream(aInputStream, aInputStream.available());
        ...
Attached patch patch (obsolete) — Splinter Review
Works fine.
Assignee: nobody → mark.finkle
Attachment #505854 - Flags: review?(mbrubeck)
Comment on attachment 505854 [details] [diff] [review]
patch

>+      NetUtil.asyncFetch(this.cacheFile, function(aInputStream, aResultCode) {
>+        if (Components.isSuccessCode(aResultCode)) {
You don't seem to log an error here in case this isn't a success code.
(In reply to comment #2)
> Comment on attachment 505854 [details] [diff] [review]
> patch
> 
> >+      NetUtil.asyncFetch(this.cacheFile, function(aInputStream, aResultCode) {
> >+        if (Components.isSuccessCode(aResultCode)) {
> You don't seem to log an error here in case this isn't a success code.

Added locally. Thanks for pointing out and filing this async issue Shawn.
Comment on attachment 505854 [details] [diff] [review]
patch

>+      NetUtil.asyncFetch(this.cacheFile, function(aInputStream, aResultCode) {
>+        if (Components.isSuccessCode(aResultCode)) {
>+          let cache = Cc["@mozilla.org/dom/json;1"].createInstance(Ci.nsIJSON).
>+                      decodeFromStream(aInputStream, aInputStream.available());
> 
>+          if (cache.version != CACHE_VERSION) {
>+            this.fetch(this.query);
>+            return;
>+          }
>+          this.cache = new cacheResult(cache.result.searchString, cache.result.data);
>+        }
>+      });

Looks like "this" is not set correctly inside the callback.

How do I test to see if this is working?  Can we get a browser-chrome test?
Attachment #505854 - Flags: review?(mbrubeck) → review-
Attached patch patch 2Splinter Review
Updated to use "self" in the closure.

I made a test for this. Just a simple mock JSON cache file is be loaded and we check for the mock values. The problem was getting the timing right. I had to add some notifications, which seem pretty good for general use:
* cache is loaded
* cache is saved
* force a reload of the cache

With these notifs, I was able to make the test and it passes.

Lastly, I changed the delay used to refresh the cache from 10secs to 5secs. 10secs just seems crazy long. We have had bugs where people added a bookmark, then open the awesomebar, but the bookmark is not shown yet. The cache was stale. I don't think 10 -> 5 will cause any adverse side effects.
Attachment #505854 - Attachment is obsolete: true
Attachment #506073 - Flags: review?(mbrubeck)
Attachment #506073 - Flags: review?(mbrubeck) → review+
Keywords: main-thread-io
pushed:
http://hg.mozilla.org/mobile-browser/rev/7af22bb64ec7
Status: NEW → RESOLVED
Closed: 14 years ago
Resolution: --- → FIXED
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Created:
Updated:
Size: