1/*
2 * Copyright (C) 2013 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 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 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 PluginReplacement_h
27#define PluginReplacement_h
28
29#include "RenderPtr.h"
30#include <wtf/RefCounted.h>
31#include <wtf/text/WTFString.h>
32
33namespace JSC {
34class JSObject;
35}
36
37namespace WebCore {
38
39class HTMLPlugInElement;
40class RenderElement;
41class RenderStyle;
42class ShadowRoot;
43class URL;
44
45class PluginReplacement : public RefCounted<PluginReplacement> {
46public:
47    virtual ~PluginReplacement() { }
48
49    virtual bool installReplacement(ShadowRoot*) = 0;
50    virtual JSC::JSObject* scriptObject() { return 0; }
51
52    virtual bool willCreateRenderer() { return false; }
53    virtual RenderPtr<RenderElement> createElementRenderer(HTMLPlugInElement&, PassRef<RenderStyle>) = 0;
54
55protected:
56    PluginReplacement() { }
57};
58
59typedef PassRefPtr<PluginReplacement> (*CreatePluginReplacement)(HTMLPlugInElement&, const Vector<String>& paramNames, const Vector<String>& paramValues);
60typedef bool (*PluginReplacementSupportsType)(const String&);
61typedef bool (*PluginReplacementSupportsFileExtension)(const String&);
62typedef bool (*PluginReplacementSupportsURL)(const URL&);
63
64class ReplacementPlugin {
65public:
66    ReplacementPlugin(CreatePluginReplacement constructor, PluginReplacementSupportsType supportsType, PluginReplacementSupportsFileExtension supportsFileExtension, PluginReplacementSupportsURL supportsURL)
67        : m_constructor(constructor)
68        , m_supportsType(supportsType)
69        , m_supportsFileExtension(supportsFileExtension)
70        , m_supportsURL(supportsURL)
71    {
72    }
73
74    explicit ReplacementPlugin(const ReplacementPlugin& other)
75        : m_constructor(other.m_constructor)
76        , m_supportsType(other.m_supportsType)
77        , m_supportsFileExtension(other.m_supportsFileExtension)
78        , m_supportsURL(other.m_supportsURL)
79    {
80    }
81
82    PassRefPtr<PluginReplacement> create(HTMLPlugInElement& element, const Vector<String>& paramNames, const Vector<String>& paramValues) const { return m_constructor(element, paramNames, paramValues); }
83    bool supportsType(const String& mimeType) const { return m_supportsType(mimeType); }
84    bool supportsFileExtension(const String& extension) const { return m_supportsFileExtension(extension); }
85    bool supportsURL(const URL& url) const { return m_supportsURL(url); }
86
87private:
88    CreatePluginReplacement m_constructor;
89    PluginReplacementSupportsType m_supportsType;
90    PluginReplacementSupportsFileExtension m_supportsFileExtension;
91    PluginReplacementSupportsURL m_supportsURL;
92};
93
94typedef void (*PluginReplacementRegistrar)(const ReplacementPlugin&);
95
96}
97
98#endif
99