@@ -555,30 +555,38 @@ class CallOnMessageAvailable MOZ_FINAL : public nsIRunnable
555
555
public:
556
556
NS_DECL_THREADSAFE_ISUPPORTS
557
557
558
- CallOnMessageAvailable (WebSocketChannel * aChannel,
559
- nsCString & aData,
560
- int32_t aLen)
558
+ CallOnMessageAvailable (WebSocketChannel* aChannel,
559
+ nsACString& aData,
560
+ int32_t aLen)
561
561
: mChannel (aChannel),
562
+ mListenerMT (aChannel->mListenerMT ),
562
563
mData(aData),
563
564
mLen(aLen) {}
564
565
565
566
NS_IMETHOD Run () MOZ_OVERRIDE
566
567
{
567
568
MOZ_ASSERT (mChannel ->IsOnTargetThread ());
568
569
569
- if (mLen < 0 )
570
- mChannel ->mListener ->OnMessageAvailable (mChannel ->mContext , mData );
571
- else
572
- mChannel ->mListener ->OnBinaryMessageAvailable (mChannel ->mContext , mData );
570
+ if (mListenerMT ) {
571
+ if (mLen < 0 ) {
572
+ mListenerMT ->mListener ->OnMessageAvailable (mListenerMT ->mContext ,
573
+ mData );
574
+ } else {
575
+ mListenerMT ->mListener ->OnBinaryMessageAvailable (mListenerMT ->mContext ,
576
+ mData );
577
+ }
578
+ }
579
+
573
580
return NS_OK;
574
581
}
575
582
576
583
private:
577
584
~CallOnMessageAvailable () {}
578
585
579
- nsRefPtr<WebSocketChannel> mChannel ;
580
- nsCString mData ;
581
- int32_t mLen ;
586
+ nsRefPtr<WebSocketChannel> mChannel ;
587
+ nsRefPtr<BaseWebSocketChannel::ListenerAndContextContainer> mListenerMT ;
588
+ nsCString mData ;
589
+ int32_t mLen ;
582
590
};
583
591
NS_IMPL_ISUPPORTS (CallOnMessageAvailable, nsIRunnable)
584
592
@@ -591,30 +599,33 @@ class CallOnStop MOZ_FINAL : public nsIRunnable
591
599
public:
592
600
NS_DECL_THREADSAFE_ISUPPORTS
593
601
594
- CallOnStop (WebSocketChannel * aChannel,
595
- nsresult aReason)
602
+ CallOnStop (WebSocketChannel* aChannel,
603
+ nsresult aReason)
596
604
: mChannel (aChannel),
597
- mReason (aReason) {}
605
+ mListenerMT (mChannel ->mListenerMT ),
606
+ mReason(aReason)
607
+ {}
598
608
599
609
NS_IMETHOD Run () MOZ_OVERRIDE
600
610
{
601
611
MOZ_ASSERT (mChannel ->IsOnTargetThread ());
602
612
603
613
nsWSAdmissionManager::OnStopSession (mChannel , mReason );
604
614
605
- if (mChannel ->mListener ) {
606
- mChannel ->mListener ->OnStop (mChannel ->mContext , mReason );
607
- mChannel ->mListener = nullptr ;
608
- mChannel ->mContext = nullptr ;
615
+ if (mListenerMT ) {
616
+ mListenerMT ->mListener ->OnStop (mListenerMT ->mContext , mReason );
617
+ mChannel ->mListenerMT = nullptr ;
609
618
}
619
+
610
620
return NS_OK;
611
621
}
612
622
613
623
private:
614
624
~CallOnStop () {}
615
625
616
- nsRefPtr<WebSocketChannel> mChannel ;
617
- nsresult mReason ;
626
+ nsRefPtr<WebSocketChannel> mChannel ;
627
+ nsRefPtr<BaseWebSocketChannel::ListenerAndContextContainer> mListenerMT ;
628
+ nsresult mReason ;
618
629
};
619
630
NS_IMPL_ISUPPORTS (CallOnStop, nsIRunnable)
620
631
@@ -627,27 +638,32 @@ class CallOnServerClose MOZ_FINAL : public nsIRunnable
627
638
public:
628
639
NS_DECL_THREADSAFE_ISUPPORTS
629
640
630
- CallOnServerClose (WebSocketChannel * aChannel,
631
- uint16_t aCode,
632
- nsCString & aReason)
641
+ CallOnServerClose (WebSocketChannel* aChannel,
642
+ uint16_t aCode,
643
+ nsACString& aReason)
633
644
: mChannel (aChannel),
645
+ mListenerMT (mChannel ->mListenerMT ),
634
646
mCode(aCode),
635
647
mReason(aReason) {}
636
648
637
649
NS_IMETHOD Run () MOZ_OVERRIDE
638
650
{
639
651
MOZ_ASSERT (mChannel ->IsOnTargetThread ());
640
652
641
- mChannel ->mListener ->OnServerClose (mChannel ->mContext , mCode , mReason );
653
+ if (mListenerMT ) {
654
+ mListenerMT ->mListener ->OnServerClose (mListenerMT ->mContext , mCode ,
655
+ mReason );
656
+ }
642
657
return NS_OK;
643
658
}
644
659
645
660
private:
646
661
~CallOnServerClose () {}
647
662
648
- nsRefPtr<WebSocketChannel> mChannel ;
649
- uint16_t mCode ;
650
- nsCString mReason ;
663
+ nsRefPtr<WebSocketChannel> mChannel ;
664
+ nsRefPtr<BaseWebSocketChannel::ListenerAndContextContainer> mListenerMT ;
665
+ uint16_t mCode ;
666
+ nsCString mReason ;
651
667
};
652
668
NS_IMPL_ISUPPORTS (CallOnServerClose, nsIRunnable)
653
669
@@ -658,25 +674,29 @@ NS_IMPL_ISUPPORTS(CallOnServerClose, nsIRunnable)
658
674
class CallAcknowledge MOZ_FINAL : public nsCancelableRunnable
659
675
{
660
676
public:
661
- CallAcknowledge (WebSocketChannel * aChannel,
662
- uint32_t aSize)
677
+ CallAcknowledge (WebSocketChannel* aChannel,
678
+ uint32_t aSize)
663
679
: mChannel (aChannel),
680
+ mListenerMT (mChannel ->mListenerMT ),
664
681
mSize(aSize) {}
665
682
666
683
NS_IMETHOD Run ()
667
684
{
668
685
MOZ_ASSERT (mChannel ->IsOnTargetThread ());
669
686
670
687
LOG ((" WebSocketChannel::CallAcknowledge: Size %u\n " , mSize ));
671
- mChannel ->mListener ->OnAcknowledge (mChannel ->mContext , mSize );
688
+ if (mListenerMT ) {
689
+ mListenerMT ->mListener ->OnAcknowledge (mListenerMT ->mContext , mSize );
690
+ }
672
691
return NS_OK;
673
692
}
674
693
675
694
private:
676
695
~CallAcknowledge () {}
677
696
678
- nsRefPtr<WebSocketChannel> mChannel ;
679
- uint32_t mSize ;
697
+ nsRefPtr<WebSocketChannel> mChannel ;
698
+ nsRefPtr<BaseWebSocketChannel::ListenerAndContextContainer> mListenerMT ;
699
+ uint32_t mSize ;
680
700
};
681
701
682
702
// -----------------------------------------------------------------------------
@@ -1174,17 +1194,7 @@ WebSocketChannel::~WebSocketChannel()
1174
1194
NS_ProxyRelease (mainThread, forgettable, false );
1175
1195
}
1176
1196
1177
- if (mListener ) {
1178
- nsIWebSocketListener *forgettableListener;
1179
- mListener .forget (&forgettableListener);
1180
- NS_ProxyRelease (mainThread, forgettableListener, false );
1181
- }
1182
-
1183
- if (mContext ) {
1184
- nsISupports *forgettableContext;
1185
- mContext .forget (&forgettableContext);
1186
- NS_ProxyRelease (mainThread, forgettableContext, false );
1187
- }
1197
+ mListenerMT = nullptr ;
1188
1198
1189
1199
if (mLoadGroup ) {
1190
1200
nsILoadGroup *forgettableGroup;
@@ -1586,7 +1596,7 @@ WebSocketChannel::ProcessInput(uint8_t *buffer, uint32_t count)
1586
1596
LOG ((" WebSocketChannel:: %stext frame received\n " ,
1587
1597
isDeflated ? " deflated " : " " ));
1588
1598
1589
- if (mListener ) {
1599
+ if (mListenerMT ) {
1590
1600
nsCString utf8Data;
1591
1601
1592
1602
if (isDeflated) {
@@ -1657,7 +1667,7 @@ WebSocketChannel::ProcessInput(uint8_t *buffer, uint32_t count)
1657
1667
mCloseTimer ->Cancel ();
1658
1668
mCloseTimer = nullptr ;
1659
1669
}
1660
- if (mListener ) {
1670
+ if (mListenerMT ) {
1661
1671
mTargetThread ->Dispatch (new CallOnServerClose (this , mServerCloseCode ,
1662
1672
mServerCloseReason ),
1663
1673
NS_DISPATCH_NORMAL);
@@ -1696,7 +1706,7 @@ WebSocketChannel::ProcessInput(uint8_t *buffer, uint32_t count)
1696
1706
LOG ((" WebSocketChannel:: %sbinary frame received\n " ,
1697
1707
isDeflated ? " deflated " : " " ));
1698
1708
1699
- if (mListener ) {
1709
+ if (mListenerMT ) {
1700
1710
nsCString binaryData;
1701
1711
1702
1712
if (isDeflated) {
@@ -2265,8 +2275,11 @@ WebSocketChannel::StopSession(nsresult reason)
2265
2275
2266
2276
if (!mCalledOnStop ) {
2267
2277
mCalledOnStop = 1 ;
2268
- mTargetThread ->Dispatch (new CallOnStop (this , reason),
2269
- NS_DISPATCH_NORMAL);
2278
+
2279
+ nsWSAdmissionManager::OnStopSession (this , reason);
2280
+
2281
+ nsRefPtr<CallOnStop> runnable = new CallOnStop (this , reason);
2282
+ mTargetThread ->Dispatch (runnable, NS_DISPATCH_NORMAL);
2270
2283
}
2271
2284
}
2272
2285
@@ -2577,10 +2590,10 @@ WebSocketChannel::StartWebsocketData()
2577
2590
nsWSAdmissionManager::OnConnected (this );
2578
2591
2579
2592
LOG ((" WebSocketChannel::StartWebsocketData Notifying Listener %p\n " ,
2580
- mListener .get ()));
2593
+ mListenerMT ? mListenerMT -> mListener .get () : nullptr ));
2581
2594
2582
- if (mListener ) {
2583
- mListener ->OnStart (mContext );
2595
+ if (mListenerMT ) {
2596
+ mListenerMT -> mListener ->OnStart (mListenerMT -> mContext );
2584
2597
}
2585
2598
2586
2599
// Start keepalive ping timer, if we're using keepalive.
@@ -2943,7 +2956,7 @@ WebSocketChannel::AsyncOpen(nsIURI *aURI,
2943
2956
return NS_ERROR_UNEXPECTED;
2944
2957
}
2945
2958
2946
- if (mListener || mWasOpened )
2959
+ if (mListenerMT || mWasOpened )
2947
2960
return NS_ERROR_ALREADY_OPENED;
2948
2961
2949
2962
nsresult rv;
@@ -3109,8 +3122,7 @@ WebSocketChannel::AsyncOpen(nsIURI *aURI,
3109
3122
// Only set these if the open was successful:
3110
3123
//
3111
3124
mWasOpened = 1 ;
3112
- mListener = aListener;
3113
- mContext = aContext;
3125
+ mListenerMT = new ListenerAndContextContainer (aListener, aContext);
3114
3126
IncrementSessionCount ();
3115
3127
3116
3128
return rv;
0 commit comments