blob: 0e1541c6ac90587791815115da02759be547f165 [file] [log] [blame]
// Copyright 2016 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef COBALT_DOM_CSP_DELEGATE_FACTORY_H_
#define COBALT_DOM_CSP_DELEGATE_FACTORY_H_
#include <memory>
#include <string>
#include "base/callback_forward.h"
#include "base/gtest_prod_util.h"
#include "base/memory/singleton.h"
#include "cobalt/csp/content_security_policy.h"
#include "cobalt/dom/csp_delegate_type.h"
#include "url/gurl.h"
namespace cobalt {
namespace browser {
class BrowserModule;
class DebugConsole;
class SplashScreen;
} // namespace browser
namespace dom {
class CspDelegate;
class CspViolationReporter;
class CspDelegateFactory {
public:
static CspDelegateFactory* GetInstance();
std::unique_ptr<CspDelegate> Create(
CspEnforcementType type,
std::unique_ptr<CspViolationReporter> violation_reporter, const GURL& url,
csp::CSPHeaderPolicy require_csp,
const base::Closure& policy_changed_callback,
int insecure_allowed_token = 0);
typedef CspDelegate* (*CspDelegateCreator)(
std::unique_ptr<CspViolationReporter> violation_reporter, const GURL& url,
csp::CSPHeaderPolicy require_csp,
const base::Closure& policy_changed_callback, int insecure_allowed_token);
#if !defined(COBALT_FORCE_CSP)
// Allow tests to have the factory create a different delegate type.
void OverrideCreator(CspEnforcementType type, CspDelegateCreator creator);
#endif
private:
#if !defined(COBALT_FORCE_CSP)
// By default it's not possible to create an insecure CspDelegate. To allow
// this, get a token using |GetInsecureAllowedToken| and pass into
// CspDelegateFactory::Create().
static int GetInsecureAllowedToken();
// Only these classes may create insecure Csp delegates. Be careful
// before adding new ones.
friend class browser::DebugConsole;
FRIEND_TEST(CspDelegateFactoryTest, InsecureAllowed);
// Permit setting --csp_mode=disable on the command line.
friend class browser::BrowserModule;
#endif
CspDelegateFactory();
static bool SetInsecureAllowed(bool allowed);
CspDelegateCreator method_[kCspEnforcementCount];
friend struct base::DefaultSingletonTraits<CspDelegateFactory>;
DISALLOW_COPY_AND_ASSIGN(CspDelegateFactory);
};
} // namespace dom
} // namespace cobalt
#endif // COBALT_DOM_CSP_DELEGATE_FACTORY_H_