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

Side by Side 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, 1 month 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/renderer/render_view.h" 5 #include "chrome/renderer/render_view.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <string> 8 #include <string>
9 #include <vector> 9 #include <vector>
10 10
(...skipping 1797 matching lines...) Expand 10 before | Expand all | Expand 10 after
1808 } 1808 }
1809 return new webkit_glue::WebMediaPlayerImpl(client, factory); 1809 return new webkit_glue::WebMediaPlayerImpl(client, factory);
1810 } 1810 }
1811 1811
1812 void RenderView::willClose(WebFrame* frame) { 1812 void RenderView::willClose(WebFrame* frame) {
1813 if (!frame->parent()) { 1813 if (!frame->parent()) {
1814 const GURL& url = frame->url(); 1814 const GURL& url = frame->url();
1815 if (url.SchemeIs("http") || url.SchemeIs("https")) 1815 if (url.SchemeIs("http") || url.SchemeIs("https"))
1816 DumpLoadHistograms(); 1816 DumpLoadHistograms();
1817 } 1817 }
1818
1819 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!
1820 NavigationState* navigation_state = NavigationState::FromDataSource(ds);
1821 navigation_state->user_script_idle_scheduler()->Cancel();
1818 } 1822 }
1819 1823
1820 void RenderView::loadURLExternally( 1824 void RenderView::loadURLExternally(
1821 WebFrame* frame, const WebURLRequest& request, 1825 WebFrame* frame, const WebURLRequest& request,
1822 WebNavigationPolicy policy) { 1826 WebNavigationPolicy policy) {
1823 GURL referrer(request.httpHeaderField(WebString::fromUTF8("Referer"))); 1827 GURL referrer(request.httpHeaderField(WebString::fromUTF8("Referer")));
1824 if (policy == WebKit::WebNavigationPolicyDownload) { 1828 if (policy == WebKit::WebNavigationPolicyDownload) {
1825 Send(new ViewHostMsg_DownloadUrl(routing_id_, request.url(), referrer)); 1829 Send(new ViewHostMsg_DownloadUrl(routing_id_, request.url(), referrer));
1826 } else { 1830 } else {
1827 OpenURL(request.url(), referrer, policy); 1831 OpenURL(request.url(), referrer, policy);
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after
2010 2014
2011 void RenderView::didCompleteClientRedirect( 2015 void RenderView::didCompleteClientRedirect(
2012 WebFrame* frame, const WebURL& from) { 2016 WebFrame* frame, const WebURL& from) {
2013 if (!frame->parent()) 2017 if (!frame->parent())
2014 completed_client_redirect_src_ = from; 2018 completed_client_redirect_src_ = from;
2015 } 2019 }
2016 2020
2017 void RenderView::didCreateDataSource(WebFrame* frame, WebDataSource* ds) { 2021 void RenderView::didCreateDataSource(WebFrame* frame, WebDataSource* ds) {
2018 // The rest of RenderView assumes that a WebDataSource will always have a 2022 // The rest of RenderView assumes that a WebDataSource will always have a
2019 // non-null NavigationState. 2023 // non-null NavigationState.
2020 if (pending_navigation_state_.get()) { 2024 NavigationState* state = pending_navigation_state_.get() ?
2021 ds->setExtraData(pending_navigation_state_.release()); 2025 pending_navigation_state_.release() :
2022 } else { 2026 NavigationState::CreateContentInitiated();
2023 ds->setExtraData(NavigationState::CreateContentInitiated()); 2027
2024 } 2028 state->set_user_script_idle_scheduler(
2029 new UserScriptIdleScheduler(this, frame));
2030 ds->setExtraData(state);
2025 } 2031 }
2026 2032
2027 void RenderView::didStartProvisionalLoad(WebFrame* frame) { 2033 void RenderView::didStartProvisionalLoad(WebFrame* frame) {
2028 WebDataSource* ds = frame->provisionalDataSource(); 2034 WebDataSource* ds = frame->provisionalDataSource();
2029 NavigationState* navigation_state = NavigationState::FromDataSource(ds); 2035 NavigationState* navigation_state = NavigationState::FromDataSource(ds);
2030 2036
2031 navigation_state->set_start_load_time(Time::Now()); 2037 navigation_state->set_start_load_time(Time::Now());
2032 2038
2033 // Update the request time if WebKit has better knowledge of it. 2039 // Update the request time if WebKit has better knowledge of it.
2034 if (navigation_state->request_time().is_null()) { 2040 if (navigation_state->request_time().is_null()) {
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after
2229 if (RenderThread::current()) { // Will be NULL during unit tests. 2235 if (RenderThread::current()) { // Will be NULL during unit tests.
2230 RenderThread::current()->user_script_slave()->InjectScripts( 2236 RenderThread::current()->user_script_slave()->InjectScripts(
2231 frame, UserScript::DOCUMENT_START); 2237 frame, UserScript::DOCUMENT_START);
2232 } 2238 }
2233 if (view_type_ == ViewType::EXTENSION_TOOLSTRIP || 2239 if (view_type_ == ViewType::EXTENSION_TOOLSTRIP ||
2234 view_type_ == ViewType::EXTENSION_MOLE) { 2240 view_type_ == ViewType::EXTENSION_MOLE) {
2235 InjectToolstripCSS(); 2241 InjectToolstripCSS();
2236 ExtensionProcessBindings::SetViewType(webview(), view_type_); 2242 ExtensionProcessBindings::SetViewType(webview(), view_type_);
2237 } 2243 }
2238 2244
2239 while (!pending_code_execution_queue_.empty()) {
2240 scoped_refptr<CodeExecutionInfo> info =
2241 pending_code_execution_queue_.front();
2242 OnExecuteCode(info->request_id, info->extension_id, info->is_js_code,
2243 info->code_string);
2244 pending_code_execution_queue_.pop();
2245 }
2246
2247 // Notify the browser about non-blank documents loading in the top frame. 2245 // Notify the browser about non-blank documents loading in the top frame.
2248 GURL url = frame->url(); 2246 GURL url = frame->url();
2249 if (url.is_valid() && url.spec() != chrome::kAboutBlankURL) { 2247 if (url.is_valid() && url.spec() != chrome::kAboutBlankURL) {
2250 if (frame == webview()->mainFrame()) 2248 if (frame == webview()->mainFrame())
2251 Send(new ViewHostMsg_DocumentAvailableInMainFrame(routing_id_)); 2249 Send(new ViewHostMsg_DocumentAvailableInMainFrame(routing_id_));
2252 } 2250 }
2253 } 2251 }
2254 2252
2255 void RenderView::didReceiveTitle(WebFrame* frame, const WebString& title) { 2253 void RenderView::didReceiveTitle(WebFrame* frame, const WebString& title) {
2256 UpdateTitle(frame, title); 2254 UpdateTitle(frame, title);
(...skipping 14 matching lines...) Expand all
2271 // sent up to the browser. 2269 // sent up to the browser.
2272 SendPasswordForms(frame); 2270 SendPasswordForms(frame);
2273 2271
2274 // Check whether we have new encoding name. 2272 // Check whether we have new encoding name.
2275 UpdateEncoding(frame, frame->view()->pageEncoding().utf8()); 2273 UpdateEncoding(frame, frame->view()->pageEncoding().utf8());
2276 2274
2277 if (RenderThread::current()) { // Will be NULL during unit tests. 2275 if (RenderThread::current()) { // Will be NULL during unit tests.
2278 RenderThread::current()->user_script_slave()->InjectScripts( 2276 RenderThread::current()->user_script_slave()->InjectScripts(
2279 frame, UserScript::DOCUMENT_END); 2277 frame, UserScript::DOCUMENT_END);
2280 } 2278 }
2279
2280 navigation_state->user_script_idle_scheduler()->DidFinishDocumentLoad();
2281 }
2282
2283 void RenderView::OnUserScriptIdleLocation(WebFrame* frame) {
2284 if (RenderThread::current()) { // Will be NULL during unit tests.
2285 RenderThread::current()->user_script_slave()->InjectScripts(
2286 frame, UserScript::DOCUMENT_IDLE);
2287 }
2288
2289 WebFrame* main_frame = webview()->mainFrame();
2290 if (frame == main_frame) {
2291 while (!pending_code_execution_queue_.empty()) {
2292 scoped_refptr<CodeExecutionInfo> info =
2293 pending_code_execution_queue_.front();
2294 ExecuteCodeImpl(main_frame, info->request_id, info->extension_id,
2295 info->is_js_code, info->code_string);
2296 pending_code_execution_queue_.pop();
2297 }
2298 }
2281 } 2299 }
2282 2300
2283 void RenderView::didHandleOnloadEvents(WebFrame* frame) { 2301 void RenderView::didHandleOnloadEvents(WebFrame* frame) {
2284 // Ignore 2302 // Ignore
2285 } 2303 }
2286 2304
2287 void RenderView::didFailLoad(WebFrame* frame, const WebURLError& error) { 2305 void RenderView::didFailLoad(WebFrame* frame, const WebURLError& error) {
2288 // Ignore 2306 // Ignore
2289 } 2307 }
2290 2308
2291 void RenderView::didFinishLoad(WebFrame* frame) { 2309 void RenderView::didFinishLoad(WebFrame* frame) {
2292 WebDataSource* ds = frame->dataSource(); 2310 WebDataSource* ds = frame->dataSource();
2293 NavigationState* navigation_state = NavigationState::FromDataSource(ds); 2311 NavigationState* navigation_state = NavigationState::FromDataSource(ds);
2294 DCHECK(navigation_state); 2312 DCHECK(navigation_state);
2295 navigation_state->set_finish_load_time(Time::Now()); 2313 navigation_state->set_finish_load_time(Time::Now());
2314 navigation_state->user_script_idle_scheduler()->DidFinishLoad();
2296 } 2315 }
2297 2316
2298 void RenderView::didChangeLocationWithinPage( 2317 void RenderView::didChangeLocationWithinPage(
2299 WebFrame* frame, bool is_new_navigation) { 2318 WebFrame* frame, bool is_new_navigation) {
2300 // If this was a reference fragment navigation that we initiated, then we 2319 // If this was a reference fragment navigation that we initiated, then we
2301 // could end up having a non-null pending navigation state. We just need to 2320 // could end up having a non-null pending navigation state. We just need to
2302 // update the ExtraData on the datasource so that others who read the 2321 // update the ExtraData on the datasource so that others who read the
2303 // ExtraData will get the new NavigationState. Similarly, if we did not 2322 // ExtraData will get the new NavigationState. Similarly, if we did not
2304 // initiate this navigation, then we need to take care to reset any pre- 2323 // initiate this navigation, then we need to take care to reset any pre-
2305 // existing navigation state to a content-initiated navigation state. 2324 // existing navigation state to a content-initiated navigation state.
(...skipping 1335 matching lines...) Expand 10 before | Expand all | Expand 10 after
3641 } 3660 }
3642 3661
3643 void RenderView::OnSetEditCommandsForNextKeyEvent( 3662 void RenderView::OnSetEditCommandsForNextKeyEvent(
3644 const EditCommands& edit_commands) { 3663 const EditCommands& edit_commands) {
3645 edit_commands_ = edit_commands; 3664 edit_commands_ = edit_commands;
3646 } 3665 }
3647 3666
3648 void RenderView::OnExecuteCode(int request_id, const std::string& extension_id, 3667 void RenderView::OnExecuteCode(int request_id, const std::string& extension_id,
3649 bool is_js_code, 3668 bool is_js_code,
3650 const std::string& code_string) { 3669 const std::string& code_string) {
3651 if (is_loading_) {
3652 scoped_refptr<CodeExecutionInfo> info = new CodeExecutionInfo(
3653 request_id, extension_id, is_js_code, code_string);
3654 pending_code_execution_queue_.push(info);
3655 return;
3656 }
3657 WebFrame* main_frame = webview() ? webview()->mainFrame() : NULL; 3670 WebFrame* main_frame = webview() ? webview()->mainFrame() : NULL;
3658 if (!main_frame) { 3671 if (!main_frame) {
3659 Send(new ViewMsg_ExecuteCodeFinished(routing_id_, request_id, false)); 3672 Send(new ViewMsg_ExecuteCodeFinished(routing_id_, request_id, false));
3660 return; 3673 return;
3661 } 3674 }
3662 3675
3676 WebDataSource* ds = main_frame->dataSource();
3677 NavigationState* navigation_state = NavigationState::FromDataSource(ds);
3678 if (!navigation_state->user_script_idle_scheduler()->has_run()) {
3679 scoped_refptr<CodeExecutionInfo> info = new CodeExecutionInfo(
3680 request_id, extension_id, is_js_code, code_string);
3681 pending_code_execution_queue_.push(info);
3682 return;
3683 }
3684
3685 ExecuteCodeImpl(main_frame, request_id, extension_id, is_js_code, code_string) ;
Matt Perry 2009/11/02 19:46:30 line length
3686 }
3687
3688 void RenderView::ExecuteCodeImpl(WebFrame* frame,
3689 int request_id,
3690 const std::string& extension_id,
3691 bool is_js_code,
3692 const std::string& code_string) {
3663 if (is_js_code) { 3693 if (is_js_code) {
3664 std::vector<WebScriptSource> sources; 3694 std::vector<WebScriptSource> sources;
3665 sources.push_back( 3695 sources.push_back(
3666 WebScriptSource(WebString::fromUTF8(code_string))); 3696 WebScriptSource(WebString::fromUTF8(code_string)));
3667 UserScriptSlave::InsertInitExtensionCode(&sources, extension_id); 3697 UserScriptSlave::InsertInitExtensionCode(&sources, extension_id);
3668 main_frame->executeScriptInIsolatedWorld( 3698 frame->executeScriptInIsolatedWorld(
3669 UserScriptSlave::GetIsolatedWorldId(extension_id), 3699 UserScriptSlave::GetIsolatedWorldId(extension_id),
3670 &sources.front(), sources.size(), EXTENSION_GROUP_CONTENT_SCRIPTS); 3700 &sources.front(), sources.size(), EXTENSION_GROUP_CONTENT_SCRIPTS);
3671 } else { 3701 } else {
3672 main_frame->insertStyleText(WebString::fromUTF8(code_string), WebString()); 3702 frame->insertStyleText(WebString::fromUTF8(code_string), WebString());
3673 } 3703 }
3674 3704
3675 Send(new ViewMsg_ExecuteCodeFinished(routing_id_, request_id, true)); 3705 Send(new ViewMsg_ExecuteCodeFinished(routing_id_, request_id, true));
3676 } 3706 }
3677 3707
3678 void RenderView::Close() { 3708 void RenderView::Close() {
3679 // We need to grab a pointer to the doomed WebView before we destroy it. 3709 // We need to grab a pointer to the doomed WebView before we destroy it.
3680 WebView* doomed = webview(); 3710 WebView* doomed = webview();
3681 RenderWidget::Close(); 3711 RenderWidget::Close();
3682 Singleton<ViewMap>::get()->erase(doomed); 3712 Singleton<ViewMap>::get()->erase(doomed);
(...skipping 20 matching lines...) Expand all
3703 new PluginMsg_SignalModalDialogEvent(host_window_)); 3733 new PluginMsg_SignalModalDialogEvent(host_window_));
3704 3734
3705 message->EnableMessagePumping(); // Runs a nested message loop. 3735 message->EnableMessagePumping(); // Runs a nested message loop.
3706 bool rv = Send(message); 3736 bool rv = Send(message);
3707 3737
3708 PluginChannelHost::Broadcast( 3738 PluginChannelHost::Broadcast(
3709 new PluginMsg_ResetModalDialogEvent(host_window_)); 3739 new PluginMsg_ResetModalDialogEvent(host_window_));
3710 3740
3711 return rv; 3741 return rv;
3712 } 3742 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698