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