Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(16)

Unified Diff: chrome/renderer/render_view.cc

Issue 339064: Add new user script injection point: document_idle. (Closed)
Patch Set: smaller, cleaner, better Created 11 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/renderer/render_view.cc
diff --git a/chrome/renderer/render_view.cc b/chrome/renderer/render_view.cc
index b57d3ce86eb337a136ea8e7b0ee103bf82e461f2..56d7002b50405418256a8620c25e5ea9890dd0dd 100644
--- a/chrome/renderer/render_view.cc
+++ b/chrome/renderer/render_view.cc
@@ -1815,6 +1815,10 @@ void RenderView::willClose(WebFrame* frame) {
if (url.SchemeIs("http") || url.SchemeIs("https"))
DumpLoadHistograms();
}
+
+ WebDataSource* ds = frame->dataSource();
Matt Perry 2009/11/02 19:46:30 Can this ever be NULL?
Aaron Boodman 2009/11/03 05:03:11 No, it is created in didCreateDataSource(), and ma
darin (slow to review) 2009/11/03 05:11:00 Right, it cannot be null!
+ NavigationState* navigation_state = NavigationState::FromDataSource(ds);
+ navigation_state->user_script_idle_scheduler()->Cancel();
}
void RenderView::loadURLExternally(
@@ -2017,11 +2021,13 @@ void RenderView::didCompleteClientRedirect(
void RenderView::didCreateDataSource(WebFrame* frame, WebDataSource* ds) {
// The rest of RenderView assumes that a WebDataSource will always have a
// non-null NavigationState.
- if (pending_navigation_state_.get()) {
- ds->setExtraData(pending_navigation_state_.release());
- } else {
- ds->setExtraData(NavigationState::CreateContentInitiated());
- }
+ NavigationState* state = pending_navigation_state_.get() ?
+ pending_navigation_state_.release() :
+ NavigationState::CreateContentInitiated();
+
+ state->set_user_script_idle_scheduler(
+ new UserScriptIdleScheduler(this, frame));
+ ds->setExtraData(state);
}
void RenderView::didStartProvisionalLoad(WebFrame* frame) {
@@ -2236,14 +2242,6 @@ void RenderView::didCreateDocumentElement(WebFrame* frame) {
ExtensionProcessBindings::SetViewType(webview(), view_type_);
}
- while (!pending_code_execution_queue_.empty()) {
- scoped_refptr<CodeExecutionInfo> info =
- pending_code_execution_queue_.front();
- OnExecuteCode(info->request_id, info->extension_id, info->is_js_code,
- info->code_string);
- pending_code_execution_queue_.pop();
- }
-
// Notify the browser about non-blank documents loading in the top frame.
GURL url = frame->url();
if (url.is_valid() && url.spec() != chrome::kAboutBlankURL) {
@@ -2278,6 +2276,26 @@ void RenderView::didFinishDocumentLoad(WebFrame* frame) {
RenderThread::current()->user_script_slave()->InjectScripts(
frame, UserScript::DOCUMENT_END);
}
+
+ navigation_state->user_script_idle_scheduler()->DidFinishDocumentLoad();
+}
+
+void RenderView::OnUserScriptIdleLocation(WebFrame* frame) {
+ if (RenderThread::current()) { // Will be NULL during unit tests.
+ RenderThread::current()->user_script_slave()->InjectScripts(
+ frame, UserScript::DOCUMENT_IDLE);
+ }
+
+ WebFrame* main_frame = webview()->mainFrame();
+ if (frame == main_frame) {
+ while (!pending_code_execution_queue_.empty()) {
+ scoped_refptr<CodeExecutionInfo> info =
+ pending_code_execution_queue_.front();
+ ExecuteCodeImpl(main_frame, info->request_id, info->extension_id,
+ info->is_js_code, info->code_string);
+ pending_code_execution_queue_.pop();
+ }
+ }
}
void RenderView::didHandleOnloadEvents(WebFrame* frame) {
@@ -2293,6 +2311,7 @@ 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();
}
void RenderView::didChangeLocationWithinPage(
@@ -3648,28 +3667,39 @@ void RenderView::OnSetEditCommandsForNextKeyEvent(
void RenderView::OnExecuteCode(int request_id, const std::string& extension_id,
bool is_js_code,
const std::string& code_string) {
- if (is_loading_) {
- scoped_refptr<CodeExecutionInfo> info = new CodeExecutionInfo(
- request_id, extension_id, is_js_code, code_string);
- pending_code_execution_queue_.push(info);
- return;
- }
WebFrame* main_frame = webview() ? webview()->mainFrame() : NULL;
if (!main_frame) {
Send(new ViewMsg_ExecuteCodeFinished(routing_id_, request_id, false));
return;
}
+ WebDataSource* ds = main_frame->dataSource();
+ NavigationState* navigation_state = NavigationState::FromDataSource(ds);
+ if (!navigation_state->user_script_idle_scheduler()->has_run()) {
+ scoped_refptr<CodeExecutionInfo> info = new CodeExecutionInfo(
+ request_id, extension_id, is_js_code, code_string);
+ pending_code_execution_queue_.push(info);
+ return;
+ }
+
+ ExecuteCodeImpl(main_frame, request_id, extension_id, is_js_code, code_string);
Matt Perry 2009/11/02 19:46:30 line length
+}
+
+void RenderView::ExecuteCodeImpl(WebFrame* frame,
+ int request_id,
+ const std::string& extension_id,
+ bool is_js_code,
+ const std::string& code_string) {
if (is_js_code) {
std::vector<WebScriptSource> sources;
sources.push_back(
WebScriptSource(WebString::fromUTF8(code_string)));
UserScriptSlave::InsertInitExtensionCode(&sources, extension_id);
- main_frame->executeScriptInIsolatedWorld(
+ frame->executeScriptInIsolatedWorld(
UserScriptSlave::GetIsolatedWorldId(extension_id),
&sources.front(), sources.size(), EXTENSION_GROUP_CONTENT_SCRIPTS);
} else {
- main_frame->insertStyleText(WebString::fromUTF8(code_string), WebString());
+ frame->insertStyleText(WebString::fromUTF8(code_string), WebString());
}
Send(new ViewMsg_ExecuteCodeFinished(routing_id_, request_id, true));

Powered by Google App Engine
This is Rietveld 408576698