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 #ifndef ContextFeatures_h 28 #define ContextFeatures_h 29 30 #include "core/platform/RefCountedSupplement.h" 31 32 namespace WebCore { 33 34 class ContextFeaturesClient; 35 class Document; 36 class Page; 37 38 class ContextFeatures : public RefCountedSupplement<Page, ContextFeatures> { 39 public: 40 enum FeatureType { 41 DialogElement = 0, 42 StyleScoped, 43 PagePopup, 44 MutationEvents, 45 PushState, 46 FeatureTypeSize // Should be the last entry. 47 }; 48 49 static const char* supplementName(); 50 static ContextFeatures* defaultSwitch(); 51 static PassRefPtr<ContextFeatures> create(ContextFeaturesClient*); 52 53 static bool dialogElementEnabled(Document*); 54 static bool styleScopedEnabled(Document*); 55 static bool pagePopupEnabled(Document*); 56 static bool mutationEventsEnabled(Document*); 57 static bool pushStateEnabled(Document*); 58 59 bool isEnabled(Document*, FeatureType, bool) const; 60 void urlDidChange(Document*); 61 62 private: 63 explicit ContextFeatures(ContextFeaturesClient* client) 64 : m_client(client) 65 { } 66 67 virtual void hostDestroyed() OVERRIDE; 68 69 ContextFeaturesClient* m_client; 70 }; 71 72 inline void ContextFeatures::hostDestroyed() 73 { 74 m_client = 0; 75 } 76 77 78 class ContextFeaturesClient { 79 WTF_MAKE_FAST_ALLOCATED; 80 public: 81 static ContextFeaturesClient* empty(); 82 83 virtual ~ContextFeaturesClient() { } 84 virtual bool isEnabled(Document*, ContextFeatures::FeatureType, bool defaultValue) { return defaultValue; } 85 virtual void urlDidChange(Document*) { } 86 }; 87 88 void provideContextFeaturesTo(Page*, ContextFeaturesClient*); 89 void provideContextFeaturesToDocumentFrom(Document*, Page*); 90 91 inline PassRefPtr<ContextFeatures> ContextFeatures::create(ContextFeaturesClient* client) 92 { 93 return adoptRef(new ContextFeatures(client)); 94 } 95 96 inline bool ContextFeatures::isEnabled(Document* document, FeatureType type, bool defaultValue) const 97 { 98 if (!m_client) 99 return defaultValue; 100 return m_client->isEnabled(document, type, defaultValue); 101 } 102 103 inline void ContextFeatures::urlDidChange(Document* document) 104 { 105 if (m_client) 106 return; 107 m_client->urlDidChange(document); 108 } 109 110 } // namespace WebCore 111 112 #endif // ContextFeatures_h 113