layout/build/nsLayoutStatics.h
author Andreas Tolfsen <ato@mozilla.com>
Tue, 19 Jul 2016 18:47:33 +0100
changeset 332834 10c5f2b25f7d0d3014c7b0b526d0a0cbda6f3bc4
parent 181832 cfaa46b8361246d7defd3f8b5d4dc482f844aeb2
permissions -rw-r--r--
Bug 1280300 - Support navigation by fragment. r=automatedtester, a=test-only Adds support for navigating to a fragment on the currenty visible document without waiting for a DOM event that the document has been fully loaded. This addresses https://github.com/mozilla/geckodriver/issues/150. MozReview-Commit-ID: 7uiPT5cjGQE

/* 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 nsLayoutStatics_h__
#define nsLayoutStatics_h__

#include "nscore.h"
#include "MainThreadUtils.h"
#include "nsISupportsImpl.h"
#include "nsDebug.h"

// This isn't really a class, it's a namespace for static methods.
// Documents and other objects can hold a reference to the layout static
// objects so that they last past the xpcom-shutdown notification.

class nsLayoutStatics
{
public:
  // Called by the layout module constructor. This call performs an AddRef()
  // internally.
  static nsresult Initialize();

  static void AddRef()
  {
    NS_ASSERTION(NS_IsMainThread(),
                 "nsLayoutStatics reference counting must be on main thread");

    NS_ASSERTION(sLayoutStaticRefcnt,
                 "nsLayoutStatics already dropped to zero!");

    ++sLayoutStaticRefcnt;
    NS_LOG_ADDREF(&sLayoutStaticRefcnt, sLayoutStaticRefcnt,
                  "nsLayoutStatics", 1);
  }
  static void Release()
  {
    NS_ASSERTION(NS_IsMainThread(),
                 "nsLayoutStatics reference counting must be on main thread");

    --sLayoutStaticRefcnt;
    NS_LOG_RELEASE(&sLayoutStaticRefcnt, sLayoutStaticRefcnt,
                   "nsLayoutStatics");

    if (!sLayoutStaticRefcnt)
      Shutdown();
  }

private:
  // not to be called!
  nsLayoutStatics();

  static void Shutdown();

  static nsrefcnt sLayoutStaticRefcnt;
};

class nsLayoutStaticsRef
{
public:
  nsLayoutStaticsRef()
  {
    nsLayoutStatics::AddRef();
  }
  ~nsLayoutStaticsRef()
  {
    nsLayoutStatics::Release();
  }
};

#endif // nsLayoutStatics_h__