summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/renderer/extensions/extension_helper.cc21
-rw-r--r--chrome/renderer/extensions/extension_helper.h7
-rw-r--r--chrome/renderer/user_script_idle_scheduler.cc164
-rw-r--r--chrome/renderer/user_script_idle_scheduler.h48
-rw-r--r--content/renderer/navigation_state.cc12
-rw-r--r--content/renderer/navigation_state.h9
-rw-r--r--content/renderer/render_view.cc115
-rw-r--r--content/renderer/render_view.h21
-rw-r--r--content/renderer/render_view_observer.h3
9 files changed, 213 insertions, 187 deletions
diff --git a/chrome/renderer/extensions/extension_helper.cc b/chrome/renderer/extensions/extension_helper.cc
index d089955..7e01c40 100644
--- a/chrome/renderer/extensions/extension_helper.cc
+++ b/chrome/renderer/extensions/extension_helper.cc
@@ -7,12 +7,17 @@
#include "chrome/common/extensions/extension_messages.h"
#include "chrome/renderer/extensions/extension_process_bindings.h"
#include "chrome/renderer/extensions/renderer_extension_bindings.h"
+#include "chrome/renderer/user_script_idle_scheduler.h"
+
+using WebKit::WebFrame;
+using WebKit::WebDataSource;
ExtensionHelper::ExtensionHelper(RenderView* render_view)
: RenderViewObserver(render_view) {
}
ExtensionHelper::~ExtensionHelper() {
+ DCHECK(user_script_idle_schedulers_.empty());
}
bool ExtensionHelper::OnMessageReceived(const IPC::Message& message) {
@@ -25,6 +30,22 @@ bool ExtensionHelper::OnMessageReceived(const IPC::Message& message) {
return handled;
}
+void ExtensionHelper::FrameDetached(WebFrame* frame) {
+ // This could be called before DidCreateDataSource, in which case the frame
+ // won't be in the set.
+ user_script_idle_schedulers_.erase(frame);
+}
+
+void ExtensionHelper::DidCreateDataSource(WebFrame* frame, WebDataSource* ds) {
+ // Check first if we created a scheduler for the frame, since this function
+ // gets called for navigations within the document.
+ if (user_script_idle_schedulers_.count(frame))
+ return;
+
+ new UserScriptIdleScheduler(render_view(), frame);
+ user_script_idle_schedulers_.insert(frame);
+}
+
void ExtensionHelper::OnExtensionResponse(int request_id,
bool success,
const std::string& response,
diff --git a/chrome/renderer/extensions/extension_helper.h b/chrome/renderer/extensions/extension_helper.h
index d18ad48..f7fb438 100644
--- a/chrome/renderer/extensions/extension_helper.h
+++ b/chrome/renderer/extensions/extension_helper.h
@@ -6,6 +6,8 @@
#define CHROME_RENDERER_EXTENSIONS_EXTENSION_HELPER_H_
#pragma once
+#include <set>
+
#include "content/renderer/render_view_observer.h"
class GURL;
@@ -20,6 +22,9 @@ class ExtensionHelper : public RenderViewObserver {
private:
// RenderViewObserver implementation.
virtual bool OnMessageReceived(const IPC::Message& message);
+ virtual void FrameDetached(WebKit::WebFrame* frame);
+ virtual void DidCreateDataSource(WebKit::WebFrame* frame,
+ WebKit::WebDataSource* ds);
void OnExtensionResponse(int request_id, bool success,
const std::string& response,
@@ -29,6 +34,8 @@ class ExtensionHelper : public RenderViewObserver {
const ListValue& args,
const GURL& event_url);
+ // Keeps tracks of the frames that we created a scheduler for.
+ std::set<WebKit::WebFrame*> user_script_idle_schedulers_;
DISALLOW_COPY_AND_ASSIGN(ExtensionHelper);
};
diff --git a/chrome/renderer/user_script_idle_scheduler.cc b/chrome/renderer/user_script_idle_scheduler.cc
index 38a81f6..7b4243f 100644
--- a/chrome/renderer/user_script_idle_scheduler.cc
+++ b/chrome/renderer/user_script_idle_scheduler.cc
@@ -5,7 +5,15 @@
#include "chrome/renderer/user_script_idle_scheduler.h"
#include "base/message_loop.h"
+#include "chrome/common/extensions/extension_messages.h"
+#include "chrome/renderer/extension_groups.h"
+#include "chrome/renderer/extensions/extension_dispatcher.h"
+#include "chrome/renderer/render_thread.h"
+#include "chrome/renderer/user_script_slave.h"
#include "content/renderer/render_view.h"
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h"
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebString.h"
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h"
namespace {
// The length of time to wait after the DOM is complete to try and run user
@@ -13,43 +21,167 @@ namespace {
const int kUserScriptIdleTimeoutMs = 200;
}
-UserScriptIdleScheduler::UserScriptIdleScheduler(RenderView* view,
- WebKit::WebFrame* frame)
- : ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)), view_(view),
- frame_(frame), has_run_(false) {
+using WebKit::WebFrame;
+using WebKit::WebString;
+using WebKit::WebView;
+
+UserScriptIdleScheduler::UserScriptIdleScheduler(RenderView* render_view,
+ WebFrame* frame)
+ : RenderViewObserver(render_view),
+ ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)),
+ frame_(frame),
+ has_run_(false) {
}
UserScriptIdleScheduler::~UserScriptIdleScheduler() {
}
-void UserScriptIdleScheduler::DidFinishDocumentLoad() {
+bool UserScriptIdleScheduler::OnMessageReceived(const IPC::Message& message) {
+ if (message.type() != ExtensionMsg_ExecuteCode::ID)
+ return false;
+
+ // chrome.tabs.executeScript() only supports execution in either the top frame
+ // or all frames. We handle both cases in the top frame.
+ WebFrame* main_frame = GetMainFrame();
+ if (main_frame && main_frame != frame_)
+ return false;
+
+ IPC_BEGIN_MESSAGE_MAP(UserScriptIdleScheduler, message)
+ IPC_MESSAGE_HANDLER(ExtensionMsg_ExecuteCode, OnExecuteCode)
+ IPC_END_MESSAGE_MAP()
+ return true;
+}
+
+void UserScriptIdleScheduler::DidFinishDocumentLoad(WebFrame* frame) {
+ if (frame != frame_)
+ return;
+
MessageLoop::current()->PostDelayedTask(FROM_HERE,
method_factory_.NewRunnableMethod(&UserScriptIdleScheduler::MaybeRun),
kUserScriptIdleTimeoutMs);
}
-void UserScriptIdleScheduler::DidFinishLoad() {
+void UserScriptIdleScheduler::DidFinishLoad(WebFrame* frame) {
+ if (frame != frame_)
+ return;
+
// Ensure that running scripts does not keep any progress UI running.
MessageLoop::current()->PostTask(FROM_HERE,
method_factory_.NewRunnableMethod(&UserScriptIdleScheduler::MaybeRun));
}
-void UserScriptIdleScheduler::Cancel() {
- view_ = NULL;
- frame_ = NULL;
+void UserScriptIdleScheduler::DidStartProvisionalLoad(WebKit::WebFrame* frame) {
+ // The frame is navigating, so reset the state since we'll want to inject
+ // scripts once the load finishes.
+ has_run_ = false;
+ method_factory_.RevokeAll();
+ while (!pending_code_execution_queue_.empty())
+ pending_code_execution_queue_.pop();
+}
+
+void UserScriptIdleScheduler::FrameDetached(WebFrame* frame) {
+ if (frame != frame_)
+ return;
+
+ delete this;
}
void UserScriptIdleScheduler::MaybeRun() {
- if (!view_ || has_run())
+ if (has_run_)
return;
- // Note: we must set this before calling OnUserScriptIdleTriggered, because
- // that may result in a synchronous call back into MaybeRun if there is a
- // pending task currently in the queue.
+ // Note: we must set this before calling ExecuteCodeImpl, because that may
+ // result in a synchronous call back into MaybeRun if there is a pending task
+ // currently in the queue.
// http://code.google.com/p/chromium/issues/detail?id=29644
has_run_ = true;
- DCHECK(frame_);
- view_->OnUserScriptIdleTriggered(frame_);
- Cancel();
+ if (RenderThread::current()) { // Will be NULL during unit tests.
+ ExtensionDispatcher::Get()->user_script_slave()->InjectScripts(
+ frame_, UserScript::DOCUMENT_IDLE);
+ }
+
+ while (!pending_code_execution_queue_.empty()) {
+ linked_ptr<ExtensionMsg_ExecuteCode_Params>& params =
+ pending_code_execution_queue_.front();
+ ExecuteCodeImpl(GetMainFrame(), *params);
+ pending_code_execution_queue_.pop();
+ }
+}
+
+void UserScriptIdleScheduler::OnExecuteCode(
+ const ExtensionMsg_ExecuteCode_Params& params) {
+ WebFrame* main_frame = GetMainFrame();
+ if (!main_frame) {
+ Send(new ViewHostMsg_ExecuteCodeFinished(
+ routing_id(), params.request_id, false));
+ return;
+ }
+
+ if (!has_run_) {
+ pending_code_execution_queue_.push(
+ linked_ptr<ExtensionMsg_ExecuteCode_Params>(
+ new ExtensionMsg_ExecuteCode_Params(params)));
+ return;
+ }
+
+ ExecuteCodeImpl(main_frame, params);
+}
+
+void UserScriptIdleScheduler::ExecuteCodeImpl(
+ WebFrame* frame, const ExtensionMsg_ExecuteCode_Params& params) {
+ std::vector<WebFrame*> frame_vector;
+ frame_vector.push_back(frame);
+ if (params.all_frames)
+ GetAllChildFrames(frame, &frame_vector);
+
+ for (std::vector<WebFrame*>::iterator frame_it = frame_vector.begin();
+ frame_it != frame_vector.end(); ++frame_it) {
+ WebFrame* frame = *frame_it;
+ if (params.is_javascript) {
+ const Extension* extension =
+ ExtensionDispatcher::Get()->extensions()->GetByID(
+ params.extension_id);
+
+ // Since extension info is sent separately from user script info, they can
+ // be out of sync. We just ignore this situation.
+ if (!extension)
+ continue;
+
+ if (!extension->CanExecuteScriptOnPage(frame->url(), NULL, NULL))
+ continue;
+
+ std::vector<WebScriptSource> sources;
+ sources.push_back(
+ WebScriptSource(WebString::fromUTF8(params.code)));
+ UserScriptSlave::InsertInitExtensionCode(&sources, params.extension_id);
+ frame->executeScriptInIsolatedWorld(
+ UserScriptSlave::GetIsolatedWorldId(params.extension_id),
+ &sources.front(), sources.size(), EXTENSION_GROUP_CONTENT_SCRIPTS);
+ } else {
+ frame->insertStyleText(WebString::fromUTF8(params.code), WebString());
+ }
+ }
+
+ Send(new ViewHostMsg_ExecuteCodeFinished(
+ routing_id(), params.request_id, true));
+}
+
+bool UserScriptIdleScheduler::GetAllChildFrames(
+ WebFrame* parent_frame,
+ std::vector<WebFrame*>* frames_vector) const {
+ if (!parent_frame)
+ return false;
+
+ for (WebFrame* child_frame = parent_frame->firstChild(); child_frame;
+ child_frame = child_frame->nextSibling()) {
+ frames_vector->push_back(child_frame);
+ GetAllChildFrames(child_frame, frames_vector);
+ }
+ return true;
+}
+
+WebFrame* UserScriptIdleScheduler::GetMainFrame() {
+ WebView* webview = render_view()->webview();
+ return webview ? webview->mainFrame() : NULL;
}
diff --git a/chrome/renderer/user_script_idle_scheduler.h b/chrome/renderer/user_script_idle_scheduler.h
index 165db5a..c3ede9a 100644
--- a/chrome/renderer/user_script_idle_scheduler.h
+++ b/chrome/renderer/user_script_idle_scheduler.h
@@ -6,9 +6,15 @@
#define CHROME_RENDERER_USER_SCRIPT_IDLE_SCHEDULER_H_
#pragma once
+#include <queue>
+#include <vector>
+
+#include "base/memory/linked_ptr.h"
#include "base/task.h"
+#include "content/renderer/render_view_observer.h"
class RenderView;
+struct ExtensionMsg_ExecuteCode_Params;
namespace WebKit {
class WebFrame;
@@ -24,37 +30,47 @@ class WebFrame;
// The intent of this mechanism is to prevent user scripts from slowing down
// fast pages (run after load), while still allowing them to run relatively
// timely for pages with lots of slow subresources.
-class UserScriptIdleScheduler {
+class UserScriptIdleScheduler : public RenderViewObserver {
public:
- UserScriptIdleScheduler(RenderView* view, WebKit::WebFrame* frame);
+ UserScriptIdleScheduler(RenderView* render_view, WebKit::WebFrame* frame);
~UserScriptIdleScheduler();
- bool has_run() { return has_run_; }
-
- // Called when the DOM has been completely constructed.
- void DidFinishDocumentLoad();
-
- // Called when the document has completed loading.
- void DidFinishLoad();
-
- // Called when the client has gone away and we should no longer run scripts.
- void Cancel();
-
private:
+ // RenderViewObserver implementation:
+ virtual bool OnMessageReceived(const IPC::Message& message);
+ virtual void DidFinishDocumentLoad(WebKit::WebFrame* frame);
+ virtual void DidFinishLoad(WebKit::WebFrame* frame);
+ virtual void DidStartProvisionalLoad(WebKit::WebFrame* frame);
+ virtual void FrameDetached(WebKit::WebFrame* frame);
+
// Run user scripts, except if they've already run for this frame, or the
// frame has been destroyed.
void MaybeRun();
- ScopedRunnableMethodFactory<UserScriptIdleScheduler> method_factory_;
+ void OnExecuteCode(const ExtensionMsg_ExecuteCode_Params& params);
+
+ // Backend for the IPC Message ExecuteCode in addition to being used
+ // internally.
+ void ExecuteCodeImpl(WebKit::WebFrame* frame,
+ const ExtensionMsg_ExecuteCode_Params& params);
+
+ // Get all child frames of parent_frame, returned by frames_vector.
+ bool GetAllChildFrames(WebKit::WebFrame* parent_frame,
+ std::vector<WebKit::WebFrame*>* frames_vector) const;
- // The RenderView we will call back to when it is time to run scripts.
- RenderView* view_;
+ WebKit::WebFrame* GetMainFrame();
+
+ ScopedRunnableMethodFactory<UserScriptIdleScheduler> method_factory_;
// The Frame we will run scripts in.
WebKit::WebFrame* frame_;
// Whether we have already run scripts.
bool has_run_;
+
+ // This is only used if we're for the main frame.
+ std::queue<linked_ptr<ExtensionMsg_ExecuteCode_Params> >
+ pending_code_execution_queue_;
};
#endif // CHROME_RENDERER_USER_SCRIPT_IDLE_SCHEDULER_H_
diff --git a/content/renderer/navigation_state.cc b/content/renderer/navigation_state.cc
index 78bebbb..4ab7123 100644
--- a/content/renderer/navigation_state.cc
+++ b/content/renderer/navigation_state.cc
@@ -4,22 +4,11 @@
#include "content/renderer/navigation_state.h"
-#include "chrome/renderer/user_script_idle_scheduler.h"
#include "webkit/glue/alt_error_page_resource_fetcher.h"
#include "webkit/glue/password_form.h"
NavigationState::~NavigationState() {}
-void NavigationState::set_user_script_idle_scheduler(
- UserScriptIdleScheduler* scheduler) {
- user_script_idle_scheduler_.reset(scheduler);
-}
-
-void NavigationState::swap_user_script_idle_scheduler(
- NavigationState* state) {
- user_script_idle_scheduler_.swap(state->user_script_idle_scheduler_);
-}
-
const base::Time& NavigationState::prerendered_page_display_time() const {
return prerendered_page_display_time_;
}
@@ -67,7 +56,6 @@ NavigationState::NavigationState(PageTransition::Type transition_type,
was_started_as_prerender_(false),
cache_policy_override_set_(false),
cache_policy_override_(WebKit::WebURLRequest::UseProtocolCachePolicy),
- user_script_idle_scheduler_(NULL),
http_status_code_(0),
was_fetched_via_spdy_(false),
was_npn_negotiated_(false),
diff --git a/content/renderer/navigation_state.h b/content/renderer/navigation_state.h
index 6fc06e8..3037568 100644
--- a/content/renderer/navigation_state.h
+++ b/content/renderer/navigation_state.h
@@ -21,8 +21,6 @@ struct PasswordForm;
class AltErrorPageResourceFetcher;
}
-class UserScriptIdleScheduler;
-
// The RenderView stores an instance of this class in the "extra data" of each
// WebDataSource (see RenderView::DidCreateDataSource).
class NavigationState : public WebKit::WebDataSource::ExtraData {
@@ -66,12 +64,6 @@ class NavigationState : public WebKit::WebDataSource::ExtraData {
return static_cast<NavigationState*>(ds->extraData());
}
- UserScriptIdleScheduler* user_script_idle_scheduler() {
- return user_script_idle_scheduler_.get();
- }
- void set_user_script_idle_scheduler(UserScriptIdleScheduler* scheduler);
- void swap_user_script_idle_scheduler(NavigationState* state);
-
// Contains the page_id for this navigation or -1 if there is none yet.
int32 pending_page_id() const { return pending_page_id_; }
@@ -318,7 +310,6 @@ class NavigationState : public WebKit::WebDataSource::ExtraData {
bool cache_policy_override_set_;
WebKit::WebURLRequest::CachePolicy cache_policy_override_;
- scoped_ptr<UserScriptIdleScheduler> user_script_idle_scheduler_;
int http_status_code_;
bool was_fetched_via_spdy_;
diff --git a/content/renderer/render_view.cc b/content/renderer/render_view.cc
index 86733e4..9e14c55 100644
--- a/content/renderer/render_view.cc
+++ b/content/renderer/render_view.cc
@@ -46,7 +46,6 @@
#include "chrome/renderer/automation/dom_automation_controller.h"
#include "chrome/renderer/devtools_agent.h"
#include "chrome/renderer/devtools_client.h"
-#include "chrome/renderer/extension_groups.h"
#include "chrome/renderer/extensions/event_bindings.h"
#include "chrome/renderer/extensions/extension_dispatcher.h"
#include "chrome/renderer/extensions/extension_helper.h"
@@ -66,7 +65,6 @@
#include "chrome/renderer/spellchecker/spellcheck.h"
#include "chrome/renderer/spellchecker/spellcheck_provider.h"
#include "chrome/renderer/translate_helper.h"
-#include "chrome/renderer/user_script_idle_scheduler.h"
#include "chrome/renderer/user_script_slave.h"
#include "chrome/renderer/visitedlink_slave.h"
#include "content/common/appcache/appcache_dispatcher.h"
@@ -1052,7 +1050,6 @@ bool RenderView::OnMessageReceived(const IPC::Message& message) {
#endif
IPC_MESSAGE_HANDLER(ViewMsg_SetEditCommandsForNextKeyEvent,
OnSetEditCommandsForNextKeyEvent)
- IPC_MESSAGE_HANDLER(ExtensionMsg_ExecuteCode, OnExecuteCode)
IPC_MESSAGE_HANDLER(ViewMsg_CustomContextMenuAction,
OnCustomContextMenuAction)
IPC_MESSAGE_HANDLER(ViewMsg_EnableAccessibility, OnEnableAccessibility)
@@ -2632,11 +2629,7 @@ void RenderView::frameDetached(WebFrame* frame) {
}
void RenderView::willClose(WebFrame* frame) {
- WebDataSource* ds = frame->dataSource();
- NavigationState* navigation_state = NavigationState::FromDataSource(ds);
-
page_load_histograms_.Dump(frame);
- navigation_state->user_script_idle_scheduler()->Cancel();
FOR_EACH_OBSERVER(RenderViewObserver, observers_, FrameWillClose(frame));
}
@@ -2657,7 +2650,6 @@ bool RenderView::allowPlugins(WebFrame* frame, bool enabled_per_settings) {
return WebFrameClient::allowPlugins(frame, enabled_per_settings);
}
-
void RenderView::loadURLExternally(
WebFrame* frame, const WebURLRequest& request,
WebNavigationPolicy policy) {
@@ -2985,16 +2977,8 @@ void RenderView::didCreateDataSource(WebFrame* frame, WebDataSource* ds) {
}
}
- // If this datasource already has a UserScriptIdleScheduler, reuse that one.
- // This is for navigations within a page (didNavigateWithinPage). See
- // http://code.google.com/p/chromium/issues/detail?id=64093
- NavigationState* old_state = NavigationState::FromDataSource(ds);
- if (old_state && old_state->user_script_idle_scheduler()) {
- state->swap_user_script_idle_scheduler(old_state);
- } else {
- state->set_user_script_idle_scheduler(
- new UserScriptIdleScheduler(this, frame));
- }
+ FOR_EACH_OBSERVER(
+ RenderViewObserver, observers_, DidCreateDataSource(frame, ds));
state->set_was_started_as_prerender(is_prerendering_);
@@ -3258,28 +3242,6 @@ void RenderView::didFinishDocumentLoad(WebFrame* frame) {
ExtensionDispatcher::Get()->user_script_slave()->InjectScripts(
frame, UserScript::DOCUMENT_END);
}
-
- // InjectScripts() can end up creating a new NavigationState if it triggers a
- // fragment navigation, so we need to re-fetch it here.
- navigation_state = NavigationState::FromDataSource(ds);
- navigation_state->user_script_idle_scheduler()->DidFinishDocumentLoad();
-}
-
-void RenderView::OnUserScriptIdleTriggered(WebFrame* frame) {
- if (RenderThread::current()) { // Will be NULL during unit tests.
- ExtensionDispatcher::Get()->user_script_slave()->InjectScripts(
- frame, UserScript::DOCUMENT_IDLE);
- }
-
- WebFrame* main_frame = webview()->mainFrame();
- if (frame == main_frame) {
- while (!pending_code_execution_queue_.empty()) {
- linked_ptr<ExtensionMsg_ExecuteCode_Params>& params =
- pending_code_execution_queue_.front();
- ExecuteCodeImpl(main_frame, *params);
- pending_code_execution_queue_.pop();
- }
- }
}
void RenderView::didHandleOnloadEvents(WebFrame* frame) {
@@ -3298,7 +3260,6 @@ void RenderView::didFinishLoad(WebFrame* frame) {
NavigationState* navigation_state = NavigationState::FromDataSource(ds);
DCHECK(navigation_state);
navigation_state->set_finish_load_time(Time::Now());
- navigation_state->user_script_idle_scheduler()->DidFinishLoad();
FOR_EACH_OBSERVER(RenderViewObserver, observers_, DidFinishLoad(frame));
@@ -4157,19 +4118,6 @@ void RenderView::OnResetPageEncodingToDefault() {
webview()->setPageEncoding(no_encoding);
}
-bool RenderView::GetAllChildFrames(
- WebFrame* parent_frame,
- std::vector<WebFrame*>* frames_vector) const {
- if (!parent_frame)
- return false;
- for (WebFrame* child_frame = parent_frame->firstChild(); child_frame;
- child_frame = child_frame->nextSibling()) {
- frames_vector->push_back(child_frame);
- GetAllChildFrames(child_frame, frames_vector);
- }
- return true;
-}
-
WebFrame* RenderView::GetChildFrame(const std::wstring& xpath) const {
if (xpath.empty())
return webview()->mainFrame();
@@ -4866,65 +4814,6 @@ void RenderView::OnSetEditCommandsForNextKeyEvent(
edit_commands_ = edit_commands;
}
-void RenderView::OnExecuteCode(const ExtensionMsg_ExecuteCode_Params& params) {
- WebFrame* main_frame = webview() ? webview()->mainFrame() : NULL;
- if (!main_frame) {
- Send(new ViewHostMsg_ExecuteCodeFinished(routing_id_, params.request_id,
- false));
- return;
- }
-
- WebDataSource* ds = main_frame->dataSource();
- NavigationState* navigation_state = NavigationState::FromDataSource(ds);
- if (!navigation_state->user_script_idle_scheduler()->has_run()) {
- pending_code_execution_queue_.push(
- linked_ptr<ExtensionMsg_ExecuteCode_Params>(
- new ExtensionMsg_ExecuteCode_Params(params)));
- return;
- }
-
- ExecuteCodeImpl(main_frame, params);
-}
-
-void RenderView::ExecuteCodeImpl(
- WebFrame* frame, const ExtensionMsg_ExecuteCode_Params& params) {
- std::vector<WebFrame*> frame_vector;
- frame_vector.push_back(frame);
- if (params.all_frames)
- GetAllChildFrames(frame, &frame_vector);
-
- for (std::vector<WebFrame*>::iterator frame_it = frame_vector.begin();
- frame_it != frame_vector.end(); ++frame_it) {
- WebFrame* frame = *frame_it;
- if (params.is_javascript) {
- const Extension* extension =
- ExtensionDispatcher::Get()->extensions()->GetByID(
- params.extension_id);
-
- // Since extension info is sent separately from user script info, they can
- // be out of sync. We just ignore this situation.
- if (!extension)
- continue;
-
- if (!extension->CanExecuteScriptOnPage(frame->url(), NULL, NULL))
- continue;
-
- std::vector<WebScriptSource> sources;
- sources.push_back(
- WebScriptSource(WebString::fromUTF8(params.code)));
- UserScriptSlave::InsertInitExtensionCode(&sources, params.extension_id);
- frame->executeScriptInIsolatedWorld(
- UserScriptSlave::GetIsolatedWorldId(params.extension_id),
- &sources.front(), sources.size(), EXTENSION_GROUP_CONTENT_SCRIPTS);
- } else {
- frame->insertStyleText(WebString::fromUTF8(params.code), WebString());
- }
- }
-
- Send(new ViewHostMsg_ExecuteCodeFinished(
- routing_id_, params.request_id, true));
-}
-
void RenderView::Close() {
// We need to grab a pointer to the doomed WebView before we destroy it.
WebView* doomed = webview();
diff --git a/content/renderer/render_view.h b/content/renderer/render_view.h
index 421c960..a47b601 100644
--- a/content/renderer/render_view.h
+++ b/content/renderer/render_view.h
@@ -80,7 +80,6 @@ class WebPluginDelegatePepper;
class WebPluginDelegateProxy;
class WebUIBindings;
struct ContextMenuMediaParams;
-struct ExtensionMsg_ExecuteCode_Params;
struct PP_Flash_NetAddress;
struct ThumbnailScore;
struct ViewHostMsg_RunFileChooser_Params;
@@ -305,13 +304,6 @@ class RenderView : public RenderWidget,
// Sets whether the renderer should report load progress to the browser.
void SetReportLoadProgressEnabled(bool enabled);
- // Extensions ----------------------------------------------------------------
-
- // Called when the "idle" user script state has been reached. See
- // UserScript::DOCUMENT_IDLE.
- // TODO(jam): remove me
- void OnUserScriptIdleTriggered(WebKit::WebFrame* frame);
-
// Plugin-related functions --------------------------------------------------
// (See also WebPluginPageDelegate implementation.)
@@ -822,7 +814,6 @@ class RenderView : public RenderWidget,
WebKit::WebDragOperationsMask operations_allowed);
void OnEnablePreferredSizeChangedMode(int flags);
void OnEnableViewSourceMode();
- void OnExecuteCode(const ExtensionMsg_ExecuteCode_Params& params);
void OnExecuteEditCommand(const std::string& name, const std::string& value);
void OnFileChooserResponse(const std::vector<FilePath>& paths);
void OnFind(int request_id, const string16&, const WebKit::WebFindOptions&);
@@ -965,15 +956,6 @@ class RenderView : public RenderWidget,
// image doesn't have a frame at the specified size, the first is returned.
bool DownloadImage(int id, const GURL& image_url, int image_size);
- // Backend for the IPC Message ExecuteCode in addition to being used
- // internally by other RenderView functions.
- void ExecuteCodeImpl(WebKit::WebFrame* frame,
- const ExtensionMsg_ExecuteCode_Params& params);
-
- // Get all child frames of parent_frame, returned by frames_vector.
- bool GetAllChildFrames(WebKit::WebFrame* parent_frame,
- std::vector<WebKit::WebFrame* >* frames_vector) const;
-
GURL GetAlternateErrorPageURL(const GURL& failed_url,
ErrorPageType error_type);
@@ -1304,9 +1286,6 @@ class RenderView : public RenderWidget,
struct PendingFileChooser;
std::deque< linked_ptr<PendingFileChooser> > file_chooser_completions_;
- std::queue<linked_ptr<ExtensionMsg_ExecuteCode_Params> >
- pending_code_execution_queue_;
-
// ImageResourceFetchers schedule via DownloadImage.
ImageResourceFetcherList image_fetchers_;
diff --git a/content/renderer/render_view_observer.h b/content/renderer/render_view_observer.h
index cfa1cb4..e03156a 100644
--- a/content/renderer/render_view_observer.h
+++ b/content/renderer/render_view_observer.h
@@ -12,6 +12,7 @@
class RenderView;
namespace WebKit {
+class WebDataSource;
class WebFrame;
class WebMouseEvent;
struct WebURLError;
@@ -38,6 +39,8 @@ class RenderViewObserver : public IPC::Channel::Listener,
bool is_new_navigation) {}
virtual void FrameDetached(WebKit::WebFrame* frame) {}
virtual void FrameWillClose(WebKit::WebFrame* frame) {}
+ virtual void DidCreateDataSource(WebKit::WebFrame* frame,
+ WebKit::WebDataSource* ds) {}
// These match the RenderView methods below.
virtual void FrameTranslated(WebKit::WebFrame* frame) {}