dom/xbl/nsXBLProtoImplMember.h
author Timothy Nikkel <tnikkel@gmail.com>
Mon, 22 Aug 2016 21:15:38 -0500
changeset 310763 54933b5b96f1673a94a6463baf2c9cc643973e2d
parent 242171 bd079aadd3feeee3f9b9f73c5e0bc4bd6a870722
child 385068 67a8e12324569dd730347187e2ffccae486c758b
permissions -rw-r--r--
Bug 1260324. Don't draw garbage to the screen if an image doesn't happen to be decoded. r=seth Layout has been using imgIContainer::IsOpaque to determine if the image will draw opaquely to all pixels it covers, and doing culling based on this. However imgIContainer::IsOpaque doesn't guarantee anything. It only describes if the image, when in a decoded state, has all opaque pixels. So if the image doesn't have fully decoded frames around (because they got discarded) it may not draw opaquely to all of its pixels. So we create a new function that first checks if there is a fully decoded frame.

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* 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/. */

#ifndef nsXBLProtoImplMember_h__
#define nsXBLProtoImplMember_h__

#include "nsIAtom.h"
#include "nsString.h"
#include "nsString.h"
#include "nsIServiceManager.h"
#include "nsContentUtils.h" // For NS_CONTENT_DELETE_LIST_MEMBER.
#include "nsCycleCollectionParticipant.h"

class nsIObjectOutputStream;

struct nsXBLTextWithLineNumber
{
  char16_t* mText;
  uint32_t mLineNumber;

  nsXBLTextWithLineNumber() :
    mText(nullptr),
    mLineNumber(0)
  {
    MOZ_COUNT_CTOR(nsXBLTextWithLineNumber);
  }

  ~nsXBLTextWithLineNumber() {
    MOZ_COUNT_DTOR(nsXBLTextWithLineNumber);
    if (mText) {
      free(mText);
    }
  }

  void AppendText(const nsAString& aText) {
    if (mText) {
      char16_t* temp = mText;
      mText = ToNewUnicode(nsDependentString(temp) + aText);
      free(temp);
    } else {
      mText = ToNewUnicode(aText);
    }
  }

  char16_t* GetText() {
    return mText;
  }

  void SetLineNumber(uint32_t aLineNumber) {
    mLineNumber = aLineNumber;
  }

  uint32_t GetLineNumber() {
    return mLineNumber;
  }
};

class nsXBLProtoImplMember
{
public:
  explicit nsXBLProtoImplMember(const char16_t* aName)
    : mNext(nullptr)
    , mExposeToUntrustedContent(false)
  {
    mName = ToNewUnicode(nsDependentString(aName));
  }
  virtual ~nsXBLProtoImplMember() {
    free(mName);
    NS_CONTENT_DELETE_LIST_MEMBER(nsXBLProtoImplMember, this, mNext);
  }

  nsXBLProtoImplMember* GetNext() { return mNext; }
  void SetNext(nsXBLProtoImplMember* aNext) { mNext = aNext; }
  bool ShouldExposeToUntrustedContent() { return mExposeToUntrustedContent; }
  void SetExposeToUntrustedContent(bool aExpose) { mExposeToUntrustedContent = aExpose; }
  const char16_t* GetName() { return mName; }

  virtual nsresult InstallMember(JSContext* aCx,
                                 JS::Handle<JSObject*> aTargetClassObject) = 0;
  virtual nsresult CompileMember(mozilla::dom::AutoJSAPI& jsapi, const nsString& aClassStr,
                                 JS::Handle<JSObject*> aClassObject) = 0;

  virtual void Trace(const TraceCallbacks& aCallbacks, void *aClosure) = 0;

  virtual nsresult Write(nsIObjectOutputStream* aStream)
  {
    return NS_OK;
  }

protected:
  nsXBLProtoImplMember* mNext;  // The members of an implementation are chained.
  char16_t* mName;               // The name of the field, method, or property.

  bool mExposeToUntrustedContent; // If this binding is installed on an element
                                  // in an untrusted scope, should this
                                  // implementation member be accessible to the
                                  // content?
};

#endif // nsXBLProtoImplMember_h__