summaryrefslogtreecommitdiffstats
path: root/dom/ipc/TabMessageUtils.h
blob: 6eca1dec1f022a57b4b13f9fc6f9f078490743bd (plain)
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
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* 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 TABMESSAGE_UTILS_H
#define TABMESSAGE_UTILS_H

#include "ipc/EnumSerializer.h"
#include "mozilla/RefPtr.h"
#include "mozilla/dom/Event.h"
#include "nsIRemoteTab.h"
#include "nsPIDOMWindow.h"
#include "nsCOMPtr.h"
#include "mozilla/dom/EffectsInfo.h"
#include "mozilla/layers/LayersMessageUtils.h"
#include "TabMessageTypes.h"
#include "X11UndefineNone.h"

namespace mozilla::dom {

bool ReadRemoteEvent(const IPC::Message* aMsg, PickleIterator* aIter,
                     mozilla::dom::RemoteDOMEvent* aResult);

}  // namespace mozilla::dom

namespace IPC {

template <>
struct ParamTraits<mozilla::dom::RemoteDOMEvent> {
  typedef mozilla::dom::RemoteDOMEvent paramType;

  static void Write(Message* aMsg, const paramType& aParam) {
    aParam.mEvent->Serialize(aMsg, true);
  }

  static bool Read(const Message* aMsg, PickleIterator* aIter,
                   paramType* aResult) {
    return mozilla::dom::ReadRemoteEvent(aMsg, aIter, aResult);
  }

  static void Log(const paramType& aParam, std::wstring* aLog) {}
};

template <>
struct ParamTraits<nsSizeMode>
    : public ContiguousEnumSerializer<nsSizeMode, nsSizeMode_Normal,
                                      nsSizeMode_Invalid> {};

template <>
struct ParamTraits<UIStateChangeType>
    : public ContiguousEnumSerializer<UIStateChangeType,
                                      UIStateChangeType_NoChange,
                                      UIStateChangeType_Invalid> {};

template <>
struct ParamTraits<nsIRemoteTab::NavigationType>
    : public ContiguousEnumSerializerInclusive<
          nsIRemoteTab::NavigationType,
          nsIRemoteTab::NavigationType::NAVIGATE_BACK,
          nsIRemoteTab::NavigationType::NAVIGATE_URL> {};

template <>
struct ParamTraits<mozilla::dom::EffectsInfo> {
  typedef mozilla::dom::EffectsInfo paramType;

  static void Write(Message* aMsg, const paramType& aParam) {
    WriteParam(aMsg, aParam.mVisibleRect);
    WriteParam(aMsg, aParam.mScaleX);
    WriteParam(aMsg, aParam.mScaleY);
  }

  static bool Read(const Message* aMsg, PickleIterator* aIter,
                   paramType* aResult) {
    return ReadParam(aMsg, aIter, &aResult->mVisibleRect) &&
           ReadParam(aMsg, aIter, &aResult->mScaleX) &&
           ReadParam(aMsg, aIter, &aResult->mScaleY);
  }
};

template <>
struct ParamTraits<mozilla::WhenToScroll>
    : public ContiguousEnumSerializerInclusive<
          mozilla::WhenToScroll, mozilla::WhenToScroll::Always,
          mozilla::WhenToScroll::IfNotFullyVisible> {};

template <>
struct ParamTraits<mozilla::ScrollFlags>
    : public BitFlagsEnumSerializer<mozilla::ScrollFlags,
                                    mozilla::ScrollFlags::ALL_BITS> {};

template <>
struct ParamTraits<mozilla::ScrollAxis> {
  typedef mozilla::ScrollAxis paramType;

  static void Write(Message* aMsg, const paramType& aParam) {
    WriteParam(aMsg, aParam.mWhereToScroll);
    WriteParam(aMsg, aParam.mWhenToScroll);
    WriteParam(aMsg, aParam.mOnlyIfPerceivedScrollableDirection);
  }

  static bool Read(const Message* aMsg, PickleIterator* aIter,
                   paramType* aResult) {
    if (!ReadParam(aMsg, aIter, &aResult->mWhereToScroll)) {
      return false;
    }
    if (!ReadParam(aMsg, aIter, &aResult->mWhenToScroll)) {
      return false;
    }

    // We can't set mOnlyIfPerceivedScrollableDirection directly since it's
    // a bitfield.
    bool value;
    if (!ReadParam(aMsg, aIter, &value)) {
      return false;
    }
    aResult->mOnlyIfPerceivedScrollableDirection = value;

    return true;
  }
};

template <>
struct ParamTraits<mozilla::dom::EmbedderElementEventType>
    : public ContiguousEnumSerializer<
          mozilla::dom::EmbedderElementEventType,
          mozilla::dom::EmbedderElementEventType::NoEvent,
          mozilla::dom::EmbedderElementEventType::EndGuard_> {};

}  // namespace IPC

#endif  // TABMESSAGE_UTILS_H