15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2011 Google, Inc. All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met:
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer.
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer in the
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    documentation and/or other materials provided with the distribution.
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY GOOGLE INC. ``AS IS'' AND ANY
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef ContentSecurityPolicy_h
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define ContentSecurityPolicy_h
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/ScriptState.h"
305d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/dom/ExecutionContext.h"
31c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "core/frame/ConsoleTypes.h"
32d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "platform/network/ContentSecurityPolicyParsers.h"
331e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/network/HTTPParsers.h"
3409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "platform/weborigin/ReferrerPolicy.h"
353c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch#include "wtf/HashSet.h"
36591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/PassOwnPtr.h"
37d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "wtf/PassRefPtr.h"
38d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "wtf/RefCounted.h"
39591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/Vector.h"
403c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch#include "wtf/text/StringHash.h"
41591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/text/TextPosition.h"
42591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/text/WTFString.h"
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WTF {
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class OrdinalNumber;
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
48c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
50f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)class ContentSecurityPolicyResponseHeaders;
517242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclass ConsoleMessage;
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class CSPDirectiveList;
537242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclass CSPSource;
54197021e6b966cfb06891637935ef33fff06433d1Ben Murdochclass Document;
55521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)class KURL;
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class SecurityOrigin;
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)typedef int SandboxFlags;
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)typedef Vector<OwnPtr<CSPDirectiveList> > CSPDirectiveListVector;
607242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccitypedef WillBePersistentHeapVector<RefPtrWillBeMember<ConsoleMessage> > ConsoleMessageVector;
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
62d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)class ContentSecurityPolicy : public RefCounted<ContentSecurityPolicy> {
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WTF_MAKE_FAST_ALLOCATED;
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
65d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // CSP 1.0 Directives
66d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    static const char ConnectSrc[];
67d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    static const char DefaultSrc[];
68d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    static const char FontSrc[];
69d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    static const char FrameSrc[];
70d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    static const char ImgSrc[];
71d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    static const char MediaSrc[];
72d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    static const char ObjectSrc[];
73d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    static const char ReportURI[];
74d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    static const char Sandbox[];
75d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    static const char ScriptSrc[];
76d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    static const char StyleSrc[];
77d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
78d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // CSP 1.1 Directives
79d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    static const char BaseURI[];
80d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    static const char ChildSrc[];
81d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    static const char FormAction[];
82d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    static const char FrameAncestors[];
83d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    static const char PluginTypes[];
84d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    static const char ReflectedXSS[];
85d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    static const char Referrer[];
86d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
877242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    enum ReportingStatus {
887242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        SendReport,
897242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        SuppressReport
907242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    };
917242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
927242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    static PassRefPtr<ContentSecurityPolicy> create()
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
947242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return adoptRef(new ContentSecurityPolicy());
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ~ContentSecurityPolicy();
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
987242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void bindToExecutionContext(ExecutionContext*);
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void copyStateFrom(const ContentSecurityPolicy*);
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    void didReceiveHeaders(const ContentSecurityPolicyResponseHeaders&);
102d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    void didReceiveHeader(const String&, ContentSecurityPolicyHeaderType, ContentSecurityPolicyHeaderSource);
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // These functions are wrong because they assume that there is only one header.
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: Replace them with functions that return vectors.
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const String& deprecatedHeader() const;
107d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ContentSecurityPolicyHeaderType deprecatedHeaderType() const;
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool allowJavaScriptURLs(const String& contextURL, const WTF::OrdinalNumber& contextLine, ReportingStatus = SendReport) const;
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool allowInlineEventHandlers(const String& contextURL, const WTF::OrdinalNumber& contextLine, ReportingStatus = SendReport) const;
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool allowInlineScript(const String& contextURL, const WTF::OrdinalNumber& contextLine, ReportingStatus = SendReport) const;
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool allowInlineStyle(const String& contextURL, const WTF::OrdinalNumber& contextLine, ReportingStatus = SendReport) const;
113d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    bool allowEval(ScriptState* = 0, ReportingStatus = SendReport) const;
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool allowPluginType(const String& type, const String& typeAttribute, const KURL&, ReportingStatus = SendReport) const;
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool allowScriptFromSource(const KURL&, ReportingStatus = SendReport) const;
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool allowObjectFromSource(const KURL&, ReportingStatus = SendReport) const;
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool allowChildFrameFromSource(const KURL&, ReportingStatus = SendReport) const;
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool allowImageFromSource(const KURL&, ReportingStatus = SendReport) const;
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool allowStyleFromSource(const KURL&, ReportingStatus = SendReport) const;
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool allowFontFromSource(const KURL&, ReportingStatus = SendReport) const;
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool allowMediaFromSource(const KURL&, ReportingStatus = SendReport) const;
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool allowConnectToSource(const KURL&, ReportingStatus = SendReport) const;
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool allowFormAction(const KURL&, ReportingStatus = SendReport) const;
12553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    bool allowBaseURI(const KURL&, ReportingStatus = SendReport) const;
1267242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    bool allowAncestors(LocalFrame*, const KURL&, ReportingStatus = SendReport) const;
12709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    bool allowChildContextFromSource(const KURL&, ReportingStatus = SendReport) const;
12809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    bool allowWorkerContextFromSource(const KURL&, ReportingStatus = SendReport) const;
12909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
130f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    // The nonce and hash allow functions are guaranteed to not have any side
131f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    // effects, including reporting.
132197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // Nonce/Hash functions check all policies relating to use of a script/style
133197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // with the given nonce/hash and return true all CSP policies allow it.
134197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // If these return true, callers can then process the content or
135197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // issue a load and be safe disabling any further CSP checks.
136197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    bool allowScriptWithNonce(const String& nonce) const;
137197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    bool allowStyleWithNonce(const String& nonce) const;
138197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    bool allowScriptWithHash(const String& source) const;
139197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    bool allowStyleWithHash(const String& source) const;
140f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)
141d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    void usesScriptHashAlgorithms(uint8_t ContentSecurityPolicyHashAlgorithm);
142d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    void usesStyleHashAlgorithms(uint8_t ContentSecurityPolicyHashAlgorithm);
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
144926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ReflectedXSSDisposition reflectedXSSDisposition() const;
145926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
14609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    ReferrerPolicy referrerPolicy() const;
14709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    bool didSetReferrerPolicy() const;
14809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setOverrideAllowInlineStyle(bool);
1507242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void setOverrideURLForSelf(const KURL&);
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isActive() const;
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1547242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // If a frame is passed in, the message will be logged to its active document's console.
1557242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // Otherwise, the message will be logged to this object's |m_executionContext|.
1567242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void logToConsole(PassRefPtrWillBeRawPtr<ConsoleMessage>, LocalFrame* = 0);
1577242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1587242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void reportDirectiveAsSourceExpression(const String& directiveName, const String& sourceExpression);
1597242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void reportDuplicateDirective(const String&);
1607242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void reportInvalidDirectiveValueCharacter(const String& directiveName, const String& value);
1617242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void reportInvalidPathCharacter(const String& directiveName, const String& value, const char);
1627242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void reportInvalidPluginTypes(const String&);
1637242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void reportInvalidSandboxFlags(const String&);
1647242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void reportInvalidSourceExpression(const String& directiveName, const String& source);
1657242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void reportInvalidReflectedXSS(const String&);
1667242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void reportMissingReportURI(const String&);
1677242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void reportUnsupportedDirective(const String&);
1687242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void reportInvalidInReportOnly(const String&);
1697242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void reportInvalidReferrer(const String&);
1707242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void reportReportOnlyInMeta(const String&);
1717242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void reportMetaOutsideHead(const String&);
1727242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1737242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // If a frame is passed in, the report will be sent using it as a context. If no frame is
1747242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // passed in, the report will be sent via this object's |m_executionContext| (or dropped
1757242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // on the floor if no such context is available).
1767242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void reportViolation(const String& directiveText, const String& effectiveDirective, const String& consoleMessage, const KURL& blockedURL, const Vector<String>& reportEndpoints, const String& header, LocalFrame* = 0);
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void reportBlockedScriptExecutionToInspector(const String& directiveText) const;
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
180f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    const KURL url() const;
1817242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void enforceSandboxFlags(SandboxFlags);
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String evalDisabledErrorMessage() const;
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1847242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    bool urlMatchesSelf(const KURL&) const;
1857242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    bool protocolMatchesSelf(const KURL&) const;
1867242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
187926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool experimentalFeaturesEnabled() const;
188926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1891e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    static bool shouldBypassMainWorld(ExecutionContext*);
190e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)
191d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    static bool isDirectiveName(const String&);
192d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
1947242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    ContentSecurityPolicy();
1957242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1967242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void applyPolicySideEffectsToExecutionContext();
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
198197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    Document* document() const;
1997242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    SecurityOrigin* securityOrigin() const;
2007242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    KURL completeURL(const String&) const;
201197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
2027242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void logToConsole(const String& message, MessageLevel = ErrorMessageLevel);
203d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    void addPolicyFromHeaderValue(const String&, ContentSecurityPolicyHeaderType, ContentSecurityPolicyHeaderSource);
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2053c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    bool shouldSendViolationReport(const String&) const;
2063c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    void didSendViolationReport(const String&);
2073c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch
2085d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    ExecutionContext* m_executionContext;
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool m_overrideInlineStyleAllowed;
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CSPDirectiveListVector m_policies;
2117242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    ConsoleMessageVector m_consoleMessages;
2123c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch
2133c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    HashSet<unsigned, AlreadyHashed> m_violationReportsSent;
214f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)
215f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    // We put the hash functions used on the policy object so that we only need
21609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // to calculate a hash once and then distribute it to all of the directives
21709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // for validation.
21809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    uint8_t m_scriptHashAlgorithmsUsed;
21909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    uint8_t m_styleHashAlgorithmsUsed;
2207242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
2217242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // State flags used to configure the environment after parsing a policy.
2227242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    SandboxFlags m_sandboxMask;
2237242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    ReferrerPolicy m_referrerPolicy;
2247242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    String m_disableEvalErrorMessage;
2257242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
2267242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    OwnPtr<CSPSource> m_selfSource;
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
232