| Index: extensions/renderer/user_script_slave.cc
|
| diff --git a/extensions/renderer/user_script_slave.cc b/extensions/renderer/user_script_slave.cc
|
| deleted file mode 100644
|
| index 7e465c65d4e294b37e14444e12633c2cc2d076c6..0000000000000000000000000000000000000000
|
| --- a/extensions/renderer/user_script_slave.cc
|
| +++ /dev/null
|
| @@ -1,298 +0,0 @@
|
| -// Copyright 2014 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/user_script_slave.h"
|
| -
|
| -#include <map>
|
| -
|
| -#include "base/logging.h"
|
| -#include "base/memory/shared_memory.h"
|
| -#include "base/metrics/histogram.h"
|
| -#include "base/pickle.h"
|
| -#include "base/timer/elapsed_timer.h"
|
| -#include "content/public/renderer/render_thread.h"
|
| -#include "content/public/renderer/render_view.h"
|
| -#include "extensions/common/extension.h"
|
| -#include "extensions/common/extension_messages.h"
|
| -#include "extensions/common/extension_set.h"
|
| -#include "extensions/common/manifest_handlers/csp_info.h"
|
| -#include "extensions/common/permissions/permissions_data.h"
|
| -#include "extensions/renderer/extension_helper.h"
|
| -#include "extensions/renderer/extensions_renderer_client.h"
|
| -#include "extensions/renderer/script_context.h"
|
| -#include "third_party/WebKit/public/web/WebFrame.h"
|
| -#include "third_party/WebKit/public/web/WebSecurityOrigin.h"
|
| -#include "third_party/WebKit/public/web/WebSecurityPolicy.h"
|
| -#include "third_party/WebKit/public/web/WebView.h"
|
| -#include "url/gurl.h"
|
| -
|
| -using blink::WebFrame;
|
| -using blink::WebSecurityOrigin;
|
| -using blink::WebSecurityPolicy;
|
| -using blink::WebString;
|
| -using content::RenderThread;
|
| -
|
| -namespace extensions {
|
| -
|
| -int UserScriptSlave::GetIsolatedWorldIdForExtension(const Extension* extension,
|
| - WebFrame* frame) {
|
| - static int g_next_isolated_world_id =
|
| - ExtensionsRendererClient::Get()->GetLowestIsolatedWorldId();
|
| -
|
| - int id = 0;
|
| - IsolatedWorldMap::iterator iter = isolated_world_ids_.find(extension->id());
|
| - if (iter != isolated_world_ids_.end()) {
|
| - id = iter->second;
|
| - } else {
|
| - id = g_next_isolated_world_id++;
|
| - // This map will tend to pile up over time, but realistically, you're never
|
| - // going to have enough extensions for it to matter.
|
| - isolated_world_ids_[extension->id()] = id;
|
| - }
|
| -
|
| - // We need to set the isolated world origin and CSP even if it's not a new
|
| - // world since these are stored per frame, and we might not have used this
|
| - // isolated world in this frame before.
|
| - frame->setIsolatedWorldSecurityOrigin(
|
| - id, WebSecurityOrigin::create(extension->url()));
|
| - frame->setIsolatedWorldContentSecurityPolicy(
|
| - id, WebString::fromUTF8(CSPInfo::GetContentSecurityPolicy(extension)));
|
| -
|
| - return id;
|
| -}
|
| -
|
| -std::string UserScriptSlave::GetExtensionIdForIsolatedWorld(
|
| - int isolated_world_id) {
|
| - for (IsolatedWorldMap::iterator iter = isolated_world_ids_.begin();
|
| - iter != isolated_world_ids_.end();
|
| - ++iter) {
|
| - if (iter->second == isolated_world_id)
|
| - return iter->first;
|
| - }
|
| - return std::string();
|
| -}
|
| -
|
| -void UserScriptSlave::RemoveIsolatedWorld(const std::string& extension_id) {
|
| - isolated_world_ids_.erase(extension_id);
|
| -}
|
| -
|
| -UserScriptSlave::UserScriptSlave(const ExtensionSet* extensions)
|
| - : extensions_(extensions) {
|
| -}
|
| -
|
| -UserScriptSlave::~UserScriptSlave() {
|
| -}
|
| -
|
| -void UserScriptSlave::GetActiveExtensions(
|
| - std::set<std::string>* extension_ids) {
|
| - DCHECK(extension_ids);
|
| - for (ScopedVector<ScriptInjection>::const_iterator iter =
|
| - script_injections_.begin();
|
| - iter != script_injections_.end();
|
| - ++iter) {
|
| - DCHECK(!(*iter)->extension_id().empty());
|
| - extension_ids->insert((*iter)->extension_id());
|
| - }
|
| -}
|
| -
|
| -const Extension* UserScriptSlave::GetExtension(
|
| - const std::string& extension_id) {
|
| - return extensions_->GetByID(extension_id);
|
| -}
|
| -
|
| -bool UserScriptSlave::UpdateScripts(
|
| - base::SharedMemoryHandle shared_memory,
|
| - const std::set<std::string>& changed_extensions) {
|
| - bool only_inject_incognito =
|
| - ExtensionsRendererClient::Get()->IsIncognitoProcess();
|
| -
|
| - // Create the shared memory object (read only).
|
| - shared_memory_.reset(new base::SharedMemory(shared_memory, true));
|
| - if (!shared_memory_.get())
|
| - return false;
|
| -
|
| - // First get the size of the memory block.
|
| - if (!shared_memory_->Map(sizeof(Pickle::Header)))
|
| - return false;
|
| - Pickle::Header* pickle_header =
|
| - reinterpret_cast<Pickle::Header*>(shared_memory_->memory());
|
| -
|
| - // Now map in the rest of the block.
|
| - int pickle_size = sizeof(Pickle::Header) + pickle_header->payload_size;
|
| - shared_memory_->Unmap();
|
| - if (!shared_memory_->Map(pickle_size))
|
| - return false;
|
| -
|
| - // Unpickle scripts.
|
| - uint64 num_scripts = 0;
|
| - Pickle pickle(reinterpret_cast<char*>(shared_memory_->memory()), pickle_size);
|
| - PickleIterator iter(pickle);
|
| - CHECK(pickle.ReadUInt64(&iter, &num_scripts));
|
| -
|
| - // If we pass no explicit extension ids, we should refresh all extensions.
|
| - bool include_all_extensions = changed_extensions.empty();
|
| -
|
| - // If we include all extensions, then we clear the script injections and
|
| - // start from scratch. If not, then clear only the scripts for extension ids
|
| - // that we are updating. This is important to maintain pending script
|
| - // injection state for each ScriptInjection.
|
| - if (include_all_extensions) {
|
| - script_injections_.clear();
|
| - } else {
|
| - for (ScopedVector<ScriptInjection>::iterator iter =
|
| - script_injections_.begin();
|
| - iter != script_injections_.end();) {
|
| - if (changed_extensions.count((*iter)->extension_id()) > 0)
|
| - iter = script_injections_.erase(iter);
|
| - else
|
| - ++iter;
|
| - }
|
| - }
|
| -
|
| - script_injections_.reserve(num_scripts);
|
| - for (uint64 i = 0; i < num_scripts; ++i) {
|
| - scoped_ptr<UserScript> script(new UserScript());
|
| - script->Unpickle(pickle, &iter);
|
| -
|
| - // Note that this is a pointer into shared memory. We don't own it. It gets
|
| - // cleared up when the last renderer or browser process drops their
|
| - // reference to the shared memory.
|
| - for (size_t j = 0; j < script->js_scripts().size(); ++j) {
|
| - const char* body = NULL;
|
| - int body_length = 0;
|
| - CHECK(pickle.ReadData(&iter, &body, &body_length));
|
| - script->js_scripts()[j].set_external_content(
|
| - base::StringPiece(body, body_length));
|
| - }
|
| - for (size_t j = 0; j < script->css_scripts().size(); ++j) {
|
| - const char* body = NULL;
|
| - int body_length = 0;
|
| - CHECK(pickle.ReadData(&iter, &body, &body_length));
|
| - script->css_scripts()[j].set_external_content(
|
| - base::StringPiece(body, body_length));
|
| - }
|
| -
|
| - if (only_inject_incognito && !script->is_incognito_enabled())
|
| - continue; // This script shouldn't run in an incognito tab.
|
| -
|
| - // If we include all extensions or the given extension changed, we add a
|
| - // new script injection.
|
| - if (include_all_extensions ||
|
| - changed_extensions.count(script->extension_id()) > 0) {
|
| - script_injections_.push_back(new ScriptInjection(script.Pass(), this));
|
| - } else {
|
| - // Otherwise, we need to update the existing script injection with the
|
| - // new user script (since the old content was invalidated).
|
| - //
|
| - // Note: Yes, this is O(n^2). But vectors are faster than maps for
|
| - // relatively few elements, and less than 1% of our users actually have
|
| - // enough content scripts for it to matter. If this changes, or if
|
| - // std::maps get a much faster implementation, we should look into
|
| - // making a map for script injections.
|
| - for (ScopedVector<ScriptInjection>::iterator iter =
|
| - script_injections_.begin();
|
| - iter != script_injections_.end();
|
| - ++iter) {
|
| - if ((*iter)->script()->id() == script->id()) {
|
| - (*iter)->SetScript(script.Pass());
|
| - break;
|
| - }
|
| - }
|
| - }
|
| - }
|
| - return true;
|
| -}
|
| -
|
| -void UserScriptSlave::InjectScripts(WebFrame* frame,
|
| - UserScript::RunLocation location) {
|
| - GURL document_url = ScriptInjection::GetDocumentUrlForFrame(frame);
|
| - if (document_url.is_empty())
|
| - return;
|
| -
|
| - ScriptInjection::ScriptsRunInfo scripts_run_info;
|
| - for (ScopedVector<ScriptInjection>::const_iterator iter =
|
| - script_injections_.begin();
|
| - iter != script_injections_.end();
|
| - ++iter) {
|
| - (*iter)->InjectIfAllowed(frame, location, document_url, &scripts_run_info);
|
| - }
|
| -
|
| - LogScriptsRun(frame, location, scripts_run_info);
|
| -}
|
| -
|
| -void UserScriptSlave::OnContentScriptGrantedPermission(
|
| - content::RenderView* render_view, int request_id) {
|
| - ScriptInjection::ScriptsRunInfo run_info;
|
| - blink::WebFrame* frame = NULL;
|
| - // Notify the injections that a request to inject has been granted.
|
| - for (ScopedVector<ScriptInjection>::iterator iter =
|
| - script_injections_.begin();
|
| - iter != script_injections_.end();
|
| - ++iter) {
|
| - if ((*iter)->NotifyScriptPermitted(request_id,
|
| - render_view,
|
| - &run_info,
|
| - &frame)) {
|
| - DCHECK(frame);
|
| - LogScriptsRun(frame, UserScript::RUN_DEFERRED, run_info);
|
| - break;
|
| - }
|
| - }
|
| -}
|
| -
|
| -void UserScriptSlave::FrameDetached(blink::WebFrame* frame) {
|
| - for (ScopedVector<ScriptInjection>::iterator iter =
|
| - script_injections_.begin();
|
| - iter != script_injections_.end();
|
| - ++iter) {
|
| - (*iter)->FrameDetached(frame);
|
| - }
|
| -}
|
| -
|
| -void UserScriptSlave::LogScriptsRun(
|
| - blink::WebFrame* frame,
|
| - UserScript::RunLocation location,
|
| - const ScriptInjection::ScriptsRunInfo& info) {
|
| - // Notify the browser if any extensions are now executing scripts.
|
| - if (!info.executing_scripts.empty()) {
|
| - content::RenderView* render_view =
|
| - content::RenderView::FromWebView(frame->view());
|
| - render_view->Send(new ExtensionHostMsg_ContentScriptsExecuting(
|
| - render_view->GetRoutingID(),
|
| - info.executing_scripts,
|
| - render_view->GetPageId(),
|
| - ScriptContext::GetDataSourceURLForFrame(frame)));
|
| - }
|
| -
|
| - switch (location) {
|
| - case UserScript::DOCUMENT_START:
|
| - UMA_HISTOGRAM_COUNTS_100("Extensions.InjectStart_CssCount",
|
| - info.num_css);
|
| - UMA_HISTOGRAM_COUNTS_100("Extensions.InjectStart_ScriptCount",
|
| - info.num_js);
|
| - if (info.num_css || info.num_js)
|
| - UMA_HISTOGRAM_TIMES("Extensions.InjectStart_Time",
|
| - info.timer.Elapsed());
|
| - break;
|
| - case UserScript::DOCUMENT_END:
|
| - UMA_HISTOGRAM_COUNTS_100("Extensions.InjectEnd_ScriptCount", info.num_js);
|
| - if (info.num_js)
|
| - UMA_HISTOGRAM_TIMES("Extensions.InjectEnd_Time", info.timer.Elapsed());
|
| - break;
|
| - case UserScript::DOCUMENT_IDLE:
|
| - UMA_HISTOGRAM_COUNTS_100("Extensions.InjectIdle_ScriptCount",
|
| - info.num_js);
|
| - if (info.num_js)
|
| - UMA_HISTOGRAM_TIMES("Extensions.InjectIdle_Time", info.timer.Elapsed());
|
| - break;
|
| - case UserScript::RUN_DEFERRED:
|
| - // TODO(rdevlin.cronin): Add histograms.
|
| - break;
|
| - case UserScript::UNDEFINED:
|
| - case UserScript::RUN_LOCATION_LAST:
|
| - NOTREACHED();
|
| - }
|
| -}
|
| -
|
| -} // namespace extensions
|
|
|