Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

chrome.storage.sync vs chrome.storage.local

I was trying to understand how to use the chrome.storage.api. I have included the following in my manifest.json:

"permissions": [
"activeTab","storage"
],

Than, I opened a new tab with the devtools and switched the <page context> to the one of my chrome-extension. Than I typed:

chrome.storage.sync.set({"foo":"bar"},function(){ console.log("saved ok"); } );

and got:

undefined
saved ok 

Than I tried getting this stored value:

chrome.storage.sync.get("foo",function(data){ console.log(data); } );

but this got me:

undefined
Object {} 

Than I did the same, but instead of sync I used local and this worked as expected:

chrome.storage.local.set({"foo":"bar"},function(){ console.log("saved ok"); } );

..and the retrieval:

chrome.storage.local.get("foo",function(data){ console.log(data); } );

Which got me: Object {foo: "bar"} as it should.

Is this because I am not signed in to my account on chrome? But in that case, isn't chrome.storage.sync designed to fallback into storing the data locally?

EDIT

Strangely, when i type this straight on console it seems to be working, but this code doesn't run from background.js code inside a click listener:

var dataCache = {};

function addStarredPost(post)
{
  var id = getPostId(post);
  var timeStamp = new Date().getTime();
  var user = getUserName();

  dataCache[id] = {"id":id,"post":post,"time":timeStamp,"user":user};
  chrome.storage.sync.set(dataCache,function(){ console.log("Starred!");});
}

After this is ran, chrome.storage.sync.get(null,function(data){ console.log(data); }); returns an empty object as if the data wasn't stored. :/ This code seems to be working perfect with chrome.storage.local instead.

chrome.runtime.lastErros returns undefined

like image 828
user1555863 Avatar asked Mar 25 '14 13:03

user1555863


People also ask

What is Chrome local storage?

Many browser extensions store their data in the browser's so-called Local Storage, which is nothing else than a storage location managed by the web browser. And as the same suggests, all is saved locally on the machine where the browser is installed. Local storage is not in the cloud.

Is Chrome local storage safe?

Local storage is inherently no more secure than using cookies. When that's understood, the object can be used to store data that's insignificant from a security standpoint.

Where is Chrome local storage stored?

Google Chrome records Web storage data in a SQLite file in the user's profile. The subfolder containing this file is " \AppData\Local\Google\Chrome\User Data\Default\Local Storage " on Windows, and " ~/Library/Application Support/Google/Chrome/Default/Local Storage " on macOS.


2 Answers

The max size for chrome local storage is 5,242,880 bytes. To extend the storage you can add on the manifest.json :

"permissions": [
  "unlimitedStorage"
]

The max size for chrome sync storage is:

  • 102,400 bytes total
  • 8,192 bytes per item
  • 512 items max
  • 1,800 write operations per hour
  • 120 operations per minutes

(source)

like image 156
Intuitisoft Avatar answered Sep 22 '22 02:09

Intuitisoft


Whoops!

The problem was I was trying to sync data that exceeded in size. (4096 Bytes per item)

I wasn't getting chrome.runtime.lastError because I was mistakenly putting it inside the get function scope, instead of the set function which was producing the error. Hence, I'm posting this answer so it might help others who share the same confusion.

You should check chrome.runtime.lastError inside each api call, like so:

chrome.storage.local.set(objectToStore, function(data)
{
   if(chrome.runtime.lastError)
   {
       /* error */
       console.log(chrome.runtime.lastError.message);
       return;
   }
  //all good. do your thing..
}

This ran OK with chrome.storage.local because according to the docs you only have this limitation with sync.

printing chrome.runtime.lastError gave me: Object {message: "QUOTA_BYTES_PER_ITEM quota exceeded"}

like image 43
user1555863 Avatar answered Sep 18 '22 02:09

user1555863