gecko-dev/dom/base/nsCopySupport.h
Masayuki Nakano 9c349ade9b Bug 1487591 - Make Selection treat AccessibleCaretEventHub as concrete class rather than nsISelectionListener r=smaug
AccessibleCaretEventHub is an nsISelectionListener of Selection whose type is
"normal".  This is added only when nsFrameSelection::Init() is called and
accessible caret is enabled.  Additionally, nsFrameSelection::Init() is
always called immediately after creating nsFrameSelection.

Therefore, when AccessibleCaretEventHub is installed to Selection, this is
always second selection listener and won't be installed multiple times.  So,
Selection can store pointer of AccessibleCaretEventHub directly only when
it's enabled and the Selection needs to notify it of selection change.

This patch makes Selection stores AccessibleCaretEventHub with RefPtr, then,
makes Selection::NotifySelectionListeners() call its OnSelectionChange()
immediately after AutoCopyListener.

Unfortunately, this patch includes making of MOZ_CAN_RUN_SCRIPT_BOUNDARY and
MOZ_CAN_RUN_SCRIPT a lot since some methods of AccessibleCaretEventHub are
marked as MOZ_CAN_RUN_SCRIPT and including AccessibleCaretEventHub.h into
Selection.h causes compile the compile errors.

Differential Revision: https://phabricator.services.mozilla.com/D4733

--HG--
extra : moz-landing-system : lando
2018-08-31 21:19:44 +00:00

107 lines
4.5 KiB
C++

/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* 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/. */
#ifndef nsCopySupport_h__
#define nsCopySupport_h__
#include "nsError.h"
#include "nsIDocument.h"
#include "nsStringFwd.h"
#include "mozilla/EventForwards.h"
class nsINode;
class nsIDocument;
class nsIImageLoadingContent;
class nsIContent;
class nsITransferable;
class nsIPresShell;
class nsILoadContext;
namespace mozilla {
namespace dom {
class Selection;
} // namespace dom
} // namespace mozilla
class nsCopySupport
{
// class of static helper functions for copy support
public:
static nsresult ClearSelectionCache();
static nsresult HTMLCopy(mozilla::dom::Selection* aSel, nsIDocument* aDoc,
int16_t aClipboardID, bool aWithRubyAnnotation);
// Get the selection, or entire document, in the format specified by the mime type
// (text/html or text/plain). If aSel is non-null, use it, otherwise get the entire
// doc.
static nsresult GetContents(const nsACString& aMimeType, uint32_t aFlags,
mozilla::dom::Selection* aSel,
nsIDocument *aDoc, nsAString& outdata);
static nsresult ImageCopy(nsIImageLoadingContent* aImageElement,
nsILoadContext* aLoadContext,
int32_t aCopyFlags);
// Get the selection as a transferable. Similar to HTMLCopy except does
// not deal with the clipboard.
static nsresult GetTransferableForSelection(mozilla::dom::Selection* aSelection,
nsIDocument* aDocument,
nsITransferable** aTransferable);
// Same as GetTransferableForSelection, but doesn't skip invisible content.
MOZ_CAN_RUN_SCRIPT_BOUNDARY
static nsresult GetTransferableForNode(nsINode* aNode,
nsIDocument* aDoc,
nsITransferable** aTransferable);
/**
* Retrieve the selection for the given document. If the current focus
* within the document has its own selection, aSelection will be set to it
* and this focused content node returned. Otherwise, aSelection will be
* set to the document's selection and null will be returned.
*/
static nsIContent* GetSelectionForCopy(nsIDocument* aDocument,
mozilla::dom::Selection** aSelection);
/**
* Returns true if a copy operation is currently permitted based on the
* current focus and selection within the specified document.
*/
static bool CanCopy(nsIDocument* aDocument);
/**
* Fires a cut, copy or paste event, on the given presshell, depending
* on the value of aEventMessage, which should be either eCut, eCopy or
* ePaste, and perform the default copy action if the event was not
* cancelled.
*
* If aSelection is specified, then this selection is used as the target
* of the operation. Otherwise, GetSelectionForCopy is used to retrieve
* the current selection.
*
* This will fire a cut, copy or paste event at the node at the start
* point of the selection. If a cut or copy event is not cancelled, the
* selection is copied to the clipboard and true is returned. Paste events
* have no default behaviour but true will be returned. It is expected
* that the caller will execute any needed default paste behaviour. Also,
* note that this method only copies text to the clipboard, the caller is
* responsible for removing the content during a cut operation if true is
* returned.
*
* aClipboardType specifies which clipboard to use, from nsIClipboard.
*
* If aActionTaken is non-NULL, it will be set to true if an action was
* taken, whether it be the default action or the default being prevented.
*
* If the event is cancelled or an error occurs, false will be returned.
*/
static bool FireClipboardEvent(mozilla::EventMessage aEventMessage,
int32_t aClipboardType,
nsIPresShell* aPresShell,
mozilla::dom::Selection* aSelection,
bool* aActionTaken = nullptr);
};
#endif