1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5
6 #include "APZTestData.h"
7 #include "mozilla/dom/APZTestDataBinding.h"
8 #include "mozilla/dom/ToJSValue.h"
9 #include "nsString.h"
10
11 namespace mozilla {
12 namespace layers {
13
14 struct APZTestDataToJSConverter {
15 template <typename Key, typename Value, typename KeyValuePair>
ConvertMapmozilla::layers::APZTestDataToJSConverter16 static void ConvertMap(const std::map<Key, Value>& aFrom,
17 dom::Sequence<KeyValuePair>& aOutTo,
18 void (*aElementConverter)(const Key&, const Value&, KeyValuePair&)) {
19 for (auto it = aFrom.begin(); it != aFrom.end(); ++it) {
20 aOutTo.AppendElement(fallible);
21 aElementConverter(it->first, it->second, aOutTo.LastElement());
22 }
23 }
24
ConvertAPZTestDatamozilla::layers::APZTestDataToJSConverter25 static void ConvertAPZTestData(const APZTestData& aFrom,
26 dom::APZTestData& aOutTo) {
27 ConvertMap(aFrom.mPaints, aOutTo.mPaints.Construct(), ConvertBucket);
28 ConvertMap(aFrom.mRepaintRequests, aOutTo.mRepaintRequests.Construct(), ConvertBucket);
29 }
30
ConvertBucketmozilla::layers::APZTestDataToJSConverter31 static void ConvertBucket(const SequenceNumber& aKey,
32 const APZTestData::Bucket& aValue,
33 dom::APZBucket& aOutKeyValuePair) {
34 aOutKeyValuePair.mSequenceNumber.Construct() = aKey;
35 ConvertMap(aValue, aOutKeyValuePair.mScrollFrames.Construct(), ConvertScrollFrameData);
36 }
37
ConvertScrollFrameDatamozilla::layers::APZTestDataToJSConverter38 static void ConvertScrollFrameData(const APZTestData::ViewID& aKey,
39 const APZTestData::ScrollFrameData& aValue,
40 dom::ScrollFrameData& aOutKeyValuePair) {
41 aOutKeyValuePair.mScrollId.Construct() = aKey;
42 ConvertMap(aValue, aOutKeyValuePair.mEntries.Construct(), ConvertEntry);
43 }
44
ConvertEntrymozilla::layers::APZTestDataToJSConverter45 static void ConvertEntry(const std::string& aKey,
46 const std::string& aValue,
47 dom::ScrollFrameDataEntry& aOutKeyValuePair) {
48 ConvertString(aKey, aOutKeyValuePair.mKey.Construct());
49 ConvertString(aValue, aOutKeyValuePair.mValue.Construct());
50 }
51
ConvertStringmozilla::layers::APZTestDataToJSConverter52 static void ConvertString(const std::string& aFrom, nsString& aOutTo) {
53 aOutTo = NS_ConvertUTF8toUTF16(aFrom.c_str(), aFrom.size());
54 }
55 };
56
57 bool
ToJS(JS::MutableHandleValue aOutValue,JSContext * aContext) const58 APZTestData::ToJS(JS::MutableHandleValue aOutValue, JSContext* aContext) const
59 {
60 dom::APZTestData result;
61 APZTestDataToJSConverter::ConvertAPZTestData(*this, result);
62 return dom::ToJSValue(aContext, result, aOutValue);
63 }
64
65 } // namespace layers
66 } // namespace mozilla
67