blob: 16b0831b6e2f4bd72537678c6d324fd450ff0ced [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "extensions/renderer/extension_injection_host.h"
#include "content/public/renderer/render_frame.h"
#include "extensions/common/constants.h"
#include "extensions/common/extension_set.h"
#include "extensions/common/manifest_handlers/csp_info.h"
#include "third_party/WebKit/public/platform/WebSecurityOrigin.h"
#include "third_party/WebKit/public/web/WebLocalFrame.h"
namespace extensions {
ExtensionInjectionHost::ExtensionInjectionHost(
const Extension* extension)
: InjectionHost(HostID(HostID::EXTENSIONS, extension->id())),
extension_(extension) {
}
ExtensionInjectionHost::~ExtensionInjectionHost() {
}
// static
scoped_ptr<const InjectionHost> ExtensionInjectionHost::Create(
const std::string& extension_id,
const ExtensionSet* extensions) {
const Extension* extension = extensions->GetByID(extension_id);
if (!extension)
return scoped_ptr<const ExtensionInjectionHost>();
return scoped_ptr<const ExtensionInjectionHost>(
new ExtensionInjectionHost(extension));
}
std::string ExtensionInjectionHost::GetContentSecurityPolicy() const {
return CSPInfo::GetContentSecurityPolicy(extension_);
}
const GURL& ExtensionInjectionHost::url() const {
return extension_->url();
}
const std::string& ExtensionInjectionHost::name() const {
return extension_->name();
}
PermissionsData::AccessType ExtensionInjectionHost::CanExecuteOnFrame(
const GURL& document_url,
content::RenderFrame* render_frame,
int tab_id,
bool is_declarative) const {
// If we don't have a tab id, we have no UI surface to ask for user consent.
// For now, we treat this as an automatic allow.
if (tab_id == -1)
return PermissionsData::ACCESS_ALLOWED;
blink::WebSecurityOrigin top_frame_security_origin =
render_frame->GetWebFrame()->top()->securityOrigin();
if (top_frame_security_origin.protocol().utf8() == kExtensionScheme &&
top_frame_security_origin.host().utf8() != extension_->id())
return PermissionsData::ACCESS_DENIED;
// Declarative user scripts use "page access" (from "permissions" section in
// manifest) whereas non-declarative user scripts use custom
// "content script access" logic.
if (is_declarative) {
return extension_->permissions_data()->GetPageAccess(
extension_,
document_url,
tab_id,
-1, // no process id
nullptr /* ignore error */);
} else {
return extension_->permissions_data()->GetContentScriptAccess(
extension_,
document_url,
tab_id,
-1, // no process id
nullptr /* ignore error */);
}
}
bool ExtensionInjectionHost::ShouldNotifyBrowserOfInjection() const {
// We notify the browser of any injection if the extension has no withheld
// permissions (i.e., the permissions weren't restricted), but would have
// otherwise been affected by the scripts-require-action feature.
return extension_->permissions_data()->withheld_permissions()->IsEmpty() &&
PermissionsData::ScriptsMayRequireActionForExtension(
extension_,
extension_->permissions_data()->active_permissions().get());
}
} // namespace extensions