void MediaQueryList::AddListener(MediaQueryListListener& aListener) { if (!HasListeners()) { // When we have listeners, the pres context owns a reference to // this. This is a cyclic reference that can only be broken by // cycle collection. NS_ADDREF_THIS(); } if (!mMatchesValid) { MOZ_ASSERT(!HasListeners(), "when listeners present, must keep mMatches current"); RecomputeMatches(); } for (uint32_t i = 0; i < mCallbacks.Length(); ++i) { if (aListener == *mCallbacks[i]) { // Already registered return; } } if (!mCallbacks.AppendElement(&aListener, fallible)) { if (!HasListeners()) { // Append failed; undo the AddRef above. NS_RELEASE_THIS(); } } }
void MediaQueryList::MaybeNotify() { mMatchesValid = false; if (!HasListeners()) { return; } bool oldMatches = mMatches; RecomputeMatches(); // No need to notify the change. if (mMatches == oldMatches) { return; } MediaQueryListEventInit init; init.mBubbles = false; init.mCancelable = false; init.mMatches = mMatches; mMediaList->GetText(init.mMedia); RefPtr<MediaQueryListEvent> event = MediaQueryListEvent::Constructor(this, ONCHANGE_STRING, init); event->SetTrusted(true); bool dummy; DispatchEvent(event, &dummy); }
already_AddRefed<WebSocketFrame> WebSocketEventService::CreateFrameIfNeeded(bool aFinBit, bool aRsvBit1, bool aRsvBit2, bool aRsvBit3, uint8_t aOpCode, bool aMaskBit, uint32_t aMask, uint8_t* aPayloadInHdr, uint32_t aPayloadInHdrLength, uint8_t* aPayload, uint32_t aPayloadLength) { if (!HasListeners()) { return nullptr; } uint32_t payloadLength = aPayloadLength + aPayloadInHdrLength; nsAutoCString payload; if (NS_WARN_IF(!payload.SetLength(payloadLength, fallible))) { return nullptr; } char* payloadPtr = payload.BeginWriting(); if (aPayloadInHdrLength) { memcpy(payloadPtr, aPayloadInHdr, aPayloadInHdrLength); } memcpy(payloadPtr + aPayloadInHdrLength, aPayload, aPayloadLength); return MakeAndAddRef<WebSocketFrame>(aFinBit, aRsvBit1, aRsvBit2, aRsvBit3, aOpCode, aMaskBit, aMask, payload); }
void MediaQueryList::RemoveAllListeners() { bool hadListeners = HasListeners(); mCallbacks.Clear(); if (hadListeners) { // See NS_ADDREF_THIS() in AddListener. NS_RELEASE_THIS(); } }
bool MediaQueryList::Matches() { if (!mMatchesValid) { MOZ_ASSERT(!HasListeners(), "when listeners present, must keep mMatches current"); RecomputeMatches(); } return mMatches; }
bool MediaQueryList::Matches() { if (!mMatchesValid) { NS_ABORT_IF_FALSE(!HasListeners(), "when listeners present, must keep mMatches current"); RecomputeMatches(); } return mMatches; }
already_AddRefed<WebSocketFrame> WebSocketEventService::CreateFrameIfNeeded(bool aFinBit, bool aRsvBit1, bool aRsvBit2, bool aRsvBit3, uint8_t aOpCode, bool aMaskBit, uint32_t aMask, const nsCString& aPayload) { if (!HasListeners()) { return nullptr; } return MakeAndAddRef<WebSocketFrame>(aFinBit, aRsvBit1, aRsvBit2, aRsvBit3, aOpCode, aMaskBit, aMask, aPayload); }
void MediaQueryList::RemoveListener(MediaQueryListListener& aListener) { for (uint32_t i = 0; i < mCallbacks.Length(); ++i) { if (aListener == *mCallbacks[i]) { mCallbacks.RemoveElementAt(i); if (!HasListeners()) { // See NS_ADDREF_THIS() in AddListener. NS_RELEASE_THIS(); } break; } } }
void MediaQueryList::AddEventListener(const nsAString& aType, EventListener* aCallback, const AddEventListenerOptionsOrBoolean& aOptions, const dom::Nullable<bool>& aWantsUntrusted, ErrorResult& aRv) { if (!mMatchesValid) { MOZ_ASSERT(!HasListeners(), "when listeners present, must keep mMatches current"); RecomputeMatches(); } DOMEventTargetHelper::AddEventListener(aType, aCallback, aOptions, aWantsUntrusted, aRv); }
void MediaQueryList::MediumFeaturesChanged(NotifyList &aListenersToNotify) { mMatchesValid = false; if (HasListeners()) { bool oldMatches = mMatches; RecomputeMatches(); if (mMatches != oldMatches) { for (uint32_t i = 0, i_end = mCallbacks.Length(); i != i_end; ++i) { HandleChangeData *d = aListenersToNotify.AppendElement(); if (d) { d->mql = this; d->callback = mCallbacks[i]; } } } } }
already_AddRefed<WebSocketFrame> WebSocketEventService::CreateFrameIfNeeded(bool aFinBit, bool aRsvBit1, bool aRsvBit2, bool aRsvBit3, uint8_t aOpCode, bool aMaskBit, uint32_t aMask, uint8_t* aPayload, uint32_t aPayloadLength) { if (!HasListeners()) { return nullptr; } nsAutoCString payloadStr; if (NS_WARN_IF(!(payloadStr.Assign((const char*) aPayload, aPayloadLength, mozilla::fallible)))) { return nullptr; } return MakeAndAddRef<WebSocketFrame>(aFinBit, aRsvBit1, aRsvBit2, aRsvBit3, aOpCode, aMaskBit, aMask, payloadStr); }
void WebSocketEventService::FrameSent(uint32_t aWebSocketSerialID, uint64_t aInnerWindowID, already_AddRefed<WebSocketFrame> aFrame) { RefPtr<WebSocketFrame> frame(Move(aFrame)); MOZ_ASSERT(frame); // Let's continue only if we have some listeners. if (!HasListeners()) { return; } RefPtr<WebSocketFrameRunnable> runnable = new WebSocketFrameRunnable(aWebSocketSerialID, aInnerWindowID, frame.forget(), true /* frameSent */); DebugOnly<nsresult> rv = NS_DispatchToMainThread(runnable); NS_WARNING_ASSERTION(NS_SUCCEEDED(rv), "NS_DispatchToMainThread failed"); }
NS_IMETHODIMP WebSocketEventService::Observe(nsISupports* aSubject, const char* aTopic, const char16_t* aData) { MOZ_ASSERT(NS_IsMainThread()); if (!strcmp(aTopic, "xpcom-shutdown")) { Shutdown(); return NS_OK; } if (!strcmp(aTopic, "inner-window-destroyed") && HasListeners()) { nsCOMPtr<nsISupportsPRUint64> wrapper = do_QueryInterface(aSubject); NS_ENSURE_TRUE(wrapper, NS_ERROR_FAILURE); uint64_t innerID; nsresult rv = wrapper->GetData(&innerID); NS_ENSURE_SUCCESS(rv, rv); WindowListener* listener = mWindows.Get(innerID); if (!listener) { return NS_OK; } MOZ_ASSERT(mCountListeners >= listener->mListeners.Length()); mCountListeners -= listener->mListeners.Length(); if (IsChildProcess()) { ShutdownActorListener(listener); } mWindows.Remove(innerID); } // This should not happen. return NS_ERROR_FAILURE; }
already_AddRefed<WebSocketFrame> WebSocketEventService::CreateFrameIfNeeded(bool aFinBit, bool aRsvBit1, bool aRsvBit2, bool aRsvBit3, uint8_t aOpCode, bool aMaskBit, uint32_t aMask, uint8_t* aPayloadInHdr, uint32_t aPayloadInHdrLength, uint8_t* aPayload, uint32_t aPayloadLength) { if (!HasListeners()) { return nullptr; } uint32_t payloadLength = aPayloadLength + aPayloadInHdrLength; nsAutoArrayPtr<uint8_t> payload(new uint8_t[payloadLength]); if (NS_WARN_IF(!payload)) { return nullptr; } if (aPayloadInHdrLength) { memcpy(payload, aPayloadInHdr, aPayloadInHdrLength); } memcpy(payload + aPayloadInHdrLength, aPayload, aPayloadLength); nsAutoCString payloadStr; if (NS_WARN_IF(!(payloadStr.Assign((const char*) payload.get(), payloadLength, mozilla::fallible)))) { return nullptr; } return MakeAndAddRef<WebSocketFrame>(aFinBit, aRsvBit1, aRsvBit2, aRsvBit3, aOpCode, aMaskBit, aMask, payloadStr); }