1926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)/* 2926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * Copyright (C) 2013 Google Inc. All rights reserved. 3926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * 4926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * Redistribution and use in source and binary forms, with or without 5926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * modification, are permitted provided that the following conditions 6926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * are met: 7926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * 1. Redistributions of source code must retain the above copyright 8926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * notice, this list of conditions and the following disclaimer. 9926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright 10926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * notice, this list of conditions and the following disclaimer in the 11926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * documentation and/or other materials provided with the distribution. 12926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * 13926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND 14926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 16926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE 17926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 18926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 19926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 20926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 21926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 22926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 23926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * SUCH DAMAGE. 24926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) */ 25926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 26926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#include "config.h" 2753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/shadow/ClearButtonElement.h" 28926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 2906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)#include "core/events/MouseEvent.h" 30d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/frame/LocalFrame.h" 315267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "core/html/shadow/ShadowElementNames.h" 3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/EventHandler.h" 3353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderView.h" 34926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 35c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 36926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 37926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)using namespace HTMLNames; 38926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 398abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)inline ClearButtonElement::ClearButtonElement(Document& document, ClearButtonOwner& clearButtonOwner) 4051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) : HTMLDivElement(document) 41926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) , m_clearButtonOwner(&clearButtonOwner) 42926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) , m_capturing(false) 43926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 44926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 45926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 46323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)PassRefPtrWillBeRawPtr<ClearButtonElement> ClearButtonElement::create(Document& document, ClearButtonOwner& clearButtonOwner) 47926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 485d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) RefPtrWillBeRawPtr<ClearButtonElement> element = adoptRefWillBeNoop(new ClearButtonElement(document, clearButtonOwner)); 4909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) element->setShadowPseudoId(AtomicString("-webkit-clear-button", AtomicString::ConstructFromLiteral)); 50521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) element->setAttribute(idAttr, ShadowElementNames::clearButton()); 51521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) return element.release(); 52926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 53926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 54521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)void ClearButtonElement::detach(const AttachContext& context) 55926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 56926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (m_capturing) { 57d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (LocalFrame* frame = document().frame()) 58d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) frame->eventHandler().setCapturingMouseEventsNode(nullptr); 59926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 60521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) HTMLDivElement::detach(context); 61926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 62926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 63926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void ClearButtonElement::releaseCapture() 64926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 65926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!m_capturing) 66926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return; 67926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 68d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (LocalFrame* frame = document().frame()) { 69d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) frame->eventHandler().setCapturingMouseEventsNode(nullptr); 70926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_capturing = false; 71926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 72926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 73926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 74926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void ClearButtonElement::defaultEventHandler(Event* event) 75926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 76926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!m_clearButtonOwner) { 77926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!event->defaultHandled()) 78926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) HTMLDivElement::defaultEventHandler(event); 79926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return; 80926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 81926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 82926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!m_clearButtonOwner->shouldClearButtonRespondToMouseEvents()) { 83926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!event->defaultHandled()) 84926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) HTMLDivElement::defaultEventHandler(event); 85926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return; 86926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 87926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 881e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) if (event->type() == EventTypeNames::mousedown && event->isMouseEvent() && toMouseEvent(event)->button() == LeftButton) { 89926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (renderer() && renderer()->visibleToHitTesting()) { 90d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (LocalFrame* frame = document().frame()) { 91f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) frame->eventHandler().setCapturingMouseEventsNode(this); 92926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_capturing = true; 93926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 94926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 95926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_clearButtonOwner->focusAndSelectClearButtonOwner(); 96926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) event->setDefaultHandled(); 97926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 981e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) if (event->type() == EventTypeNames::mouseup && event->isMouseEvent() && toMouseEvent(event)->button() == LeftButton) { 99926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (m_capturing) { 100d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (LocalFrame* frame = document().frame()) { 101d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) frame->eventHandler().setCapturingMouseEventsNode(nullptr); 102926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_capturing = false; 103926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 104926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (hovered()) { 105926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_clearButtonOwner->clearValue(); 106926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) event->setDefaultHandled(); 107926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 108926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 109926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 110926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 111926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!event->defaultHandled()) 112926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) HTMLDivElement::defaultEventHandler(event); 113926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 114926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 1155267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)bool ClearButtonElement::isClearButtonElement() const 1165267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles){ 1175267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return true; 1185267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)} 1195267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 120323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)void ClearButtonElement::trace(Visitor* visitor) 121323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles){ 122323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) visitor->trace(m_clearButtonOwner); 123323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) HTMLDivElement::trace(visitor); 124323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)} 125323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 126926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 127