1/*
2 * Copyright (C) 2012 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 are
6 * met:
7 *
8 *     * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 *     * Neither the name of Google Inc. nor the names of its
11 * contributors may be used to endorse or promote products derived from
12 * this software without specific prior written permission.
13 *
14 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
15 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
16 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
17 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
18 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
19 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
20 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 */
26
27#include "config.h"
28#include "ContextFeatures.h"
29
30#include "Document.h"
31#include "Page.h"
32#include "RuntimeEnabledFeatures.h"
33
34namespace WebCore {
35
36ContextFeaturesClient* ContextFeaturesClient::empty()
37{
38    DEFINE_STATIC_LOCAL(ContextFeaturesClient, empty, ());
39    return ∅
40}
41
42const char* ContextFeatures::supplementName()
43{
44    return "ContextFeatures";
45}
46
47ContextFeatures* ContextFeatures::defaultSwitch()
48{
49    DEFINE_STATIC_LOCAL(RefPtr<ContextFeatures>, instance, (ContextFeatures::create(ContextFeaturesClient::empty())));
50    return instance.get();
51}
52
53bool ContextFeatures::dialogElementEnabled(Document* document)
54{
55#if ENABLE(DIALOG_ELEMENT)
56    if (!document)
57        return RuntimeEnabledFeatures::dialogElementEnabled();
58    return document->contextFeatures()->isEnabled(document, DialogElement, RuntimeEnabledFeatures::dialogElementEnabled());
59#else
60    UNUSED_PARAM(document);
61    return false;
62#endif
63}
64
65bool ContextFeatures::styleScopedEnabled(Document* document)
66{
67#if ENABLE(STYLE_SCOPED)
68    if (!document)
69        return RuntimeEnabledFeatures::styleScopedEnabled();
70    return document->contextFeatures()->isEnabled(document, StyleScoped, RuntimeEnabledFeatures::styleScopedEnabled());
71#else
72    UNUSED_PARAM(document);
73    return false;
74#endif
75}
76
77bool ContextFeatures::htmlNotificationsEnabled(Document* document)
78{
79#if ENABLE(LEGACY_NOTIFICATIONS)
80    if (!document)
81        return false;
82    return document->contextFeatures()->isEnabled(document, HTMLNotifications, false);
83#else
84    UNUSED_PARAM(document);
85    return false;
86#endif
87}
88
89bool ContextFeatures::mutationEventsEnabled(Document* document)
90{
91    ASSERT(document);
92    if (!document)
93        return true;
94    return document->contextFeatures()->isEnabled(document, MutationEvents, true);
95}
96
97bool ContextFeatures::pushStateEnabled(Document* document)
98{
99    return document->contextFeatures()->isEnabled(document, PushState, true);
100}
101
102void provideContextFeaturesTo(Page* page, ContextFeaturesClient* client)
103{
104    RefCountedSupplement<Page, ContextFeatures>::provideTo(page, ContextFeatures::supplementName(), ContextFeatures::create(client));
105}
106
107void provideContextFeaturesToDocumentFrom(Document* document, Page* page)
108{
109    ContextFeatures* provided = static_cast<ContextFeatures*>(RefCountedSupplement<Page, ContextFeatures>::from(page, ContextFeatures::supplementName()));
110    if (!provided)
111        return;
112    document->setContextFeatures(provided);
113}
114
115}
116