tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

WebSocketFrame.cpp (4262B)


      1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
      2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
      3 /* This Source Code Form is subject to the terms of the Mozilla Public
      4 * License, v. 2.0. If a copy of the MPL was not distributed with this
      5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      6 
      7 #include "WebSocketFrame.h"
      8 
      9 #include "ErrorList.h"
     10 #include "MainThreadUtils.h"
     11 #include "chrome/common/ipc_message_utils.h"
     12 #include "mozilla/Assertions.h"
     13 #include "nsDOMNavigationTiming.h"
     14 #include "nsSocketTransportService2.h"
     15 #include "nscore.h"
     16 #include "prtime.h"
     17 
     18 namespace mozilla {
     19 namespace net {
     20 
     21 NS_INTERFACE_MAP_BEGIN(WebSocketFrame)
     22  NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIWebSocketFrame)
     23  NS_INTERFACE_MAP_ENTRY(nsIWebSocketFrame)
     24 NS_INTERFACE_MAP_END
     25 
     26 NS_IMPL_ADDREF(WebSocketFrame)
     27 NS_IMPL_RELEASE(WebSocketFrame)
     28 
     29 WebSocketFrame::WebSocketFrame(const WebSocketFrameData& aData)
     30    : mData(aData) {}
     31 
     32 WebSocketFrame::WebSocketFrame(bool aFinBit, bool aRsvBit1, bool aRsvBit2,
     33                               bool aRsvBit3, uint8_t aOpCode, bool aMaskBit,
     34                               uint32_t aMask, const nsCString& aPayload)
     35    : mData(PR_Now(), aFinBit, aRsvBit1, aRsvBit2, aRsvBit3, aOpCode, aMaskBit,
     36            aMask, aPayload) {
     37  // This could be called on the background thread when socket process is
     38  // enabled.
     39  mData.mTimeStamp = PR_Now();
     40 }
     41 
     42 #define WSF_GETTER(method, value, type)  \
     43  NS_IMETHODIMP                          \
     44  WebSocketFrame::method(type* aValue) { \
     45    MOZ_ASSERT(NS_IsMainThread());       \
     46    if (!aValue) {                       \
     47      return NS_ERROR_FAILURE;           \
     48    }                                    \
     49    *aValue = value;                     \
     50    return NS_OK;                        \
     51  }
     52 
     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);
     61 
     62 #undef WSF_GETTER
     63 
     64 NS_IMETHODIMP
     65 WebSocketFrame::GetPayload(nsACString& aValue) {
     66  MOZ_ASSERT(NS_IsMainThread());
     67  aValue = mData.mPayload;
     68  return NS_OK;
     69 }
     70 
     71 WebSocketFrameData::WebSocketFrameData()
     72    : mFinBit(false),
     73      mRsvBit1(false),
     74      mRsvBit2(false),
     75      mRsvBit3(false),
     76      mMaskBit(false) {}
     77 
     78 WebSocketFrameData::WebSocketFrameData(DOMHighResTimeStamp aTimeStamp,
     79                                       bool aFinBit, bool aRsvBit1,
     80                                       bool aRsvBit2, bool aRsvBit3,
     81                                       uint8_t aOpCode, bool aMaskBit,
     82                                       uint32_t aMask,
     83                                       const nsCString& aPayload)
     84    : mTimeStamp(aTimeStamp),
     85      mFinBit(aFinBit),
     86      mRsvBit1(aRsvBit1),
     87      mRsvBit2(aRsvBit2),
     88      mRsvBit3(aRsvBit3),
     89      mMaskBit(aMaskBit),
     90      mOpCode(aOpCode),
     91      mMask(aMask),
     92      mPayload(aPayload) {}
     93 
     94 void WebSocketFrameData::WriteIPCParams(IPC::MessageWriter* aWriter) const {
     95  WriteParam(aWriter, mTimeStamp);
     96  WriteParam(aWriter, mFinBit);
     97  WriteParam(aWriter, mRsvBit1);
     98  WriteParam(aWriter, mRsvBit2);
     99  WriteParam(aWriter, mRsvBit3);
    100  WriteParam(aWriter, mMaskBit);
    101  WriteParam(aWriter, mOpCode);
    102  WriteParam(aWriter, mMask);
    103  WriteParam(aWriter, mPayload);
    104 }
    105 
    106 bool WebSocketFrameData::ReadIPCParams(IPC::MessageReader* aReader) {
    107  if (!ReadParam(aReader, &mTimeStamp)) {
    108    return false;
    109  }
    110 
    111 #define ReadParamHelper(x)           \
    112  {                                  \
    113    bool bit;                        \
    114    if (!ReadParam(aReader, &bit)) { \
    115      return false;                  \
    116    }                                \
    117    (x) = bit;                       \
    118  }
    119 
    120  ReadParamHelper(mFinBit);
    121  ReadParamHelper(mRsvBit1);
    122  ReadParamHelper(mRsvBit2);
    123  ReadParamHelper(mRsvBit3);
    124  ReadParamHelper(mMaskBit);
    125 
    126 #undef ReadParamHelper
    127 
    128  return ReadParam(aReader, &mOpCode) && ReadParam(aReader, &mMask) &&
    129         ReadParam(aReader, &mPayload);
    130 }
    131 
    132 }  // namespace net
    133 }  // namespace mozilla