Home | History | Annotate | Download | only in css
      1 /*
      2  * Copyright (C) 2008 Apple 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 COMPUTER, INC. ``AS IS'' AND ANY
     14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
     17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
     21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     24  */
     25 
     26 #ifndef CSSCanvasValue_h
     27 #define CSSCanvasValue_h
     28 
     29 #include "core/css/CSSImageGeneratorValue.h"
     30 #include "core/html/HTMLCanvasElement.h"
     31 
     32 namespace blink {
     33 
     34 class Document;
     35 
     36 class CSSCanvasValue : public CSSImageGeneratorValue {
     37 public:
     38     static PassRefPtrWillBeRawPtr<CSSCanvasValue> create(const String& name)
     39     {
     40         return adoptRefWillBeNoop(new CSSCanvasValue(name));
     41     }
     42     ~CSSCanvasValue();
     43 
     44     String customCSSText() const;
     45 
     46     PassRefPtr<Image> image(RenderObject*, const IntSize&);
     47     bool isFixedSize() const { return true; }
     48     IntSize fixedSize(const RenderObject*);
     49 
     50     bool isPending() const { return false; }
     51     void loadSubimages(ResourceFetcher*) { }
     52 
     53     bool equals(const CSSCanvasValue&) const;
     54 
     55     void traceAfterDispatch(Visitor*);
     56 
     57 private:
     58     explicit CSSCanvasValue(const String& name)
     59         : CSSImageGeneratorValue(CanvasClass)
     60         , m_canvasObserver(adoptPtrWillBeNoop(new CanvasObserverProxy(this)))
     61         , m_name(name)
     62         , m_element(nullptr)
     63     {
     64     }
     65 
     66     // NOTE: We put the CanvasObserver in a member instead of inheriting from it
     67     // to avoid adding a vptr to CSSCanvasValue.
     68     class CanvasObserverProxy FINAL : public NoBaseWillBeGarbageCollected<CanvasObserverProxy>, public CanvasObserver {
     69         WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(CanvasObserverProxy);
     70     public:
     71         explicit CanvasObserverProxy(CSSCanvasValue* ownerValue) : m_ownerValue(ownerValue) { }
     72 
     73         virtual void canvasChanged(HTMLCanvasElement* canvas, const FloatRect& changedRect) OVERRIDE
     74         {
     75             m_ownerValue->canvasChanged(canvas, changedRect);
     76         }
     77         virtual void canvasResized(HTMLCanvasElement* canvas) OVERRIDE
     78         {
     79             m_ownerValue->canvasResized(canvas);
     80         }
     81 #if !ENABLE(OILPAN)
     82         virtual void canvasDestroyed(HTMLCanvasElement* canvas) OVERRIDE
     83         {
     84             m_ownerValue->canvasDestroyed(canvas);
     85         }
     86 #endif
     87         virtual void trace(Visitor* visitor) OVERRIDE
     88         {
     89             visitor->trace(m_ownerValue);
     90             CanvasObserver::trace(visitor);
     91         }
     92 
     93     private:
     94         RawPtrWillBeMember<CSSCanvasValue> m_ownerValue;
     95     };
     96 
     97     void canvasChanged(HTMLCanvasElement*, const FloatRect& changedRect);
     98     void canvasResized(HTMLCanvasElement*);
     99 
    100 #if !ENABLE(OILPAN)
    101     void canvasDestroyed(HTMLCanvasElement*);
    102 #endif
    103 
    104     HTMLCanvasElement* element(Document*);
    105 
    106     OwnPtrWillBeMember<CanvasObserverProxy> m_canvasObserver;
    107 
    108     // The name of the canvas.
    109     String m_name;
    110     // The document supplies the element and owns it.
    111     RawPtrWillBeWeakMember<HTMLCanvasElement> m_element;
    112 };
    113 
    114 DEFINE_CSS_VALUE_TYPE_CASTS(CSSCanvasValue, isCanvasValue());
    115 
    116 } // namespace blink
    117 
    118 #endif // CSSCanvasValue_h
    119