mirror of
https://github.com/ManchildProductions/UXP-Fixed.git
synced 2026-05-27 11:41:26 +00:00
cbb61ab832
Part 1: Remove current table item, as it's never set. Part 2: Get rid of generic table painting code, and handle each class separately. Part 4: Hoist outline skipping into col(group) frame code. Part 5: Skip box-shadow for table column and column groups. Part 6: Store column and column group backgrounds separately, and then append them before the rest of the table contents. Part 7: Pass rects in display list coordinates to AppendBackgroundItemsToTop. Part 8: Create column and column group background display items as part of the cell's BuildDisplayList. Part 9: Used cached values instead of calling nsDisplayListBuilder::ToReferenceFrame when possible, since it can be expensive when the requested frame isn't the builder's current frame. Part 10: Make sure we build display items for table parts where only the normal position is visible, since we may need to create background items for ancestors at that position. Part 11: Create an AutoBuildingDisplayList when we create background items for table columns and column groups, so that we initialize the invalidation state correctly.
167 lines
4.6 KiB
C++
167 lines
4.6 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 nsFileControlFrame_h___
|
|
#define nsFileControlFrame_h___
|
|
|
|
#include "mozilla/Attributes.h"
|
|
#include "nsBlockFrame.h"
|
|
#include "nsIFormControlFrame.h"
|
|
#include "nsIDOMEventListener.h"
|
|
#include "nsIAnonymousContentCreator.h"
|
|
#include "nsCOMPtr.h"
|
|
|
|
class nsIDOMDataTransfer;
|
|
class nsIDOMFileList;
|
|
namespace mozilla {
|
|
namespace dom {
|
|
class BlobImpl;
|
|
} // namespace dom
|
|
} // namespace mozilla
|
|
|
|
class nsFileControlFrame : public nsBlockFrame,
|
|
public nsIFormControlFrame,
|
|
public nsIAnonymousContentCreator
|
|
{
|
|
public:
|
|
explicit nsFileControlFrame(nsStyleContext* aContext);
|
|
|
|
virtual void Init(nsIContent* aContent,
|
|
nsContainerFrame* aParent,
|
|
nsIFrame* aPrevInFlow) override;
|
|
|
|
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
|
|
const nsDisplayListSet& aLists) override;
|
|
|
|
NS_DECL_QUERYFRAME
|
|
NS_DECL_FRAMEARENA_HELPERS
|
|
|
|
// nsIFormControlFrame
|
|
virtual nsresult SetFormProperty(nsIAtom* aName, const nsAString& aValue) override;
|
|
virtual void SetFocus(bool aOn, bool aRepaint) override;
|
|
|
|
virtual nscoord GetMinISize(nsRenderingContext *aRenderingContext) override;
|
|
|
|
virtual void DestroyFrom(nsIFrame* aDestructRoot) override;
|
|
|
|
#ifdef DEBUG_FRAME_DUMP
|
|
virtual nsresult GetFrameName(nsAString& aResult) const override;
|
|
#endif
|
|
|
|
virtual nsresult AttributeChanged(int32_t aNameSpaceID,
|
|
nsIAtom* aAttribute,
|
|
int32_t aModType) override;
|
|
virtual void ContentStatesChanged(mozilla::EventStates aStates) override;
|
|
virtual bool IsLeaf() const override
|
|
{
|
|
return true;
|
|
}
|
|
|
|
// nsIAnonymousContentCreator
|
|
virtual nsresult CreateAnonymousContent(nsTArray<ContentInfo>& aElements) override;
|
|
virtual void AppendAnonymousContentTo(nsTArray<nsIContent*>& aElements,
|
|
uint32_t aFilter) override;
|
|
|
|
#ifdef ACCESSIBILITY
|
|
virtual mozilla::a11y::AccType AccessibleType() override;
|
|
#endif
|
|
|
|
typedef bool (*AcceptAttrCallback)(const nsAString&, void*);
|
|
|
|
protected:
|
|
|
|
class MouseListener;
|
|
friend class MouseListener;
|
|
class MouseListener : public nsIDOMEventListener {
|
|
public:
|
|
NS_DECL_ISUPPORTS
|
|
|
|
explicit MouseListener(nsFileControlFrame* aFrame)
|
|
: mFrame(aFrame)
|
|
{}
|
|
|
|
void ForgetFrame() {
|
|
mFrame = nullptr;
|
|
}
|
|
|
|
protected:
|
|
virtual ~MouseListener() {}
|
|
|
|
nsFileControlFrame* mFrame;
|
|
};
|
|
|
|
class SyncDisabledStateEvent;
|
|
friend class SyncDisabledStateEvent;
|
|
class SyncDisabledStateEvent : public mozilla::Runnable
|
|
{
|
|
public:
|
|
explicit SyncDisabledStateEvent(nsFileControlFrame* aFrame)
|
|
: mFrame(aFrame)
|
|
{}
|
|
|
|
NS_IMETHOD Run() override {
|
|
nsFileControlFrame* frame = static_cast<nsFileControlFrame*>(mFrame.GetFrame());
|
|
NS_ENSURE_STATE(frame);
|
|
|
|
frame->SyncDisabledState();
|
|
return NS_OK;
|
|
}
|
|
|
|
private:
|
|
nsWeakFrame mFrame;
|
|
};
|
|
|
|
class DnDListener: public MouseListener {
|
|
public:
|
|
explicit DnDListener(nsFileControlFrame* aFrame)
|
|
: MouseListener(aFrame)
|
|
{}
|
|
|
|
NS_DECL_NSIDOMEVENTLISTENER
|
|
|
|
nsresult GetBlobImplForWebkitDirectory(nsIDOMFileList* aFileList,
|
|
mozilla::dom::BlobImpl** aBlobImpl);
|
|
|
|
bool IsValidDropData(nsIDOMDataTransfer* aDOMDataTransfer);
|
|
bool CanDropTheseFiles(nsIDOMDataTransfer* aDOMDataTransfer, bool aSupportsMultiple);
|
|
};
|
|
|
|
virtual bool IsFrameOfType(uint32_t aFlags) const override
|
|
{
|
|
return nsBlockFrame::IsFrameOfType(aFlags &
|
|
~(nsIFrame::eReplaced | nsIFrame::eReplacedContainsBlock));
|
|
}
|
|
|
|
/**
|
|
* The text box input.
|
|
* @see nsFileControlFrame::CreateAnonymousContent
|
|
*/
|
|
nsCOMPtr<nsIContent> mTextContent;
|
|
/**
|
|
* The button to open a file or directory picker.
|
|
* @see nsFileControlFrame::CreateAnonymousContent
|
|
*/
|
|
nsCOMPtr<nsIContent> mBrowseFilesOrDirs;
|
|
|
|
/**
|
|
* Drag and drop mouse listener.
|
|
* This makes sure we don't get used after destruction.
|
|
*/
|
|
RefPtr<DnDListener> mMouseListener;
|
|
|
|
protected:
|
|
/**
|
|
* Sync the disabled state of the content with anonymous children.
|
|
*/
|
|
void SyncDisabledState();
|
|
|
|
/**
|
|
* Updates the displayed value by using aValue.
|
|
*/
|
|
void UpdateDisplayedValue(const nsAString& aValue, bool aNotify);
|
|
};
|
|
|
|
#endif // nsFileControlFrame_h___
|