image/imgINotificationObserver.idl
author Kartikaya Gupta <kgupta@mozilla.com>
Wed, 30 May 2018 15:54:50 -0400
changeset 420571 8a1bdb8d8bf5a1c8869bf3f82fd86c56f9f4b72c
parent 242676 ef516c84ef5496c3a8576e85c3e6ecb7b0776104
permissions -rw-r--r--
Bug 1457590 - Strengthen the contract around recycling HitTestingTreeNodes. r=botond This patch makes three related changes: - A non-functional change that factors a IsRecyclable function on HitTestingTreeNode. - A non-functional change that sprinkles proof-of-tree-lock arguments to a few HitTestingTreeNode functions, to ensure at compile-time that they can only be called while holding the tree lock. - A functional change that stops clearing mLayersId in HitTestingTreeNode::Destroy, so that if a node is non-recyclable, and it gets Destroy()'d while other code still has a RefPtr to it, that other code can still read the layers id off in a safe manner. These changes provide a stronger set of checks around node recycling, and allows for a safe mechanism to use a HitTestingTreeNode on the controller thread without having to lock the entire APZ tree. The mechanism is effectively a per-node lock, which will be added in the next patch. MozReview-Commit-ID: DBIjFDZJwhE

/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
 *
 * 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 "nsISupports.idl"

interface imgIRequest;

%{C++
#include "nsRect.h"
%}

[ptr] native nsIntRect(nsIntRect);

[scriptable, builtinclass, uuid(03da5641-a333-454a-a859-036d0bb683b7)]
interface imgINotificationObserver : nsISupports
{
  // GetWidth() and GetHeight() can now be used to retrieve the size of the
  // image.
  const long SIZE_AVAILABLE = 1;

  // A region of the image (indicated by the |aRect| argument to |notify|) has
  // changed, and needs to be redrawn. This is triggered both for incremental
  // rendering as the image gets decoded and for changes due to animation.
  const long FRAME_UPDATE = 2;

  // The first frame of the image is now decoded and ready to draw.
  const long FRAME_COMPLETE = 3;

  // The entire image has been loaded. That doesn't mean that it has been
  // decoded, but it does mean that imgIContainer::Draw is guaranteed to succeed
  // (modulo decode errors, at least) if you specify FLAG_SYNC_DECODE.
  const long LOAD_COMPLETE = 4;

  // The entire image has been decoded.
  const long DECODE_COMPLETE = 5;

  // The decoded version of the image has been discarded. Content should never
  // change as a result of this notification - discarding is an implementation
  // detail. This notification should normally only be observed by tests.
  const long DISCARD = 6;

  // The image was drawn without being locked. This notification is part of the
  // image locking mechanism that prevents visible images from being discarded;
  // generally only image locking code needs to observe it.
  const long UNLOCKED_DRAW = 7;

  // The image is animated.
  const long IS_ANIMATED = 8;

  // The image is transparent.
  const long HAS_TRANSPARENCY = 9;

  [noscript] void notify(in imgIRequest aProxy, in long aType,
                         [const] in nsIntRect aRect);
};