tor-browser

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

InputEvent.cpp (4632B)


      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 "mozilla/dom/InputEvent.h"
      8 
      9 #include "mozilla/StaticPrefs_dom.h"
     10 #include "mozilla/TextEvents.h"
     11 #include "prtime.h"
     12 
     13 namespace mozilla::dom {
     14 
     15 InputEvent::InputEvent(EventTarget* aOwner, nsPresContext* aPresContext,
     16                       InternalEditorInputEvent* aEvent)
     17    : UIEvent(aOwner, aPresContext,
     18              aEvent
     19                  ? aEvent
     20                  : new InternalEditorInputEvent(false, eVoidEvent, nullptr)) {
     21  NS_ASSERTION(mEvent->mClass == eEditorInputEventClass, "event type mismatch");
     22 
     23  if (aEvent) {
     24    mEventIsInternal = false;
     25  } else {
     26    mEventIsInternal = true;
     27  }
     28 }
     29 
     30 void InputEvent::GetData(nsAString& aData, CallerType aCallerType) {
     31  InternalEditorInputEvent* editorInputEvent = mEvent->AsEditorInputEvent();
     32  MOZ_ASSERT(editorInputEvent);
     33  // If clipboard event is disabled, user may not want to leak clipboard
     34  // information via DOM events.  If so, we should return empty string instead.
     35  if (mEvent->IsTrusted() && aCallerType != CallerType::System &&
     36      !StaticPrefs::dom_event_clipboardevents_enabled() &&
     37      ExposesClipboardDataOrDataTransfer(editorInputEvent->mInputType)) {
     38    aData = editorInputEvent->mData.IsVoid() ? VoidString() : u""_ns;
     39    return;
     40  }
     41  aData = editorInputEvent->mData;
     42 }
     43 
     44 already_AddRefed<DataTransfer> InputEvent::GetDataTransfer(
     45    CallerType aCallerType) {
     46  InternalEditorInputEvent* editorInputEvent = mEvent->AsEditorInputEvent();
     47  MOZ_ASSERT(editorInputEvent);
     48  // If clipboard event is disabled, user may not want to leak clipboard
     49  // information via DOM events.  If so, we should return DataTransfer which
     50  // has empty string instead.  The reason why we make it have empty string is,
     51  // web apps may not expect that InputEvent.dataTransfer returns empty and
     52  // non-null DataTransfer instance.
     53  if (mEvent->IsTrusted() && aCallerType != CallerType::System &&
     54      !StaticPrefs::dom_event_clipboardevents_enabled() &&
     55      ExposesClipboardDataOrDataTransfer(editorInputEvent->mInputType)) {
     56    if (!editorInputEvent->mDataTransfer) {
     57      return nullptr;
     58    }
     59    return do_AddRef(
     60        new DataTransfer(editorInputEvent->mDataTransfer->GetParentObject(),
     61                         editorInputEvent->mMessage, u""_ns));
     62  }
     63  return do_AddRef(editorInputEvent->mDataTransfer);
     64 }
     65 
     66 void InputEvent::GetInputType(nsAString& aInputType) {
     67  InternalEditorInputEvent* editorInputEvent = mEvent->AsEditorInputEvent();
     68  MOZ_ASSERT(editorInputEvent);
     69  if (editorInputEvent->mInputType == EditorInputType::eUnknown) {
     70    aInputType = mInputTypeValue;
     71  } else {
     72    editorInputEvent->GetDOMInputTypeName(aInputType);
     73  }
     74 }
     75 
     76 void InputEvent::GetTargetRanges(nsTArray<RefPtr<StaticRange>>& aTargetRanges) {
     77  MOZ_ASSERT(aTargetRanges.IsEmpty());
     78  MOZ_ASSERT(mEvent->AsEditorInputEvent());
     79  aTargetRanges.AppendElements(mEvent->AsEditorInputEvent()->mTargetRanges);
     80 }
     81 
     82 bool InputEvent::IsComposing() {
     83  return mEvent->AsEditorInputEvent()->mIsComposing;
     84 }
     85 
     86 already_AddRefed<InputEvent> InputEvent::Constructor(
     87    const GlobalObject& aGlobal, const nsAString& aType,
     88    const InputEventInit& aParam) {
     89  nsCOMPtr<EventTarget> t = do_QueryInterface(aGlobal.GetAsSupports());
     90  RefPtr<InputEvent> e = new InputEvent(t, nullptr, nullptr);
     91  bool trusted = e->Init(t);
     92  e->InitUIEvent(aType, aParam.mBubbles, aParam.mCancelable, aParam.mView,
     93                 aParam.mDetail);
     94  InternalEditorInputEvent* internalEvent = e->mEvent->AsEditorInputEvent();
     95  internalEvent->mInputType =
     96      InternalEditorInputEvent::GetEditorInputType(aParam.mInputType);
     97  if (internalEvent->mInputType == EditorInputType::eUnknown) {
     98    e->mInputTypeValue = aParam.mInputType;
     99  }
    100  internalEvent->mData = aParam.mData;
    101  internalEvent->mDataTransfer = aParam.mDataTransfer;
    102  internalEvent->mTargetRanges = aParam.mTargetRanges;
    103  internalEvent->mIsComposing = aParam.mIsComposing;
    104  e->SetTrusted(trusted);
    105  e->SetComposed(aParam.mComposed);
    106  return e.forget();
    107 }
    108 
    109 }  // namespace mozilla::dom
    110 
    111 using namespace mozilla;
    112 using namespace mozilla::dom;
    113 
    114 already_AddRefed<InputEvent> NS_NewDOMInputEvent(
    115    EventTarget* aOwner, nsPresContext* aPresContext,
    116    InternalEditorInputEvent* aEvent) {
    117  RefPtr<InputEvent> it = new InputEvent(aOwner, aPresContext, aEvent);
    118  return it.forget();
    119 }