gecko-dev/dom/events/CompositionEvent.cpp
Aryeh Gregor 0e4353d48a Bug 1002256 - Support CompositionEvent constructor; r=bkelly
All other browsers support a constructor here.  Per current spec, the
constructor does not support .locale, although initCompositionEvent
does.  If we ever decide to standardize .locale, the constructor can be
updated at that point.  (Edge also supports .locale in
initCompositionEvent but not the constructor.  Chrome doesn't support
.locale at all.)
2016-11-16 22:16:22 +02:00

128 lines
4.0 KiB
C++

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "mozilla/dom/CompositionEvent.h"
#include "mozilla/TextEvents.h"
#include "prtime.h"
namespace mozilla {
namespace dom {
CompositionEvent::CompositionEvent(EventTarget* aOwner,
nsPresContext* aPresContext,
WidgetCompositionEvent* aEvent)
: UIEvent(aOwner, aPresContext,
aEvent ? aEvent :
new WidgetCompositionEvent(false, eVoidEvent, nullptr))
{
NS_ASSERTION(mEvent->mClass == eCompositionEventClass,
"event type mismatch");
if (aEvent) {
mEventIsInternal = false;
} else {
mEventIsInternal = true;
mEvent->mTime = PR_Now();
// XXX compositionstart is cancelable in draft of DOM3 Events.
// However, it doesn't make sence for us, we cannot cancel composition
// when we sends compositionstart event.
mEvent->mFlags.mCancelable = false;
}
// XXX Do we really need to duplicate the data value?
mData = mEvent->AsCompositionEvent()->mData;
// TODO: Native event should have locale information.
}
// static
already_AddRefed<CompositionEvent>
CompositionEvent::Constructor(const GlobalObject& aGlobal,
const nsAString& aType,
const CompositionEventInit& aParam,
ErrorResult& aRv)
{
nsCOMPtr<EventTarget> t = do_QueryInterface(aGlobal.GetAsSupports());
RefPtr<CompositionEvent> e = new CompositionEvent(t, nullptr, nullptr);
bool trusted = e->Init(t);
e->InitCompositionEvent(aType, aParam.mBubbles, aParam.mCancelable,
aParam.mView, aParam.mData, EmptyString());
e->mDetail = aParam.mDetail;
e->SetTrusted(trusted);
e->SetComposed(aParam.mComposed);
return e.forget();
}
NS_IMPL_ADDREF_INHERITED(CompositionEvent, UIEvent)
NS_IMPL_RELEASE_INHERITED(CompositionEvent, UIEvent)
NS_INTERFACE_MAP_BEGIN(CompositionEvent)
NS_INTERFACE_MAP_END_INHERITING(UIEvent)
void
CompositionEvent::GetData(nsAString& aData) const
{
aData = mData;
}
void
CompositionEvent::GetLocale(nsAString& aLocale) const
{
aLocale = mLocale;
}
void
CompositionEvent::InitCompositionEvent(const nsAString& aType,
bool aCanBubble,
bool aCancelable,
nsGlobalWindow* aView,
const nsAString& aData,
const nsAString& aLocale)
{
NS_ENSURE_TRUE_VOID(!mEvent->mFlags.mIsBeingDispatched);
UIEvent::InitUIEvent(aType, aCanBubble, aCancelable, aView, 0);
mData = aData;
mLocale = aLocale;
}
void
CompositionEvent::GetRanges(TextClauseArray& aRanges)
{
// If the mRanges is not empty, we return the cached value.
if (!mRanges.IsEmpty()) {
aRanges = mRanges;
return;
}
RefPtr<TextRangeArray> textRangeArray = mEvent->AsCompositionEvent()->mRanges;
if (!textRangeArray) {
return;
}
nsCOMPtr<nsPIDOMWindowInner> window = do_QueryInterface(mOwner);
const TextRange* targetRange = textRangeArray->GetTargetClause();
for (size_t i = 0; i < textRangeArray->Length(); i++) {
const TextRange& range = textRangeArray->ElementAt(i);
mRanges.AppendElement(new TextClause(window, range, targetRange));
}
aRanges = mRanges;
}
} // namespace dom
} // namespace mozilla
using namespace mozilla;
using namespace mozilla::dom;
already_AddRefed<CompositionEvent>
NS_NewDOMCompositionEvent(EventTarget* aOwner,
nsPresContext* aPresContext,
WidgetCompositionEvent* aEvent)
{
RefPtr<CompositionEvent> event =
new CompositionEvent(aOwner, aPresContext, aEvent);
return event.forget();
}