/* * Copyright (C) 2006, 2007, 2012 Apple Inc. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public License * along with this library; see the file COPYING.LIB. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * */ #include "third_party/blink/renderer/core/layout/layout_file_upload_control.h" #include #include "third_party/blink/renderer/core/dom/shadow_root.h" #include "third_party/blink/renderer/core/fileapi/file_list.h" #include "third_party/blink/renderer/core/html/forms/html_input_element.h" #include "third_party/blink/renderer/core/input_type_names.h" #include "third_party/blink/renderer/core/layout/layout_theme.h" #include "third_party/blink/renderer/core/paint/file_upload_control_painter.h" #include "third_party/blink/renderer/platform/fonts/font.h" #include "third_party/blink/renderer/platform/fonts/string_truncator.h" #include "third_party/blink/renderer/platform/text/text_run.h" namespace blink { const int kButtonShadowHeight = 2; LayoutFileUploadControl::LayoutFileUploadControl(Element* input) : LayoutBlockFlow(input) { DCHECK_EQ(To(input)->type(), input_type_names::kFile); } LayoutFileUploadControl::~LayoutFileUploadControl() = default; bool LayoutFileUploadControl::IsChildAllowed(LayoutObject* child, const ComputedStyle& style) const { const Node* child_node = child->GetNode(); // Reject shadow nodes other than UploadButton. if (child_node && child_node->OwnerShadowHost() == GetNode() && child_node != UploadButton()) return false; return LayoutBlockFlow::IsChildAllowed(child, style); } int LayoutFileUploadControl::MaxFilenameWidth() const { int upload_button_width = (UploadButton() && UploadButton()->GetLayoutBox()) ? UploadButton()->GetLayoutBox()->PixelSnappedWidth() : 0; return std::max(0, PhysicalContentBoxRect().PixelSnappedWidth() - upload_button_width - kAfterButtonSpacing); } void LayoutFileUploadControl::PaintObject( const PaintInfo& paint_info, const PhysicalOffset& paint_offset) const { FileUploadControlPainter(*this).PaintObject(paint_info, paint_offset); } HTMLInputElement* LayoutFileUploadControl::UploadButton() const { return To(GetNode())->UploadButton(); } String LayoutFileUploadControl::FileTextValue() const { int width = MaxFilenameWidth(); if (width <= 0) return String(); auto* input = To(GetNode()); DCHECK(input->files()); String text = input->FileStatusText(); if (input->files()->length() >= 2) return StringTruncator::RightTruncate(text, width, StyleRef().GetFont()); return StringTruncator::CenterTruncate(text, width, StyleRef().GetFont()); } // Override to allow effective clip rect to be bigger than the padding box // because of kButtonShadowHeight. PhysicalRect LayoutFileUploadControl::OverflowClipRect( const PhysicalOffset& additional_offset, OverlayScrollbarClipBehavior) const { PhysicalRect rect(additional_offset, Size()); rect.Expand(BorderInsets()); rect.offset.top -= LayoutUnit(kButtonShadowHeight); rect.size.height += LayoutUnit(kButtonShadowHeight) * 2; return rect; } } // namespace blink