gecko-dev/dom/localstorage/PBackgroundLSObserver.ipdl
Jan Varga be167c5e0b Bug 1286798 - Part 10: Support for storage events; r=asuth,janv
Storage events are fired either directly after getting response from synchronous SetItem call or through observers. When a new onstorage event listener is added, we sycnhronously register an observer in the parent process. There's always only one observer actor per content process.
PBackgroundLSDatabase is now managed by a new PBackgroundLSObject protocol. PBackgroundLSObject is needed to eliminate the need to pass the principal info and document URI everytime a write operation occurs.
Preparation of an observer shares some states with preparation of a datastore, so common stuff now lives in LSRequestBase and preparation of a datastore now implements a nested state machine.

This patch was enhanced by asuth to drop observers only when the last storage listener is removed.
EventListenerRemoved is invoked on any removal, not just the final removal, so we need to make sure it's the final removal before dropping observer.
2018-11-29 21:47:45 +01:00

58 lines
1.8 KiB
Plaintext

/* 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/. */
include protocol PBackground;
include PBackgroundSharedTypes;
namespace mozilla {
namespace dom {
/**
* The observer protocol sends "storage" event notifications for changes to
* LocalStorage that take place in other processes as their Snapshots are
* Checkpointed to the canonical Datastore in the parent process. Same-process
* notifications are generated as mutations happen.
*
* Note that mutations are never generated for redundant mutations. Setting the
* key "foo" to have value "bar" when it already has value "bar" will never
* result in a "storage" event.
*/
async protocol PBackgroundLSObserver
{
manager PBackground;
parent:
/**
* Sent by the LSObserver's destructor when it's going away. Any Observe
* messages received after this is sent will be ignored. Which is fine,
* because there should be nothing around left to hear. In the event a new
* page came into existence, its Observer creation will happen (effectively)
* synchronously.
*/
async DeleteMe();
child:
/**
* Only sent by the parent in response to a deletion request.
*/
async __delete__();
/**
* Sent by the parent process as Snapshots from other processes are
* Checkpointed, applying their mutations. The child actor currently directly
* shunts these to Storage::NotifyChange to generate "storage" events for
* immediate dispatch.
*/
async Observe(PrincipalInfo principalInfo,
uint32_t privateBrowsingId,
nsString documentURI,
nsString key,
nsString oldValue,
nsString newValue);
};
} // namespace dom
} // namespace mozilla