summaryrefslogtreecommitdiff
path: root/widget/nsScreenManagerProxy.h
diff options
context:
space:
mode:
Diffstat (limited to 'widget/nsScreenManagerProxy.h')
-rw-r--r--widget/nsScreenManagerProxy.h67
1 files changed, 67 insertions, 0 deletions
diff --git a/widget/nsScreenManagerProxy.h b/widget/nsScreenManagerProxy.h
new file mode 100644
index 0000000000..bcfa387a4c
--- /dev/null
+++ b/widget/nsScreenManagerProxy.h
@@ -0,0 +1,67 @@
+/* -*- 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