Coverage Report

Created: 2018-09-25 14:53

/work/obj-fuzz/dist/include/GfxInfoCollector.h
Line
Count
Source (jump to first uncovered line)
1
/* vim: se cin sw=2 ts=2 et : */
2
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
3
 *
4
 * This Source Code Form is subject to the terms of the Mozilla Public
5
 * License, v. 2.0. If a copy of the MPL was not distributed with this
6
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7
8
#ifndef __mozilla_widget_GfxInfoCollector_h__
9
#define __mozilla_widget_GfxInfoCollector_h__
10
11
#include "mozilla/Attributes.h"
12
#include "nsStringFwd.h"
13
#include "js/RootingAPI.h"
14
15
namespace mozilla {
16
namespace widget {
17
18
19
/* this is handy wrapper around JSAPI to make it more pleasant to use.
20
 * We collect the JSAPI errors and so that callers don't need to */
21
class MOZ_STACK_CLASS InfoObject
22
{
23
  friend class GfxInfoBase;
24
25
  public:
26
  void DefineProperty(const char *name, int value);
27
  void DefineProperty(const char *name, nsAString &value);
28
  void DefineProperty(const char *name, const char *value);
29
30
  private:
31
  // We need to ensure that this object lives on the stack so that GC sees it properly
32
  explicit InfoObject(JSContext *aCx);
33
  InfoObject(InfoObject&);
34
35
  JSContext *mCx;
36
  JS::Rooted<JSObject*> mObj;
37
  bool mOk;
38
};
39
40
/*
41
42
   Here's an example usage:
43
44
   class Foo {
45
   Foo::Foo() : mInfoCollector(this, &Foo::GetAweseomeness) {}
46
47
   void GetAwesomeness(InfoObject &obj) {
48
     obj.DefineProperty("awesome", mAwesome);
49
   }
50
51
   int mAwesome;
52
53
   GfxInfoCollector<Foo> mInfoCollector;
54
   }
55
56
   This will define a property on the object
57
   returned from calling getInfo() on a
58
   GfxInfo object. e.g.
59
60
       gfxInfo = Cc["@mozilla.org/gfx/info;1"].getService(Ci.nsIGfxInfo);
61
       info = gfxInfo.getInfo();
62
       if (info.awesome)
63
          alert(info.awesome);
64
65
*/
66
67
class GfxInfoCollectorBase
68
{
69
  public:
70
  GfxInfoCollectorBase();
71
  virtual void GetInfo(InfoObject &obj) = 0;
72
  virtual ~GfxInfoCollectorBase();
73
};
74
75
template<class T>
76
class GfxInfoCollector : public GfxInfoCollectorBase
77
{
78
  public:
79
0
  GfxInfoCollector(T* aPointer, void (T::*aFunc)(InfoObject &obj)) : mPointer(aPointer), mFunc(aFunc) {
80
0
  }
81
0
  virtual void GetInfo(InfoObject &obj) override {
82
0
    (mPointer->*mFunc)(obj);
83
0
  }
84
85
  protected:
86
  T* mPointer;
87
  void (T::*mFunc)(InfoObject &obj);
88
89
};
90
91
} // namespace widget
92
} // namespace mozilla
93
94
#endif