15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/** 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2006, 2007, 2010 Apple Inc. All rights reserved. 302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch * (C) 2008 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/) 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2010 Google Inc. All rights reserved. 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Library General Public 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2 of the License, or (at your option) any later version. 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful, 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Library General Public License for more details. 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * along with this library; see the file COPYING.LIB. If not, write to 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02110-1301, USA. 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 2553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderSearchField.h" 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 27e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#include "core/dom/shadow/ShadowRoot.h" 2853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLInputElement.h" 293c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch#include "core/html/shadow/ShadowElementNames.h" 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace std; 325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore { 345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace HTMLNames; 365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// ---------------------------- 385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 39521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)RenderSearchField::RenderSearchField(HTMLInputElement* element) 40926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) : RenderTextControlSingleLine(element) 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 42521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) ASSERT(element->isSearchField()); 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)RenderSearchField::~RenderSearchField() 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 493c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdochinline Element* RenderSearchField::searchDecorationElement() const 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 51e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) return inputElement()->userAgentShadowRoot()->getElementById(ShadowElementNames::searchDecoration()); 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 543c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdochinline Element* RenderSearchField::cancelButtonElement() const 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 56e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) return inputElement()->userAgentShadowRoot()->getElementById(ShadowElementNames::clearButton()); 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 59926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)LayoutUnit RenderSearchField::computeControlLogicalHeight(LayoutUnit lineHeight, LayoutUnit nonContentHeight) const 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 613c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch Element* searchDecoration = searchDecorationElement(); 6281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) if (RenderBox* decorationRenderer = searchDecoration ? searchDecoration->renderBox() : 0) { 6381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) decorationRenderer->updateLogicalHeight(); 6481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) nonContentHeight = max(nonContentHeight, decorationRenderer->borderAndPaddingLogicalHeight() + decorationRenderer->marginLogicalHeight()); 6581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) lineHeight = max(lineHeight, decorationRenderer->logicalHeight()); 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 673c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch Element* cancelButton = cancelButtonElement(); 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (RenderBox* cancelRenderer = cancelButton ? cancelButton->renderBox() : 0) { 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) cancelRenderer->updateLogicalHeight(); 70926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) nonContentHeight = max(nonContentHeight, cancelRenderer->borderAndPaddingLogicalHeight() + cancelRenderer->marginLogicalHeight()); 71926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) lineHeight = max(lineHeight, cancelRenderer->logicalHeight()); 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return lineHeight + nonContentHeight; 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 77926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)LayoutUnit RenderSearchField::computeLogicalHeightLimit() const 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 79926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return logicalHeight(); 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RenderSearchField::centerContainerIfNeeded(RenderBox* containerRenderer) const 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!containerRenderer) 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 87926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (containerRenderer->logicalHeight() <= contentLogicalHeight()) 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // A quirk for find-in-page box on Safari Windows. 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // http://webkit.org/b/63157 92926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) LayoutUnit logicalHeightDiff = containerRenderer->logicalHeight() - contentLogicalHeight(); 93926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) containerRenderer->setLogicalTop(containerRenderer->logicalTop() - (logicalHeightDiff / 2 + layoutMod(logicalHeightDiff, 2))); 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 97