diff options
author | Matt A. Tobin <mattatobin@localhost.localdomain> | 2018-02-02 04:16:08 -0500 |
---|---|---|
committer | Matt A. Tobin <mattatobin@localhost.localdomain> | 2018-02-02 04:16:08 -0500 |
commit | 5f8de423f190bbb79a62f804151bc24824fa32d8 (patch) | |
tree | 10027f336435511475e392454359edea8e25895d /layout/forms/nsColorControlFrame.cpp | |
parent | 49ee0794b5d912db1f95dce6eb52d781dc210db5 (diff) | |
download | UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.gz UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.lz UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.xz UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.zip |
Add m-esr52 at 52.6.0
Diffstat (limited to 'layout/forms/nsColorControlFrame.cpp')
-rw-r--r-- | layout/forms/nsColorControlFrame.cpp | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/layout/forms/nsColorControlFrame.cpp b/layout/forms/nsColorControlFrame.cpp new file mode 100644 index 000000000..e0bae43a9 --- /dev/null +++ b/layout/forms/nsColorControlFrame.cpp @@ -0,0 +1,147 @@ +/* -*- 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/. */ + +#include "nsColorControlFrame.h" + +#include "nsContentCreatorFunctions.h" +#include "nsContentList.h" +#include "nsContentUtils.h" +#include "nsCSSPseudoElements.h" +#include "nsFormControlFrame.h" +#include "nsGkAtoms.h" +#include "nsIDOMHTMLInputElement.h" +#include "nsIDOMNode.h" +#include "nsIFormControl.h" +#include "mozilla/StyleSetHandle.h" +#include "mozilla/StyleSetHandleInlines.h" +#include "nsIDocument.h" + +using mozilla::dom::Element; + +nsColorControlFrame::nsColorControlFrame(nsStyleContext* aContext) + : nsHTMLButtonControlFrame(aContext) +{ +} + +nsIFrame* +NS_NewColorControlFrame(nsIPresShell* aPresShell, nsStyleContext* aContext) +{ + return new (aPresShell) nsColorControlFrame(aContext); +} + +NS_IMPL_FRAMEARENA_HELPERS(nsColorControlFrame) + +NS_QUERYFRAME_HEAD(nsColorControlFrame) + NS_QUERYFRAME_ENTRY(nsColorControlFrame) + NS_QUERYFRAME_ENTRY(nsIAnonymousContentCreator) +NS_QUERYFRAME_TAIL_INHERITING(nsHTMLButtonControlFrame) + + +void nsColorControlFrame::DestroyFrom(nsIFrame* aDestructRoot) +{ + nsFormControlFrame::RegUnRegAccessKey(static_cast<nsIFrame*>(this), false); + nsContentUtils::DestroyAnonymousContent(&mColorContent); + nsHTMLButtonControlFrame::DestroyFrom(aDestructRoot); +} + +nsIAtom* +nsColorControlFrame::GetType() const +{ + return nsGkAtoms::colorControlFrame; +} + +#ifdef DEBUG_FRAME_DUMP +nsresult +nsColorControlFrame::GetFrameName(nsAString& aResult) const +{ + return MakeFrameName(NS_LITERAL_STRING("ColorControl"), aResult); +} +#endif + +// Create the color area for the button. +// The frame will be generated by the frame constructor. +nsresult +nsColorControlFrame::CreateAnonymousContent(nsTArray<ContentInfo>& aElements) +{ + nsCOMPtr<nsIDocument> doc = mContent->GetComposedDoc(); + mColorContent = doc->CreateHTMLElement(nsGkAtoms::div); + + // Mark the element to be native anonymous before setting any attributes. + mColorContent->SetIsNativeAnonymousRoot(); + + nsresult rv = UpdateColor(); + NS_ENSURE_SUCCESS(rv, rv); + + CSSPseudoElementType pseudoType = CSSPseudoElementType::mozColorSwatch; + RefPtr<nsStyleContext> newStyleContext = PresContext()->StyleSet()-> + ResolvePseudoElementStyle(mContent->AsElement(), pseudoType, + StyleContext(), mColorContent->AsElement()); + if (!aElements.AppendElement(ContentInfo(mColorContent, newStyleContext))) { + return NS_ERROR_OUT_OF_MEMORY; + } + + return NS_OK; +} + +void +nsColorControlFrame::AppendAnonymousContentTo(nsTArray<nsIContent*>& aElements, + uint32_t aFilter) +{ + if (mColorContent) { + aElements.AppendElement(mColorContent); + } +} + +nsresult +nsColorControlFrame::UpdateColor() +{ + // Get the color from the "value" property of our content; it will return the + // default color (through the sanitization algorithm) if there is none. + nsAutoString color; + nsCOMPtr<nsIDOMHTMLInputElement> elt = do_QueryInterface(mContent); + elt->GetValue(color); + MOZ_ASSERT(!color.IsEmpty(), + "Content node's GetValue() should return a valid color string " + "(the default color, in case no valid color is set)"); + + // Set the background-color style property of the swatch element to this color + return mColorContent->SetAttr(kNameSpaceID_None, nsGkAtoms::style, + NS_LITERAL_STRING("background-color:") + color, true); +} + +nsresult +nsColorControlFrame::AttributeChanged(int32_t aNameSpaceID, + nsIAtom* aAttribute, + int32_t aModType) +{ + NS_ASSERTION(mColorContent, "The color div must exist"); + + // If the value attribute is set, update the color box, but only if we're + // still a color control, which might not be the case if the type attribute + // was removed/changed. + nsCOMPtr<nsIFormControl> fctrl = do_QueryInterface(GetContent()); + if (fctrl->GetType() == NS_FORM_INPUT_COLOR && + aNameSpaceID == kNameSpaceID_None && nsGkAtoms::value == aAttribute) { + UpdateColor(); + } + return nsHTMLButtonControlFrame::AttributeChanged(aNameSpaceID, aAttribute, + aModType); +} + +nsContainerFrame* +nsColorControlFrame::GetContentInsertionFrame() +{ + return this; +} + +Element* +nsColorControlFrame::GetPseudoElement(CSSPseudoElementType aType) +{ + if (aType == CSSPseudoElementType::mozColorSwatch) { + return mColorContent; + } + + return nsContainerFrame::GetPseudoElement(aType); +} |