| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "content/renderer/render_view_impl.h" | 5 #include "content/renderer/render_view_impl.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <cmath> | 8 #include <cmath> |
| 9 | 9 |
| 10 #include "base/auto_reset.h" | 10 #include "base/auto_reset.h" |
| (...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 318 LAZY_INSTANCE_INITIALIZER; | 318 LAZY_INSTANCE_INITIALIZER; |
| 319 | 319 |
| 320 // Time, in seconds, we delay before sending content state changes (such as form | 320 // Time, in seconds, we delay before sending content state changes (such as form |
| 321 // state and scroll position) to the browser. We delay sending changes to avoid | 321 // state and scroll position) to the browser. We delay sending changes to avoid |
| 322 // spamming the browser. | 322 // spamming the browser. |
| 323 // To avoid having tab/session restore require sending a message to get the | 323 // To avoid having tab/session restore require sending a message to get the |
| 324 // current content state during tab closing we use a shorter timeout for the | 324 // current content state during tab closing we use a shorter timeout for the |
| 325 // foreground renderer. This means there is a small window of time from which | 325 // foreground renderer. This means there is a small window of time from which |
| 326 // content state is modified and not sent to session restore, but this is | 326 // content state is modified and not sent to session restore, but this is |
| 327 // better than having to wake up all renderers during shutdown. | 327 // better than having to wake up all renderers during shutdown. |
| 328 const int kHiddenPageStateSendingDelaySeconds = 5; | 328 const int kDelaySecondsForContentStateSyncHidden = 5; |
| 329 const int kPageStateSendingDelaySeconds = 1; | 329 const int kDelaySecondsForContentStateSync = 1; |
| 330 | 330 |
| 331 #if defined(OS_ANDROID) | 331 #if defined(OS_ANDROID) |
| 332 // Delay between tapping in content and launching the associated android intent. | 332 // Delay between tapping in content and launching the associated android intent. |
| 333 // Used to allow users see what has been recognized as content. | 333 // Used to allow users see what has been recognized as content. |
| 334 const size_t kContentIntentDelayMilliseconds = 700; | 334 const size_t kContentIntentDelayMilliseconds = 700; |
| 335 #endif | 335 #endif |
| 336 | 336 |
| 337 static RenderViewImpl* (*g_create_render_view_impl)(RenderViewImplParams*) = | 337 static RenderViewImpl* (*g_create_render_view_impl)(RenderViewImplParams*) = |
| 338 NULL; | 338 NULL; |
| 339 | 339 |
| (...skipping 302 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 642 | 642 |
| 643 } // namespace | 643 } // namespace |
| 644 | 644 |
| 645 RenderViewImpl::RenderViewImpl(RenderViewImplParams* params) | 645 RenderViewImpl::RenderViewImpl(RenderViewImplParams* params) |
| 646 : RenderWidget(blink::WebPopupTypeNone, | 646 : RenderWidget(blink::WebPopupTypeNone, |
| 647 params->screen_info, | 647 params->screen_info, |
| 648 params->swapped_out, | 648 params->swapped_out, |
| 649 params->hidden, | 649 params->hidden, |
| 650 params->never_visible), | 650 params->never_visible), |
| 651 webkit_preferences_(params->webkit_prefs), | 651 webkit_preferences_(params->webkit_prefs), |
| 652 send_content_state_immediately_(false), |
| 652 enabled_bindings_(0), | 653 enabled_bindings_(0), |
| 653 send_preferred_size_changes_(false), | 654 send_preferred_size_changes_(false), |
| 654 navigation_gesture_(NavigationGestureUnknown), | 655 navigation_gesture_(NavigationGestureUnknown), |
| 655 opened_by_user_gesture_(true), | 656 opened_by_user_gesture_(true), |
| 656 opener_suppressed_(false), | 657 opener_suppressed_(false), |
| 657 suppress_dialogs_until_swap_out_(false), | 658 suppress_dialogs_until_swap_out_(false), |
| 658 page_state_sent_immediately_(false), | |
| 659 page_state_dirty_(false), | |
| 660 page_id_(-1), | 659 page_id_(-1), |
| 661 last_page_id_sent_to_browser_(-1), | 660 last_page_id_sent_to_browser_(-1), |
| 662 next_page_id_(params->next_page_id), | 661 next_page_id_(params->next_page_id), |
| 663 history_list_offset_(-1), | 662 history_list_offset_(-1), |
| 664 history_list_length_(0), | 663 history_list_length_(0), |
| 665 frames_in_progress_(0), | 664 frames_in_progress_(0), |
| 666 target_url_status_(TARGET_NONE), | 665 target_url_status_(TARGET_NONE), |
| 667 uses_temporary_zoom_level_(false), | 666 uses_temporary_zoom_level_(false), |
| 668 #if defined(OS_ANDROID) | 667 #if defined(OS_ANDROID) |
| 669 top_controls_constraints_(cc::BOTH), | 668 top_controls_constraints_(cc::BOTH), |
| (...skipping 851 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1521 return; | 1520 return; |
| 1522 if (in_live_resize) | 1521 if (in_live_resize) |
| 1523 webview()->willStartLiveResize(); | 1522 webview()->willStartLiveResize(); |
| 1524 else | 1523 else |
| 1525 webview()->willEndLiveResize(); | 1524 webview()->willEndLiveResize(); |
| 1526 } | 1525 } |
| 1527 #endif | 1526 #endif |
| 1528 | 1527 |
| 1529 /////////////////////////////////////////////////////////////////////////////// | 1528 /////////////////////////////////////////////////////////////////////////////// |
| 1530 | 1529 |
| 1530 // Sends the current history state to the browser so it will be saved before we |
| 1531 // navigate to a new page. |
| 1532 void RenderViewImpl::UpdateSessionHistory(WebFrame* frame) { |
| 1533 // If we have a valid page ID at this point, then it corresponds to the page |
| 1534 // we are navigating away from. Otherwise, this is the first navigation, so |
| 1535 // there is no past session history to record. |
| 1536 if (page_id_ == -1) |
| 1537 return; |
| 1538 SendUpdateState(history_controller_->GetCurrentEntry()); |
| 1539 } |
| 1540 |
| 1541 void RenderViewImpl::SendUpdateState(HistoryEntry* entry) { |
| 1542 if (!entry) |
| 1543 return; |
| 1544 |
| 1545 // Don't send state updates for kSwappedOutURL. |
| 1546 if (entry->root().urlString() == WebString::fromUTF8(kSwappedOutURL)) |
| 1547 return; |
| 1548 |
| 1549 Send(new ViewHostMsg_UpdateState( |
| 1550 routing_id_, page_id_, HistoryEntryToPageState(entry))); |
| 1551 } |
| 1552 |
| 1531 bool RenderViewImpl::SendAndRunNestedMessageLoop(IPC::SyncMessage* message) { | 1553 bool RenderViewImpl::SendAndRunNestedMessageLoop(IPC::SyncMessage* message) { |
| 1532 // Before WebKit asks us to show an alert (etc.), it takes care of doing the | 1554 // Before WebKit asks us to show an alert (etc.), it takes care of doing the |
| 1533 // equivalent of WebView::willEnterModalLoop. In the case of showModalDialog | 1555 // equivalent of WebView::willEnterModalLoop. In the case of showModalDialog |
| 1534 // it is particularly important that we do not call willEnterModalLoop as | 1556 // it is particularly important that we do not call willEnterModalLoop as |
| 1535 // that would defer resource loads for the dialog itself. | 1557 // that would defer resource loads for the dialog itself. |
| 1536 if (RenderThreadImpl::current()) // Will be NULL during unit tests. | 1558 if (RenderThreadImpl::current()) // Will be NULL during unit tests. |
| 1537 RenderThreadImpl::current()->DoNotNotifyWebKitOfModalLoop(); | 1559 RenderThreadImpl::current()->DoNotNotifyWebKitOfModalLoop(); |
| 1538 | 1560 |
| 1539 message->EnableMessagePumping(); // Runs a nested message loop. | 1561 message->EnableMessagePumping(); // Runs a nested message loop. |
| 1540 return Send(message); | 1562 return Send(message); |
| (...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1870 } | 1892 } |
| 1871 } | 1893 } |
| 1872 | 1894 |
| 1873 gfx::RectF RenderViewImpl::ClientRectToPhysicalWindowRect( | 1895 gfx::RectF RenderViewImpl::ClientRectToPhysicalWindowRect( |
| 1874 const gfx::RectF& rect) const { | 1896 const gfx::RectF& rect) const { |
| 1875 gfx::RectF window_rect = rect; | 1897 gfx::RectF window_rect = rect; |
| 1876 window_rect.Scale(device_scale_factor_ * webview()->pageScaleFactor()); | 1898 window_rect.Scale(device_scale_factor_ * webview()->pageScaleFactor()); |
| 1877 return window_rect; | 1899 return window_rect; |
| 1878 } | 1900 } |
| 1879 | 1901 |
| 1880 void RenderViewImpl::MarkPageStateAsDirty() { | 1902 void RenderViewImpl::StartNavStateSyncTimerIfNecessary() { |
| 1881 // No need to send state if no page has committed yet. | 1903 // No need to update state if no page has committed yet. |
| 1882 if (page_id_ == -1) | 1904 if (page_id_ == -1) |
| 1883 return; | 1905 return; |
| 1884 | 1906 |
| 1885 page_state_dirty_ = true; | |
| 1886 | |
| 1887 int delay; | 1907 int delay; |
| 1888 if (page_state_sent_immediately_) | 1908 if (send_content_state_immediately_) |
| 1889 delay = 0; | 1909 delay = 0; |
| 1890 else if (is_hidden()) | 1910 else if (is_hidden()) |
| 1891 delay = kHiddenPageStateSendingDelaySeconds; | 1911 delay = kDelaySecondsForContentStateSyncHidden; |
| 1892 else | 1912 else |
| 1893 delay = kPageStateSendingDelaySeconds; | 1913 delay = kDelaySecondsForContentStateSync; |
| 1894 | 1914 |
| 1895 if (page_state_timer_.IsRunning()) { | 1915 if (nav_state_sync_timer_.IsRunning()) { |
| 1896 // The timer is already running. If the delay of the timer maches the amount | 1916 // The timer is already running. If the delay of the timer maches the amount |
| 1897 // we want to delay by, then return. Otherwise stop the timer so that it | 1917 // we want to delay by, then return. Otherwise stop the timer so that it |
| 1898 // gets started with the right delay. | 1918 // gets started with the right delay. |
| 1899 if (page_state_timer_.GetCurrentDelay().InSeconds() == delay) | 1919 if (nav_state_sync_timer_.GetCurrentDelay().InSeconds() == delay) |
| 1900 return; | 1920 return; |
| 1901 page_state_timer_.Stop(); | 1921 nav_state_sync_timer_.Stop(); |
| 1902 } | 1922 } |
| 1903 | 1923 |
| 1904 page_state_timer_.Start(FROM_HERE, TimeDelta::FromSeconds(delay), this, | 1924 nav_state_sync_timer_.Start(FROM_HERE, TimeDelta::FromSeconds(delay), this, |
| 1905 &RenderViewImpl::FlushPageState); | 1925 &RenderViewImpl::SyncNavigationState); |
| 1906 } | |
| 1907 | |
| 1908 void RenderViewImpl::FlushPageState() { | |
| 1909 if (!page_state_dirty_ || page_id_ == -1 || !webview()) | |
| 1910 return; | |
| 1911 | |
| 1912 HistoryEntry* entry = history_controller_->GetCurrentEntry(); | |
| 1913 if (!entry) | |
| 1914 return; | |
| 1915 | |
| 1916 // Don't send state updates for kSwappedOutURL. | |
| 1917 if (entry->root().urlString() == WebString::fromUTF8(kSwappedOutURL)) | |
| 1918 return; | |
| 1919 | |
| 1920 Send(new ViewHostMsg_UpdateState( | |
| 1921 routing_id_, page_id_, HistoryEntryToPageState(entry))); | |
| 1922 | |
| 1923 page_state_dirty_ = false; | |
| 1924 } | 1926 } |
| 1925 | 1927 |
| 1926 void RenderViewImpl::setMouseOverURL(const WebURL& url) { | 1928 void RenderViewImpl::setMouseOverURL(const WebURL& url) { |
| 1927 mouse_over_url_ = GURL(url); | 1929 mouse_over_url_ = GURL(url); |
| 1928 UpdateTargetURL(mouse_over_url_, focus_url_); | 1930 UpdateTargetURL(mouse_over_url_, focus_url_); |
| 1929 } | 1931 } |
| 1930 | 1932 |
| 1931 void RenderViewImpl::setKeyboardFocusURL(const WebURL& url) { | 1933 void RenderViewImpl::setKeyboardFocusURL(const WebURL& url) { |
| 1932 focus_url_ = GURL(url); | 1934 focus_url_ = GURL(url); |
| 1933 UpdateTargetURL(focus_url_, mouse_over_url_); | 1935 UpdateTargetURL(focus_url_, mouse_over_url_); |
| (...skipping 465 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2399 for (size_t i = 0; i < icon_urls.size(); i++) { | 2401 for (size_t i = 0; i < icon_urls.size(); i++) { |
| 2400 std::vector<gfx::Size> sizes; | 2402 std::vector<gfx::Size> sizes; |
| 2401 ConvertToFaviconSizes(icon_urls[i].sizes(), &sizes); | 2403 ConvertToFaviconSizes(icon_urls[i].sizes(), &sizes); |
| 2402 urls.push_back(FaviconURL( | 2404 urls.push_back(FaviconURL( |
| 2403 icon_urls[i].iconURL(), ToFaviconType(icon_urls[i].iconType()), sizes)); | 2405 icon_urls[i].iconURL(), ToFaviconType(icon_urls[i].iconType()), sizes)); |
| 2404 } | 2406 } |
| 2405 SendUpdateFaviconURL(urls); | 2407 SendUpdateFaviconURL(urls); |
| 2406 } | 2408 } |
| 2407 | 2409 |
| 2408 void RenderViewImpl::didUpdateCurrentHistoryItem(WebLocalFrame* frame) { | 2410 void RenderViewImpl::didUpdateCurrentHistoryItem(WebLocalFrame* frame) { |
| 2409 MarkPageStateAsDirty(); | 2411 StartNavStateSyncTimerIfNecessary(); |
| 2410 } | 2412 } |
| 2411 | 2413 |
| 2412 void RenderViewImpl::CheckPreferredSize() { | 2414 void RenderViewImpl::CheckPreferredSize() { |
| 2413 // We don't always want to send the change messages over IPC, only if we've | 2415 // We don't always want to send the change messages over IPC, only if we've |
| 2414 // been put in that mode by getting a |ViewMsg_EnablePreferredSizeChangedMode| | 2416 // been put in that mode by getting a |ViewMsg_EnablePreferredSizeChangedMode| |
| 2415 // message. | 2417 // message. |
| 2416 if (!send_preferred_size_changes_ || !webview()) | 2418 if (!send_preferred_size_changes_ || !webview()) |
| 2417 return; | 2419 return; |
| 2418 | 2420 |
| 2419 gfx::Size size = webview()->contentsPreferredMinimumSize(); | 2421 gfx::Size size = webview()->contentsPreferredMinimumSize(); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 2432 preferred_size_)); | 2434 preferred_size_)); |
| 2433 } | 2435 } |
| 2434 | 2436 |
| 2435 BrowserPluginManager* RenderViewImpl::GetBrowserPluginManager() { | 2437 BrowserPluginManager* RenderViewImpl::GetBrowserPluginManager() { |
| 2436 if (!browser_plugin_manager_.get()) | 2438 if (!browser_plugin_manager_.get()) |
| 2437 browser_plugin_manager_ = BrowserPluginManager::Create(this); | 2439 browser_plugin_manager_ = BrowserPluginManager::Create(this); |
| 2438 return browser_plugin_manager_.get(); | 2440 return browser_plugin_manager_.get(); |
| 2439 } | 2441 } |
| 2440 | 2442 |
| 2441 void RenderViewImpl::didChangeScrollOffset(WebLocalFrame* frame) { | 2443 void RenderViewImpl::didChangeScrollOffset(WebLocalFrame* frame) { |
| 2442 MarkPageStateAsDirty(); | 2444 StartNavStateSyncTimerIfNecessary(); |
| 2443 | 2445 |
| 2444 FOR_EACH_OBSERVER( | 2446 FOR_EACH_OBSERVER( |
| 2445 RenderViewObserver, observers_, DidChangeScrollOffset(frame)); | 2447 RenderViewObserver, observers_, DidChangeScrollOffset(frame)); |
| 2446 } | 2448 } |
| 2447 | 2449 |
| 2448 void RenderViewImpl::SendFindReply(int request_id, | 2450 void RenderViewImpl::SendFindReply(int request_id, |
| 2449 int match_count, | 2451 int match_count, |
| 2450 int ordinal, | 2452 int ordinal, |
| 2451 const WebRect& selection_rect, | 2453 const WebRect& selection_rect, |
| 2452 bool final_status_update) { | 2454 bool final_status_update) { |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2556 bool RenderViewImpl::ShouldDisplayScrollbars(int width, int height) const { | 2558 bool RenderViewImpl::ShouldDisplayScrollbars(int width, int height) const { |
| 2557 return (!send_preferred_size_changes_ || | 2559 return (!send_preferred_size_changes_ || |
| 2558 (disable_scrollbars_size_limit_.width() <= width || | 2560 (disable_scrollbars_size_limit_.width() <= width || |
| 2559 disable_scrollbars_size_limit_.height() <= height)); | 2561 disable_scrollbars_size_limit_.height() <= height)); |
| 2560 } | 2562 } |
| 2561 | 2563 |
| 2562 int RenderViewImpl::GetEnabledBindings() const { | 2564 int RenderViewImpl::GetEnabledBindings() const { |
| 2563 return enabled_bindings_; | 2565 return enabled_bindings_; |
| 2564 } | 2566 } |
| 2565 | 2567 |
| 2566 bool RenderViewImpl::IsPageStateSentImmediately() const { | 2568 bool RenderViewImpl::GetContentStateImmediately() const { |
| 2567 return page_state_sent_immediately_; | 2569 return send_content_state_immediately_; |
| 2568 } | 2570 } |
| 2569 | 2571 |
| 2570 blink::WebPageVisibilityState RenderViewImpl::GetVisibilityState() const { | 2572 blink::WebPageVisibilityState RenderViewImpl::GetVisibilityState() const { |
| 2571 return visibilityState(); | 2573 return visibilityState(); |
| 2572 } | 2574 } |
| 2573 | 2575 |
| 2574 void RenderViewImpl::DidStartLoading() { | 2576 void RenderViewImpl::DidStartLoading() { |
| 2575 main_render_frame_->didStartLoading(true); | 2577 main_render_frame_->didStartLoading(true); |
| 2576 } | 2578 } |
| 2577 | 2579 |
| 2578 void RenderViewImpl::DidStopLoading() { | 2580 void RenderViewImpl::DidStopLoading() { |
| 2579 main_render_frame_->didStopLoading(); | 2581 main_render_frame_->didStopLoading(); |
| 2580 } | 2582 } |
| 2581 | 2583 |
| 2582 void RenderViewImpl::ForcePageStateFlushForTesting() { | 2584 void RenderViewImpl::SyncNavigationState() { |
| 2583 FlushPageState(); | 2585 if (!webview()) |
| 2586 return; |
| 2587 SendUpdateState(history_controller_->GetCurrentEntry()); |
| 2584 } | 2588 } |
| 2585 | 2589 |
| 2586 blink::WebPlugin* RenderViewImpl::GetWebPluginForFind() { | 2590 blink::WebPlugin* RenderViewImpl::GetWebPluginForFind() { |
| 2587 if (!webview()) | 2591 if (!webview()) |
| 2588 return NULL; | 2592 return NULL; |
| 2589 | 2593 |
| 2590 WebFrame* main_frame = webview()->mainFrame(); | 2594 WebFrame* main_frame = webview()->mainFrame(); |
| 2591 if (main_frame->isWebLocalFrame() && | 2595 if (main_frame->isWebLocalFrame() && |
| 2592 main_frame->document().isPluginDocument()) | 2596 main_frame->document().isPluginDocument()) |
| 2593 return webview()->mainFrame()->document().to<WebPluginDocument>().plugin(); | 2597 return webview()->mainFrame()->document().to<WebPluginDocument>().plugin(); |
| (...skipping 1616 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4210 std::vector<gfx::Size> sizes; | 4214 std::vector<gfx::Size> sizes; |
| 4211 ConvertToFaviconSizes(icon_urls[i].sizes(), &sizes); | 4215 ConvertToFaviconSizes(icon_urls[i].sizes(), &sizes); |
| 4212 if (!url.isEmpty()) | 4216 if (!url.isEmpty()) |
| 4213 urls.push_back( | 4217 urls.push_back( |
| 4214 FaviconURL(url, ToFaviconType(icon_urls[i].iconType()), sizes)); | 4218 FaviconURL(url, ToFaviconType(icon_urls[i].iconType()), sizes)); |
| 4215 } | 4219 } |
| 4216 SendUpdateFaviconURL(urls); | 4220 SendUpdateFaviconURL(urls); |
| 4217 } | 4221 } |
| 4218 | 4222 |
| 4219 } // namespace content | 4223 } // namespace content |
| OLD | NEW |