summaryrefslogtreecommitdiffstats
path: root/widget/GfxInfoCollector.h
diff options
context:
space:
mode:
Diffstat (limited to 'widget/GfxInfoCollector.h')
-rw-r--r--widget/GfxInfoCollector.h88
1 files changed, 88 insertions, 0 deletions
diff --git a/widget/GfxInfoCollector.h b/widget/GfxInfoCollector.h
new file mode 100644
index 0000000000..7108a7fe2d
--- /dev/null
+++ b/widget/GfxInfoCollector.h
@@ -0,0 +1,88 @@
+/* vim: se cin sw=2 ts=2 et : */
+/* -*- 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 __mozilla_widget_GfxInfoCollector_h__
+#define __mozilla_widget_GfxInfoCollector_h__
+
+#include "mozilla/Attributes.h"
+#include "nsStringFwd.h"
+#include "js/RootingAPI.h"
+
+namespace mozilla {
+namespace widget {
+
+/* this is handy wrapper around JSAPI to make it more pleasant to use.
+ * We collect the JSAPI errors and so that callers don't need to */
+class MOZ_STACK_CLASS InfoObject {
+ friend class GfxInfoBase;
+
+ public:
+ void DefineProperty(const char* name, int value);
+ void DefineProperty(const char* name, const nsAString& value);
+ void DefineProperty(const char* name, const char* value);
+
+ private:
+ // We need to ensure that this object lives on the stack so that GC sees it
+ // properly
+ explicit InfoObject(JSContext* aCx);
+ InfoObject(InfoObject&);
+
+ JSContext* mCx;
+ JS::Rooted<JSObject*> mObj;
+ bool mOk;
+};
+
+/*
+
+ Here's an example usage:
+
+ class Foo {
+ Foo::Foo() : mInfoCollector(this, &Foo::GetAweseomeness) {}
+
+ void GetAwesomeness(InfoObject &obj) {
+ obj.DefineProperty("awesome", mAwesome);
+ }
+
+ int mAwesome;
+
+ GfxInfoCollector<Foo> mInfoCollector;
+ }
+
+ This will define a property on the object
+ returned from calling getInfo() on a
+ GfxInfo object. e.g.
+
+ gfxInfo = Cc["@mozilla.org/gfx/info;1"].getService(Ci.nsIGfxInfo);
+ info = gfxInfo.getInfo();
+ if (info.awesome)
+ alert(info.awesome);
+
+*/
+
+class GfxInfoCollectorBase {
+ public:
+ GfxInfoCollectorBase();
+ virtual void GetInfo(InfoObject& obj) = 0;
+ virtual ~GfxInfoCollectorBase();
+};
+
+template <class T>
+class GfxInfoCollector : public GfxInfoCollectorBase {
+ public:
+ GfxInfoCollector(T* aPointer, void (T::*aFunc)(InfoObject& obj))
+ : mPointer(aPointer), mFunc(aFunc) {}
+ virtual void GetInfo(InfoObject& obj) override { (mPointer->*mFunc)(obj); }
+
+ protected:
+ T* mPointer;
+ void (T::*mFunc)(InfoObject& obj);
+};
+
+} // namespace widget
+} // namespace mozilla
+
+#endif