1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/dom/events/ClipboardEvent.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,135 @@ 1.4 +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 1.5 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.6 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.7 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.8 + 1.9 +#include "mozilla/dom/ClipboardEvent.h" 1.10 +#include "mozilla/ContentEvents.h" 1.11 +#include "mozilla/dom/DataTransfer.h" 1.12 +#include "nsIClipboard.h" 1.13 + 1.14 +namespace mozilla { 1.15 +namespace dom { 1.16 + 1.17 +ClipboardEvent::ClipboardEvent(EventTarget* aOwner, 1.18 + nsPresContext* aPresContext, 1.19 + InternalClipboardEvent* aEvent) 1.20 + : Event(aOwner, aPresContext, 1.21 + aEvent ? aEvent : new InternalClipboardEvent(false, 0)) 1.22 +{ 1.23 + if (aEvent) { 1.24 + mEventIsInternal = false; 1.25 + } else { 1.26 + mEventIsInternal = true; 1.27 + mEvent->time = PR_Now(); 1.28 + } 1.29 +} 1.30 + 1.31 +NS_INTERFACE_MAP_BEGIN(ClipboardEvent) 1.32 + NS_INTERFACE_MAP_ENTRY(nsIDOMClipboardEvent) 1.33 +NS_INTERFACE_MAP_END_INHERITING(Event) 1.34 + 1.35 +NS_IMPL_ADDREF_INHERITED(ClipboardEvent, Event) 1.36 +NS_IMPL_RELEASE_INHERITED(ClipboardEvent, Event) 1.37 + 1.38 +nsresult 1.39 +ClipboardEvent::InitClipboardEvent(const nsAString& aType, 1.40 + bool aCanBubble, 1.41 + bool aCancelable, 1.42 + nsIDOMDataTransfer* aClipboardData) 1.43 +{ 1.44 + nsCOMPtr<DataTransfer> clipboardData = do_QueryInterface(aClipboardData); 1.45 + // Null clipboardData is OK 1.46 + 1.47 + ErrorResult rv; 1.48 + InitClipboardEvent(aType, aCanBubble, aCancelable, clipboardData, rv); 1.49 + 1.50 + return rv.ErrorCode(); 1.51 +} 1.52 + 1.53 +void 1.54 +ClipboardEvent::InitClipboardEvent(const nsAString& aType, bool aCanBubble, 1.55 + bool aCancelable, 1.56 + DataTransfer* aClipboardData, 1.57 + ErrorResult& aError) 1.58 +{ 1.59 + aError = Event::InitEvent(aType, aCanBubble, aCancelable); 1.60 + if (aError.Failed()) { 1.61 + return; 1.62 + } 1.63 + 1.64 + mEvent->AsClipboardEvent()->clipboardData = aClipboardData; 1.65 +} 1.66 + 1.67 +already_AddRefed<ClipboardEvent> 1.68 +ClipboardEvent::Constructor(const GlobalObject& aGlobal, 1.69 + const nsAString& aType, 1.70 + const ClipboardEventInit& aParam, 1.71 + ErrorResult& aRv) 1.72 +{ 1.73 + nsCOMPtr<EventTarget> t = do_QueryInterface(aGlobal.GetAsSupports()); 1.74 + nsRefPtr<ClipboardEvent> e = new ClipboardEvent(t, nullptr, nullptr); 1.75 + bool trusted = e->Init(t); 1.76 + 1.77 + nsRefPtr<DataTransfer> clipboardData; 1.78 + if (e->mEventIsInternal) { 1.79 + InternalClipboardEvent* event = e->mEvent->AsClipboardEvent(); 1.80 + if (event) { 1.81 + // Always create a clipboardData for the copy event. If this is changed to 1.82 + // support other types of events, make sure that read/write privileges are 1.83 + // checked properly within DataTransfer. 1.84 + clipboardData = new DataTransfer(ToSupports(e), NS_COPY, false, -1); 1.85 + clipboardData->SetData(aParam.mDataType, aParam.mData); 1.86 + } 1.87 + } 1.88 + 1.89 + e->InitClipboardEvent(aType, aParam.mBubbles, aParam.mCancelable, 1.90 + clipboardData, aRv); 1.91 + e->SetTrusted(trusted); 1.92 + return e.forget(); 1.93 +} 1.94 + 1.95 +NS_IMETHODIMP 1.96 +ClipboardEvent::GetClipboardData(nsIDOMDataTransfer** aClipboardData) 1.97 +{ 1.98 + NS_IF_ADDREF(*aClipboardData = GetClipboardData()); 1.99 + return NS_OK; 1.100 +} 1.101 + 1.102 +DataTransfer* 1.103 +ClipboardEvent::GetClipboardData() 1.104 +{ 1.105 + InternalClipboardEvent* event = mEvent->AsClipboardEvent(); 1.106 + 1.107 + if (!event->clipboardData) { 1.108 + if (mEventIsInternal) { 1.109 + event->clipboardData = 1.110 + new DataTransfer(ToSupports(this), NS_COPY, false, -1); 1.111 + } else { 1.112 + event->clipboardData = 1.113 + new DataTransfer(ToSupports(this), event->message, 1.114 + event->message == NS_PASTE, 1.115 + nsIClipboard::kGlobalClipboard); 1.116 + } 1.117 + } 1.118 + 1.119 + return event->clipboardData; 1.120 +} 1.121 + 1.122 +} // namespace dom 1.123 +} // namespace mozilla 1.124 + 1.125 +using namespace mozilla; 1.126 +using namespace mozilla::dom; 1.127 + 1.128 +nsresult 1.129 +NS_NewDOMClipboardEvent(nsIDOMEvent** aInstancePtrResult, 1.130 + EventTarget* aOwner, 1.131 + nsPresContext* aPresContext, 1.132 + InternalClipboardEvent* aEvent) 1.133 +{ 1.134 + ClipboardEvent* it = new ClipboardEvent(aOwner, aPresContext, aEvent); 1.135 + NS_ADDREF(it); 1.136 + *aInstancePtrResult = static_cast<Event*>(it); 1.137 + return NS_OK; 1.138 +}