TEST(ObserverService, TestNotify) { nsCString topicA; topicA.Assign( "topic-A" ); nsCString topicB; topicB.Assign( "topic-B" ); nsCOMPtr<nsIObserverService> svc = do_CreateInstance("@mozilla.org/observer-service;1"); RefPtr<TestObserver> aObserver = new TestObserver(NS_LITERAL_STRING("Observer-A")); RefPtr<TestObserver> bObserver = new TestObserver(NS_LITERAL_STRING("Observer-B")); // Add two observers for topicA. testResult(svc->AddObserver(aObserver, topicA.get(), false)); testResult(svc->AddObserver(bObserver, topicA.get(), false)); // Add one observer for topicB. testResult(svc->AddObserver(bObserver, topicB.get(), false)); // Notify topicA. NS_NAMED_LITERAL_STRING(dataA, "Testing Notify(observer-A, topic-A)"); aObserver->mExpectedData = dataA; bObserver->mExpectedData = dataA; nsresult rv = svc->NotifyObservers(ToSupports(aObserver), topicA.get(), dataA.get()); testResult(rv); ASSERT_EQ(aObserver->mObservations, 1); ASSERT_EQ(bObserver->mObservations, 1); // Notify topicB. NS_NAMED_LITERAL_STRING(dataB, "Testing Notify(observer-B, topic-B)"); bObserver->mExpectedData = dataB; rv = svc->NotifyObservers(ToSupports(bObserver), topicB.get(), dataB.get()); testResult(rv); ASSERT_EQ(aObserver->mObservations, 1); ASSERT_EQ(bObserver->mObservations, 2); // Remove one of the topicA observers, make sure it's not notified. testResult(svc->RemoveObserver(aObserver, topicA.get())); // Notify topicA, only bObserver is expected to be notified. bObserver->mExpectedData = dataA; rv = svc->NotifyObservers(ToSupports(aObserver), topicA.get(), dataA.get()); testResult(rv); ASSERT_EQ(aObserver->mObservations, 1); ASSERT_EQ(bObserver->mObservations, 3); // Remove the other topicA observer, make sure none are notified. testResult(svc->RemoveObserver(bObserver, topicA.get())); rv = svc->NotifyObservers(ToSupports(aObserver), topicA.get(), dataA.get()); testResult(rv); ASSERT_EQ(aObserver->mObservations, 1); ASSERT_EQ(bObserver->mObservations, 3); }
TimeRanges* SourceBuffer::GetBuffered(ErrorResult& aRv) { MOZ_ASSERT(NS_IsMainThread()); // http://w3c.github.io/media-source/index.html#widl-SourceBuffer-buffered // 1. If this object has been removed from the sourceBuffers attribute of the parent media source then throw an InvalidStateError exception and abort these steps. if (!IsAttached()) { aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR); return nullptr; } bool rangeChanged = true; media::TimeIntervals intersection = mTrackBuffersManager->Buffered(); MSE_DEBUGV("intersection=%s", DumpTimeRanges(intersection).get()); if (mBuffered) { media::TimeIntervals currentValue(mBuffered); rangeChanged = (intersection != currentValue); MSE_DEBUGV("currentValue=%s", DumpTimeRanges(currentValue).get()); } // 5. If intersection ranges does not contain the exact same range information as the current value of this attribute, then update the current value of this attribute to intersection ranges. if (rangeChanged) { mBuffered = new TimeRanges(ToSupports(this)); intersection.ToTimeRanges(mBuffered); } // 6. Return the current value of this attribute. return mBuffered; }
already_AddRefed<ClipboardEvent> ClipboardEvent::Constructor(const GlobalObject& aGlobal, const nsAString& aType, const ClipboardEventInit& aParam, ErrorResult& aRv) { nsCOMPtr<EventTarget> t = do_QueryInterface(aGlobal.GetAsSupports()); RefPtr<ClipboardEvent> e = new ClipboardEvent(t, nullptr, nullptr); bool trusted = e->Init(t); RefPtr<DataTransfer> clipboardData; if (e->mEventIsInternal) { InternalClipboardEvent* event = e->mEvent->AsClipboardEvent(); if (event) { // Always create a clipboardData for the copy event. If this is changed to // support other types of events, make sure that read/write privileges are // checked properly within DataTransfer. clipboardData = new DataTransfer(ToSupports(e), eCopy, false, -1); clipboardData->SetData(aParam.mDataType, aParam.mData, aRv); NS_ENSURE_TRUE(!aRv.Failed(), nullptr); } } e->InitClipboardEvent(aType, aParam.mBubbles, aParam.mCancelable, clipboardData, aRv); e->SetTrusted(trusted); return e.forget(); }
void GamepadService::SetWindowHasSeenGamepad(nsGlobalWindow* aWindow, uint32_t aIndex, bool aHasSeen) { MOZ_ASSERT(aWindow); MOZ_ASSERT(aWindow->IsInnerWindow()); if (mListeners.IndexOf(aWindow) == NoIndex) { // This window isn't even listening for gamepad events. return; } if (aHasSeen) { aWindow->SetHasSeenGamepadInput(true); nsCOMPtr<nsISupports> window = ToSupports(aWindow); RefPtr<Gamepad> gamepad = GetGamepad(aIndex); MOZ_ASSERT(gamepad); if (!gamepad) { return; } RefPtr<Gamepad> clonedGamepad = gamepad->Clone(window); aWindow->AddGamepad(aIndex, clonedGamepad); } else { aWindow->RemoveGamepad(aIndex); } }
DataTransfer* ClipboardEvent::GetClipboardData() { InternalClipboardEvent* event = mEvent->AsClipboardEvent(); if (!event->clipboardData) { if (mEventIsInternal) { event->clipboardData = new DataTransfer(ToSupports(this), eCopy, false, -1); } else { event->clipboardData = new DataTransfer(ToSupports(this), event->mMessage, event->mMessage == ePaste, nsIClipboard::kGlobalClipboard); } } return event->clipboardData; }
already_AddRefed<nsClientRect> nsDOMNotifyPaintEvent::BoundingClientRect() { nsRefPtr<nsClientRect> rect = new nsClientRect(ToSupports(this)); if (mPresContext) { rect->SetLayoutRect(GetRegion().GetBounds()); } return rect.forget(); }
nsISupports* ChildSHistory::GetParentObject() const { // We want to get the TabChildMessageManager, which is the // messageManager on mDocShell. RefPtr<ContentFrameMessageManager> mm; if (mDocShell) { mm = mDocShell->GetMessageManager(); } // else we must be unlinked... can that happen here? return ToSupports(mm); }
already_AddRefed<DOMRectList> NotifyPaintEvent::ClientRects() { nsISupports* parent = ToSupports(this); RefPtr<DOMRectList> rectList = new DOMRectList(parent); nsRegion r = GetRegion(); for (auto iter = r.RectIter(); !iter.Done(); iter.Next()) { RefPtr<DOMRect> rect = new DOMRect(parent); rect->SetLayoutRect(iter.Get()); rectList->Append(rect); } return rectList.forget(); }
already_AddRefed<DOMRectList> NotifyPaintEvent::ClientRects() { nsISupports* parent = ToSupports(this); nsRefPtr<DOMRectList> rectList = new DOMRectList(parent); nsRegion r = GetRegion(); nsRegionRectIterator iter(r); for (const nsRect* rgnRect = iter.Next(); rgnRect; rgnRect = iter.Next()) { nsRefPtr<DOMRect> rect = new DOMRect(parent); rect->SetLayoutRect(*rgnRect); rectList->Append(rect); } return rectList.forget(); }