Skip to content

Commit 5fb3338

Browse files
committed
Bug 1203802 - Websocket Frame Listener API for devtool Network Inspector - part 4 - IPC, r=michal
1 parent 2cabb2a commit 5fb3338

16 files changed

+548
-49
lines changed

ipc/glue/IPCMessageUtils.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include "mozilla/DebugOnly.h"
1515
#include "mozilla/dom/ipc/StructuredCloneData.h"
1616
#include "mozilla/Maybe.h"
17+
#include "mozilla/net/WebSocketFrame.h"
1718
#include "mozilla/TimeStamp.h"
1819
#ifdef XP_WIN
1920
#include "mozilla/TimeStamp_windows.h"
@@ -718,6 +719,22 @@ struct ParamTraits<mozilla::dom::ipc::StructuredCloneData>
718719
}
719720
};
720721

722+
template <>
723+
struct ParamTraits<mozilla::net::WebSocketFrameData>
724+
{
725+
typedef mozilla::net::WebSocketFrameData paramType;
726+
727+
static void Write(Message* aMsg, const paramType& aParam)
728+
{
729+
aParam.WriteIPCParams(aMsg);
730+
}
731+
732+
static bool Read(const Message* aMsg, void** aIter, paramType* aResult)
733+
{
734+
return aResult->ReadIPCParams(aMsg, aIter);
735+
}
736+
};
737+
721738
template <>
722739
struct ParamTraits<mozilla::SerializedStructuredCloneBuffer>
723740
{

netwerk/ipc/NeckoChild.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include "mozilla/net/WyciwygChannelChild.h"
1616
#include "mozilla/net/FTPChannelChild.h"
1717
#include "mozilla/net/WebSocketChannelChild.h"
18+
#include "mozilla/net/WebSocketFrameListenerChild.h"
1819
#include "mozilla/net/DNSRequestChild.h"
1920
#include "mozilla/net/RemoteOpenFileChild.h"
2021
#include "mozilla/net/ChannelDiverterChild.h"
@@ -158,6 +159,23 @@ NeckoChild::DeallocPWebSocketChild(PWebSocketChild* child)
158159
return true;
159160
}
160161

162+
PWebSocketFrameListenerChild*
163+
NeckoChild::AllocPWebSocketFrameListenerChild(const uint64_t& aInnerWindowID)
164+
{
165+
RefPtr<WebSocketFrameListenerChild> c =
166+
new WebSocketFrameListenerChild(aInnerWindowID);
167+
return c.forget().take();
168+
}
169+
170+
bool
171+
NeckoChild::DeallocPWebSocketFrameListenerChild(PWebSocketFrameListenerChild* aActor)
172+
{
173+
RefPtr<WebSocketFrameListenerChild> c =
174+
dont_AddRef(static_cast<WebSocketFrameListenerChild*>(aActor));
175+
MOZ_ASSERT(c);
176+
return true;
177+
}
178+
161179
PDataChannelChild*
162180
NeckoChild::AllocPDataChannelChild(const uint32_t& channelId)
163181
{

netwerk/ipc/NeckoChild.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,9 @@ class NeckoChild :
7979
const nsString& aRealm,
8080
const uint64_t& aCallbackId) override;
8181
virtual bool RecvAppOfflineStatus(const uint32_t& aId, const bool& aOffline) override;
82+
virtual PWebSocketFrameListenerChild*
83+
AllocPWebSocketFrameListenerChild(const uint64_t& aInnerWindowID) override;
84+
virtual bool DeallocPWebSocketFrameListenerChild(PWebSocketFrameListenerChild*) override;
8285

8386
/* Predictor Messsages */
8487
virtual bool RecvPredOnPredictPreconnect(const URIParams& aURI) override;

netwerk/ipc/NeckoParent.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include "mozilla/net/WyciwygChannelParent.h"
1414
#include "mozilla/net/FTPChannelParent.h"
1515
#include "mozilla/net/WebSocketChannelParent.h"
16+
#include "mozilla/net/WebSocketFrameListenerParent.h"
1617
#include "mozilla/net/DataChannelParent.h"
1718
#ifdef NECKO_PROTOCOL_rtsp
1819
#include "mozilla/net/RtspControllerParent.h"
@@ -347,6 +348,23 @@ NeckoParent::DeallocPWebSocketParent(PWebSocketParent* actor)
347348
return true;
348349
}
349350

351+
PWebSocketFrameListenerParent*
352+
NeckoParent::AllocPWebSocketFrameListenerParent(const uint64_t& aInnerWindowID)
353+
{
354+
RefPtr<WebSocketFrameListenerParent> c =
355+
new WebSocketFrameListenerParent(aInnerWindowID);
356+
return c.forget().take();
357+
}
358+
359+
bool
360+
NeckoParent::DeallocPWebSocketFrameListenerParent(PWebSocketFrameListenerParent* aActor)
361+
{
362+
RefPtr<WebSocketFrameListenerParent> c =
363+
dont_AddRef(static_cast<WebSocketFrameListenerParent*>(aActor));
364+
MOZ_ASSERT(c);
365+
return true;
366+
}
367+
350368
PDataChannelParent*
351369
NeckoParent::AllocPDataChannelParent(const uint32_t &channelId)
352370
{

netwerk/ipc/NeckoParent.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,9 @@ class NeckoParent
172172
virtual bool RecvCancelHTMLDNSPrefetch(const nsString& hostname,
173173
const uint16_t& flags,
174174
const nsresult& reason) override;
175+
virtual PWebSocketFrameListenerParent*
176+
AllocPWebSocketFrameListenerParent(const uint64_t& aInnerWindowID) override;
177+
virtual bool DeallocPWebSocketFrameListenerParent(PWebSocketFrameListenerParent*) override;
175178

176179
virtual mozilla::ipc::IProtocol*
177180
CloneProtocol(Channel* aChannel,

netwerk/ipc/PNecko.ipdl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ include protocol PBrowser;
1212
include protocol PWyciwygChannel;
1313
include protocol PFTPChannel;
1414
include protocol PWebSocket;
15+
include protocol PWebSocketFrameListener;
1516
include protocol PTCPSocket;
1617
include protocol PTCPServerSocket;
1718
include protocol PUDPSocket;
@@ -45,6 +46,7 @@ prio(normal upto urgent) sync protocol PNecko
4546
manages PWyciwygChannel;
4647
manages PFTPChannel;
4748
manages PWebSocket;
49+
manages PWebSocketFrameListener;
4850
manages PTCPSocket;
4951
manages PTCPServerSocket;
5052
manages PUDPSocket;
@@ -72,6 +74,7 @@ parent:
7274

7375
PDNSRequest(nsCString hostName, uint32_t flags, nsCString networkInterface);
7476

77+
PWebSocketFrameListener(uint64_t aInnerWindowID);
7578

7679
/* Predictor Methods */
7780
PredPredict(OptionalURIParams targetURI, OptionalURIParams sourceURI,
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2+
/* vim: set sw=2 ts=8 et tw=80 ft=cpp : */
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+
include protocol PNecko;
9+
10+
using mozilla::net::WebSocketFrameData from "ipc/IPCMessageUtils.h";
11+
12+
namespace mozilla {
13+
namespace net {
14+
15+
async protocol PWebSocketFrameListener
16+
{
17+
manager PNecko;
18+
19+
child:
20+
FrameReceived(uint32_t aWebSocketSerialID,
21+
WebSocketFrameData aFrameData);
22+
23+
FrameSent(uint32_t aWebSocketSerialID,
24+
WebSocketFrameData aFrameData);
25+
26+
__delete__();
27+
28+
parent:
29+
Close();
30+
};
31+
32+
} //namespace net
33+
} //namespace mozilla

netwerk/protocol/websocket/WebSocketFrame.cpp

Lines changed: 111 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -21,20 +21,18 @@ NS_INTERFACE_MAP_END
2121
NS_IMPL_ADDREF(WebSocketFrame)
2222
NS_IMPL_RELEASE(WebSocketFrame)
2323

24+
WebSocketFrame::WebSocketFrame(const WebSocketFrameData& aData)
25+
: mData(aData)
26+
{}
27+
2428
WebSocketFrame::WebSocketFrame(bool aFinBit, bool aRsvBit1, bool aRsvBit2,
2529
bool aRsvBit3, uint8_t aOpCode, bool aMaskBit,
2630
uint32_t aMask, const nsCString& aPayload)
27-
: mFinBit(aFinBit)
28-
, mRsvBit1(aRsvBit1)
29-
, mRsvBit2(aRsvBit2)
30-
, mRsvBit3(aRsvBit3)
31-
, mMaskBit(aMaskBit)
32-
, mOpCode(aOpCode)
33-
, mMask(aMask)
34-
, mPayload(aPayload)
31+
: mData(PR_Now(), aFinBit, aRsvBit1, aRsvBit2, aRsvBit3, aOpCode, aMaskBit,
32+
aMask, aPayload)
3533
{
3634
MOZ_ASSERT(PR_GetCurrentThread() == gSocketThread);
37-
mTimeStamp = PR_Now();
35+
mData.mTimeStamp = PR_Now();
3836
}
3937

4038
WebSocketFrame::~WebSocketFrame()
@@ -52,24 +50,119 @@ WebSocketFrame::method(type* aValue) \
5250
return NS_OK; \
5351
}
5452

55-
WSF_GETTER(GetTimeStamp, mTimeStamp, DOMHighResTimeStamp);
56-
WSF_GETTER(GetFinBit, mFinBit, bool);
57-
WSF_GETTER(GetRsvBit1, mRsvBit1, bool);
58-
WSF_GETTER(GetRsvBit2, mRsvBit2, bool);
59-
WSF_GETTER(GetRsvBit3, mRsvBit3, bool);
60-
WSF_GETTER(GetOpCode, mOpCode, uint16_t);
61-
WSF_GETTER(GetMaskBit, mMaskBit, bool);
62-
WSF_GETTER(GetMask, mMask, uint32_t);
53+
WSF_GETTER(GetTimeStamp, mData.mTimeStamp, DOMHighResTimeStamp);
54+
WSF_GETTER(GetFinBit, mData.mFinBit, bool);
55+
WSF_GETTER(GetRsvBit1, mData.mRsvBit1, bool);
56+
WSF_GETTER(GetRsvBit2, mData.mRsvBit2, bool);
57+
WSF_GETTER(GetRsvBit3, mData.mRsvBit3, bool);
58+
WSF_GETTER(GetOpCode, mData.mOpCode, uint16_t);
59+
WSF_GETTER(GetMaskBit, mData.mMaskBit, bool);
60+
WSF_GETTER(GetMask, mData.mMask, uint32_t);
6361

6462
#undef WSF_GETTER
6563

6664
NS_IMETHODIMP
6765
WebSocketFrame::GetPayload(nsACString& aValue)
6866
{
6967
MOZ_ASSERT(NS_IsMainThread());
70-
aValue = mPayload;
68+
aValue = mData.mPayload;
7169
return NS_OK;
7270
}
7371

72+
WebSocketFrameData::WebSocketFrameData()
73+
: mTimeStamp(0)
74+
, mFinBit(false)
75+
, mRsvBit1(false)
76+
, mRsvBit2(false)
77+
, mRsvBit3(false)
78+
, mMaskBit(false)
79+
, mOpCode(0)
80+
, mMask(0)
81+
{
82+
MOZ_COUNT_CTOR(WebSocketFrameData);
83+
}
84+
85+
WebSocketFrameData::WebSocketFrameData(DOMHighResTimeStamp aTimeStamp,
86+
bool aFinBit, bool aRsvBit1,
87+
bool aRsvBit2, bool aRsvBit3,
88+
uint8_t aOpCode, bool aMaskBit,
89+
uint32_t aMask,
90+
const nsCString& aPayload)
91+
: mTimeStamp(aTimeStamp)
92+
, mFinBit(aFinBit)
93+
, mRsvBit1(aRsvBit1)
94+
, mRsvBit2(aRsvBit2)
95+
, mRsvBit3(aRsvBit3)
96+
, mMaskBit(aMaskBit)
97+
, mOpCode(aOpCode)
98+
, mMask(aMask)
99+
, mPayload(aPayload)
100+
{
101+
MOZ_COUNT_CTOR(WebSocketFrameData);
102+
}
103+
104+
WebSocketFrameData::WebSocketFrameData(const WebSocketFrameData& aData)
105+
: mTimeStamp(aData.mTimeStamp)
106+
, mFinBit(aData.mFinBit)
107+
, mRsvBit1(aData.mRsvBit1)
108+
, mRsvBit2(aData.mRsvBit2)
109+
, mRsvBit3(aData.mRsvBit3)
110+
, mMaskBit(aData.mMaskBit)
111+
, mOpCode(aData.mOpCode)
112+
, mMask(aData.mMask)
113+
, mPayload(aData.mPayload)
114+
{
115+
MOZ_COUNT_CTOR(WebSocketFrameData);
116+
}
117+
118+
WebSocketFrameData::~WebSocketFrameData()
119+
{
120+
MOZ_COUNT_DTOR(WebSocketFrameData);
121+
}
122+
123+
void
124+
WebSocketFrameData::WriteIPCParams(IPC::Message* aMessage) const
125+
{
126+
WriteParam(aMessage, mTimeStamp);
127+
WriteParam(aMessage, mFinBit);
128+
WriteParam(aMessage, mRsvBit1);
129+
WriteParam(aMessage, mRsvBit2);
130+
WriteParam(aMessage, mRsvBit3);
131+
WriteParam(aMessage, mOpCode);
132+
WriteParam(aMessage, mMaskBit);
133+
WriteParam(aMessage, mMask);
134+
WriteParam(aMessage, mPayload);
135+
}
136+
137+
bool
138+
WebSocketFrameData::ReadIPCParams(const IPC::Message* aMessage,
139+
void** aIter)
140+
{
141+
if (!ReadParam(aMessage, aIter, &mTimeStamp)) {
142+
return false;
143+
}
144+
145+
#define ReadParamHelper(x) \
146+
{ \
147+
bool bit; \
148+
if (!ReadParam(aMessage, aIter, &bit)) { \
149+
return false; \
150+
} \
151+
x = bit; \
152+
}
153+
154+
ReadParamHelper(mFinBit);
155+
ReadParamHelper(mRsvBit1);
156+
ReadParamHelper(mRsvBit2);
157+
ReadParamHelper(mRsvBit3);
158+
ReadParamHelper(mMaskBit);
159+
160+
#undef ReadParamHelper
161+
162+
return ReadParam(aMessage, aIter, &mOpCode) &&
163+
ReadParam(aMessage, aIter, &mMask) &&
164+
ReadParam(aMessage, aIter, &mPayload);
165+
}
166+
74167
} // net namespace
75168
} // mozilla namespace

0 commit comments

Comments
 (0)