void CancelVibrate(const WindowIdentifier &id) { AssertMainThread(); // Although only active windows may start vibrations, a window may // cancel its own vibration even if it's no longer active. // // After a window is marked as inactive, it sends a CancelVibrate // request. We want this request to cancel a playing vibration // started by that window, so we certainly don't want to reject the // cancellation request because the window is now inactive. // // But it could be the case that, after this window became inactive, // some other window came along and started a vibration. We don't // want this window's cancellation request to cancel that window's // actively-playing vibration! // // To solve this problem, we keep track of the id of the last window // to start a vibration, and only accepts cancellation requests from // the same window. All other cancellation requests are ignored. if (InSandbox() || (gLastIDToVibrate && *gLastIDToVibrate == id.AsArray())) { // Don't forward our ID if we are not in the sandbox, because hal_impl // doesn't need it, and we don't want it to be tempted to read it. The // empty identifier will assert if it's used. PROXY_IF_SANDBOXED(CancelVibrate(InSandbox() ? id : WindowIdentifier())); } }
void CancelVibrate(nsIDOMWindow* window) { CancelVibrate(WindowIdentifier(window)); }