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 "platform/RefCountedSupplement.h" 31 32 namespace blink { 33 34 class ContextFeaturesClient; 35 class Document; 36 class Page; 37 38 #if ENABLE(OILPAN) 39 class ContextFeatures FINAL : public GarbageCollectedFinalized<ContextFeatures>, public HeapSupplement<Page> { 40 USING_GARBAGE_COLLECTED_MIXIN(ContextFeatures); 41 public: 42 typedef HeapSupplement<Page> SupplementType; 43 #else 44 class ContextFeatures : public RefCountedSupplement<Page, ContextFeatures> { 45 public: 46 typedef RefCountedSupplement<Page, ContextFeatures> SupplementType; 47 #endif 48 enum FeatureType { 49 PagePopup = 0, 50 MutationEvents, 51 PushState, 52 FeatureTypeSize // Should be the last entry. 53 }; 54 55 static const char* supplementName(); 56 static ContextFeatures* defaultSwitch(); 57 static PassRefPtrWillBeRawPtr<ContextFeatures> create(PassOwnPtr<ContextFeaturesClient>); 58 59 static bool pagePopupEnabled(Document*); 60 static bool mutationEventsEnabled(Document*); 61 static bool pushStateEnabled(Document*); 62 63 bool isEnabled(Document*, FeatureType, bool) const; 64 void urlDidChange(Document*); 65 66 #if ENABLE(OILPAN) 67 virtual void trace(Visitor* visitor) OVERRIDE { HeapSupplement<Page>::trace(visitor); } 68 #endif 69 70 private: 71 explicit ContextFeatures(PassOwnPtr<ContextFeaturesClient> client) 72 : m_client(client) 73 { } 74 75 OwnPtr<ContextFeaturesClient> m_client; 76 }; 77 78 class ContextFeaturesClient { 79 WTF_MAKE_FAST_ALLOCATED; 80 public: 81 static PassOwnPtr<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&, PassOwnPtr<ContextFeaturesClient>); 89 void provideContextFeaturesToDocumentFrom(Document&, Page&); 90 91 inline PassRefPtrWillBeRawPtr<ContextFeatures> ContextFeatures::create(PassOwnPtr<ContextFeaturesClient> client) 92 { 93 return adoptRefWillBeNoop(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 // FIXME: The original code, commented out below, is obviously 106 // wrong, but the seemingly correct fix of negating the test to 107 // the more logical 'if (!m_client)' crashes the renderer. 108 // See issue 294180 109 // 110 // if (m_client) 111 // return; 112 // m_client->urlDidChange(document); 113 } 114 115 } // namespace blink 116 117 #endif // ContextFeatures_h 118