/usr/include/thunderbird/mozilla/layers/APZTestData.h is in thunderbird-dev 1:52.8.0-1~deb8u1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 | /* -*- 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_layers_APZTestData_h
#define mozilla_layers_APZTestData_h
#include <map>
#include "FrameMetrics.h"
#include "nsDebug.h" // for NS_WARNING
#include "mozilla/Assertions.h" // for MOZ_ASSERT
#include "mozilla/DebugOnly.h" // for DebugOnly
#include "mozilla/ToString.h" // for ToString
#include "ipc/IPCMessageUtils.h"
#include "js/TypeDecls.h"
namespace mozilla {
namespace layers {
typedef uint32_t SequenceNumber;
/**
* This structure is used to store information logged by various gecko
* components for later examination by test code.
* It consists of a bucket for every paint (initiated on the client side),
* and every repaint request (initiated on the compositor side by
* AsyncPanZoomController::RequestContentRepait), which are identified by
* sequence numbers, and within that, a set of arbitrary string key/value
* pairs for every scrollable frame, identified by a scroll id.
* There are two instances of this data structure for every content thread:
* one on the client side and one of the compositor side.
*/
// TODO(botond):
// - Improve warnings/asserts.
// - Add ability to associate a repaint request triggered during a layers update
// with the sequence number of the paint that caused the layers update.
class APZTestData {
typedef FrameMetrics::ViewID ViewID;
friend struct IPC::ParamTraits<APZTestData>;
friend struct APZTestDataToJSConverter;
public:
void StartNewPaint(SequenceNumber aSequenceNumber) {
// We should never get more than one paint with the same sequence number.
MOZ_ASSERT(mPaints.find(aSequenceNumber) == mPaints.end());
mPaints.insert(DataStore::value_type(aSequenceNumber, Bucket()));
}
void LogTestDataForPaint(SequenceNumber aSequenceNumber,
ViewID aScrollId,
const std::string& aKey,
const std::string& aValue) {
LogTestDataImpl(mPaints, aSequenceNumber, aScrollId, aKey, aValue);
}
void StartNewRepaintRequest(SequenceNumber aSequenceNumber) {
typedef std::pair<DataStore::iterator, bool> InsertResultT;
DebugOnly<InsertResultT> insertResult = mRepaintRequests.insert(DataStore::value_type(aSequenceNumber, Bucket()));
MOZ_ASSERT(((InsertResultT&)insertResult).second, "Already have a repaint request with this sequence number");
}
void LogTestDataForRepaintRequest(SequenceNumber aSequenceNumber,
ViewID aScrollId,
const std::string& aKey,
const std::string& aValue) {
LogTestDataImpl(mRepaintRequests, aSequenceNumber, aScrollId, aKey, aValue);
}
// Convert this object to a JS representation.
bool ToJS(JS::MutableHandleValue aOutValue, JSContext* aContext) const;
// Use dummy derived structures wrapping the tyepdefs to work around a type
// name length limit in MSVC.
typedef std::map<std::string, std::string> ScrollFrameDataBase;
struct ScrollFrameData : ScrollFrameDataBase {};
typedef std::map<ViewID, ScrollFrameData> BucketBase;
struct Bucket : BucketBase {};
typedef std::map<SequenceNumber, Bucket> DataStoreBase;
struct DataStore : DataStoreBase {};
private:
DataStore mPaints;
DataStore mRepaintRequests;
void LogTestDataImpl(DataStore& aDataStore,
SequenceNumber aSequenceNumber,
ViewID aScrollId,
const std::string& aKey,
const std::string& aValue) {
auto bucketIterator = aDataStore.find(aSequenceNumber);
if (bucketIterator == aDataStore.end()) {
MOZ_ASSERT(false, "LogTestDataImpl called with nonexistent sequence number");
return;
}
Bucket& bucket = bucketIterator->second;
ScrollFrameData& scrollFrameData = bucket[aScrollId]; // create if doesn't exist
MOZ_ASSERT(scrollFrameData.find(aKey) == scrollFrameData.end()
|| scrollFrameData[aKey] == aValue);
scrollFrameData.insert(ScrollFrameData::value_type(aKey, aValue));
}
};
// A helper class for logging data for a paint.
class APZPaintLogHelper {
public:
APZPaintLogHelper(APZTestData* aTestData, SequenceNumber aPaintSequenceNumber)
: mTestData(aTestData),
mPaintSequenceNumber(aPaintSequenceNumber)
{}
template <typename Value>
void LogTestData(FrameMetrics::ViewID aScrollId,
const std::string& aKey,
const Value& aValue) const {
if (mTestData) { // avoid stringifying if mTestData == nullptr
LogTestData(aScrollId, aKey, ToString(aValue));
}
}
void LogTestData(FrameMetrics::ViewID aScrollId,
const std::string& aKey,
const std::string& aValue) const {
if (mTestData) {
mTestData->LogTestDataForPaint(mPaintSequenceNumber, aScrollId, aKey, aValue);
}
}
private:
APZTestData* mTestData;
SequenceNumber mPaintSequenceNumber;
};
} // namespace layers
} // namespace mozilla
namespace IPC {
template <>
struct ParamTraits<mozilla::layers::APZTestData>
{
typedef mozilla::layers::APZTestData paramType;
static void Write(Message* aMsg, const paramType& aParam)
{
WriteParam(aMsg, aParam.mPaints);
WriteParam(aMsg, aParam.mRepaintRequests);
}
static bool Read(const Message* aMsg, PickleIterator* aIter, paramType* aResult)
{
return (ReadParam(aMsg, aIter, &aResult->mPaints) &&
ReadParam(aMsg, aIter, &aResult->mRepaintRequests));
}
};
template <>
struct ParamTraits<mozilla::layers::APZTestData::ScrollFrameData>
: ParamTraits<mozilla::layers::APZTestData::ScrollFrameDataBase> {};
template <>
struct ParamTraits<mozilla::layers::APZTestData::Bucket>
: ParamTraits<mozilla::layers::APZTestData::BucketBase> {};
template <>
struct ParamTraits<mozilla::layers::APZTestData::DataStore>
: ParamTraits<mozilla::layers::APZTestData::DataStoreBase> {};
} // namespace IPC
#endif /* mozilla_layers_APZTestData_h */
|