Home | History | Annotate | Download | only in shadow
      1 /*
      2  * Copyright (C) 2013 Google Inc. All rights reserved.
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions
      6  * are met:
      7  * 1.  Redistributions of source code must retain the above copyright
      8  *     notice, this list of conditions and the following disclaimer.
      9  * 2.  Redistributions in binary form must reproduce the above copyright
     10  *     notice, this list of conditions and the following disclaimer in the
     11  *     documentation and/or other materials provided with the distribution.
     12  *
     13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND
     14  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     16  * ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE
     17  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     18  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
     19  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
     20  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     21  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     22  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     23  * SUCH DAMAGE.
     24  */
     25 
     26 #include "config.h"
     27 #include "core/html/shadow/ClearButtonElement.h"
     28 
     29 #include "core/events/MouseEvent.h"
     30 #include "core/frame/LocalFrame.h"
     31 #include "core/html/shadow/ShadowElementNames.h"
     32 #include "core/page/EventHandler.h"
     33 #include "core/rendering/RenderView.h"
     34 
     35 namespace blink {
     36 
     37 using namespace HTMLNames;
     38 
     39 inline ClearButtonElement::ClearButtonElement(Document& document, ClearButtonOwner& clearButtonOwner)
     40     : HTMLDivElement(document)
     41     , m_clearButtonOwner(&clearButtonOwner)
     42     , m_capturing(false)
     43 {
     44 }
     45 
     46 PassRefPtrWillBeRawPtr<ClearButtonElement> ClearButtonElement::create(Document& document, ClearButtonOwner& clearButtonOwner)
     47 {
     48     RefPtrWillBeRawPtr<ClearButtonElement> element = adoptRefWillBeNoop(new ClearButtonElement(document, clearButtonOwner));
     49     element->setShadowPseudoId(AtomicString("-webkit-clear-button", AtomicString::ConstructFromLiteral));
     50     element->setAttribute(idAttr, ShadowElementNames::clearButton());
     51     return element.release();
     52 }
     53 
     54 void ClearButtonElement::detach(const AttachContext& context)
     55 {
     56     if (m_capturing) {
     57         if (LocalFrame* frame = document().frame())
     58             frame->eventHandler().setCapturingMouseEventsNode(nullptr);
     59     }
     60     HTMLDivElement::detach(context);
     61 }
     62 
     63 void ClearButtonElement::releaseCapture()
     64 {
     65     if (!m_capturing)
     66         return;
     67 
     68     if (LocalFrame* frame = document().frame()) {
     69         frame->eventHandler().setCapturingMouseEventsNode(nullptr);
     70         m_capturing = false;
     71     }
     72 }
     73 
     74 void ClearButtonElement::defaultEventHandler(Event* event)
     75 {
     76     if (!m_clearButtonOwner) {
     77         if (!event->defaultHandled())
     78             HTMLDivElement::defaultEventHandler(event);
     79         return;
     80     }
     81 
     82     if (!m_clearButtonOwner->shouldClearButtonRespondToMouseEvents()) {
     83         if (!event->defaultHandled())
     84             HTMLDivElement::defaultEventHandler(event);
     85         return;
     86     }
     87 
     88     if (event->type() == EventTypeNames::mousedown && event->isMouseEvent() && toMouseEvent(event)->button() == LeftButton) {
     89         if (renderer() && renderer()->visibleToHitTesting()) {
     90             if (LocalFrame* frame = document().frame()) {
     91                 frame->eventHandler().setCapturingMouseEventsNode(this);
     92                 m_capturing = true;
     93             }
     94         }
     95         m_clearButtonOwner->focusAndSelectClearButtonOwner();
     96         event->setDefaultHandled();
     97     }
     98     if (event->type() == EventTypeNames::mouseup && event->isMouseEvent() && toMouseEvent(event)->button() == LeftButton) {
     99         if (m_capturing) {
    100             if (LocalFrame* frame = document().frame()) {
    101                 frame->eventHandler().setCapturingMouseEventsNode(nullptr);
    102                 m_capturing = false;
    103             }
    104             if (hovered()) {
    105                 m_clearButtonOwner->clearValue();
    106                 event->setDefaultHandled();
    107             }
    108         }
    109     }
    110 
    111     if (!event->defaultHandled())
    112         HTMLDivElement::defaultEventHandler(event);
    113 }
    114 
    115 bool ClearButtonElement::isClearButtonElement() const
    116 {
    117     return true;
    118 }
    119 
    120 void ClearButtonElement::trace(Visitor* visitor)
    121 {
    122     visitor->trace(m_clearButtonOwner);
    123     HTMLDivElement::trace(visitor);
    124 }
    125 
    126 }
    127