widget/nsScreenManagerProxy.h
author Mike Hommey <mh+mozilla@glandium.org>
Tue, 07 Jun 2016 13:49:14 +0900
changeset 301919 08093ab05dd463215a7ab14c73fa0905a7ef3ff9
parent 268184 e8c7dfe727cd970e2c3294934e2927b14143c205
child 349750 57f989c1010f40a2b99ee89d61bd1621c633ab4a
permissions -rw-r--r--
Bug 1278415 - Also write a mozinfo for js standalone builds. r=gps Historically, a mozinfo for js standalone build has not been necessary, but with the move towards a) having things work with mach and b) buildconfig using the MozbuildObject.from_environment in next patch, mozinfo becomes necessary (it's required for MozbuildObject.from_environment to find the directory is an objdir). Interestingly, hazard builds do both a js standalone build and a desktop Firefox build at the same time, both of which are done with MOZCONFIG set in the environment... with the Firefox mozconfig. The result of now writing a mozinfo for js standalone builds is that in that case, they end up with a reference to the mozconfig, which the build system then reads, and finds a MOZ_OBJDIR, which then doesn't match the js standalone build objdir. So for those builds, reset MOZCONFIG.

/* -*- 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/. */

#ifndef nsScreenManagerProxy_h
#define nsScreenManagerProxy_h

#include "nsIScreenManager.h"
#include "mozilla/dom/PScreenManagerChild.h"
#include "mozilla/dom/TabChild.h"
#include "ScreenProxy.h"

/**
 * The nsScreenManagerProxy is used by the content process to get
 * information about system screens. It uses the PScreenManager protocol
 * to communicate with a PScreenManagerParent to get this information,
 * and also caches the information it gets back.
 *
 * We cache both the system screen information that nsIScreenManagers
 * provide, as well as the nsIScreens that callers can query for.
 *
 * Both of these caches are invalidated on the next tick of the event
 * loop.
 */
class nsScreenManagerProxy final : public nsIScreenManager,
                                   public mozilla::dom::PScreenManagerChild
{
public:
  nsScreenManagerProxy();

  NS_DECL_ISUPPORTS
  NS_DECL_NSISCREENMANAGER

private:
  ~nsScreenManagerProxy() {};

  bool EnsureCacheIsValid();
  void InvalidateCacheOnNextTick();
  void InvalidateCache();

  uint32_t mNumberOfScreens;
  float mSystemDefaultScale;
  bool mCacheValid;
  bool mCacheWillInvalidate;

  RefPtr<mozilla::widget::ScreenProxy> mPrimaryScreen;

  // nsScreenManagerProxy caches the results to repeated calls to
  // ScreenForNativeWidget, which can be triggered indirectly by
  // web content using the DOM Screen API. This allows us to bypass
  // a lot of IPC traffic.
  //
  // The cache stores ScreenProxy's mapped to the TabChild that
  // asked for the ScreenForNativeWidget was called with via
  // ScreenCacheEntry's. The cache is cleared on the next tick of
  // the event loop.
  struct ScreenCacheEntry
  {
    RefPtr<mozilla::widget::ScreenProxy> mScreenProxy;
    RefPtr<mozilla::dom::TabChild> mTabChild;
  };

  nsTArray<ScreenCacheEntry> mScreenCache;
};

#endif // nsScreenManagerProxy_h