gecko-dev/layout/generic/nsAtomicContainerFrame.h
Masayuki Nakano 5a78a77b68 Bug 1375825 - part2: ContentEventHandler::ExpandToClusterBoundary() should check the return value of nsTextFrame::PeekOffsetCharacter() r=jfkthame
ContentEventHandler::ExpandToClusterBoundary() doesn't check the return value of nsTextFrame::PeekOffsetCharacter().  Therefore, it may set its result to reversed offset. (e.g., when aForward is true and offset is 6, the result may be 5.  When aForward is false and offset is 5, the result may be 6.)

For avoiding that, ContentEventHandler::ExpandToClusterBoundary() should check the result and only when it returns nsIFrame::FOUND, it should compute the proper offset.

On the other hand, it's too bad for ContentEventHandler that nsTextFrame::PeekOffsetCharacter() to return nsIFrame::CONTINUE_UNSELECTABLE when the user-select style is "all" because IME doesn't expect such cases.

Therefore, this patch adds additional argument to nsIFrame::PeekOffsetCharacter(), aOptions which is a struct containing bool members.  The reason why it's not a bit mask enum is, such struct doesn't cause simple mistake at checking the value and the code is shorter.  When mIgnoreUserStyleAll of it is true, this patch makes nsTextFrame not return nsIFrame::CONTINUE_UNSELECTABLE.

MozReview-Commit-ID: ACNNBTP92YZ

--HG--
extra : rebase_source : bd85da902e7fb59135d15514cb20a5599a4a640b
2017-06-29 10:58:16 +09:00

50 lines
1.7 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/. */
/* base class for rendering objects that need child lists but behave like leaf */
#ifndef nsAtomicContainerFrame_h___
#define nsAtomicContainerFrame_h___
#include "nsContainerFrame.h"
/**
* This class is for frames which need child lists but act like a leaf
* frame. In general, all frames of elements laid out according to the
* CSS box model would need child list for ::backdrop in case they are
* in fullscreen, while some of them still want leaf frame behavior.
*/
class nsAtomicContainerFrame : public nsContainerFrame
{
public:
NS_DECL_ABSTRACT_FRAME(nsAtomicContainerFrame)
// Bypass the nsContainerFrame/nsSplittableFrame impl of the following
// methods so we behave like a leaf frame.
FrameSearchResult PeekOffsetNoAmount(bool aForward, int32_t* aOffset) override
{
return nsFrame::PeekOffsetNoAmount(aForward, aOffset);
}
FrameSearchResult
PeekOffsetCharacter(bool aForward, int32_t* aOffset,
PeekOffsetCharacterOptions aOptions =
PeekOffsetCharacterOptions()) override
{
return nsFrame::PeekOffsetCharacter(aForward, aOffset, aOptions);
}
nsSplittableType GetSplittableType() const override
{
return nsFrame::GetSplittableType();
}
protected:
nsAtomicContainerFrame(nsStyleContext* aContext, ClassID aID)
: nsContainerFrame(aContext, aID)
{}
};
#endif // nsAtomicContainerFrame_h___