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 32namespace blink { 33 34class ContextFeaturesClient; 35class Document; 36class Page; 37 38#if ENABLE(OILPAN) 39class ContextFeatures FINAL : public GarbageCollectedFinalized<ContextFeatures>, public HeapSupplement<Page> { 40 USING_GARBAGE_COLLECTED_MIXIN(ContextFeatures); 41public: 42 typedef HeapSupplement<Page> SupplementType; 43#else 44class ContextFeatures : public RefCountedSupplement<Page, ContextFeatures> { 45public: 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 70private: 71 explicit ContextFeatures(PassOwnPtr<ContextFeaturesClient> client) 72 : m_client(client) 73 { } 74 75 OwnPtr<ContextFeaturesClient> m_client; 76}; 77 78class ContextFeaturesClient { 79 WTF_MAKE_FAST_ALLOCATED; 80public: 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 88void provideContextFeaturesTo(Page&, PassOwnPtr<ContextFeaturesClient>); 89void provideContextFeaturesToDocumentFrom(Document&, Page&); 90 91inline PassRefPtrWillBeRawPtr<ContextFeatures> ContextFeatures::create(PassOwnPtr<ContextFeaturesClient> client) 92{ 93 return adoptRefWillBeNoop(new ContextFeatures(client)); 94} 95 96inline 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 103inline 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