web_contents_impl.cc revision cedac228d2dd51db4b79ea1e72c7f249408ee061
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/web_contents/web_contents_impl.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <utility>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/debug/trace_event.h"
11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/lazy_instance.h"
12a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/logging.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/histogram.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/stats_counters.h"
15a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/process/process.h"
16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h"
17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_number_conversions.h"
18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/browser_plugin/browser_plugin_embedder.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/browser_plugin/browser_plugin_guest.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/child_process_security_policy_impl.h"
24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/browser/devtools/render_view_devtools_agent_host.h"
25bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "content/browser/dom_storage/dom_storage_context_wrapper.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/dom_storage/session_storage_namespace_impl.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/download/download_stats.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/download/mhtml_generation_manager.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/download/save_package.h"
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/browser/frame_host/cross_process_frame_connector.h"
311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "content/browser/frame_host/interstitial_page_impl.h"
321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "content/browser/frame_host/navigation_entry_impl.h"
33a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/browser/frame_host/navigator_impl.h"
34a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/browser/frame_host/render_frame_host_impl.h"
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/browser/frame_host/render_widget_host_view_child_frame.h"
36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/browser/geolocation/geolocation_dispatcher_host.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/host_zoom_map_impl.h"
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/loader/resource_dispatcher_host_impl.h"
398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "content/browser/message_port_message_filter.h"
408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "content/browser/message_port_service.h"
41ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/browser/power_save_blocker_impl.h"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/render_process_host_impl.h"
43010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "content/browser/renderer_host/render_view_host_delegate_view.h"
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/render_view_host_impl.h"
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/render_widget_host_impl.h"
46010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "content/browser/renderer_host/render_widget_host_view_base.h"
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/site_instance_impl.h"
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/web_contents/web_contents_view_guest.h"
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/webui/generic_handler.h"
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/webui/web_ui_controller_factory_registry.h"
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/webui/web_ui_impl.h"
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/common/browser_plugin/browser_plugin_constants.h"
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/common/browser_plugin/browser_plugin_messages.h"
54a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/common/frame_messages.h"
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/common/image_messages.h"
56c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "content/common/input_messages.h"
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/ssl_status_serialization.h"
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/view_messages.h"
59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/public/browser/ax_event_notification_details.h"
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_context.h"
61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/public/browser/browser_plugin_guest_manager.h"
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/content_browser_client.h"
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/devtools_agent_host.h"
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_manager.h"
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_url_parameters.h"
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/invalidate_type.h"
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/javascript_dialog_manager.h"
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/load_from_memory_cache_details.h"
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/load_notification_details.h"
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_details.h"
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_details.h"
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h"
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/resource_request_details.h"
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/storage_partition.h"
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/user_metrics.h"
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_delegate.h"
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_observer.h"
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/bindings_policy.h"
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_constants.h"
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_switches.h"
8158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch#include "content/public/common/page_zoom.h"
82a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/public/common/result_codes.h"
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/url_constants.h"
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/common/url_utils.h"
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/mime_util.h"
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_util.h"
8758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "net/http/http_cache.h"
8858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "net/http/http_transaction_factory.h"
8958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "net/url_request/url_request_context.h"
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context_getter.h"
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/layout.h"
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/display.h"
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/screen.h"
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gl_switches.h"
95868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "webkit/common/webpreferences.h"
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_ANDROID)
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/android/date_time_chooser_android.h"
99010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "content/browser/media/android/browser_media_player_manager.h"
100a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/browser/web_contents/web_contents_android.h"
101868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/public/browser/android/content_view_core.h"
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/mac/foundation_util.h"
1067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ui/gl/io_surface_support_mac.h"
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Cross-Site Navigations
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If a WebContentsImpl is told to navigate to a different web site (as
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// determined by SiteInstance), it will replace its current RenderViewHost with
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a new RenderViewHost dedicated to the new SiteInstance.  This works as
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// follows:
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
1164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// - RVHM::Navigate determines whether the destination is cross-site, and if so,
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   it creates a pending_render_view_host_.
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - The pending RVH is "suspended," so that no navigation messages are sent to
1194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)//   its renderer until the beforeunload JavaScript handler has a chance to
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   run in the current RVH.
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - The pending RVH tells CrossSiteRequestManager (a thread-safe singleton)
1224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)//   that it has a pending cross-site request.  We will check this on the IO
1234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)//   thread when deciding how to handle the response.
1244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// - The current RVH runs its beforeunload handler.  If it returns false, we
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   cancel all the pending logic.  Otherwise we allow the pending RVH to send
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   the navigation request to its renderer.
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - ResourceDispatcherHost receives a ResourceRequest on the IO thread for the
1284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)//   main resource load on the pending RVH.  It creates a
1294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)//   CrossSiteResourceHandler to check whether a process swap is needed when
1304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)//   the request is ready to commit.
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - When RDH receives a response, the BufferedResourceHandler determines
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   whether it is a download.  If so, it sends a message to the new renderer
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   causing it to cancel the request, and the download proceeds. For now, the
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   pending RVH remains until the next DidNavigate event for this
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   WebContentsImpl. This isn't ideal, but it doesn't affect any functionality.
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - After RDH receives a response and determines that it is safe and not a
1374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)//   download, the CrossSiteResourceHandler checks whether a process swap is
1384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)//   needed (either because CrossSiteRequestManager has state for it or because
1394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)//   a transfer was needed for a redirect).
1404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// - If so, CrossSiteResourceHandler pauses the response to first run the old
1414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)//   page's unload handler.  It does this by asynchronously calling the
142f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)//   OnCrossSiteResponse method of RenderFrameHostManager on the UI thread,
143f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)//   which sends a SwapOut message to the current RVH.
1444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// - Once the unload handler is finished, RVHM::SwappedOut checks if a transfer
1454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)//   to a new process is needed, based on the stored pending_nav_params_.  (This
1464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)//   is independent of whether we started out with a cross-process navigation.)
1474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)//   - If not, it just tells the ResourceDispatcherHost to resume the response
1484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)//     to its current RenderViewHost.
1494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)//   - If so, it cancels the current pending RenderViewHost and sets up a new
1504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)//     navigation using RequestTransferURL.  When the transferred request
1514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)//     arrives in the ResourceDispatcherHost, we transfer the response and
1524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)//     resume it.
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - The pending renderer sends a FrameNavigate message that invokes the
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   DidNavigate method.  This replaces the current RVH with the
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   pending RVH.
156f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// - The previous renderer is kept swapped out in RenderFrameHostManager in case
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   the user goes back.  The process only stays live if another tab is using
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   it, but if so, the existing frame relationships will be maintained.
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
163cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const int kMinimumDelayBetweenLoadingUpdatesMS = 100;
164cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// This matches what Blink's ProgressTracker has traditionally used for a
166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// minimum progress value.
167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const double kMinimumLoadingProgress = 0.1;
168cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kDotGoogleDotCom[] = ".google.com";
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
171a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if defined(OS_ANDROID)
172a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)const char kWebContentsAndroidKey[] = "web_contents_android";
173a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif  // OS_ANDROID
174a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
175f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)base::LazyInstance<std::vector<WebContentsImpl::CreatedCallback> >
176868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)g_created_callbacks = LAZY_INSTANCE_INITIALIZER;
177868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
178e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochstatic int StartDownload(content::RenderFrameHost* rfh,
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         const GURL& url,
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         bool is_favicon,
181d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                         uint32_t max_bitmap_size) {
182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static int g_next_image_download_id = 0;
183e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  rfh->Send(new ImageMsg_DownloadImage(rfh->GetRoutingID(),
184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       ++g_next_image_download_id,
185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       url,
186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       is_favicon,
187d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                       max_bitmap_size));
188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return g_next_image_download_id;
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void NotifyCacheOnIO(
19258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    scoped_refptr<net::URLRequestContextGetter> request_context,
19358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const GURL& url,
19458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const std::string& http_method) {
19558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  request_context->GetURLRequestContext()->http_transaction_factory()->
19658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      GetCache()->OnExternalCacheHit(url, http_method);
19758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
19858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Helper function for retrieving all the sites in a frame tree.
2004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)bool CollectSites(BrowserContext* context,
2014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                  std::set<GURL>* sites,
2024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                  FrameTreeNode* node) {
2034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  sites->insert(SiteInstance::GetSiteForURL(context, node->current_url()));
2044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return true;
2054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
2064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool ForEachFrameInternal(
2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::Callback<void(RenderFrameHost*)>& on_frame,
2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    FrameTreeNode* node) {
2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  on_frame.Run(node->current_frame_host());
2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return true;
2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SendToAllFramesInternal(IPC::Message* message, RenderFrameHost* rfh) {
2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  IPC::Message* message_copy = new IPC::Message(*message);
2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  message_copy->set_routing_id(rfh->GetRoutingID());
2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  rfh->Send(message_copy);
2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
220cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void AddRenderWidgetHostToSet(std::set<RenderWidgetHostImpl*>* set,
221cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                              RenderFrameHost* rfh) {
222cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  set->insert(static_cast<RenderFrameHostImpl*>(rfh)->GetRenderWidgetHost());
223a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
224a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebContents* WebContents::Create(const WebContents::CreateParams& params) {
228a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return WebContentsImpl::CreateWithOpener(
229a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      params, static_cast<WebContentsImpl*>(params.opener));
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContents* WebContents::CreateWithSessionStorage(
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const WebContents::CreateParams& params,
234ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    const SessionStorageNamespaceMap& session_storage_namespace_map) {
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContentsImpl* new_contents = new WebContentsImpl(
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      params.browser_context, NULL);
237ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
238ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  for (SessionStorageNamespaceMap::const_iterator it =
239ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch           session_storage_namespace_map.begin();
240ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch       it != session_storage_namespace_map.end();
241ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch       ++it) {
242ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    new_contents->GetController()
243ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        .SetSessionStorageNamespace(it->first, it->second.get());
244ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
245ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  new_contents->Init(params);
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new_contents;
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
250f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void WebContentsImpl::AddCreatedCallback(const CreatedCallback& callback) {
251868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  g_created_callbacks.Get().push_back(callback);
252868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
253868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
254f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void WebContentsImpl::RemoveCreatedCallback(const CreatedCallback& callback) {
255868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  for (size_t i = 0; i < g_created_callbacks.Get().size(); ++i) {
256868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (g_created_callbacks.Get().at(i).Equals(callback)) {
257868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      g_created_callbacks.Get().erase(g_created_callbacks.Get().begin() + i);
258868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      return;
259868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    }
260868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
261868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
262868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContents* WebContents::FromRenderViewHost(const RenderViewHost* rvh) {
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return rvh->GetDelegate()->GetAsWebContents();
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)WebContents* WebContents::FromRenderFrameHost(RenderFrameHost* rfh) {
2685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  RenderFrameHostImpl* rfh_impl = static_cast<RenderFrameHostImpl*>(rfh);
2695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!rfh_impl)
2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return NULL;
2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return rfh_impl->delegate()->GetAsWebContents();
2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
27490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// WebContentsImpl::DestructionObserver ----------------------------------------
27590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
27690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class WebContentsImpl::DestructionObserver : public WebContentsObserver {
27790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public:
27890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DestructionObserver(WebContentsImpl* owner, WebContents* watched_contents)
27990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      : WebContentsObserver(watched_contents),
28090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        owner_(owner) {
28190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
28290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
28390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // WebContentsObserver:
284010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void WebContentsDestroyed() OVERRIDE {
285010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    owner_->OnWebContentsDestroyed(
286010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        static_cast<WebContentsImpl*>(web_contents()));
28790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
28890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
28990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private:
29090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  WebContentsImpl* owner_;
29190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
29290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DestructionObserver);
29390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
29490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
295a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochWebContentsImpl::ColorChooserInfo::ColorChooserInfo(int render_process_id,
296a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                                    int render_frame_id,
297a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                                    ColorChooser* chooser,
298a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                                    int identifier)
299a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    : render_process_id(render_process_id),
300a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      render_frame_id(render_frame_id),
301a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      chooser(chooser),
302a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      identifier(identifier) {
303a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
304a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
305a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochWebContentsImpl::ColorChooserInfo::~ColorChooserInfo() {
306a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
307a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebContentsImpl -------------------------------------------------------------
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsImpl::WebContentsImpl(
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserContext* browser_context,
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebContentsImpl* opener)
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : delegate_(NULL),
314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      controller_(this, browser_context),
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      render_view_host_delegate_view_(NULL),
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      opener_(opener),
3170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      created_with_opener_(!!opener),
3185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN)
319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      accessible_parent_(NULL),
320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
321a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      frame_tree_(new NavigatorImpl(&controller_, this),
322a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                  this, this, this, this),
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      is_loading_(false),
324cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      is_load_to_different_document_(false),
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      crashed_status_(base::TERMINATION_STATUS_STILL_RUNNING),
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      crashed_error_code_(0),
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      waiting_for_response_(false),
328a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      load_state_(net::LOAD_STATE_IDLE, base::string16()),
329cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      loading_total_progress_(0.0),
330cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      loading_weak_factory_(this),
331cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      loading_frames_in_progress_(0),
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      upload_size_(0),
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      upload_position_(0),
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      displayed_insecure_content_(false),
3355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      has_accessed_initial_document_(false),
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      capturer_count_(0),
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      should_normally_be_visible_(true),
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      is_being_destroyed_(false),
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      notify_disconnection_(false),
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      dialog_manager_(NULL),
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      is_showing_before_unload_dialog_(false),
3425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      last_active_time_(base::TimeTicks::Now()),
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      closed_by_user_gesture_(false),
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      minimum_zoom_percent_(static_cast<int>(kMinimumZoomFactor * 100)),
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      maximum_zoom_percent_(static_cast<int>(kMaximumZoomFactor * 100)),
346effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      totalPinchGestureAmount_(0),
347effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      currentPinchZoomStepDelta_(0),
348a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      render_view_message_source_(NULL),
3495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      fullscreen_widget_routing_id_(MSG_ROUTING_NONE),
350c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      is_subframe_(false),
351c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      last_dialog_suppressed_(false) {
352868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  for (size_t i = 0; i < g_created_callbacks.Get().size(); i++)
353868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    g_created_callbacks.Get().at(i).Run(this);
3544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  frame_tree_.SetFrameRemoveListener(
3554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      base::Bind(&WebContentsImpl::OnFrameRemoved,
3564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                 base::Unretained(this)));
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsImpl::~WebContentsImpl() {
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_being_destroyed_ = true;
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
362a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Delete all RFH pending shutdown, which will lead the corresponding RVH to
363a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // shutdown and be deleted as well.
364a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  frame_tree_.ForEach(
365a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      base::Bind(&RenderFrameHostManager::ClearRFHsPendingShutdown));
366a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
367ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  ClearAllPowerSaveBlockers();
368ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (std::set<RenderWidgetHostImpl*>::iterator iter =
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           created_widgets_.begin(); iter != created_widgets_.end(); ++iter) {
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    (*iter)->DetachDelegate();
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  created_widgets_.clear();
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clear out any JavaScript state.
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (dialog_manager_)
377a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    dialog_manager_->WebContentsDestroyed(this);
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
379a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (color_chooser_info_.get())
380a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    color_chooser_info_->chooser->End();
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotifyDisconnected();
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notify any observer that have a reference on this WebContents.
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotificationService::current()->Notify(
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTIFICATION_WEB_CONTENTS_DESTROYED,
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Source<WebContents>(this),
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NotificationService::NoDetails());
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
390cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Destroy all frame tree nodes except for the root; this notifies observers.
391cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  frame_tree_.ResetForMainFrameSwap();
392cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  GetRenderManager()->ResetProxyHosts();
393a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
394cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Manually call the observer methods for the root frame tree node.
395cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  RenderFrameHostManager* root = GetRenderManager();
396cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (root->pending_frame_host()) {
3978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    FOR_EACH_OBSERVER(WebContentsObserver,
3988bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                      observers_,
399cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                      RenderFrameDeleted(root->pending_frame_host()));
4008bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
401cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver,
402cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                    observers_,
403cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                    RenderFrameDeleted(root->current_frame_host()));
4048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
405cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (root->pending_render_view_host()) {
406cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    FOR_EACH_OBSERVER(WebContentsObserver,
407cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                      observers_,
408cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                      RenderViewDeleted(root->pending_render_view_host()));
409cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
410a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
4118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver,
4128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                    observers_,
413cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                    RenderViewDeleted(root->current_host()));
4148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver,
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    observers_,
417010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    WebContentsDestroyed());
418010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
419010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver,
420010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    observers_,
421010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    ResetWebContents());
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetDelegate(NULL);
42490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
42590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  STLDeleteContainerPairSecondPointers(destruction_observers_.begin(),
42690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                       destruction_observers_.end());
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsImpl* WebContentsImpl::CreateWithOpener(
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const WebContents::CreateParams& params,
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebContentsImpl* opener) {
4327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  TRACE_EVENT0("browser", "WebContentsImpl::CreateWithOpener");
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContentsImpl* new_contents = new WebContentsImpl(
434cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      params.browser_context, params.opener_suppressed ? NULL : opener);
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
436cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (params.guest_instance_id) {
437cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    scoped_ptr<base::DictionaryValue> extra_params;
438cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (params.guest_extra_params)
439cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        extra_params.reset(params.guest_extra_params->DeepCopy());
440cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // This makes |new_contents| act as a guest.
441cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // For more info, see comment above class BrowserPluginGuest.
442cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    BrowserPluginGuest::Create(params.guest_instance_id,
443cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                               params.site_instance,
444cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                               new_contents,
445cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                               extra_params.Pass(),
446cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                               opener ? opener->GetBrowserPluginGuest() : NULL);
447cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // We are instantiating a WebContents for browser plugin. Set its subframe
448cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // bit to true.
449cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    new_contents->is_subframe_ = true;
450cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  new_contents->Init(params);
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new_contents;
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)RenderFrameHostManager* WebContentsImpl::GetRenderManagerForTesting() {
456f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return GetRenderManager();
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::OnMessageReceived(RenderViewHost* render_view_host,
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        const IPC::Message& message) {
461a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return OnMessageReceived(render_view_host, NULL, message);
462a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
463a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
464a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool WebContentsImpl::OnMessageReceived(RenderViewHost* render_view_host,
465a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                        RenderFrameHost* render_frame_host,
466a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                        const IPC::Message& message) {
467a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  DCHECK(render_view_host || render_frame_host);
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (GetWebUI() &&
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<WebUIImpl*>(GetWebUI())->OnMessageReceived(message)) {
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ObserverListBase<WebContentsObserver>::Iterator it(observers_);
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebContentsObserver* observer;
475cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (render_frame_host) {
476cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    while ((observer = it.GetNext()) != NULL)
477cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      if (observer->OnMessageReceived(message, render_frame_host))
478cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        return true;
479cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  } else {
480cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    while ((observer = it.GetNext()) != NULL)
481cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      if (observer->OnMessageReceived(message))
482cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        return true;
483cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Message handlers should be aware of which
4865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // RenderViewHost/RenderFrameHost sent the message, which is temporarily
4875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // stored in render_(view|frame)_message_source_.
488a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (render_frame_host) {
489a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (RenderViewDevToolsAgentHost::DispatchIPCMessage(
490a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        render_frame_host->GetRenderViewHost(), message))
491a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        return true;
4925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    render_frame_message_source_ = render_frame_host;
493a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  } else {
494a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (RenderViewDevToolsAgentHost::DispatchIPCMessage(
495a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        render_view_host, message))
496a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        return true;
4975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    render_view_message_source_ = render_view_host;
498a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
4995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool handled = true;
501cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  IPC_BEGIN_MESSAGE_MAP(WebContentsImpl, message)
502a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    IPC_MESSAGE_HANDLER(FrameHostMsg_PepperPluginHung, OnPepperPluginHung)
503a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    IPC_MESSAGE_HANDLER(FrameHostMsg_PluginCrashed, OnPluginCrashed)
504a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    IPC_MESSAGE_HANDLER(FrameHostMsg_DomOperationResponse,
505a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        OnDomOperationResponse)
506a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    IPC_MESSAGE_HANDLER(FrameHostMsg_DidFinishDocumentLoad,
507a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                        OnDocumentLoadedInFrame)
508a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    IPC_MESSAGE_HANDLER(FrameHostMsg_DidFinishLoad, OnDidFinishLoad)
509cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    IPC_MESSAGE_HANDLER(FrameHostMsg_DidStartLoading, OnDidStartLoading)
510cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    IPC_MESSAGE_HANDLER(FrameHostMsg_DidStopLoading, OnDidStopLoading)
511cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    IPC_MESSAGE_HANDLER(FrameHostMsg_DidChangeLoadProgress,
512cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                        OnDidChangeLoadProgress)
513a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    IPC_MESSAGE_HANDLER(FrameHostMsg_OpenColorChooser, OnOpenColorChooser)
514a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    IPC_MESSAGE_HANDLER(FrameHostMsg_EndColorChooser, OnEndColorChooser)
515a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    IPC_MESSAGE_HANDLER(FrameHostMsg_SetSelectedColorInColorChooser,
516a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                        OnSetSelectedColorInColorChooser)
517010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    IPC_MESSAGE_HANDLER(FrameHostMsg_MediaPlayingNotification,
518010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        OnMediaPlayingNotification)
519010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    IPC_MESSAGE_HANDLER(FrameHostMsg_MediaPausedNotification,
520010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        OnMediaPausedNotification)
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_DidLoadResourceFromMemoryCache,
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        OnDidLoadResourceFromMemoryCache)
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_DidDisplayInsecureContent,
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        OnDidDisplayInsecureContent)
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_DidRunInsecureContent,
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        OnDidRunInsecureContent)
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_GoToEntryAtOffset, OnGoToEntryAtOffset)
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_UpdateZoomLimits, OnUpdateZoomLimits)
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_EnumerateDirectory, OnEnumerateDirectory)
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_RegisterProtocolHandler,
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        OnRegisterProtocolHandler)
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_Find_Reply, OnFindReply)
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_AppCacheAccessed, OnAppCacheAccessed)
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_WebUISend, OnWebUISend)
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_RequestPpapiBrokerPermission,
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        OnRequestPpapiBrokerPermission)
5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER_GENERIC(BrowserPluginHostMsg_AllocateInstanceID,
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                OnBrowserPluginMessage(message))
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER_GENERIC(BrowserPluginHostMsg_Attach,
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                OnBrowserPluginMessage(message))
541c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ImageHostMsg_DidDownloadImage, OnDidDownloadImage)
542c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_UpdateFaviconURL, OnUpdateFaviconURL)
543f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_DidFirstVisuallyNonEmptyPaint,
544f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                        OnFirstVisuallyNonEmptyPaint)
5455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_ShowValidationMessage,
5465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        OnShowValidationMessage)
5475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_HideValidationMessage,
5485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        OnHideValidationMessage)
5495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_MoveValidationMessage,
5505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        OnMoveValidationMessage)
551a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#if defined(OS_ANDROID)
552a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    IPC_MESSAGE_HANDLER(ViewHostMsg_FindMatchRects_Reply,
553a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                        OnFindMatchRectsReply)
554a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    IPC_MESSAGE_HANDLER(ViewHostMsg_OpenDateTimeDialog,
555a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                        OnOpenDateTimeDialog)
556a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#endif
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_UNHANDLED(handled = false)
558cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  IPC_END_MESSAGE_MAP()
559a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  render_view_message_source_ = NULL;
5605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  render_frame_message_source_ = NULL;
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return handled;
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RunFileChooser(
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RenderViewHost* render_view_host,
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FileChooserParams& params) {
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->RunFileChooser(this, params);
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NavigationControllerImpl& WebContentsImpl::GetController() {
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return controller_;
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const NavigationControllerImpl& WebContentsImpl::GetController() const {
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return controller_;
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserContext* WebContentsImpl::GetBrowserContext() const {
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return controller_.GetBrowserContext();
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GURL& WebContentsImpl::GetURL() const {
58590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // We may not have a navigation entry yet.
586868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  NavigationEntry* entry = controller_.GetVisibleEntry();
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return entry ? entry->GetVirtualURL() : GURL::EmptyGURL();
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
590ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochconst GURL& WebContentsImpl::GetVisibleURL() const {
59190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // We may not have a navigation entry yet.
592868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  NavigationEntry* entry = controller_.GetVisibleEntry();
59390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return entry ? entry->GetVirtualURL() : GURL::EmptyGURL();
59490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
59590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
59690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const GURL& WebContentsImpl::GetLastCommittedURL() const {
59790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // We may not have a navigation entry yet.
59890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  NavigationEntry* entry = controller_.GetLastCommittedEntry();
59990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return entry ? entry->GetVirtualURL() : GURL::EmptyGURL();
60090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
60190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsDelegate* WebContentsImpl::GetDelegate() {
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return delegate_;
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetDelegate(WebContentsDelegate* delegate) {
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(cbentzel): remove this debugging code?
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate == delegate_)
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->Detach(this);
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_ = delegate;
6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (delegate_) {
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->Attach(this);
6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Ensure the visible RVH reflects the new delegate's preferences.
6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (view_)
6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      view_->SetOverscrollControllerEnabled(delegate->CanOverscrollContent());
6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderProcessHost* WebContentsImpl::GetRenderProcessHost() const {
622f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  RenderViewHostImpl* host = GetRenderManager()->current_host();
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return host ? host->GetProcess() : NULL;
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
626a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)RenderFrameHost* WebContentsImpl::GetMainFrame() {
6275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return frame_tree_.root()->current_frame_host();
6285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
6295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
630a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)RenderFrameHost* WebContentsImpl::GetFocusedFrame() {
631a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!frame_tree_.GetFocusedFrame())
632a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return NULL;
633a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return frame_tree_.GetFocusedFrame()->current_frame_host();
634a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
635a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
6365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::ForEachFrame(
6375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::Callback<void(RenderFrameHost*)>& on_frame) {
6385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  frame_tree_.ForEach(base::Bind(&ForEachFrameInternal, on_frame));
6395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
6405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::SendToAllFrames(IPC::Message* message) {
6425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ForEachFrame(base::Bind(&SendToAllFramesInternal, message));
6435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  delete message;
644a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
645a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderViewHost* WebContentsImpl::GetRenderViewHost() const {
647f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return GetRenderManager()->current_host();
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsImpl::GetRoutingID() const {
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetRenderViewHost())
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return MSG_ROUTING_NONE;
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetRenderViewHost()->GetRoutingID();
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int WebContentsImpl::GetFullscreenWidgetRoutingID() const {
6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return fullscreen_widget_routing_id_;
6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderWidgetHostView* WebContentsImpl::GetRenderWidgetHostView() const {
662f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return GetRenderManager()->GetRenderWidgetHostView();
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)RenderWidgetHostView* WebContentsImpl::GetFullscreenRenderWidgetHostView()
666d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    const {
667d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  RenderWidgetHost* const widget_host =
668d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      RenderWidgetHostImpl::FromID(GetRenderProcessHost()->GetID(),
669d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                   GetFullscreenWidgetRoutingID());
670d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return widget_host ? widget_host->GetView() : NULL;
671d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
672d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsView* WebContentsImpl::GetView() const {
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return view_.get();
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebUI* WebContentsImpl::CreateWebUI(const GURL& url) {
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebUIImpl* web_ui = new WebUIImpl(this);
6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebUIController* controller = WebUIControllerFactoryRegistry::GetInstance()->
6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateWebUIControllerForURL(web_ui, url);
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (controller) {
6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    web_ui->AddMessageHandler(new GenericHandler());
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_ui->SetController(controller);
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return web_ui;
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete web_ui;
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebUI* WebContentsImpl::GetWebUI() const {
692f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return GetRenderManager()->web_ui() ? GetRenderManager()->web_ui()
693f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      : GetRenderManager()->pending_web_ui();
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebUI* WebContentsImpl::GetCommittedWebUI() const {
697f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return GetRenderManager()->web_ui();
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetUserAgentOverride(const std::string& override) {
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (GetUserAgentOverride() == override)
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  renderer_preferences_.user_agent_override = override;
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Send the new override string to the renderer.
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderViewHost* host = GetRenderViewHost();
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (host)
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    host->SyncRendererPrefs();
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reload the page if a load is currently in progress to avoid having
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // different parts of the page loaded using different user agents.
7134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  NavigationEntry* entry = controller_.GetVisibleEntry();
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_loading_ && entry != NULL && entry->GetIsOverridingUserAgent())
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    controller_.ReloadIgnoringCache(true);
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver, observers_,
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    UserAgentOverrideSet(override));
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::string& WebContentsImpl::GetUserAgentOverride() const {
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return renderer_preferences_.user_agent_override;
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN)
726c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebContentsImpl::SetParentNativeViewAccessible(
727c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)gfx::NativeViewAccessible accessible_parent) {
728c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  accessible_parent_ = accessible_parent;
72990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (GetRenderViewHost())
73090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    GetRenderViewHostImpl()->SetParentNativeViewAccessible(accessible_parent);
731c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
732c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
733c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
734a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)const base::string16& WebContentsImpl::GetTitle() const {
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Transient entries take precedence. They are used for interstitial pages
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // that are shown on top of existing pages.
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigationEntry* entry = controller_.GetTransientEntry();
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string accept_languages =
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetContentClient()->browser()->GetAcceptLangs(
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          GetBrowserContext());
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (entry) {
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return entry->GetTitleForDisplay(accept_languages);
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
744f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  WebUI* our_web_ui = GetRenderManager()->pending_web_ui() ?
745f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GetRenderManager()->pending_web_ui() : GetRenderManager()->web_ui();
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (our_web_ui) {
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Don't override the title in view source mode.
748868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    entry = controller_.GetVisibleEntry();
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!(entry && entry->IsViewSourceMode())) {
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Give the Web UI the chance to override our title.
751a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      const base::string16& title = our_web_ui->GetOverriddenTitle();
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!title.empty())
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return title;
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We use the title for the last committed entry rather than a pending
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // navigation entry. For example, when the user types in a URL, we want to
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // keep the old page's title until the new load has committed and we get a new
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // title.
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry = controller_.GetLastCommittedEntry();
762868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
763f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // We make an exception for initial navigations.
764f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (controller_.IsInitialNavigation()) {
765f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // We only want to use the title from the visible entry in one of two cases:
766f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // 1. There's already a committed entry for an initial navigation, in which
767f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    //    case we are doing a history navigation in a new tab (e.g., Ctrl+Back).
768f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // 2. The pending entry has been explicitly assigned a title to display.
769f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    //
770f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // If there's no last committed entry and no assigned title, we should fall
771f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // back to |page_title_when_no_navigation_entry_| rather than showing the
772f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // URL.
773f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (entry ||
774f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        (controller_.GetVisibleEntry() &&
775f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         !controller_.GetVisibleEntry()->GetTitle().empty())) {
776f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      entry = controller_.GetVisibleEntry();
777f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
778f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
779868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (entry) {
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return entry->GetTitleForDisplay(accept_languages);
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |page_title_when_no_navigation_entry_| is finally used
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // if no title cannot be retrieved.
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return page_title_when_no_navigation_entry_;
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32 WebContentsImpl::GetMaxPageID() {
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetMaxPageIDForSiteInstance(GetSiteInstance());
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32 WebContentsImpl::GetMaxPageIDForSiteInstance(
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SiteInstance* site_instance) {
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (max_page_ids_.find(site_instance->GetId()) == max_page_ids_.end())
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    max_page_ids_[site_instance->GetId()] = -1;
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return max_page_ids_[site_instance->GetId()];
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdateMaxPageID(int32 page_id) {
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateMaxPageIDForSiteInstance(GetSiteInstance(), page_id);
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdateMaxPageIDForSiteInstance(
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SiteInstance* site_instance, int32 page_id) {
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (GetMaxPageIDForSiteInstance(site_instance) < page_id)
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    max_page_ids_[site_instance->GetId()] = page_id;
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void WebContentsImpl::CopyMaxPageIDsFrom(WebContents* web_contents) {
8121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  WebContentsImpl* contents = static_cast<WebContentsImpl*>(web_contents);
8131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  max_page_ids_ = contents->max_page_ids_;
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SiteInstance* WebContentsImpl::GetSiteInstance() const {
817f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return GetRenderManager()->current_host()->GetSiteInstance();
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SiteInstance* WebContentsImpl::GetPendingSiteInstance() const {
821f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  RenderViewHost* dest_rvh = GetRenderManager()->pending_render_view_host() ?
822f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GetRenderManager()->pending_render_view_host() :
823f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GetRenderManager()->current_host();
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return dest_rvh->GetSiteInstance();
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::IsLoading() const {
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return is_loading_;
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
831cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool WebContentsImpl::IsLoadingToDifferentDocument() const {
832cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return is_loading_ && is_load_to_different_document_;
833cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
834cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::IsWaitingForResponse() const {
836cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return waiting_for_response_ && is_load_to_different_document_;
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const net::LoadStateWithParam& WebContentsImpl::GetLoadState() const {
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return load_state_;
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
843a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)const base::string16& WebContentsImpl::GetLoadStateHost() const {
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return load_state_host_;
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint64 WebContentsImpl::GetUploadSize() const {
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return upload_size_;
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint64 WebContentsImpl::GetUploadPosition() const {
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return upload_position_;
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)std::set<GURL> WebContentsImpl::GetSitesInTab() const {
8567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::set<GURL> sites;
8575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  frame_tree_.ForEach(base::Bind(&CollectSites,
8585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                 base::Unretained(GetBrowserContext()),
8595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                 base::Unretained(&sites)));
8607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return sites;
8617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
8627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::string& WebContentsImpl::GetEncoding() const {
864cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return canonical_encoding_;
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::DisplayedInsecureContent() const {
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return displayed_insecure_content_;
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::IncrementCapturerCount(const gfx::Size& capture_size) {
8722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(!is_being_destroyed_);
8732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ++capturer_count_;
8742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DVLOG(1) << "There are now " << capturer_count_
8752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           << " capturing(s) of WebContentsImpl@" << this;
8765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
8775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Note: This provides a hint to upstream code to size the views optimally
8785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // for quality (e.g., to avoid scaling).
8795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!capture_size.IsEmpty() && preferred_size_for_capture_.IsEmpty()) {
8805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    preferred_size_for_capture_ = capture_size;
8815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    OnPreferredSizeChanged(preferred_size_);
8825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
8832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::DecrementCapturerCount() {
8862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  --capturer_count_;
8872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DVLOG(1) << "There are now " << capturer_count_
8882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           << " capturing(s) of WebContentsImpl@" << this;
8892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK_LE(0, capturer_count_);
8902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (is_being_destroyed_)
8922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
8932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (capturer_count_ == 0) {
8955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const gfx::Size old_size = preferred_size_for_capture_;
8965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    preferred_size_for_capture_ = gfx::Size();
8975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    OnPreferredSizeChanged(old_size);
8985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
8995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
9003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (IsHidden()) {
9012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DVLOG(1) << "Executing delayed WasHidden().";
9022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WasHidden();
9032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
906ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochint WebContentsImpl::GetCapturerCount() const {
907ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  return capturer_count_;
908ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
909ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::IsCrashed() const {
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (crashed_status_ == base::TERMINATION_STATUS_PROCESS_CRASHED ||
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          crashed_status_ == base::TERMINATION_STATUS_ABNORMAL_TERMINATION ||
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          crashed_status_ == base::TERMINATION_STATUS_PROCESS_WAS_KILLED);
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetIsCrashed(base::TerminationStatus status,
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   int error_code) {
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (status == crashed_status_)
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  crashed_status_ = status;
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  crashed_error_code_ = error_code;
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotifyNavigationStateChanged(INVALIDATE_TYPE_TAB);
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::TerminationStatus WebContentsImpl::GetCrashedStatus() const {
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return crashed_status_;
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::IsBeingDestroyed() const {
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return is_being_destroyed_;
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::NotifyNavigationStateChanged(unsigned changed_flags) {
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->NavigationStateChanged(this, changed_flags);
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::TimeTicks WebContentsImpl::GetLastActiveTime() const {
9405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return last_active_time_;
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::WasShown() {
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  controller_.SetActive(true);
945cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
946cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::set<RenderWidgetHostImpl*> widgets = GetRenderWidgetHostsInTree();
947cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  for (std::set<RenderWidgetHostImpl*>::iterator iter = widgets.begin();
948cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)       iter != widgets.end();
949cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)       iter++) {
950cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    RenderWidgetHostView* rwhv = (*iter)->GetView();
951cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (rwhv) {
952cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      rwhv->Show();
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
954cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      rwhv->SetActive(true);
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
956cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    }
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  last_active_time_ = base::TimeTicks::Now();
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The resize rect might have changed while this was inactive -- send the new
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // one to make sure it's up to date.
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderViewHostImpl* rvh =
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<RenderViewHostImpl*>(GetRenderViewHost());
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (rvh) {
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rvh->ResizeRectChanged(GetRootWindowResizerRect());
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver, observers_, WasShown());
9704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
9712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  should_normally_be_visible_ = true;
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::WasHidden() {
9752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If there are entities capturing screenshots or video (e.g., mirroring),
9762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // don't activate the "disable rendering" optimization.
9772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (capturer_count_ == 0) {
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // |GetRenderViewHost()| can be NULL if the user middle clicks a link to
9792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // open a tab in the background, then closes the tab before selecting it.
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // This is because closing the tab calls WebContentsImpl::Destroy(), which
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // removes the |GetRenderViewHost()|; then when we actually destroy the
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // window, OnWindowPosChanged() notices and calls WasHidden() (which
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // calls us).
984cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    std::set<RenderWidgetHostImpl*> widgets = GetRenderWidgetHostsInTree();
985cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    for (std::set<RenderWidgetHostImpl*>::iterator iter = widgets.begin();
986cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)         iter != widgets.end();
987cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)         iter++) {
988cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      RenderWidgetHostView* rwhv = (*iter)->GetView();
989cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      if (rwhv)
990cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        rwhv->Hide();
991cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    }
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver, observers_, WasHidden());
9954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
9962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  should_normally_be_visible_ = false;
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::NeedToFireBeforeUnload() {
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(creis): Should we fire even for interstitial pages?
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return WillNotifyDisconnection() &&
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !ShowingInterstitialPage() &&
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !static_cast<RenderViewHostImpl*>(
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          GetRenderViewHost())->SuddenTerminationAllowed();
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1007c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::DispatchBeforeUnload(bool for_cross_site_transition) {
1008c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  static_cast<RenderFrameHostImpl*>(GetMainFrame())->DispatchBeforeUnload(
1009c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      for_cross_site_transition);
1010c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
1011c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::Stop() {
1013f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  GetRenderManager()->Stop();
10143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver, observers_, NavigationStopped());
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContents* WebContentsImpl::Clone() {
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We use our current SiteInstance since the cloned entry will use it anyway.
10192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // We pass our own opener so that the cloned page can access it if it was
10202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // before.
10212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateParams create_params(GetBrowserContext(), GetSiteInstance());
1022010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  create_params.initial_size = GetContainerBounds().size();
10232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContentsImpl* tc = CreateWithOpener(create_params, opener_);
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tc->GetController().CopyStateFrom(controller_);
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver,
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    observers_,
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    DidCloneToNewWebContents(this, tc));
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return tc;
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::Observe(int type,
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const NotificationSource& source,
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const NotificationDetails& details) {
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (type) {
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED: {
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      RenderWidgetHost* host = Source<RenderWidgetHost>(source).ptr();
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (PendingWidgetViews::iterator i = pending_widget_views_.begin();
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           i != pending_widget_views_.end(); ++i) {
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (host->GetView() == i->second) {
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          pending_widget_views_.erase(i);
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)WebContents* WebContentsImpl::GetWebContents() {
10521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return this;
10531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
10541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
10552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::Init(const WebContents::CreateParams& params) {
1056f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // This is set before initializing the render manager since
1057f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // RenderFrameHostManager::Init calls back into us via its delegate to ask if
1058f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // it should be hidden.
10598bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  should_normally_be_visible_ = !params.initially_hidden;
10608bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
1061f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  GetRenderManager()->Init(
1062868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      params.browser_context, params.site_instance, params.routing_id,
1063868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      params.main_frame_routing_id);
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  WebContentsViewDelegate* delegate =
1066010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      GetContentClient()->browser()->GetWebContentsViewDelegate(this);
1067010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1068010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (browser_plugin_guest_) {
1069010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    scoped_ptr<WebContentsView> platform_view(CreateWebContentsView(
1070010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        this, delegate, &render_view_host_delegate_view_));
1071010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1072010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    WebContentsViewGuest* rv = new WebContentsViewGuest(
1073010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        this, browser_plugin_guest_.get(), platform_view.Pass(),
1074010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        render_view_host_delegate_view_);
1075010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    render_view_host_delegate_view_ = rv;
1076010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    view_.reset(rv);
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
1078010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // Regular WebContentsView.
1079010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    view_.reset(CreateWebContentsView(
1080010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        this, delegate, &render_view_host_delegate_view_));
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1082010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  CHECK(render_view_host_delegate_view_);
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(view_.get());
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Size initial_size = params.initial_size;
10862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  view_->CreateView(initial_size, params.context);
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Listen for whether our opener gets destroyed.
108990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (opener_)
109090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    AddDestructionObserver(opener_);
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registrar_.Add(this,
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED,
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 NotificationService::AllBrowserContextsAndSources());
1095cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1096cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  geolocation_dispatcher_host_.reset(new GeolocationDispatcherHost(this));
1097cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
10987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if defined(OS_ANDROID)
10992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  date_time_chooser_.reset(new DateTimeChooserAndroid());
11002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
110390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WebContentsImpl::OnWebContentsDestroyed(WebContentsImpl* web_contents) {
110490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  RemoveDestructionObserver(web_contents);
110590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clear the opener if it has been closed.
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (web_contents == opener_) {
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    opener_ = NULL;
11092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
11102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
11112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Clear a pending contents that has been closed before being shown.
11122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (PendingContents::iterator iter = pending_contents_.begin();
11132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       iter != pending_contents_.end();
11142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       ++iter) {
11152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (iter->second != web_contents)
11162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      continue;
11172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    pending_contents_.erase(iter);
11182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NOTREACHED();
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
112390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WebContentsImpl::AddDestructionObserver(WebContentsImpl* web_contents) {
112490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!ContainsKey(destruction_observers_, web_contents)) {
112590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    destruction_observers_[web_contents] =
112690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        new DestructionObserver(this, web_contents);
112790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
112890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
112990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
113090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WebContentsImpl::RemoveDestructionObserver(WebContentsImpl* web_contents) {
113190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DestructionObservers::iterator iter =
113290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      destruction_observers_.find(web_contents);
113390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (iter != destruction_observers_.end()) {
113490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    delete destruction_observers_[web_contents];
113590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    destruction_observers_.erase(iter);
113690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
113790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
113890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::AddObserver(WebContentsObserver* observer) {
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  observers_.AddObserver(observer);
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RemoveObserver(WebContentsObserver* observer) {
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  observers_.RemoveObserver(observer);
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1147cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)std::set<RenderWidgetHostImpl*> WebContentsImpl::GetRenderWidgetHostsInTree() {
1148cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::set<RenderWidgetHostImpl*> set;
1149cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ForEachFrame(base::Bind(&AddRenderWidgetHostToSet, base::Unretained(&set)));
1150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return set;
1151cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1152cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::Activate() {
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->ActivateContents(this);
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::Deactivate() {
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->DeactivateContents(this);
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::LostCapture() {
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->LostCapture();
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RenderWidgetDeleted(
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RenderWidgetHostImpl* render_widget_host) {
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_being_destroyed_) {
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // |created_widgets_| might have been destroyed.
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<RenderWidgetHostImpl*>::iterator iter =
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      created_widgets_.find(render_widget_host);
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (iter != created_widgets_.end())
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    created_widgets_.erase(iter);
11792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (render_widget_host &&
11812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      render_widget_host->GetRoutingID() == fullscreen_widget_routing_id_) {
1182d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    if (delegate_ && delegate_->EmbedsFullscreenWidget())
1183d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      delegate_->ToggleFullscreenModeForTab(this, false);
11842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FOR_EACH_OBSERVER(WebContentsObserver,
11852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      observers_,
11862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      DidDestroyFullscreenWidget(
11872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          fullscreen_widget_routing_id_));
11882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    fullscreen_widget_routing_id_ = MSG_ROUTING_NONE;
11892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::PreHandleKeyboardEvent(
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const NativeWebKeyboardEvent& event,
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool* is_keyboard_shortcut) {
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return delegate_ &&
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delegate_->PreHandleKeyboardEvent(this, event, is_keyboard_shortcut);
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::HandleKeyboardEvent(const NativeWebKeyboardEvent& event) {
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->HandleKeyboardEvent(this, event);
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1204a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool WebContentsImpl::HandleWheelEvent(
1205f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const blink::WebMouseWheelEvent& event) {
1206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if !defined(OS_MACOSX)
1207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // On platforms other than Mac, control+mousewheel changes zoom. On Mac, this
1208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // isn't done for two reasons:
1209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  //   -the OS already has a gesture to do this through pinch-zoom
1210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  //   -if a user starts an inertial scroll, let's go, and presses control
1211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  //      (i.e. control+tab) then the OS's buffered scroll events will come in
1212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  //      with control key set which isn't what the user wants
12132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (delegate_ &&
12142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      event.wheelTicksY &&
12150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      (event.modifiers & blink::WebInputEvent::ControlKey) &&
12160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      // Avoid adjusting the zoom in response to two-finger-scrolling touchpad
12170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      // gestures, which are regrettably easy to trigger accidentally.
12180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      !event.hasPreciseScrollingDeltas) {
12192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    delegate_->ContentsZoomChange(event.wheelTicksY > 0);
12202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return true;
12212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
12232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
12242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
12252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool WebContentsImpl::PreHandleGestureEvent(
12275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const blink::WebGestureEvent& event) {
12285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return delegate_ && delegate_->PreHandleGestureEvent(this, event);
12295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
12305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1231effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochbool WebContentsImpl::HandleGestureEvent(
1232effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    const blink::WebGestureEvent& event) {
1233effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Some platforms (eg. Mac) send GesturePinch events for trackpad pinch-zoom.
1234effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Use them to implement browser zoom, as for HandleWheelEvent above.
1235effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (event.type == blink::WebInputEvent::GesturePinchUpdate &&
1236effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      event.sourceDevice == blink::WebGestureEvent::Touchpad) {
1237effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    // The scale difference necessary to trigger a zoom action. Derived from
1238effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    // experimentation to find a value that feels reasonable.
1239effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    const float kZoomStepValue = 0.6f;
1240effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
1241effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    // Find the (absolute) thresholds on either side of the current zoom factor,
1242effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    // then convert those to actual numbers to trigger a zoom in or out.
1243effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    // This logic deliberately makes the range around the starting zoom value
1244effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    // for the gesture twice as large as the other ranges (i.e., the notches are
1245effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    // at ..., -3*step, -2*step, -step, step, 2*step, 3*step, ... but not at 0)
1246effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    // so that it's easier to get back to your starting point than it is to
1247effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    // overshoot.
1248effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    float nextStep = (abs(currentPinchZoomStepDelta_) + 1) * kZoomStepValue;
1249effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    float backStep = abs(currentPinchZoomStepDelta_) * kZoomStepValue;
1250effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    float zoomInThreshold = (currentPinchZoomStepDelta_ >= 0) ? nextStep
1251effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        : -backStep;
1252effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    float zoomOutThreshold = (currentPinchZoomStepDelta_ <= 0) ? -nextStep
1253effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        : backStep;
1254effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
12555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    totalPinchGestureAmount_ += (event.data.pinchUpdate.scale - 1.0);
1256effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    if (totalPinchGestureAmount_ > zoomInThreshold) {
1257effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      currentPinchZoomStepDelta_++;
12580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      if (delegate_)
12590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        delegate_->ContentsZoomChange(true);
1260effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    } else if (totalPinchGestureAmount_ < zoomOutThreshold) {
1261effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      currentPinchZoomStepDelta_--;
12620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      if (delegate_)
12630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        delegate_->ContentsZoomChange(false);
1264effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    }
1265effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return true;
1266effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
1267effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
1268effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  return false;
1269effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
1270effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
12715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN)
1272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)gfx::NativeViewAccessible WebContentsImpl::GetParentNativeViewAccessible() {
1273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return accessible_parent_;
1274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
1276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::HandleMouseDown() {
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->HandleMouseDown();
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::HandleMouseUp() {
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->HandleMouseUp();
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::HandlePointerActivate() {
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->HandlePointerActivate();
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::HandleGestureBegin() {
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->HandleGestureBegin();
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::HandleGestureEnd() {
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->HandleGestureEnd();
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ToggleFullscreenMode(bool enter_fullscreen) {
1303d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // This method is being called to enter or leave renderer-initiated fullscreen
1304d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // mode.  Either way, make sure any existing fullscreen widget is shut down
1305d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // first.
1306d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  RenderWidgetHostView* const widget_view = GetFullscreenRenderWidgetHostView();
1307d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (widget_view)
1308d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    RenderWidgetHostImpl::From(widget_view->GetRenderWidgetHost())->Shutdown();
1309d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->ToggleFullscreenModeForTab(this, enter_fullscreen);
131223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
131323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver,
131423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                    observers_,
131523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                    DidToggleFullscreenModeForTab(IsFullscreenForCurrentTab()));
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::IsFullscreenForCurrentTab() const {
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return delegate_ ? delegate_->IsFullscreenForTabOrPending(this) : false;
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RequestToLockMouse(bool user_gesture,
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         bool last_unlocked_by_target) {
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_) {
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->RequestToLockMouse(this, user_gesture, last_unlocked_by_target);
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GotResponseToLockMouseRequest(false);
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::LostMouseLock() {
13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->LostMouseLock();
13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::CreateNewWindow(
1337a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    int render_process_id,
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int route_id,
1339868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    int main_frame_route_id,
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ViewHostMsg_CreateWindow_Params& params,
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SessionStorageNamespace* session_storage_namespace) {
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We usually create the new window in the same BrowsingInstance (group of
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // script-related windows), by passing in the current SiteInstance.  However,
13442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // if the opener is being suppressed (in a non-guest), we create a new
13452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // SiteInstance in its own BrowsingInstance.
1346cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool is_guest = BrowserPluginGuest::IsGuest(this);
13472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1348a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // If the opener is to be suppressed, the new window can be in any process.
1349a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Since routing ids are process specific, we must not have one passed in
1350a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // as argument here.
1351a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  DCHECK(!params.opener_suppressed || route_id == MSG_ROUTING_NONE);
1352a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<SiteInstance> site_instance =
13542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      params.opener_suppressed && !is_guest ?
13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SiteInstance::CreateForURL(GetBrowserContext(), params.target_url) :
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetSiteInstance();
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1358a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // A message to create a new window can only come from the active process for
1359a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // this WebContentsImpl instance. If any other process sends the request,
1360a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // it is invalid and the process must be terminated.
1361a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (GetRenderProcessHost()->GetID() != render_process_id) {
1362a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    base::ProcessHandle process_handle =
1363a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        RenderProcessHost::FromID(render_process_id)->GetHandle();
1364a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    if (process_handle != base::kNullProcessHandle) {
1365a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      RecordAction(
13665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          base::UserMetricsAction("Terminate_ProcessMismatch_CreateNewWindow"));
1367a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      base::KillProcess(process_handle, content::RESULT_CODE_KILLED, false);
1368a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    }
1369a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return;
1370a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
1371a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We must assign the SessionStorageNamespace before calling Init().
13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // http://crbug.com/142685
1375ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  const std::string& partition_id =
1376ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      GetContentClient()->browser()->
1377ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch          GetStoragePartitionIdForSite(GetBrowserContext(),
1378ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                                       site_instance->GetSiteURL());
1379868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  StoragePartition* partition = BrowserContext::GetStoragePartition(
1380868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      GetBrowserContext(), site_instance.get());
1381bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  DOMStorageContextWrapper* dom_storage_context =
1382bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      static_cast<DOMStorageContextWrapper*>(partition->GetDOMStorageContext());
13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionStorageNamespaceImpl* session_storage_namespace_impl =
13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<SessionStorageNamespaceImpl*>(session_storage_namespace);
13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(session_storage_namespace_impl->IsFromContext(dom_storage_context));
13863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
13873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (delegate_ &&
13883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      !delegate_->ShouldCreateWebContents(this,
13893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                          route_id,
13903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                          params.window_container_type,
13913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                          params.frame_name,
13923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                          params.target_url,
13933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                          partition_id,
13943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                          session_storage_namespace)) {
13955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (route_id != MSG_ROUTING_NONE &&
13965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        !RenderViewHost::FromID(render_process_id, route_id)) {
13975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      // If the embedder didn't create a WebContents for this route, we need to
13985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      // delete the RenderView that had already been created.
13995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      Send(new ViewMsg_Close(route_id));
14005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
14013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    GetRenderViewHost()->GetProcess()->ResumeRequestsForView(route_id);
14023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    GetRenderViewHost()->GetProcess()->ResumeRequestsForView(
14033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        main_frame_route_id);
14043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return;
14053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
14063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
14073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Create the new web contents. This will automatically create the new
14083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // WebContentsView. In the future, we may want to create the view separately.
1409868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  CreateParams create_params(GetBrowserContext(), site_instance.get());
14102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  create_params.routing_id = route_id;
1411868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  create_params.main_frame_routing_id = main_frame_route_id;
1412cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  create_params.opener = this;
1413cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  create_params.opener_suppressed = params.opener_suppressed;
1414cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (params.disposition == NEW_BACKGROUND_TAB)
1415cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    create_params.initially_hidden = true;
1416cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
14172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!is_guest) {
14182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    create_params.context = view_->GetNativeView();
1419010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    create_params.initial_size = GetContainerBounds().size();
14202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
1421cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    create_params.guest_instance_id =
1422cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        GetBrowserContext()->GetGuestManager()->GetNextInstanceID();
14232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1424cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  WebContentsImpl* new_contents = static_cast<WebContentsImpl*>(
1425cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      WebContents::Create(create_params));
1426cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  new_contents->GetController().SetSessionStorageNamespace(
1427cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      partition_id,
1428cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      session_storage_namespace);
1429cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  new_contents->RenderViewCreated(new_contents->GetRenderViewHost());
14302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Save the window for later if we're not suppressing the opener (since it
1432c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // will be shown immediately).
1433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!params.opener_suppressed) {
1434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!is_guest) {
1435010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      WebContentsView* new_view = new_contents->view_.get();
1436c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // TODO(brettw): It seems bogus that we have to call this function on the
1438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // newly created object and give it one of its own member variables.
1439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      new_view->CreateViewForWidget(new_contents->GetRenderViewHost());
1440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Save the created window associated with the route so we can show it
14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // later.
14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK_NE(MSG_ROUTING_NONE, route_id);
14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pending_contents_[route_id] = new_contents;
144590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    AddDestructionObserver(new_contents);
14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_) {
14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->WebContentsCreated(
1450effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        this, params.opener_render_frame_id, params.frame_name,
14512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        params.target_url, new_contents);
14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (params.opener_suppressed) {
14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // When the opener is suppressed, the original renderer cannot access the
14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // new window.  As a result, we need to show and navigate the window here.
14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool was_blocked = false;
14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (delegate_) {
14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::Rect initial_pos;
14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delegate_->AddNewContents(
14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          this, new_contents, params.disposition, initial_pos,
14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          params.user_gesture, &was_blocked);
14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!was_blocked) {
14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      OpenURLParams open_params(params.target_url,
14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                Referrer(),
14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                CURRENT_TAB,
14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                PAGE_TRANSITION_LINK,
14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                true /* is_renderer_initiated */);
14707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      open_params.user_gesture = params.user_gesture;
14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_contents->OpenURL(open_params);
14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1476a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WebContentsImpl::CreateNewWidget(int render_process_id,
1477a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                      int route_id,
1478f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                      blink::WebPopupType popup_type) {
1479a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  CreateNewWidget(render_process_id, route_id, false, popup_type);
14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1482a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WebContentsImpl::CreateNewFullscreenWidget(int render_process_id,
1483a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                                int route_id) {
1484a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  CreateNewWidget(render_process_id, route_id, true, blink::WebPopupTypeNone);
14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1487a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WebContentsImpl::CreateNewWidget(int render_process_id,
1488a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                      int route_id,
14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      bool is_fullscreen,
1490f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                      blink::WebPopupType popup_type) {
14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderProcessHost* process = GetRenderProcessHost();
1492a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // A message to create a new widget can only come from the active process for
1493a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // this WebContentsImpl instance. If any other process sends the request,
1494a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // it is invalid and the process must be terminated.
1495a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (process->GetID() != render_process_id) {
1496a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    base::ProcessHandle process_handle =
1497a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        RenderProcessHost::FromID(render_process_id)->GetHandle();
1498a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    if (process_handle != base::kNullProcessHandle) {
1499a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      RecordAction(
15005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          base::UserMetricsAction("Terminate_ProcessMismatch_CreateNewWidget"));
1501a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      base::KillProcess(process_handle, content::RESULT_CODE_KILLED, false);
1502a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    }
1503a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return;
1504a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
1505a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderWidgetHostImpl* widget_host =
15073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      new RenderWidgetHostImpl(this, process, route_id, IsHidden());
15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  created_widgets_.insert(widget_host);
15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1510010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  RenderWidgetHostViewBase* widget_view =
1511010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      static_cast<RenderWidgetHostViewBase*>(
1512010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          view_->CreateViewForPopupWidget(widget_host));
15132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!widget_view)
15142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!is_fullscreen) {
15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Popups should not get activated.
15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    widget_view->SetPopupType(popup_type);
15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Save the created widget associated with the route so we can show it later.
15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pending_widget_views_[route_id] = widget_view;
15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A RenderWidgetHostViewMac has lifetime scoped to the view. We'll retain it
15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to allow it to survive the trip without being hosted.
15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::mac::NSObjectRetain(widget_view->GetNativeView());
15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ShowCreatedWindow(int route_id,
15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        WindowOpenDisposition disposition,
15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        const gfx::Rect& initial_pos,
15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        bool user_gesture) {
15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebContentsImpl* contents = GetCreatedWindow(route_id);
15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (contents) {
15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebContentsDelegate* delegate = GetDelegate();
15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (delegate) {
15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delegate->AddNewContents(
15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          this, contents, disposition, initial_pos, user_gesture, NULL);
15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ShowCreatedWidget(int route_id,
15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        const gfx::Rect& initial_pos) {
15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShowCreatedWidget(route_id, false, initial_pos);
15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ShowCreatedFullscreenWidget(int route_id) {
15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShowCreatedWidget(route_id, true, gfx::Rect());
15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ShowCreatedWidget(int route_id,
15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        bool is_fullscreen,
15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        const gfx::Rect& initial_pos) {
1555010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  RenderWidgetHostViewBase* widget_host_view =
1556010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      static_cast<RenderWidgetHostViewBase*>(GetCreatedWidget(route_id));
15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!widget_host_view)
15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1559010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1560010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  RenderWidgetHostView* view = NULL;
1561010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  BrowserPluginGuest* guest = GetBrowserPluginGuest();
1562010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (guest && guest->embedder_web_contents()) {
1563010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    view = guest->embedder_web_contents()->GetRenderWidgetHostView();
1564010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  } else {
1565010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    view = GetRenderWidgetHostView();
1566010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
1567010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1568d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (is_fullscreen) {
15694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    DCHECK_EQ(MSG_ROUTING_NONE, fullscreen_widget_routing_id_);
15704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    fullscreen_widget_routing_id_ = route_id;
1571d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    if (delegate_ && delegate_->EmbedsFullscreenWidget()) {
1572d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      widget_host_view->InitAsChild(GetRenderWidgetHostView()->GetNativeView());
1573d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      delegate_->ToggleFullscreenModeForTab(this, true);
1574d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    } else {
1575010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      widget_host_view->InitAsFullscreen(view);
1576d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    }
1577d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    FOR_EACH_OBSERVER(WebContentsObserver,
1578d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                      observers_,
1579d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                      DidShowFullscreenWidget(route_id));
1580d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    if (!widget_host_view->HasFocus())
1581d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      widget_host_view->Focus();
1582d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  } else {
1583010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    widget_host_view->InitAsPopup(view, initial_pos);
1584d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderWidgetHostImpl* render_widget_host_impl =
15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      RenderWidgetHostImpl::From(widget_host_view->GetRenderWidgetHost());
15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  render_widget_host_impl->Init();
15894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Only allow privileged mouse lock for fullscreen render widget, which is
15904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // used to implement Pepper Flash fullscreen.
15914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  render_widget_host_impl->set_allow_privileged_mouse_lock(is_fullscreen);
15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A RenderWidgetHostViewMac has lifetime scoped to the view. Now that it's
15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // properly embedded (or purposefully ignored) we can release the retain we
15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // took in CreateNewWidget().
15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::mac::NSObjectRelease(widget_host_view->GetNativeView());
15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsImpl* WebContentsImpl::GetCreatedWindow(int route_id) {
16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PendingContents::iterator iter = pending_contents_.find(route_id);
16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Certain systems can block the creation of new windows. If we didn't succeed
16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // in creating one, just return NULL.
16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (iter == pending_contents_.end()) {
16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebContentsImpl* new_contents = iter->second;
16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pending_contents_.erase(route_id);
161290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  RemoveDestructionObserver(new_contents);
16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1614c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Don't initialize the guest WebContents immediately.
1615cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (BrowserPluginGuest::IsGuest(new_contents))
1616c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return new_contents;
1617c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!new_contents->GetRenderProcessHost()->HasConnection() ||
16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !new_contents->GetRenderViewHost()->GetView())
16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(brettw): It seems bogus to reach into here and initialize the host.
16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static_cast<RenderViewHostImpl*>(new_contents->GetRenderViewHost())->Init();
16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new_contents;
16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderWidgetHostView* WebContentsImpl::GetCreatedWidget(int route_id) {
16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PendingWidgetViews::iterator iter = pending_widget_views_.find(route_id);
16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (iter == pending_widget_views_.end()) {
16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(false);
16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderWidgetHostView* widget_host_view = iter->second;
16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pending_widget_views_.erase(route_id);
16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderWidgetHost* widget_host = widget_host_view->GetRenderWidgetHost();
16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!widget_host->GetProcess()->HasConnection()) {
16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The view has gone away or the renderer crashed. Nothing to do.
16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return widget_host_view;
16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RequestMediaAccessPermission(
16472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const MediaStreamRequest& request,
16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const MediaResponseCallback& callback) {
1649a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (delegate_) {
16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->RequestMediaAccessPermission(this, request, callback);
1651a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  } else {
1652a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    callback.Run(MediaStreamDevices(),
1653a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                 MEDIA_DEVICE_INVALID_STATE,
1654a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                 scoped_ptr<MediaStreamUI>());
1655a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1658a3f7b4e666c476898878fa745f637129375cd889Ben MurdochSessionStorageNamespace* WebContentsImpl::GetSessionStorageNamespace(
1659a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    SiteInstance* instance) {
1660a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  return controller_.GetSessionStorageNamespace(instance);
1661a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch}
1662a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
16634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)FrameTree* WebContentsImpl::GetFrameTree() {
16644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return &frame_tree_;
16654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
16664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1667a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void WebContentsImpl::AccessibilityEventReceived(
1668a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const std::vector<AXEventNotificationDetails>& details) {
1669a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  FOR_EACH_OBSERVER(
1670a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      WebContentsObserver, observers_, AccessibilityEventReceived(details));
1671a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
1672a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
16735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::OnShowValidationMessage(
16745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const gfx::Rect& anchor_in_root_view,
16755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::string16& main_text,
16765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::string16& sub_text) {
16775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (delegate_)
16785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    delegate_->ShowValidationMessage(
16795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        this, anchor_in_root_view, main_text, sub_text);
16805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
16815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
16825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::OnHideValidationMessage() {
16835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (delegate_)
16845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    delegate_->HideValidationMessage(this);
16855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
16865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
16875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::OnMoveValidationMessage(
16885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const gfx::Rect& anchor_in_root_view) {
16895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (delegate_)
16905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    delegate_->MoveValidationMessage(this, anchor_in_root_view);
16915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
16925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
169390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WebContentsImpl::DidSendScreenRects(RenderWidgetHostImpl* rwh) {
169490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (browser_plugin_embedder_)
16957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    browser_plugin_embedder_->DidSendScreenRects();
169690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
169790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdatePreferredSize(const gfx::Size& pref_size) {
16995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const gfx::Size old_size = GetPreferredSize();
17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  preferred_size_ = pref_size;
17015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  OnPreferredSizeChanged(old_size);
17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ResizeDueToAutoResize(const gfx::Size& new_size) {
17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->ResizeDueToAutoResize(this, new_size);
17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContents* WebContentsImpl::OpenURL(const OpenURLParams& params) {
17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!delegate_)
17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebContents* new_contents = delegate_->OpenURLFromTab(this, params);
17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new_contents;
17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::Send(IPC::Message* message) {
17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetRenderViewHost()) {
17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete message;
17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetRenderViewHost()->Send(message);
17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::NavigateToPendingEntry(
17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NavigationController::ReloadType reload_type) {
1728effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  FrameTreeNode* node = frame_tree_.root();
1729effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
1730effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // If we are using --site-per-process, we should navigate in the FrameTreeNode
1731effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // specified in the pending entry.
1732effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  NavigationEntryImpl* pending_entry =
1733effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      NavigationEntryImpl::FromNavigationEntry(controller_.GetPendingEntry());
1734effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSitePerProcess) &&
1735effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      pending_entry->frame_tree_node_id() != -1) {
1736effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    node = frame_tree_.FindByID(pending_entry->frame_tree_node_id());
1737effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
1738effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
1739effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  return node->navigator()->NavigateToPendingEntry(
1740effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      node->current_frame_host(), reload_type);
17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::RenderFrameForInterstitialPageCreated(
17445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    RenderFrameHost* render_frame_host) {
17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver, observers_,
17465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                    RenderFrameForInterstitialPageCreated(render_frame_host));
17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::AttachInterstitialPage(
17502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    InterstitialPageImpl* interstitial_page) {
17512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(interstitial_page);
1752f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  GetRenderManager()->set_interstitial_page(interstitial_page);
175368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
175468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Cancel any visible dialogs so that they don't interfere with the
175568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // interstitial.
175668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (dialog_manager_)
175768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    dialog_manager_->CancelActiveAndPendingDialogs(this);
175868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
17592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver, observers_,
17602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    DidAttachInterstitialPage());
17612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
17622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::DetachInterstitialPage() {
17645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (ShowingInterstitialPage())
1765f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    GetRenderManager()->remove_interstitial_page();
17662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver, observers_,
17672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    DidDetachInterstitialPage());
17682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
17692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetHistoryLengthAndPrune(
17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const SiteInstance* site_instance,
17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int history_length,
17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int32 minimum_page_id) {
17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SetHistoryLengthAndPrune doesn't work when there are pending cross-site
17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // navigations. Callers should ensure that this is the case.
1776f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (GetRenderManager()->pending_render_view_host()) {
17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderViewHostImpl* rvh = GetRenderViewHostImpl();
17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!rvh) {
17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (site_instance && rvh->GetSiteInstance() != site_instance) {
17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new ViewMsg_SetHistoryLengthAndPrune(GetRoutingID(),
17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            history_length,
17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            minimum_page_id));
17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1794e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid WebContentsImpl::ReloadFocusedFrame(bool ignore_cache) {
1795c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  RenderFrameHost* focused_frame = GetFocusedFrame();
1796c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (!focused_frame)
1797c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return;
1798c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1799c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  focused_frame->Send(new FrameMsg_Reload(
1800c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      focused_frame->GetRoutingID(), ignore_cache));
1801c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
1802c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1803c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::Undo() {
1804c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  RenderFrameHost* focused_frame = GetFocusedFrame();
1805c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (!focused_frame)
1806c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return;
1807c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1808c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  focused_frame->Send(new InputMsg_Undo(focused_frame->GetRoutingID()));
1809c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  RecordAction(base::UserMetricsAction("Undo"));
1810c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
1811c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1812c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::Redo() {
1813c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  RenderFrameHost* focused_frame = GetFocusedFrame();
1814c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (!focused_frame)
1815c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return;
1816c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  focused_frame->Send(new InputMsg_Redo(focused_frame->GetRoutingID()));
1817c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  RecordAction(base::UserMetricsAction("Redo"));
1818c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
1819c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1820c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::Cut() {
1821c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  RenderFrameHost* focused_frame = GetFocusedFrame();
1822c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (!focused_frame)
1823c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return;
1824c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1825c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  focused_frame->Send(new InputMsg_Cut(focused_frame->GetRoutingID()));
1826c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  RecordAction(base::UserMetricsAction("Cut"));
1827c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
1828c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1829c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::Copy() {
1830c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  RenderFrameHost* focused_frame = GetFocusedFrame();
1831c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (!focused_frame)
1832c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return;
1833c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1834c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  focused_frame->Send(new InputMsg_Copy(focused_frame->GetRoutingID()));
1835c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  RecordAction(base::UserMetricsAction("Copy"));
1836c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
1837c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1838c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::CopyToFindPboard() {
1839c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(OS_MACOSX)
1840c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  RenderFrameHost* focused_frame = GetFocusedFrame();
1841c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (!focused_frame)
1842c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return;
1843c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1844c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Windows/Linux don't have the concept of a find pasteboard.
1845c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  focused_frame->Send(
1846c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      new InputMsg_CopyToFindPboard(focused_frame->GetRoutingID()));
1847c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  RecordAction(base::UserMetricsAction("CopyToFindPboard"));
1848c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif
1849c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
1850c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1851c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::Paste() {
1852c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  RenderFrameHost* focused_frame = GetFocusedFrame();
1853c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (!focused_frame)
1854c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return;
1855c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1856c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  focused_frame->Send(new InputMsg_Paste(focused_frame->GetRoutingID()));
1857c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  RecordAction(base::UserMetricsAction("Paste"));
1858c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
1859c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1860c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::PasteAndMatchStyle() {
1861c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  RenderFrameHost* focused_frame = GetFocusedFrame();
1862c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (!focused_frame)
1863c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return;
1864c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1865c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  focused_frame->Send(new InputMsg_PasteAndMatchStyle(
1866c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      focused_frame->GetRoutingID()));
1867c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  RecordAction(base::UserMetricsAction("PasteAndMatchStyle"));
1868c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
1869c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1870c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::Delete() {
1871c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  RenderFrameHost* focused_frame = GetFocusedFrame();
1872c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (!focused_frame)
1873c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return;
1874c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1875c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  focused_frame->Send(new InputMsg_Delete(focused_frame->GetRoutingID()));
1876c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  RecordAction(base::UserMetricsAction("DeleteSelection"));
1877c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
1878c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1879c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::SelectAll() {
1880c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  RenderFrameHost* focused_frame = GetFocusedFrame();
1881c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (!focused_frame)
1882c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return;
1883c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1884c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  focused_frame->Send(new InputMsg_SelectAll(focused_frame->GetRoutingID()));
1885c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  RecordAction(base::UserMetricsAction("SelectAll"));
1886c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
1887c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1888c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::Unselect() {
1889c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  RenderFrameHost* focused_frame = GetFocusedFrame();
1890c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (!focused_frame)
1891c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return;
1892c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1893c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  focused_frame->Send(new InputMsg_Unselect(focused_frame->GetRoutingID()));
1894c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  RecordAction(base::UserMetricsAction("Unselect"));
1895c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
1896c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1897c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::Replace(const base::string16& word) {
1898c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  RenderFrameHost* focused_frame = GetFocusedFrame();
1899c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (!focused_frame)
1900c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return;
1901c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1902c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  focused_frame->Send(new InputMsg_Replace(
1903c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      focused_frame->GetRoutingID(), word));
1904c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
1905c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1906c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::ReplaceMisspelling(const base::string16& word) {
1907c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  RenderFrameHost* focused_frame = GetFocusedFrame();
1908c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (!focused_frame)
1909c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return;
1910c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1911c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  focused_frame->Send(new InputMsg_ReplaceMisspelling(
1912c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      focused_frame->GetRoutingID(), word));
1913c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
1914c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1915c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::NotifyContextMenuClosed(
1916c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    const CustomContextMenuContext& context) {
1917c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  RenderFrameHost* focused_frame = GetFocusedFrame();
1918c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (!focused_frame)
1919c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return;
1920c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1921c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  focused_frame->Send(new FrameMsg_ContextMenuClosed(
1922c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      focused_frame->GetRoutingID(), context));
1923c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
1924c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1925c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::ExecuteCustomContextMenuCommand(
1926c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    int action, const CustomContextMenuContext& context) {
1927c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  RenderFrameHost* focused_frame = GetFocusedFrame();
1928c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (!focused_frame)
1929c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return;
1930c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1931c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  focused_frame->Send(new FrameMsg_CustomContextMenuAction(
1932c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      focused_frame->GetRoutingID(), context, action));
1933e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}
1934e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
1935010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)gfx::NativeView WebContentsImpl::GetNativeView() {
1936010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return view_->GetNativeView();
1937010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
1938010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1939010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)gfx::NativeView WebContentsImpl::GetContentNativeView() {
1940010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return view_->GetContentNativeView();
1941010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
1942010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1943010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)gfx::NativeWindow WebContentsImpl::GetTopLevelNativeWindow() {
1944010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return view_->GetTopLevelNativeWindow();
1945010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
1946010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1947010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)gfx::Rect WebContentsImpl::GetViewBounds() {
1948010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return view_->GetViewBounds();
1949010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
1950010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1951010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)gfx::Rect WebContentsImpl::GetContainerBounds() {
1952010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  gfx::Rect rv;
1953010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  view_->GetContainerBounds(&rv);
1954010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return rv;
1955010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
1956010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1957010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)DropData* WebContentsImpl::GetDropData() {
1958010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return view_->GetDropData();
1959010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
1960010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1961010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void WebContentsImpl::Focus() {
1962010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  view_->Focus();
1963010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
1964010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1965010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void WebContentsImpl::SetInitialFocus() {
1966010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  view_->SetInitialFocus();
1967010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
1968010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1969010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void WebContentsImpl::StoreFocus() {
1970010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  view_->StoreFocus();
1971010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
1972010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1973010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void WebContentsImpl::RestoreFocus() {
1974010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  view_->RestoreFocus();
1975010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
1976010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::FocusThroughTabTraversal(bool reverse) {
19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ShowingInterstitialPage()) {
1979f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    GetRenderManager()->interstitial_page()->FocusThroughTabTraversal(reverse);
19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetRenderViewHostImpl()->SetInitialFocus(reverse);
19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::ShowingInterstitialPage() const {
1986f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return GetRenderManager()->interstitial_page() != NULL;
19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)InterstitialPage* WebContentsImpl::GetInterstitialPage() const {
1990f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return GetRenderManager()->interstitial_page();
19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::IsSavable() {
19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // WebKit creates Document object when MIME type is application/xhtml+xml,
19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // so we also support this MIME type.
19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return contents_mime_type_ == "text/html" ||
19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         contents_mime_type_ == "text/xml" ||
19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         contents_mime_type_ == "application/xhtml+xml" ||
19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         contents_mime_type_ == "text/plain" ||
20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         contents_mime_type_ == "text/css" ||
20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         net::IsSupportedJavascriptMimeType(contents_mime_type_.c_str());
20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnSavePage() {
20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If we can not save the page, try to download it.
20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!IsSavable()) {
20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RecordDownloadSource(INITIATED_BY_SAVE_PACKAGE_ON_NON_HTML);
2008ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    SaveFrame(GetURL(), Referrer());
20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Stop();
20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create the save package and possibly prompt the user for the name to save
20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the page as. The user prompt is an asynchronous operation that runs on
20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // another thread.
20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  save_package_ = new SavePackage(this);
20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  save_package_->GetSaveInfo();
20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Used in automated testing to bypass prompting the user for file names.
20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Instead, the names and paths are hard coded rather than running them through
20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// file name sanitation and extension / mime checking.
20242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool WebContentsImpl::SavePage(const base::FilePath& main_file,
20252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               const base::FilePath& dir_path,
20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               SavePageType save_type) {
20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Stop the page from navigating.
20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Stop();
20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  save_package_ = new SavePackage(this, save_type, main_file, dir_path);
20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return save_package_->Init(SavePackageDownloadCreatedCallback());
20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2034ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid WebContentsImpl::SaveFrame(const GURL& url,
2035ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                                const Referrer& referrer) {
2036ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (!GetURL().is_valid())
2037ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return;
2038ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  bool is_main_frame = (url == GetURL());
2039ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
2040ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  DownloadManager* dlm =
2041ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      BrowserContext::GetDownloadManager(GetBrowserContext());
2042ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (!dlm)
2043ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return;
2044ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  int64 post_id = -1;
2045ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (is_main_frame) {
20464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    const NavigationEntry* entry = controller_.GetLastCommittedEntry();
2047ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    if (entry)
2048ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      post_id = entry->GetPostID();
2049ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
2050ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  scoped_ptr<DownloadUrlParameters> params(
2051ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      DownloadUrlParameters::FromWebContents(this, url));
2052ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  params->set_referrer(referrer);
2053ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  params->set_post_id(post_id);
2054ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  params->set_prefer_cache(true);
2055ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (post_id >= 0)
2056ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    params->set_method("POST");
2057ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  params->set_prompt(true);
2058ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  dlm->DownloadUrl(params.Pass());
2059ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
2060ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::GenerateMHTML(
20622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& file,
2063424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    const base::Callback<void(int64)>& callback) {
2064424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  MHTMLGenerationManager::GetInstance()->SaveMHTML(this, file, callback);
20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// TODO(nasko): Rename this method to IsVisibleEntry.
20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::IsActiveEntry(int32 page_id) {
20694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  NavigationEntryImpl* visible_entry =
20704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      NavigationEntryImpl::FromNavigationEntry(controller_.GetVisibleEntry());
20714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return (visible_entry != NULL &&
20724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          visible_entry->site_instance() == GetSiteInstance() &&
20734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          visible_entry->GetPageID() == page_id);
20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::string& WebContentsImpl::GetContentsMimeType() const {
20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return contents_mime_type_;
20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::WillNotifyDisconnection() const {
20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return notify_disconnection_;
20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetOverrideEncoding(const std::string& encoding) {
20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetEncoding(encoding);
20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new ViewMsg_SetPageEncoding(GetRoutingID(), encoding));
20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ResetOverrideEncoding() {
2090cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  canonical_encoding_.clear();
20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new ViewMsg_ResetPageEncodingToDefault(GetRoutingID()));
20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RendererPreferences* WebContentsImpl::GetMutableRendererPrefs() {
20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return &renderer_preferences_;
20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::Close() {
20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Close(GetRenderViewHost());
21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebContentsImpl::DragSourceEndedAt(int client_x, int client_y,
2103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    int screen_x, int screen_y, blink::WebDragOperation operation) {
2104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (browser_plugin_embedder_.get())
2105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    browser_plugin_embedder_->DragSourceEndedAt(client_x, client_y,
2106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        screen_x, screen_y, operation);
2107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (GetRenderViewHost())
2108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    GetRenderViewHostImpl()->DragSourceEndedAt(client_x, client_y,
2109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        screen_x, screen_y, operation);
2110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
2111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
21125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::DidGetResourceResponseStart(
21135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const ResourceRequestDetails& details) {
21145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  controller_.ssl_manager()->DidStartResourceResponse(details);
21155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
21165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver, observers_,
21175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                    DidGetResourceResponseStart(details));
21185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
21195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // TODO(avi): Remove. http://crbug.com/170921
21205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NotificationService::current()->Notify(
21215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      NOTIFICATION_RESOURCE_RESPONSE_STARTED,
21225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      Source<WebContents>(this),
21235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      Details<const ResourceRequestDetails>(&details));
21245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
21255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
21265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::DidGetRedirectForResourceRequest(
21275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  RenderViewHost* render_view_host,
21285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const ResourceRedirectDetails& details) {
21295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  controller_.ssl_manager()->DidReceiveResourceRedirect(details);
21305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
21315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  FOR_EACH_OBSERVER(
21325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      WebContentsObserver,
21335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      observers_,
21345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      DidGetRedirectForResourceRequest(render_view_host, details));
21355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
21365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // TODO(avi): Remove. http://crbug.com/170921
21375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NotificationService::current()->Notify(
21385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      NOTIFICATION_RESOURCE_RECEIVED_REDIRECT,
21395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      Source<WebContents>(this),
21405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      Details<const ResourceRedirectDetails>(&details));
21415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
21425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SystemDragEnded() {
21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (GetRenderViewHost())
21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetRenderViewHostImpl()->DragSourceSystemDragEnded();
21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->DragEnded();
2148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (browser_plugin_embedder_.get())
2149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    browser_plugin_embedder_->SystemDragEnded();
21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UserGestureDone() {
21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnUserGesture();
21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetClosedByUserGesture(bool value) {
21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  closed_by_user_gesture_ = value;
21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::GetClosedByUserGesture() const {
21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return closed_by_user_gesture_;
21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsImpl::GetZoomPercent(bool* enable_increment,
21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    bool* enable_decrement) const {
21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *enable_decrement = *enable_increment = false;
21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Calculate the zoom percent from the factor. Round up to the nearest whole
21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // number.
21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int percent = static_cast<int>(
2170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      ZoomLevelToZoomFactor(HostZoomMap::GetZoomLevel(this)) * 100 + 0.5);
21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *enable_decrement = percent > minimum_zoom_percent_;
21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *enable_increment = percent < maximum_zoom_percent_;
21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return percent;
21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ViewSource() {
21775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!delegate_)
21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  NavigationEntry* entry = GetController().GetLastCommittedEntry();
21814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (!entry)
21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  delegate_->ViewSourceForTab(this, entry->GetURL());
21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ViewFrameSource(const GURL& url,
218890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                      const PageState& page_state) {
21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!delegate_)
21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
21915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
219290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  delegate_->ViewSourceForFrame(this, url, page_state);
21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsImpl::GetMinimumZoomPercent() const {
21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return minimum_zoom_percent_;
21975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsImpl::GetMaximumZoomPercent() const {
22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return maximum_zoom_percent_;
22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Size WebContentsImpl::GetPreferredSize() const {
22045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return capturer_count_ == 0 ? preferred_size_ : preferred_size_for_capture_;
22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::GotResponseToLockMouseRequest(bool allowed) {
2208cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (GetBrowserPluginGuest())
2209cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return GetBrowserPluginGuest()->LockMouse(allowed);
2210cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetRenderViewHost() ?
22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetRenderViewHostImpl()->GotResponseToLockMouseRequest(allowed) : false;
22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::HasOpener() const {
22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return opener_ != NULL;
22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
221990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WebContentsImpl::DidChooseColorInColorChooser(SkColor color) {
2220a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (!color_chooser_info_.get())
2221a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    return;
2222a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  RenderFrameHost* rfh = RenderFrameHost::FromID(
2223a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      color_chooser_info_->render_process_id,
2224a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      color_chooser_info_->render_frame_id);
2225a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (!rfh)
2226a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    return;
2227a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
2228a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  rfh->Send(new FrameMsg_DidChooseColorResponse(
2229a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      rfh->GetRoutingID(), color_chooser_info_->identifier, color));
22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
223290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WebContentsImpl::DidEndColorChooser() {
2233a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (!color_chooser_info_.get())
2234a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    return;
2235a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  RenderFrameHost* rfh = RenderFrameHost::FromID(
2236a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      color_chooser_info_->render_process_id,
2237a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      color_chooser_info_->render_frame_id);
2238a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (!rfh)
2239a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    return;
2240a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
2241a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  rfh->Send(new FrameMsg_DidEndColorChooser(
2242a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      rfh->GetRoutingID(), color_chooser_info_->identifier));
2243a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  color_chooser_info_.reset();
22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)int WebContentsImpl::DownloadImage(const GURL& url,
2247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                   bool is_favicon,
2248d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                   uint32_t max_bitmap_size,
2249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                   const ImageDownloadCallback& callback) {
2250e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  int id = StartDownload(GetMainFrame(), url, is_favicon, max_bitmap_size);
2251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  image_download_map_[id] = callback;
22522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return id;
22532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
22542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool WebContentsImpl::IsSubframe() const {
22565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return is_subframe_;
22575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
22585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
22595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::Find(int request_id,
22605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                           const base::string16& search_text,
22615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                           const blink::WebFindOptions& options) {
22625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Send(new ViewMsg_Find(GetRoutingID(), request_id, search_text, options));
22635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
22645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
22655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::StopFinding(StopFindAction action) {
22665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Send(new ViewMsg_StopFinding(GetRoutingID(), action));
22675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
22685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2269c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::InsertCSS(const std::string& css) {
2270c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  GetMainFrame()->Send(new FrameMsg_CSSInsertRequest(
2271c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      GetMainFrame()->GetRoutingID(), css));
2272c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
2273c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::FocusLocationBarByDefault() {
22754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  NavigationEntry* entry = controller_.GetVisibleEntry();
227690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (entry && entry->GetURL() == GURL(kAboutBlankURL))
22772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return true;
22782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return delegate_ && delegate_->ShouldFocusLocationBarByDefault(this);
22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetFocusToLocationBar(bool select_all) {
22825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
22835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->SetFocusToLocationBar(select_all);
22845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2286a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WebContentsImpl::DidStartProvisionalLoad(
2287a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    RenderFrameHostImpl* render_frame_host,
2288a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    int parent_routing_id,
2289a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const GURL& validated_url,
2290a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    bool is_error_page,
2291a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    bool is_iframe_srcdoc) {
2292effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  bool is_main_frame = render_frame_host->frame_tree_node()->IsMainFrame();
22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notify observers about the start of the provisional load.
229523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  int render_frame_id = render_frame_host->GetRoutingID();
229623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  RenderViewHost* render_view_host = render_frame_host->render_view_host();
22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver, observers_,
2298a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                    DidStartProvisionalLoadForFrame(
229923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                        render_frame_id, parent_routing_id, is_main_frame,
230023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                        validated_url, is_error_page, is_iframe_srcdoc,
230123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                        render_view_host));
23025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_main_frame) {
2304a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    FOR_EACH_OBSERVER(
2305a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        WebContentsObserver,
2306a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        observers_,
2307a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        ProvisionalChangeToMainFrameUrl(validated_url,
23085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                        render_frame_host));
23095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
23105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::DidFailProvisionalLoadWithError(
23135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    RenderFrameHostImpl* render_frame_host,
23145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const FrameHostMsg_DidFailProvisionalLoadWithError_Params& params) {
23155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GURL validated_url(params.url);
231623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  int render_frame_id = render_frame_host->GetRoutingID();
2317effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  bool is_main_frame = render_frame_host->frame_tree_node()->IsMainFrame();
231823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  RenderViewHost* render_view_host = render_frame_host->render_view_host();
23195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  FOR_EACH_OBSERVER(
23205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      WebContentsObserver,
23215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      observers_,
232223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      DidFailProvisionalLoad(render_frame_id,
23235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                             params.frame_unique_name,
2324effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                             is_main_frame,
23255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                             validated_url,
23265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                             params.error_code,
23275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                             params.error_description,
232823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                             render_view_host));
23295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
23305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
23315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::DidFailLoadWithError(
23325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    RenderFrameHostImpl* render_frame_host,
23335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const GURL& url,
23345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    int error_code,
23355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::string16& error_description) {
233623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  int render_frame_id = render_frame_host->GetRoutingID();
2337effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  bool is_main_frame = render_frame_host->frame_tree_node()->IsMainFrame();
233823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  RenderViewHost* render_view_host = render_frame_host->render_view_host();
23395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver, observers_,
234023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                    DidFailLoad(render_frame_id, url, is_main_frame, error_code,
2341effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                error_description, render_view_host));
23425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
23435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2344a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WebContentsImpl::NotifyChangedNavigationState(
2345a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    InvalidateTypes changed_flags) {
2346a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  NotifyNavigationStateChanged(changed_flags);
2347a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
2348a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
23495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::AboutToNavigateRenderFrame(
23505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      RenderFrameHostImpl* render_frame_host) {
23515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Notify observers that we will navigate in this RenderView.
235223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  RenderViewHost* render_view_host = render_frame_host->render_view_host();
23535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  FOR_EACH_OBSERVER(
23545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      WebContentsObserver,
23555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      observers_,
235623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      AboutToNavigateRenderView(render_view_host));
23575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
23585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
23595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::DidStartNavigationToPendingEntry(
23605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      RenderFrameHostImpl* render_frame_host,
23615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const GURL& url,
23625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      NavigationController::ReloadType reload_type) {
23635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Notify observers about navigation.
23645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  FOR_EACH_OBSERVER(
23655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      WebContentsObserver,
23665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      observers_,
23675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      DidStartNavigationToPendingEntry(url, reload_type));
23685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
23695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2370a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void WebContentsImpl::RequestOpenURL(RenderFrameHostImpl* render_frame_host,
2371a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                     const OpenURLParams& params) {
2372a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  int source_render_frame_id = render_frame_host->GetRoutingID();
2373a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  WebContents* new_contents = OpenURL(params);
2374a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2375a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (new_contents) {
2376a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // Notify observers.
2377a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    FOR_EACH_OBSERVER(WebContentsObserver, observers_,
2378a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                      DidOpenRequestedURL(new_contents,
2379a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                          params.url,
2380a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                          params.referrer,
2381a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                          params.disposition,
2382a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                          params.transition,
2383a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                          source_render_frame_id));
2384a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
2385a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
2386a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
23870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochbool WebContentsImpl::ShouldPreserveAbortedURLs() {
23880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  if (!delegate_)
23890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    return false;
23900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  return delegate_->ShouldPreserveAbortedURLs(this);
23910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
23920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
23935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::DidRedirectProvisionalLoad(
23945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    RenderFrameHostImpl* render_frame_host,
23955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const GURL& validated_target_url) {
23965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Notify observers about the provisional change in the main frame URL.
23975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  FOR_EACH_OBSERVER(
23985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      WebContentsObserver,
23995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      observers_,
24005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ProvisionalChangeToMainFrameUrl(validated_target_url,
24015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                      render_frame_host));
24025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
24035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
24045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::DidCommitProvisionalLoad(
2405a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    RenderFrameHostImpl* render_frame_host,
24065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::string16& frame_unique_name,
24075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    bool is_main_frame,
24085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const GURL& url,
2409a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    PageTransition transition_type) {
2410a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  int render_frame_id = render_frame_host->GetRoutingID();
241123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  RenderViewHost* render_view_host = render_frame_host->render_view_host();
24125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Notify observers about the commit of the provisional load.
24135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  FOR_EACH_OBSERVER(
24145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      WebContentsObserver,
24155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      observers_,
2416a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      DidCommitProvisionalLoadForFrame(render_frame_id,
24175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                       frame_unique_name,
24185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                       is_main_frame,
24195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                       url,
24205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                       transition_type,
24215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                       render_view_host));
24225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
24235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2424e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid WebContentsImpl::DidNavigateMainFramePreCommit(
2425e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    const FrameHostMsg_DidCommitProvisionalLoad_Params& params) {
2426e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // Ensure fullscreen mode is exited before committing the navigation to a
2427e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // different page.  The next page will not start out assuming it is in
2428e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // fullscreen mode.
2429c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (controller_.IsURLInPageNavigation(params.url,
2430c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                        params.was_within_same_page,
2431c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                        NAVIGATION_TYPE_UNKNOWN)) {
2432c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    // No page change?  Then, the renderer and browser can remain in fullscreen.
2433e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    return;
2434e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  }
2435e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  if (IsFullscreenForCurrentTab())
2436e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    GetRenderViewHost()->ExitFullscreen();
2437e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  DCHECK(!IsFullscreenForCurrentTab());
2438e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}
2439e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
24405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::DidNavigateMainFramePostCommit(
24415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const LoadCommittedDetails& details,
24425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const FrameHostMsg_DidCommitProvisionalLoad_Params& params) {
24435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (details.is_navigation_to_different_page()) {
24445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Clear the status bubble. This is a workaround for a bug where WebKit
24455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // doesn't let us know that the cursor left an element during a
24465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // transition (this is also why the mouse cursor remains as a hand after
24475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // clicking on a link); see bugs 1184641 and 980803. We don't want to
24485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // clear the bubble when a user navigates to a named anchor in the same
24495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // page.
24505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    UpdateTargetURL(details.entry->GetPageID(), GURL());
24515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
24525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!details.is_in_page) {
24545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Once the main frame is navigated, we're no longer considered to have
24555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // displayed insecure content.
24565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    displayed_insecure_content_ = false;
24575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    SSLManager::NotifySSLInternalStateChanged(
24585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        GetController().GetBrowserContext());
24595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
24605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
24615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Notify observers about navigation.
24625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver, observers_,
24635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                    DidNavigateMainFrame(details, params));
24645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
24655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (delegate_) {
24665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    delegate_->DidNavigateMainFramePostCommit(this);
24675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    view_->SetOverscrollControllerEnabled(delegate_->CanOverscrollContent());
24685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
24695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
24705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::DidNavigateAnyFramePostCommit(
24725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    RenderFrameHostImpl* render_frame_host,
24735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const LoadCommittedDetails& details,
24745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const FrameHostMsg_DidCommitProvisionalLoad_Params& params) {
24755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Now that something has committed, we don't need to track whether the
24765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // initial page has been accessed.
24775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  has_accessed_initial_document_ = false;
24785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
24795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // If we navigate off the page, close all JavaScript dialogs.
24805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (dialog_manager_ && !details.is_in_page)
24815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    dialog_manager_->CancelActiveAndPendingDialogs(this);
24825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Notify observers about navigation.
24845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver, observers_,
24855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                    DidNavigateAnyFrame(details, params));
24865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
24875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::SetMainFrameMimeType(const std::string& mime_type) {
24895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  contents_mime_type_ = mime_type;
24905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
249158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
24925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool WebContentsImpl::CanOverscrollContent() {
24935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (delegate_)
24945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return delegate_->CanOverscrollContent();
24955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
24965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return false;
24975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
24985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnDidLoadResourceFromMemoryCache(
25005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& url,
25015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& security_info,
25025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& http_method,
25035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& mime_type,
25045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ResourceType::Type resource_type) {
25055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::StatsCounter cache("WebKit.CacheHit");
25065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cache.Increment();
25075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Send out a notification that we loaded a resource from our memory cache.
25095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int cert_id = 0;
25105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::CertStatus cert_status = 0;
25115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int security_bits = -1;
25125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int connection_status = 0;
2513a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  SignedCertificateTimestampIDStatusList signed_certificate_timestamp_ids;
25145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeserializeSecurityInfo(security_info, &cert_id, &cert_status,
2515a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                          &security_bits, &connection_status,
2516a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                          &signed_certificate_timestamp_ids);
2517a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // TODO(alcutter,eranm): Pass signed_certificate_timestamp_ids into details
25185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadFromMemoryCacheDetails details(
25195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      url, GetRenderProcessHost()->GetID(), cert_id, cert_status, http_method,
25205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      mime_type, resource_type);
25215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
252258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  controller_.ssl_manager()->DidLoadFromMemoryCache(details);
252358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
252458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver, observers_,
252558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                    DidLoadResourceFromMemoryCache(details));
252658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
252758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (url.is_valid() && url.SchemeIsHTTPOrHTTPS()) {
252858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    scoped_refptr<net::URLRequestContextGetter> request_context(
252958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        resource_type == ResourceType::MEDIA ?
253058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            GetBrowserContext()->GetMediaRequestContextForRenderProcess(
253158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                GetRenderProcessHost()->GetID()) :
253258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            GetBrowserContext()->GetRequestContextForRenderProcess(
253358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                GetRenderProcessHost()->GetID()));
253458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    BrowserThread::PostTask(
253558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        BrowserThread::IO,
253658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        FROM_HERE,
253758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        base::Bind(&NotifyCacheOnIO, request_context, url, http_method));
253858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
25395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnDidDisplayInsecureContent() {
25425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  RecordAction(base::UserMetricsAction("SSL.DisplayedInsecureContent"));
25435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  displayed_insecure_content_ = true;
25442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SSLManager::NotifySSLInternalStateChanged(
25452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetController().GetBrowserContext());
25465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnDidRunInsecureContent(
25495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& security_origin, const GURL& target_url) {
2550f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  LOG(WARNING) << security_origin << " ran insecure content from "
2551f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)               << target_url.possibly_invalid_spec();
25525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  RecordAction(base::UserMetricsAction("SSL.RanInsecureContent"));
25535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (EndsWith(security_origin, kDotGoogleDotCom, false))
25545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    RecordAction(base::UserMetricsAction("SSL.RanInsecureContentGoogle"));
25555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  controller_.ssl_manager()->DidRunInsecureContent(security_origin);
25565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  displayed_insecure_content_ = true;
25572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SSLManager::NotifySSLInternalStateChanged(
25582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetController().GetBrowserContext());
25595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2561a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void WebContentsImpl::OnDocumentLoadedInFrame() {
25625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CHECK(render_frame_message_source_);
25635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CHECK(!render_view_message_source_);
25645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  RenderFrameHostImpl* rfh =
25655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      static_cast<RenderFrameHostImpl*>(render_frame_message_source_);
25665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
256723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  int render_frame_id = rfh->GetRoutingID();
256823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  RenderViewHost* render_view_host = rfh->render_view_host();
25695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver,
25705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                    observers_,
257123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                    DocumentLoadedInFrame(render_frame_id, render_view_host));
25725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnDidFinishLoad(
2575effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    const GURL& url) {
2576a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!render_frame_message_source_) {
25775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    RecordAction(base::UserMetricsAction("BadMessageTerminate_RVD2"));
25785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    GetRenderProcessHost()->ReceivedBadMessage();
25795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
25805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
25815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
25822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL validated_url(url);
2583a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  RenderProcessHost* render_process_host =
2584a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      render_frame_message_source_->GetProcess();
25855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  render_process_host->FilterURL(false, &validated_url);
2586a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2587effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  RenderFrameHostImpl* rfh =
2588effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      static_cast<RenderFrameHostImpl*>(render_frame_message_source_);
258923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  int render_frame_id = rfh->GetRoutingID();
259023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  RenderViewHost* render_view_host = rfh->render_view_host();
2591effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  bool is_main_frame = rfh->frame_tree_node()->IsMainFrame();
25925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver, observers_,
259323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                    DidFinishLoad(render_frame_id, validated_url,
259423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                                  is_main_frame, render_view_host));
25955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2597cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebContentsImpl::OnDidStartLoading(bool to_different_document) {
2598cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  RenderFrameHostImpl* rfh =
2599cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      static_cast<RenderFrameHostImpl*>(render_frame_message_source_);
2600cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  int64 render_frame_id = rfh->frame_tree_node()->frame_tree_node_id();
2601cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2602cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // It is possible to get multiple calls to OnDidStartLoading that don't have
2603cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // corresponding calls to OnDidStopLoading:
2604cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // - With "swappedout://" URLs, this happens when a RenderView gets swapped
2605cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  //   out for a cross-process navigation, and it turns into a placeholder for
2606cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  //   one being rendered in a different process.
2607cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // - Also, there might be more than one RenderFrameHost sharing the same
2608cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  //   FrameTreeNode (and thus sharing its ID) each sending a start.
2609cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // - But in the future, once clamy@ moves navigation network requests to the
2610cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  //   browser process, there's a good chance that callbacks about starting and
2611cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  //   stopping will all be handled by the browser. When that happens, there
2612cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  //   should no longer be a start/stop call imbalance. TODO(avi): When this
2613cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  //   future arrives, update this code to not allow this case.
2614cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DCHECK_GE(loading_frames_in_progress_, 0);
2615cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (loading_progresses_.find(render_frame_id) == loading_progresses_.end()) {
2616cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (loading_frames_in_progress_ == 0)
2617cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      DidStartLoading(rfh, to_different_document);
2618cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ++loading_frames_in_progress_;
2619cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
2620cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2621cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  loading_progresses_[render_frame_id] = kMinimumLoadingProgress;
2622cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SendLoadProgressChanged();
2623cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
2624cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2625cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebContentsImpl::OnDidStopLoading() {
2626cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  RenderFrameHostImpl* rfh =
2627cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      static_cast<RenderFrameHostImpl*>(render_frame_message_source_);
2628cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  int64 render_frame_id = rfh->frame_tree_node()->frame_tree_node_id();
2629cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2630cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (loading_progresses_.find(render_frame_id) != loading_progresses_.end()) {
2631cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // Load stopped while we were still tracking load.  Make sure we update
2632cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // progress based on this frame's completion.
2633cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    loading_progresses_[render_frame_id] = 1.0;
2634cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    SendLoadProgressChanged();
2635cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // Then we clean-up our states.
2636cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (loading_total_progress_ == 1.0)
2637cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      ResetLoadProgressState();
2638cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
2639cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2640cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // TODO(japhet): This should be a DCHECK, but the pdf plugin sometimes
2641cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // calls DidStopLoading() without a matching DidStartLoading().
2642cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (loading_frames_in_progress_ == 0)
2643cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
2644cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  --loading_frames_in_progress_;
2645cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (loading_frames_in_progress_ == 0)
2646cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    DidStopLoading(rfh);
2647cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
2648cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2649cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebContentsImpl::OnDidChangeLoadProgress(double load_progress) {
2650cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  RenderFrameHostImpl* rfh =
2651cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      static_cast<RenderFrameHostImpl*>(render_frame_message_source_);
2652cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  int64 render_frame_id = rfh->frame_tree_node()->frame_tree_node_id();
2653cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2654cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  loading_progresses_[render_frame_id] = load_progress;
2655cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2656cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // We notify progress change immediately for the first and last updates.
2657cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Also, since the message loop may be pretty busy when a page is loaded, it
2658cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // might not execute a posted task in a timely manner so we make sure to
2659cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // immediately send progress report if enough time has passed.
2660cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::TimeDelta min_delay =
2661cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      base::TimeDelta::FromMilliseconds(kMinimumDelayBetweenLoadingUpdatesMS);
2662cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (load_progress == 1.0 || loading_last_progress_update_.is_null() ||
2663cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      base::TimeTicks::Now() - loading_last_progress_update_ > min_delay) {
2664cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // If there is a pending task to send progress, it is now obsolete.
2665cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    loading_weak_factory_.InvalidateWeakPtrs();
2666cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    SendLoadProgressChanged();
2667cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (loading_total_progress_ == 1.0)
2668cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      ResetLoadProgressState();
2669cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
2670cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
2671cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2672cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (loading_weak_factory_.HasWeakPtrs())
2673cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
2674cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2675cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::MessageLoop::current()->PostDelayedTask(
2676cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      FROM_HERE,
2677cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      base::Bind(&WebContentsImpl::SendLoadProgressChanged,
2678cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 loading_weak_factory_.GetWeakPtr()),
2679cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      min_delay);
2680cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
2681cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
26825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnGoToEntryAtOffset(int offset) {
2683a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!delegate_ || delegate_->OnGoToEntryOffset(offset))
2684a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    controller_.GoToOffset(offset);
26855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
26865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnUpdateZoomLimits(int minimum_percent,
2688cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                         int maximum_percent) {
26895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  minimum_zoom_percent_ = minimum_percent;
26905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  maximum_zoom_percent_ = maximum_percent;
26915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
26925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnEnumerateDirectory(int request_id,
26942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           const base::FilePath& path) {
26955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!delegate_)
26965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
26975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ChildProcessSecurityPolicyImpl* policy =
26995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ChildProcessSecurityPolicyImpl::GetInstance();
27004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (policy->CanReadFile(GetRenderProcessHost()->GetID(), path))
27015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->EnumerateDirectory(this, request_id, path);
27025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
27035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnRegisterProtocolHandler(const std::string& protocol,
27055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                const GURL& url,
2706a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                                const base::string16& title,
27075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                bool user_gesture) {
27085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!delegate_)
27095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
27105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ChildProcessSecurityPolicyImpl* policy =
27125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ChildProcessSecurityPolicyImpl::GetInstance();
2713868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (policy->IsPseudoScheme(protocol))
27145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2715868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2716cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  delegate_->RegisterProtocolHandler(this, protocol, url, user_gesture);
27175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
27185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnFindReply(int request_id,
27205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  int number_of_matches,
27215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  const gfx::Rect& selection_rect,
27225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  int active_match_ordinal,
27235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  bool final_update) {
27245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_) {
27255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->FindReply(this, request_id, number_of_matches, selection_rect,
27265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         active_match_ordinal, final_update);
27275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
27285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
27295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID)
27315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnFindMatchRectsReply(
27325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int version,
27335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::vector<gfx::RectF>& rects,
27345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::RectF& active_rect) {
27355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
27365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->FindMatchRectsReply(this, version, rects, active_rect);
27375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
27382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
27392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::OnOpenDateTimeDialog(
27402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ViewHostMsg_DateTimeDialogValue_Params& value) {
27413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  date_time_chooser_->ShowDialog(ContentViewCore::FromWebContents(this),
27423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                 GetRenderViewHost(),
27433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                 value.dialog_type,
2744a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                 value.dialog_value,
27453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                 value.minimum,
27463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                 value.maximum,
2747a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                 value.step,
2748a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                 value.suggestions);
27492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
27502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
27515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
27525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2753a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WebContentsImpl::OnPepperPluginHung(int plugin_child_id,
2754a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                         const base::FilePath& path,
2755a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                         bool is_hung) {
2756a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  UMA_HISTOGRAM_COUNTS("Pepper.PluginHung", 1);
2757a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2758a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver, observers_,
2759a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    PluginHungStatusChanged(plugin_child_id, path, is_hung));
2760a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
2761a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2762a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WebContentsImpl::OnPluginCrashed(const base::FilePath& plugin_path,
27632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      base::ProcessId plugin_pid) {
27645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver, observers_,
27652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    PluginCrashed(plugin_path, plugin_pid));
27665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
27675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2768a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void WebContentsImpl::OnDomOperationResponse(const std::string& json_string,
2769a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                             int automation_id) {
2770a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DomOperationNotificationDetails details(json_string, automation_id);
2771a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  NotificationService::current()->Notify(
2772a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      NOTIFICATION_DOM_OPERATION_RESPONSE,
2773a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      Source<WebContents>(this),
2774a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      Details<DomOperationNotificationDetails>(&details));
2775a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
2776a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
27775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnAppCacheAccessed(const GURL& manifest_url,
27785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         bool blocked_by_policy) {
27795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notify observers about navigation.
27805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver, observers_,
27815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    AppCacheAccessed(manifest_url, blocked_by_policy));
27825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
27835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2784a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WebContentsImpl::OnOpenColorChooser(
2785a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    int color_chooser_id,
2786a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    SkColor color,
2787a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    const std::vector<ColorSuggestion>& suggestions) {
27880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ColorChooser* new_color_chooser = delegate_ ?
27890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      delegate_->OpenColorChooser(this, color, suggestions) :
27900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      NULL;
27915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!new_color_chooser)
279290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return;
2793a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (color_chooser_info_.get())
2794a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    color_chooser_info_->chooser->End();
2795a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
2796a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  color_chooser_info_.reset(new ColorChooserInfo(
2797a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      render_frame_message_source_->GetProcess()->GetID(),
2798a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      render_frame_message_source_->GetRoutingID(),
2799a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      new_color_chooser,
2800a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      color_chooser_id));
28015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
28025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnEndColorChooser(int color_chooser_id) {
2804a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (color_chooser_info_ &&
2805a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      color_chooser_id == color_chooser_info_->identifier)
2806a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    color_chooser_info_->chooser->End();
28075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
28085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnSetSelectedColorInColorChooser(int color_chooser_id,
28105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                       SkColor color) {
2811a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (color_chooser_info_ &&
2812a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      color_chooser_id == color_chooser_info_->identifier)
2813a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    color_chooser_info_->chooser->SetSelectedColor(color);
28145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
28155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This exists for render views that don't have a WebUI, but do have WebUI
28175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// bindings enabled.
28185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnWebUISend(const GURL& source_url,
28195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  const std::string& name,
28205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  const base::ListValue& args) {
28215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
28225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->WebUISend(this, source_url, name, args);
28235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
28245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnRequestPpapiBrokerPermission(
28263240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    int routing_id,
28275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& url,
28282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& plugin_path) {
28292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!delegate_) {
28303240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    OnPpapiBrokerPermissionResult(routing_id, false);
28312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
28325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
28335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!delegate_->RequestPpapiBrokerPermission(
28352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this, url, plugin_path,
28362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&WebContentsImpl::OnPpapiBrokerPermissionResult,
28373240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch                 base::Unretained(this), routing_id))) {
28382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    NOTIMPLEMENTED();
28393240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    OnPpapiBrokerPermissionResult(routing_id, false);
28402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
28415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
28425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28433240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochvoid WebContentsImpl::OnPpapiBrokerPermissionResult(int routing_id,
28445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    bool result) {
28453240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  Send(new ViewMsg_PpapiBrokerPermissionResult(routing_id, result));
28465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
28475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::OnBrowserPluginMessage(const IPC::Message& message) {
28495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This creates a BrowserPluginEmbedder, which handles all the BrowserPlugin
28502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // specific messages for this WebContents. This means that any message from
28512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // a BrowserPlugin prior to this will be ignored.
28525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For more info, see comment above classes BrowserPluginEmbedder and
28535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // BrowserPluginGuest.
28545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(!browser_plugin_embedder_.get());
28552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  browser_plugin_embedder_.reset(BrowserPluginEmbedder::Create(this));
28562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  browser_plugin_embedder_->OnMessageReceived(message);
28572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
28582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2859c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebContentsImpl::OnDidDownloadImage(
28602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int id,
286190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    int http_status_code,
28622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const GURL& image_url,
2863d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    const std::vector<SkBitmap>& bitmaps,
2864d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    const std::vector<gfx::Size>& original_bitmap_sizes) {
28655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (bitmaps.size() != original_bitmap_sizes.size())
28665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
28675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2868c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ImageDownloadMap::iterator iter = image_download_map_.find(id);
2869c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (iter == image_download_map_.end()) {
28702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Currently WebContents notifies us of ANY downloads so that it is
28712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // possible to get here.
28722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
28732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
28742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!iter->second.is_null()) {
2875d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    iter->second.Run(
2876d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        id, http_status_code, image_url, bitmaps, original_bitmap_sizes);
28772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2878c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  image_download_map_.erase(id);
28792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
28802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
28812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::OnUpdateFaviconURL(
28822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::vector<FaviconURL>& candidates) {
28832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver, observers_,
2884010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    DidUpdateFaviconURL(candidates));
28852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
28862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
28875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::OnMediaPlayingNotification(int64 player_cookie,
28885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                 bool has_video,
28895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                 bool has_audio) {
28905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Chrome OS does its own detection of audio and video.
2891ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#if !defined(OS_CHROMEOS)
28925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<PowerSaveBlocker> blocker;
28935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (has_video) {
28945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    blocker = PowerSaveBlocker::Create(
28955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        PowerSaveBlocker::kPowerSaveBlockPreventDisplaySleep, "Playing video");
2896ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#if defined(OS_ANDROID)
28975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    static_cast<PowerSaveBlockerImpl*>(blocker.get())
28985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ->InitDisplaySleepBlocker(GetView()->GetNativeView());
2899ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#endif
29005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  } else if (has_audio) {
29015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    blocker = PowerSaveBlocker::Create(
29025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        PowerSaveBlocker::kPowerSaveBlockPreventAppSuspension, "Playing audio");
29035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
2904ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
29055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (blocker) {
2906010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    power_save_blockers_[render_frame_message_source_][player_cookie] =
29075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        blocker.release();
2908ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
2909ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#endif  // !defined(OS_CHROMEOS)
2910ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
2911ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
29125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::OnMediaPausedNotification(int64 player_cookie) {
29135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Chrome OS does its own detection of audio and video.
29145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if !defined(OS_CHROMEOS)
2915010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  delete power_save_blockers_[render_frame_message_source_][player_cookie];
2916010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  power_save_blockers_[render_frame_message_source_].erase(player_cookie);
29175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif  // !defined(OS_CHROMEOS)
29185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
29195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2920010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void WebContentsImpl::OnFirstVisuallyNonEmptyPaint() {
2921f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver, observers_,
2922010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    DidFirstVisuallyNonEmptyPaint());
2923f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
2924ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
29252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::DidChangeVisibleSSLState() {
29262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver, observers_,
29272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    DidChangeVisibleSSLState());
29282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
29292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
29302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::NotifyBeforeFormRepostWarningShow() {
29312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver, observers_,
29322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    BeforeFormRepostWarningShow());
29335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
29345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
29361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void WebContentsImpl::ActivateAndShowRepostFormWarningDialog() {
29371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  Activate();
29381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (delegate_)
29391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    delegate_->ShowRepostFormWarningDialog(this);
29401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
29411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
29425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool WebContentsImpl::HasAccessedInitialDocument() {
29435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return has_accessed_initial_document_;
29445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
29455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
29465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Notifies the RenderWidgetHost instance about the fact that the page is
29474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// loading, or done loading.
29484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void WebContentsImpl::SetIsLoading(RenderViewHost* render_view_host,
29494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                   bool is_loading,
2950effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                   bool to_different_document,
29515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   LoadNotificationDetails* details) {
29525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_loading == is_loading_)
29535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
29545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!is_loading) {
2956a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    load_state_ = net::LoadStateWithParam(net::LOAD_STATE_IDLE,
2957a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                          base::string16());
29585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    load_state_host_.clear();
29595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    upload_size_ = 0;
29605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    upload_position_ = 0;
29615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
29625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2963f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  GetRenderManager()->SetIsLoading(is_loading);
29645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_loading_ = is_loading;
29665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  waiting_for_response_ = is_loading;
2967cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  is_load_to_different_document_ = to_different_document;
29685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
2970effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    delegate_->LoadingStateChanged(this, to_different_document);
29715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotifyNavigationStateChanged(INVALIDATE_TYPE_LOAD);
29725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2973f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  std::string url = (details ? details->url.possibly_invalid_spec() : "NULL");
29744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (is_loading) {
2975f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    TRACE_EVENT_ASYNC_BEGIN1("browser", "WebContentsImpl Loading", this,
2976f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                             "URL", url);
29774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    FOR_EACH_OBSERVER(WebContentsObserver, observers_,
29784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                      DidStartLoading(render_view_host));
29794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  } else {
2980f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    TRACE_EVENT_ASYNC_END1("browser", "WebContentsImpl Loading", this,
2981f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           "URL", url);
29824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    FOR_EACH_OBSERVER(WebContentsObserver, observers_,
29834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                      DidStopLoading(render_view_host));
29844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
29854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
29864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // TODO(avi): Remove. http://crbug.com/170921
29875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int type = is_loading ? NOTIFICATION_LOAD_START : NOTIFICATION_LOAD_STOP;
29885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotificationDetails det = NotificationService::NoDetails();
29895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (details)
29905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      det = Details<LoadNotificationDetails>(details);
29915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotificationService::current()->Notify(
29925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      type, Source<NavigationController>(&controller_), det);
29935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
29945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2995c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::SelectRange(const gfx::Point& start,
2996c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                  const gfx::Point& end) {
2997c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  RenderFrameHost* focused_frame = GetFocusedFrame();
2998c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (!focused_frame)
2999c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return;
3000c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
3001c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  focused_frame->Send(
3002c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      new InputMsg_SelectRange(focused_frame->GetRoutingID(), start, end));
3003c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
3004c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
30055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdateMaxPageIDIfNecessary(RenderViewHost* rvh) {
30065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If we are creating a RVH for a restored controller, then we need to make
30075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // sure the RenderView starts with a next_page_id_ larger than the number
30085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // of restored entries.  This must be called before the RenderView starts
30095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // navigating (to avoid a race between the browser updating max_page_id and
30105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the renderer updating next_page_id_).  Because of this, we only call this
30115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // from CreateRenderView and allow that to notify the RenderView for us.
30125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int max_restored_page_id = controller_.GetMaxRestoredPageID();
30135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (max_restored_page_id >
30145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetMaxPageIDForSiteInstance(rvh->GetSiteInstance()))
30155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UpdateMaxPageIDForSiteInstance(rvh->GetSiteInstance(),
30165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   max_restored_page_id);
30175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
30185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::UpdateTitleForEntry(NavigationEntryImpl* entry,
3020a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                          const base::string16& title) {
30215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For file URLs without a title, use the pathname instead. In the case of a
30225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // synthesized title, we don't want the update to count toward the "one set
30235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // per page of the title to history."
3024a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 final_title;
30255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool explicit_set;
30265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (entry && entry->GetURL().SchemeIsFile() && title.empty()) {
30275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    final_title = base::UTF8ToUTF16(entry->GetURL().ExtractFileName());
30285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    explicit_set = false;  // Don't count synthetic titles toward the set limit.
30295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
3030a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    base::TrimWhitespace(title, base::TRIM_ALL, &final_title);
30315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    explicit_set = true;
30325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
30335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If a page is created via window.open and never navigated,
30355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // there will be no navigation entry. In this situation,
30365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |page_title_when_no_navigation_entry_| will be used for page title.
30375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (entry) {
30385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (final_title == entry->GetTitle())
30395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;  // Nothing changed, don't bother.
30405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry->SetTitle(final_title);
30425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
30435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (page_title_when_no_navigation_entry_ == final_title)
30445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;  // Nothing changed, don't bother.
30455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    page_title_when_no_navigation_entry_ = final_title;
30475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
30485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Lastly, set the title for the view.
30505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  view_->SetPageTitle(final_title);
30515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver, observers_,
30534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                    TitleWasSet(entry, explicit_set));
30544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
30554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // TODO(avi): Remove. http://crbug.com/170921
30565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::pair<NavigationEntry*, bool> details =
30575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::make_pair(entry, explicit_set);
30585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotificationService::current()->Notify(
30595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTIFICATION_WEB_CONTENTS_TITLE_UPDATED,
30605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Source<WebContents>(this),
30615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Details<std::pair<NavigationEntry*, bool> >(&details));
30625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
30645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
30655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3066cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebContentsImpl::SendLoadProgressChanged() {
3067cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  loading_last_progress_update_ = base::TimeTicks::Now();
3068cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  double progress = 0.0;
3069cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  int frame_count = 0;
3070cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
3071cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  for (LoadingProgressMap::iterator it = loading_progresses_.begin();
3072cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)       it != loading_progresses_.end();
3073cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)       ++it) {
3074cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    progress += it->second;
3075cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ++frame_count;
3076cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
3077cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (frame_count == 0)
3078cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
3079cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  progress /= frame_count;
3080cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DCHECK(progress <= 1.0);
3081cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
3082cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (progress <= loading_total_progress_)
3083cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
3084cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  loading_total_progress_ = progress;
3085cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
3086cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (delegate_)
3087cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    delegate_->LoadProgressChanged(this, progress);
3088cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
3089cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
3090cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebContentsImpl::ResetLoadProgressState() {
3091cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  loading_progresses_.clear();
3092cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  loading_total_progress_ = 0.0;
3093cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  loading_weak_factory_.InvalidateWeakPtrs();
3094cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  loading_last_progress_update_ = base::TimeTicks();
3095cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
3096cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
30974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void WebContentsImpl::NotifySwapped(RenderViewHost* old_host,
30984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                    RenderViewHost* new_host) {
30995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // After sending out a swap notification, we need to send a disconnect
31005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // notification so that clients that pick up a pointer to |this| can NULL the
31015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // pointer.  See Bug 1230284.
31025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  notify_disconnection_ = true;
310358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver, observers_,
31044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                    RenderViewHostChanged(old_host, new_host));
310558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
310658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // TODO(avi): Remove. http://crbug.com/170921
31074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  std::pair<RenderViewHost*, RenderViewHost*> details =
31084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      std::make_pair(old_host, new_host);
31095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotificationService::current()->Notify(
31104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      NOTIFICATION_RENDER_VIEW_HOST_CHANGED,
31115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Source<WebContents>(this),
31124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      Details<std::pair<RenderViewHost*, RenderViewHost*> >(&details));
31135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ensure that the associated embedder gets cleared after a RenderViewHost
31155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // gets swapped, so we don't reuse the same embedder next time a
31165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // RenderViewHost is attached to this WebContents.
31175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RemoveBrowserPluginEmbedder();
31185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
31195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
312058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// TODO(avi): Remove this entire function because this notification is already
312158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// covered by two observer functions. http://crbug.com/170921
31225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::NotifyDisconnected() {
31235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!notify_disconnection_)
31245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
31255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  notify_disconnection_ = false;
31275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotificationService::current()->Notify(
31285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTIFICATION_WEB_CONTENTS_DISCONNECTED,
31295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Source<WebContents>(this),
31305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NotificationService::NoDetails());
31315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
31325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3133868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void WebContentsImpl::NotifyNavigationEntryCommitted(
3134868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const LoadCommittedDetails& load_details) {
3135868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FOR_EACH_OBSERVER(
3136868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      WebContentsObserver, observers_, NavigationEntryCommitted(load_details));
3137868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
3138868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3139a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool WebContentsImpl::OnMessageReceived(RenderFrameHost* render_frame_host,
3140a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                        const IPC::Message& message) {
3141a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return OnMessageReceived(NULL, render_frame_host, message);
3142a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
3143a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
3144c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochconst GURL& WebContentsImpl::GetMainFrameLastCommittedURL() const {
3145c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return GetLastCommittedURL();
3146c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
3147c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
3148a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WebContentsImpl::RenderFrameCreated(RenderFrameHost* render_frame_host) {
3149a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Note this is only for subframes, the notification for the main frame
3150a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // happens in RenderViewCreated.
3151a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver,
3152a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    observers_,
3153a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    RenderFrameCreated(render_frame_host));
3154a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
3155a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
3156a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WebContentsImpl::RenderFrameDeleted(RenderFrameHost* render_frame_host) {
3157010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ClearPowerSaveBlockers(render_frame_host);
3158a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver,
3159a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    observers_,
3160a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    RenderFrameDeleted(render_frame_host));
3161a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
3162a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
31635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::WorkerCrashed(RenderFrameHost* render_frame_host) {
31645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (delegate_)
31655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    delegate_->WorkerCrashed(this);
31665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
31675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
31685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::ShowContextMenu(RenderFrameHost* render_frame_host,
31695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                      const ContextMenuParams& params) {
3170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ContextMenuParams context_menu_params(params);
31715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Allow WebContentsDelegates to handle the context menu operation first.
3172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (GetBrowserPluginGuest()) {
3173cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    WebContentsViewGuest* view_guest =
3174cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        static_cast<WebContentsViewGuest*>(GetView());
3175cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    context_menu_params = view_guest->ConvertContextMenuParams(params);
3176cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
3177cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (delegate_ && delegate_->HandleContextMenu(context_menu_params))
31785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
31795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3180cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  render_view_host_delegate_view_->ShowContextMenu(render_frame_host,
3181cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                   context_menu_params);
31825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
31835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3184c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::RunJavaScriptMessage(
3185010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    RenderFrameHost* render_frame_host,
3186c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    const base::string16& message,
3187c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    const base::string16& default_prompt,
3188c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    const GURL& frame_url,
3189c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    JavaScriptMessageType javascript_message_type,
3190c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    IPC::Message* reply_msg) {
3191c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Suppress JavaScript dialogs when requested. Also suppress messages when
3192c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // showing an interstitial as it's shown over the previous page and we don't
3193c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // want the hidden page's dialogs to interfere with the interstitial.
3194c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  bool suppress_this_message =
3195010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      static_cast<RenderViewHostImpl*>(render_frame_host->GetRenderViewHost())->
3196c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          IsSwappedOut() ||
3197c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      ShowingInterstitialPage() ||
3198c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      !delegate_ ||
3199c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      delegate_->ShouldSuppressDialogs() ||
3200c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      !delegate_->GetJavaScriptDialogManager();
3201c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
3202c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (!suppress_this_message) {
3203c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    std::string accept_lang = GetContentClient()->browser()->
3204c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      GetAcceptLangs(GetBrowserContext());
3205c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    dialog_manager_ = delegate_->GetJavaScriptDialogManager();
3206c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    dialog_manager_->RunJavaScriptDialog(
3207c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        this,
3208c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        frame_url.GetOrigin(),
3209c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        accept_lang,
3210c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        javascript_message_type,
3211c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        message,
3212c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        default_prompt,
3213c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        base::Bind(&WebContentsImpl::OnDialogClosed,
3214c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                   base::Unretained(this),
3215010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                   render_frame_host->GetProcess()->GetID(),
3216010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                   render_frame_host->GetRoutingID(),
3217c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                   reply_msg,
3218c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                   false),
3219c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        &suppress_this_message);
3220c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
3221c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
3222c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (suppress_this_message) {
3223c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    // If we are suppressing messages, just reply as if the user immediately
3224c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    // pressed "Cancel", passing true to |dialog_was_suppressed|.
3225010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    OnDialogClosed(render_frame_host->GetProcess()->GetID(),
3226010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                   render_frame_host->GetRoutingID(), reply_msg,
32275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                   true, false, base::string16());
3228c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
3229c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
3230c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // OnDialogClosed (two lines up) may have caused deletion of this object (see
3231c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // http://crbug.com/288961 ). The only safe thing to do here is return.
3232c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
3233c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
3234c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::RunBeforeUnloadConfirm(
3235010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    RenderFrameHost* render_frame_host,
3236c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    const base::string16& message,
3237c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    bool is_reload,
3238c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    IPC::Message* reply_msg) {
3239010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  RenderFrameHostImpl* rfhi =
3240010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      static_cast<RenderFrameHostImpl*>(render_frame_host);
3241c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  RenderViewHostImpl* rvhi =
3242010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      static_cast<RenderViewHostImpl*>(render_frame_host->GetRenderViewHost());
3243c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (delegate_)
3244c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    delegate_->WillRunBeforeUnloadConfirm();
3245c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
3246c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  bool suppress_this_message =
3247c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      rvhi->rvh_state() != RenderViewHostImpl::STATE_DEFAULT ||
3248c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      !delegate_ ||
3249c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      delegate_->ShouldSuppressDialogs() ||
3250c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      !delegate_->GetJavaScriptDialogManager();
3251c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (suppress_this_message) {
3252c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    rfhi->JavaScriptDialogClosed(reply_msg, true, base::string16(), true);
3253c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return;
3254c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
3255c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
3256c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  is_showing_before_unload_dialog_ = true;
3257c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  dialog_manager_ = delegate_->GetJavaScriptDialogManager();
3258c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  dialog_manager_->RunBeforeUnloadDialog(
3259c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      this, message, is_reload,
3260c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      base::Bind(&WebContentsImpl::OnDialogClosed, base::Unretained(this),
3261010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                 render_frame_host->GetProcess()->GetID(),
3262010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                 render_frame_host->GetRoutingID(), reply_msg,
32635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                 false));
3264c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
3265c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
32665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)WebContents* WebContentsImpl::GetAsWebContents() {
32675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return this;
32685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
32695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
32700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochbool WebContentsImpl::IsNeverVisible() {
32710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  if (!delegate_)
32720529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    return false;
32730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  return delegate_->IsNeverVisible(this);
32740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
32750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
32765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderViewHostDelegateView* WebContentsImpl::GetDelegateView() {
32775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return render_view_host_delegate_view_;
32785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
32795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RendererPreferences WebContentsImpl::GetRendererPrefs(
32815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserContext* browser_context) const {
32825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return renderer_preferences_;
32835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
32845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Rect WebContentsImpl::GetRootWindowResizerRect() const {
32865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
32875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return delegate_->GetRootWindowResizerRect();
32885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return gfx::Rect();
32895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
32905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RemoveBrowserPluginEmbedder() {
3292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (browser_plugin_embedder_)
32935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    browser_plugin_embedder_.reset();
32945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
32955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RenderViewCreated(RenderViewHost* render_view_host) {
32975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Don't send notifications if we are just creating a swapped-out RVH for
32985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the opener chain.  These won't be used for view-source or WebUI, so it's
32995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ok to return early.
33005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (static_cast<RenderViewHostImpl*>(render_view_host)->IsSwappedOut())
33015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
33025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (delegate_)
33042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    view_->SetOverscrollControllerEnabled(delegate_->CanOverscrollContent());
33052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
33065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotificationService::current()->Notify(
33075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTIFICATION_WEB_CONTENTS_RENDER_VIEW_HOST_CREATED,
33085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Source<WebContents>(this),
33095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Details<RenderViewHost>(render_view_host));
33105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // When we're creating views, we're still doing initial setup, so we always
33125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // use the pending Web UI rather than any possibly existing committed one.
3313f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (GetRenderManager()->pending_web_ui())
3314f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    GetRenderManager()->pending_web_ui()->RenderViewCreated(render_view_host);
33155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  NavigationEntry* entry = controller_.GetPendingEntry();
3317424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  if (entry && entry->IsViewSourceMode()) {
33185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Put the renderer in view source mode.
33195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    render_view_host->Send(
33205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new ViewMsg_EnableViewSourceMode(render_view_host->GetRoutingID()));
33215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
33225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  view_->RenderViewCreated(render_view_host);
33245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FOR_EACH_OBSERVER(
33265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WebContentsObserver, observers_, RenderViewCreated(render_view_host));
3327a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
3328a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // We tell the observers now instead of when the main RenderFrameHostImpl is
3329a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // constructed because otherwise it would be too early (i.e. IPCs sent to the
3330a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // frame would be dropped because it's not created yet).
3331a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RenderFrameHost* main_frame = render_view_host->GetMainFrame();
3332a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  FOR_EACH_OBSERVER(
3333a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      WebContentsObserver, observers_, RenderFrameCreated(main_frame));
33345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
33355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RenderViewReady(RenderViewHost* rvh) {
33375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (rvh != GetRenderViewHost()) {
33385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Don't notify the world, since this came from a renderer in the
33395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // background.
33405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
33415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
33425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
334358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  notify_disconnection_ = true;
334458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // TODO(avi): Remove. http://crbug.com/170921
334558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  NotificationService::current()->Notify(
334658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      NOTIFICATION_WEB_CONTENTS_CONNECTED,
334758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      Source<WebContents>(this),
334858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      NotificationService::NoDetails());
334958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
33505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool was_crashed = IsCrashed();
33515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetIsCrashed(base::TERMINATION_STATUS_STILL_RUNNING, 0);
33525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Restore the focus to the tab (otherwise the focus will be on the top
33545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // window).
33555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (was_crashed && !FocusLocationBarByDefault() &&
33565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (!delegate_ || delegate_->ShouldFocusPageAfterCrash())) {
33572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    view_->Focus();
33585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
33595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver, observers_, RenderViewReady());
33615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
33625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebContentsImpl::RenderViewTerminated(RenderViewHost* rvh,
3364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           base::TerminationStatus status,
3365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           int error_code) {
33665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (rvh != GetRenderViewHost()) {
33675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The pending page's RenderViewHost is gone.
33685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
33695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
33705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3371a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Ensure fullscreen mode is exited in the |delegate_| since a crashed
3372a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // renderer may not have made a clean exit.
3373a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (IsFullscreenForCurrentTab())
3374a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ToggleFullscreenMode(false);
3375a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
3376a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Cancel any visible dialogs so they are not left dangling over the sad tab.
3377a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (dialog_manager_)
3378a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    dialog_manager_->CancelActiveAndPendingDialogs(this);
3379a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
3380effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  SetIsLoading(rvh, false, true, NULL);
33815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotifyDisconnected();
33825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetIsCrashed(status, error_code);
3383010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
3384cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Reset the loading progress. TODO(avi): What does it mean to have a
3385cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // "renderer crash" when there is more than one renderer process serving a
3386cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // webpage? Once this function is called at a more granular frame level, we
3387cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // probably will need to more granularly reset the state here.
3388cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ResetLoadProgressState();
3389cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  loading_frames_in_progress_ = 0;
33905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver,
33925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    observers_,
33937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                    RenderProcessGone(GetCrashedStatus()));
33945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
33955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RenderViewDeleted(RenderViewHost* rvh) {
33975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver, observers_, RenderViewDeleted(rvh));
33985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
33995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdateState(RenderViewHost* rvh,
34015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  int32 page_id,
340290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                  const PageState& page_state) {
34035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ensure that this state update comes from either the active RVH or one of
34045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the swapped out RVHs.  We don't expect to hear from any other RVHs.
34055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // TODO(nasko): This should go through RenderFrameHost.
34065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // TODO(creis): We can't update state for cross-process subframes until we
34075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // have FrameNavigationEntries.  Once we do, this should be a DCHECK.
34085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (rvh != GetRenderViewHost() &&
34095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      !GetRenderManager()->IsRVHOnSwappedOutList(
34105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          static_cast<RenderViewHostImpl*>(rvh)))
34115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
34125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We must be prepared to handle state updates for any page, these occur
34145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // when the user is scrolling and entering form data, as well as when we're
34155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // leaving a page, in which case our state may have already been moved to
34165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the next page. The navigation controller will look up the appropriate
34175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NavigationEntry and update it when it is notified via the delegate.
34185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int entry_index = controller_.GetEntryIndexWithPageID(
34205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rvh->GetSiteInstance(), page_id);
34215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (entry_index < 0)
34225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
34235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigationEntry* entry = controller_.GetEntryAtIndex(entry_index);
34245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
342590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (page_state == entry->GetPageState())
34265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;  // Nothing to update.
342790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  entry->SetPageState(page_state);
34285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  controller_.NotifyEntryChanged(entry, entry_index);
34295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
34305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdateTargetURL(int32 page_id, const GURL& url) {
34325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
34335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->UpdateTargetURL(this, page_id, url);
34345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
34355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::Close(RenderViewHost* rvh) {
34372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_MACOSX)
34385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The UI may be in an event-tracking loop, such as between the
34395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // mouse-down and mouse-up in text selection or a button click.
34405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Defer the close until after tracking is complete, so that we
34415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // don't free objects out from under the UI.
34425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(shess): This could get more fine-grained.  For instance,
34435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // closing a tab in another window while selecting text in the
34445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // current window's Omnibox should be just fine.
34452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (view_->IsEventTracking()) {
34462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    view_->CloseTabAfterEventTracking();
34475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
34485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
34492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
34505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ignore this if it comes from a RenderViewHost that we aren't showing.
34525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_ && rvh == GetRenderViewHost())
34535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->CloseContents(this);
34545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
34555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3456effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid WebContentsImpl::SwappedOut(RenderFrameHost* rfh) {
3457e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  if (delegate_ && rfh->GetRenderViewHost() == GetRenderViewHost())
3458e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    delegate_->SwappedOut(this);
34595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
34605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RequestMove(const gfx::Rect& new_bounds) {
34625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_ && delegate_->IsPopupOrPanel(this))
34635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->MoveContents(this, new_bounds);
34645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
34655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3466effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid WebContentsImpl::DidStartLoading(RenderFrameHost* render_frame_host,
3467effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                      bool to_different_document) {
3468effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  SetIsLoading(render_frame_host->GetRenderViewHost(), true,
3469effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch               to_different_document, NULL);
34705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
34715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::DidStopLoading(RenderFrameHost* render_frame_host) {
34735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<LoadNotificationDetails> details;
34745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3475c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Use the last committed entry rather than the active one, in case a
3476c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // pending entry has been created.
3477c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  NavigationEntry* entry = controller_.GetLastCommittedEntry();
34785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Navigator* navigator = frame_tree_.root()->navigator();
3479c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
34805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // An entry may not exist for a stop when loading an initial blank page or
34815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // if an iframe injected by script into a blank page finishes loading.
34825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (entry) {
34835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::TimeDelta elapsed =
34845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        base::TimeTicks::Now() - navigator->GetCurrentLoadStart();
34855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    details.reset(new LoadNotificationDetails(
34875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        entry->GetVirtualURL(),
34885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        entry->GetTransitionType(),
34895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        elapsed,
34905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &controller_,
34915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        controller_.GetCurrentEntryIndex()));
34925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
34935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3494effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  SetIsLoading(render_frame_host->GetRenderViewHost(), false, true,
3495effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch               details.get());
34965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
34975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::DidCancelLoading() {
34995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  controller_.DiscardNonCommittedEntries();
35005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Update the URL display.
35025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotifyNavigationStateChanged(INVALIDATE_TYPE_URL);
35035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
35045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3505868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void WebContentsImpl::DidAccessInitialDocument() {
35065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  has_accessed_initial_document_ = true;
35075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
35080529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // We may have left a failed browser-initiated navigation in the address bar
35090529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // to let the user edit it and try again.  Clear it now that content might
35100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // show up underneath it.
35110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  if (!IsLoading() && controller_.GetPendingEntry())
35120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    controller_.DiscardPendingEntry();
35130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
3514868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Update the URL display.
3515868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  NotifyNavigationStateChanged(content::INVALIDATE_TYPE_URL);
3516868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
3517868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3518010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void WebContentsImpl::DidDisownOpener(RenderFrameHost* render_frame_host) {
3519010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (opener_) {
3520010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // Clear our opener so that future cross-process navigations don't have an
3521010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // opener assigned.
3522010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    RemoveDestructionObserver(opener_);
3523010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    opener_ = NULL;
3524010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
3525010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
3526010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Notify all swapped out RenderViewHosts for this tab.  This is important
3527010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // in case we go back to them, or if another window in those processes tries
3528010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // to access window.opener.
3529010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GetRenderManager()->DidDisownOpener(render_frame_host->GetRenderViewHost());
35305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
35315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3532010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void WebContentsImpl::DocumentOnLoadCompleted(
3533010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    RenderFrameHost* render_frame_host) {
35344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver, observers_,
3535010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    DocumentOnLoadCompletedInMainFrame());
35364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
35374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // TODO(avi): Remove. http://crbug.com/170921
35385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotificationService::current()->Notify(
35395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTIFICATION_LOAD_COMPLETED_MAIN_FRAME,
35405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Source<WebContents>(this),
3541010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      NotificationService::NoDetails());
35425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
35435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3544cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebContentsImpl::UpdateTitle(RenderFrameHost* render_frame_host,
3545cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                  int32 page_id,
3546cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                  const base::string16& title,
3547cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                  base::i18n::TextDirection title_direction) {
3548cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  RenderViewHost* rvh = render_frame_host->GetRenderViewHost();
3549cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
3550cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // If we have a title, that's a pretty good indication that we've started
3551cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // getting useful data.
3552cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SetNotWaitingForResponse();
3553cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
3554cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Try to find the navigation entry, which might not be the current one.
3555cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // For example, it might be from a pending RVH for the pending entry.
3556cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  NavigationEntryImpl* entry = controller_.GetEntryWithPageID(
3557cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      rvh->GetSiteInstance(), page_id);
3558cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
3559cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // We can handle title updates when we don't have an entry in
3560cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // UpdateTitleForEntry, but only if the update is from the current RVH.
3561cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // TODO(avi): Change to make decisions based on the RenderFrameHost.
3562cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!entry && rvh != GetRenderViewHost())
3563cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
3564cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
3565cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // TODO(evan): make use of title_direction.
3566cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // http://code.google.com/p/chromium/issues/detail?id=27094
3567cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!UpdateTitleForEntry(entry, title))
3568cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
3569cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
3570cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Broadcast notifications when the UI should be updated.
3571cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (entry == controller_.GetEntryAtOffset(0))
3572cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    NotifyNavigationStateChanged(INVALIDATE_TYPE_TITLE);
3573cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
3574cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
3575cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebContentsImpl::UpdateEncoding(RenderFrameHost* render_frame_host,
3576cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                     const std::string& encoding) {
3577cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SetEncoding(encoding);
3578cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
3579cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
3580010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void WebContentsImpl::DocumentAvailableInMainFrame(
3581010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    RenderViewHost* render_view_host) {
3582010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver, observers_,
3583010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    DocumentAvailableInMainFrame());
3584010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
35855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RouteCloseEvent(RenderViewHost* rvh) {
35865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tell the active RenderViewHost to run unload handlers and close, as long
35875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // as the request came from a RenderViewHost in the same BrowsingInstance.
35885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // In most cases, we receive this from a swapped out RenderViewHost.
35895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // It is possible to receive it from one that has just been swapped in,
35905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // in which case we might as well deliver the message anyway.
35915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (rvh->GetSiteInstance()->IsRelatedSiteInstance(GetSiteInstance()))
35925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetRenderViewHost()->ClosePage();
35935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
35945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RouteMessageEvent(
35965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RenderViewHost* rvh,
35975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ViewMsg_PostMessage_Params& params) {
35985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Only deliver the message to the active RenderViewHost if the request
35995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // came from a RenderViewHost in the same BrowsingInstance or if this
36005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // WebContents is dedicated to a browser plugin guest.
36015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note: This check means that an embedder could theoretically receive a
36025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // postMessage from anyone (not just its own guests). However, this is
36035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // probably not a risk for apps since other pages won't have references
36045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to App windows.
36055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!rvh->GetSiteInstance()->IsRelatedSiteInstance(GetSiteInstance()) &&
36065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !GetBrowserPluginGuest() && !GetBrowserPluginEmbedder())
36075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
36085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ViewMsg_PostMessage_Params new_params(params);
36105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  if (!params.message_port_ids.empty()) {
36128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    MessagePortMessageFilter* message_port_message_filter =
36138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        static_cast<RenderProcessHostImpl*>(GetRenderProcessHost())
36148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)            ->message_port_message_filter();
3615010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    message_port_message_filter->UpdateMessagePortsWithNewRoutes(
3616010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        params.message_port_ids,
3617010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        &new_params.new_routing_ids);
36188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
36198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
36205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If there is a source_routing_id, translate it to the routing ID for
36215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the equivalent swapped out RVH in the target process.  If we need
36225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to create a swapped out RVH for the source tab, we create its opener
36235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // chain as well, since those will also be accessible to the target page.
36245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (new_params.source_routing_id != MSG_ROUTING_NONE) {
36255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Try to look up the WebContents for the source page.
36265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebContentsImpl* source_contents = NULL;
36275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RenderViewHostImpl* source_rvh = RenderViewHostImpl::FromID(
36285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rvh->GetProcess()->GetID(), params.source_routing_id);
36295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (source_rvh) {
36305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      source_contents = static_cast<WebContentsImpl*>(
36315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          source_rvh->GetDelegate()->GetAsWebContents());
36325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
36335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (source_contents) {
36355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (GetBrowserPluginGuest()) {
36365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // We create a swapped out RenderView for the embedder in the guest's
36375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // render process but we intentionally do not expose the embedder's
36385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // opener chain to it.
36395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new_params.source_routing_id =
36405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            source_contents->CreateSwappedOutRenderView(GetSiteInstance());
36415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else {
36425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new_params.source_routing_id =
36435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            source_contents->CreateOpenerRenderViews(GetSiteInstance());
36445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
36455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
36465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // We couldn't find it, so don't pass a source frame.
36475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_params.source_routing_id = MSG_ROUTING_NONE;
36485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
36495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
36505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // In most cases, we receive this from a swapped out RenderViewHost.
36525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // It is possible to receive it from one that has just been swapped in,
36535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // in which case we might as well deliver the message anyway.
36545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new ViewMsg_PostMessageEvent(GetRoutingID(), new_params));
36555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
36565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::AddMessageToConsole(int32 level,
3658a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                          const base::string16& message,
36595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          int32 line_no,
3660a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                          const base::string16& source_id) {
36615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!delegate_)
36625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
36635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return delegate_->AddMessageToConsole(this, level, message, line_no,
36645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        source_id);
36655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
36665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebPreferences WebContentsImpl::GetWebkitPrefs() {
36684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // We want to base the page config off of the actual URL, rather than the
36694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // virtual URL.
36704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // TODO(nasko): Investigate how to remove the GetActiveEntry usage here,
36714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // as it is deprecated and can be out of sync with GetRenderViewHost().
367268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  GURL url = controller_.GetActiveEntry()
367368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      ? controller_.GetActiveEntry()->GetURL() : GURL::EmptyGURL();
36741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3675f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return GetRenderManager()->current_host()->GetWebkitPrefs(url);
36765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
36775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsImpl::CreateSwappedOutRenderView(
36795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SiteInstance* instance) {
36805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return GetRenderManager()->CreateRenderFrame(instance, MSG_ROUTING_NONE,
36815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                               true, true);
36825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
36835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnUserGesture() {
36855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notify observers.
36865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver, observers_, DidGetUserGesture());
36875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResourceDispatcherHostImpl* rdh = ResourceDispatcherHostImpl::Get();
36895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (rdh)  // NULL in unittests.
36905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rdh->OnUserGesture(this);
36915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
36925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnIgnoredUIEvent() {
36945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notify observers.
36955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver, observers_, DidGetIgnoredUIEvent());
36965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
36975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RendererUnresponsive(RenderViewHost* rvh,
36993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                           bool is_during_beforeunload,
37005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           bool is_during_unload) {
37015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Don't show hung renderer dialog for a swapped out RVH.
37025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (rvh != GetRenderViewHost())
37035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
37045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderViewHostImpl* rvhi = static_cast<RenderViewHostImpl*>(rvh);
37065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ignore renderer unresponsive event if debugger is attached to the tab
37085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // since the event may be a result of the renderer sitting on a breakpoint.
37095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // See http://crbug.com/65458
37102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (DevToolsAgentHost::IsDebuggerAttached(this))
37115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
37125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (is_during_beforeunload || is_during_unload) {
37145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Hang occurred while firing the beforeunload/unload handler.
37155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Pretend the handler fired so tab closing continues as if it had.
37165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rvhi->set_sudden_termination_allowed(true);
37175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3718f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (!GetRenderManager()->ShouldCloseTabOnUnresponsiveRenderer())
37195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
37205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // If the tab hangs in the beforeunload/unload handler there's really
37223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // nothing we can do to recover. If the hang is in the beforeunload handler,
37233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // pretend the beforeunload listeners have all fired and allow the delegate
37243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // to continue closing; the user will not have the option of cancelling the
37253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // close. Otherwise, pretend the unload listeners have all fired and close
37263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // the tab.
37273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    bool close = true;
37280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    if (is_during_beforeunload && delegate_) {
37293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      delegate_->BeforeUnloadFired(this, true, &close);
37303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    }
37313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (close)
37323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      Close(rvh);
37335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
37345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
37355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetRenderViewHostImpl() || !GetRenderViewHostImpl()->IsRenderViewLive())
37375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
37385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
37405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->RendererUnresponsive(this);
37415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
37425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RendererResponsive(RenderViewHost* render_view_host) {
37445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
37455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->RendererResponsive(this);
37465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
37475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::LoadStateChanged(
37495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& url,
37505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const net::LoadStateWithParam& load_state,
37515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint64 upload_position,
37525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint64 upload_size) {
37535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  load_state_ = load_state;
37545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  upload_position_ = upload_position;
37555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  upload_size_ = upload_size;
37565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  load_state_host_ = net::IDNToUnicode(url.host(),
37575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetContentClient()->browser()->GetAcceptLangs(
37585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          GetBrowserContext()));
37595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (load_state_.state == net::LOAD_STATE_READING_RESPONSE)
37605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetNotWaitingForResponse();
37615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (IsLoading()) {
37625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NotifyNavigationStateChanged(INVALIDATE_TYPE_LOAD | INVALIDATE_TYPE_TAB);
37635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
37645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
37655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::BeforeUnloadFiredFromRenderManager(
37675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool proceed, const base::TimeTicks& proceed_time,
37685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool* proceed_to_fire_unload) {
37697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver, observers_,
37707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                    BeforeUnloadFired(proceed_time));
37715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
37725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->BeforeUnloadFired(this, proceed, proceed_to_fire_unload);
3773eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Note: |this| might be deleted at this point.
37745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
37755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid WebContentsImpl::RenderProcessGoneFromRenderManager(
37775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RenderViewHost* render_view_host) {
37785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(crashed_status_ != base::TERMINATION_STATUS_STILL_RUNNING);
3779c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderViewTerminated(render_view_host, crashed_status_, crashed_error_code_);
37805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
37815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdateRenderViewSizeForRenderManager() {
37835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(brettw) this is a hack. See WebContentsView::SizeContents.
3784424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  gfx::Size size = GetSizeForNewRenderView();
37855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 0x0 isn't a valid window size (minimal window size is 1x1) but it may be
37865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // here during container initialization and normal window size will be set
37875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // later. In case of tab duplication this resizing to 0x0 prevents setting
37885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // normal size later so just ignore it.
37895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!size.IsEmpty())
37905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    view_->SizeContents(size);
37915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
37925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void WebContentsImpl::CancelModalDialogsForRenderManager() {
37944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // We need to cancel modal dialogs when doing a process swap, since the load
37954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // deferrer would prevent us from swapping out.
37964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (dialog_manager_)
37974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    dialog_manager_->CancelActiveAndPendingDialogs(this);
37984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
37994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
38004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void WebContentsImpl::NotifySwappedFromRenderManager(RenderViewHost* old_host,
38014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                                     RenderViewHost* new_host) {
38024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  NotifySwapped(old_host, new_host);
38032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
38042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Make sure the visible RVH reflects the new delegate's preferences.
38052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (delegate_)
38062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    view_->SetOverscrollControllerEnabled(delegate_->CanOverscrollContent());
38072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
38084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  view_->RenderViewSwappedIn(new_host);
38095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
38105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsImpl::CreateOpenerRenderViewsForRenderManager(
38125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SiteInstance* instance) {
38135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!opener_)
38145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return MSG_ROUTING_NONE;
38155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Recursively create RenderViews for anything else in the opener chain.
38175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return opener_->CreateOpenerRenderViews(instance);
38185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
38195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsImpl::CreateOpenerRenderViews(SiteInstance* instance) {
38215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int opener_route_id = MSG_ROUTING_NONE;
38225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If this tab has an opener, ensure it has a RenderView in the given
38245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SiteInstance as well.
38255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (opener_)
38265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    opener_route_id = opener_->CreateOpenerRenderViews(instance);
38275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If any of the renderers (current, pending, or swapped out) for this
38292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // WebContents has the same SiteInstance, use it.
3830f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (GetRenderManager()->current_host()->GetSiteInstance() == instance)
3831f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return GetRenderManager()->current_host()->GetRoutingID();
38325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3833f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (GetRenderManager()->pending_render_view_host() &&
3834f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GetRenderManager()->pending_render_view_host()->GetSiteInstance() ==
3835f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          instance)
3836f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return GetRenderManager()->pending_render_view_host()->GetRoutingID();
38372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3838f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  RenderViewHostImpl* rvh = GetRenderManager()->GetSwappedOutRenderViewHost(
38395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      instance);
38405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (rvh)
38415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return rvh->GetRoutingID();
38425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a swapped out RenderView in the given SiteInstance if none exists,
38445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // setting its opener to the given route_id.  Return the new view's route_id.
38455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return GetRenderManager()->CreateRenderFrame(instance, opener_route_id,
38465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                               true, true);
38475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
38485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NavigationControllerImpl& WebContentsImpl::GetControllerForRenderManager() {
38505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetController();
38515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
38525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebUIImpl* WebContentsImpl::CreateWebUIForRenderManager(const GURL& url) {
38545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return static_cast<WebUIImpl*>(CreateWebUI(url));
38555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
38565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NavigationEntry*
38585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebContentsImpl::GetLastCommittedNavigationEntryForRenderManager() {
38595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return controller_.GetLastCommittedEntry();
38605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
38615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::CreateRenderViewForRenderManager(
38635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    RenderViewHost* render_view_host,
38645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    int opener_route_id,
3865cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    int proxy_routing_id,
3866cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    bool for_main_frame) {
38677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  TRACE_EVENT0("browser", "WebContentsImpl::CreateRenderViewForRenderManager");
38685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Can be NULL during tests.
3869010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  RenderWidgetHostViewBase* rwh_view;
38705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // TODO(kenrb): RenderWidgetHostViewChildFrame special casing is temporary
38715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // until RenderWidgetHost is attached to RenderFrameHost. We need to special
38725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // case this because RWH is still a base class of RenderViewHost, and child
38735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // frame RWHVs are unique in that they do not have their own WebContents.
3874cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!for_main_frame) {
38755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    RenderWidgetHostViewChildFrame* rwh_view_child =
38765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        new RenderWidgetHostViewChildFrame(render_view_host);
38775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    rwh_view = rwh_view_child;
38785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  } else {
38795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    rwh_view = view_->CreateViewForWidget(render_view_host);
38805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
38815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now that the RenderView has been created, we need to tell it its size.
38835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (rwh_view)
3884424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    rwh_view->SetSize(GetSizeForNewRenderView());
38855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure we use the correct starting page_id in the new RenderView.
38875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateMaxPageIDIfNecessary(render_view_host);
38885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32 max_page_id =
38895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetMaxPageIDForSiteInstance(render_view_host->GetSiteInstance());
38905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!static_cast<RenderViewHostImpl*>(
3892a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          render_view_host)->CreateRenderView(base::string16(),
38935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              opener_route_id,
3894cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                              proxy_routing_id,
38950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                              max_page_id,
38960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                              created_with_opener_)) {
38975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
38985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
38995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
390068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_ANDROID)
39015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Force a ViewMsg_Resize to be sent, needed to make plugins show up on
39025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // linux. See crbug.com/83941.
39035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (rwh_view) {
39045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (RenderWidgetHost* render_widget_host = rwh_view->GetRenderWidgetHost())
39055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      render_widget_host->WasResized();
39065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
39075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
39085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
39105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
39115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#if defined(OS_ANDROID)
3913010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
3914a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::android::ScopedJavaLocalRef<jobject>
3915a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)WebContentsImpl::GetJavaWebContents() {
3916a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
3917a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
3918a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  WebContentsAndroid* web_contents_android =
3919a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      static_cast<WebContentsAndroid*>(GetUserData(kWebContentsAndroidKey));
3920a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (!web_contents_android) {
3921a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    web_contents_android = new WebContentsAndroid(this);
3922a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    SetUserData(kWebContentsAndroidKey, web_contents_android);
3923a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
3924a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return web_contents_android->GetJavaObject();
3925a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
3926a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
39273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool WebContentsImpl::CreateRenderViewForInitialEmptyDocument() {
39283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return CreateRenderViewForRenderManager(GetRenderViewHost(),
39295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                          MSG_ROUTING_NONE,
3930cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                          MSG_ROUTING_NONE,
3931cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                          true);
39323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
3933010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
3934010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#elif defined(OS_MACOSX)
3935010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
3936010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void WebContentsImpl::SetAllowOverlappingViews(bool overlapping) {
3937010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  view_->SetAllowOverlappingViews(overlapping);
3938010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
3939010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
3940010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool WebContentsImpl::GetAllowOverlappingViews() {
3941010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return view_->GetAllowOverlappingViews();
3942010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
3943010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
3944010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void WebContentsImpl::SetOverlayView(WebContents* overlay,
3945010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                     const gfx::Point& offset) {
3946010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  view_->SetOverlayView(static_cast<WebContentsImpl*>(overlay)->GetView(),
3947010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        offset);
3948010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
3949010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
3950010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void WebContentsImpl::RemoveOverlayView() {
3951010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  view_->RemoveOverlayView();
3952010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
3953010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
39543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#endif
39553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
39565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid WebContentsImpl::OnDialogClosed(int render_process_id,
39575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                     int render_frame_id,
39585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     IPC::Message* reply_msg,
3959c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                     bool dialog_was_suppressed,
39605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     bool success,
3961a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                     const base::string16& user_input) {
39625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  RenderFrameHostImpl* rfh = RenderFrameHostImpl::FromID(render_process_id,
39635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                                         render_frame_id);
3964c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  last_dialog_suppressed_ = dialog_was_suppressed;
3965c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
39665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_showing_before_unload_dialog_ && !success) {
39675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // If a beforeunload dialog is canceled, we need to stop the throbber from
39685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // spinning, since we forced it to start spinning in Navigate.
39695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    if (rfh)
39705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      DidStopLoading(rfh);
39715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    controller_.DiscardNonCommittedEntries();
39727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
39737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    FOR_EACH_OBSERVER(WebContentsObserver, observers_,
39747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                      BeforeUnloadDialogCancelled());
39755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3976c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
39775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_showing_before_unload_dialog_ = false;
39785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (rfh) {
39795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    rfh->JavaScriptDialogClosed(reply_msg, success, user_input,
39805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                dialog_was_suppressed);
39815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  } else {
39825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    // Don't leak the sync IPC reply if the RFH or process is gone.
39835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    delete reply_msg;
39845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
39855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
39865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetEncoding(const std::string& encoding) {
3988cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (encoding == last_reported_encoding_)
3989cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
3990cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  last_reported_encoding_ = encoding;
3991cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
3992cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  canonical_encoding_ = GetContentClient()->browser()->
39935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetCanonicalEncodingNameByAliasName(encoding);
39945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
39955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::CreateViewAndSetSizeForRVH(RenderViewHost* rvh) {
3997010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  RenderWidgetHostViewBase* rwh_view = view_->CreateViewForWidget(rvh);
39985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Can be NULL during tests.
39995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (rwh_view)
4000010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    rwh_view->SetSize(GetContainerBounds().size());
40015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
40025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool WebContentsImpl::IsHidden() {
40043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return capturer_count_ == 0 && !should_normally_be_visible_;
40053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
40063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
4007f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)RenderFrameHostManager* WebContentsImpl::GetRenderManager() const {
4008f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return frame_tree_.root()->render_manager();
4009f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
4010f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
40115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderViewHostImpl* WebContentsImpl::GetRenderViewHostImpl() {
40125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return static_cast<RenderViewHostImpl*>(GetRenderViewHost());
40135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
40145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BrowserPluginGuest* WebContentsImpl::GetBrowserPluginGuest() const {
40165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return browser_plugin_guest_.get();
40175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
40185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4019eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid WebContentsImpl::SetBrowserPluginGuest(BrowserPluginGuest* guest) {
4020eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  CHECK(!browser_plugin_guest_);
4021eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  browser_plugin_guest_.reset(guest);
4022eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
4023eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
40242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BrowserPluginEmbedder* WebContentsImpl::GetBrowserPluginEmbedder() const {
40255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return browser_plugin_embedder_.get();
40265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
40275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4028ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid WebContentsImpl::ClearPowerSaveBlockers(
4029010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    RenderFrameHost* render_frame_host) {
4030010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  STLDeleteValues(&power_save_blockers_[render_frame_host]);
4031010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  power_save_blockers_.erase(render_frame_host);
4032ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
4033ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
4034ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid WebContentsImpl::ClearAllPowerSaveBlockers() {
4035ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  for (PowerSaveBlockerMap::iterator i(power_save_blockers_.begin());
4036ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch       i != power_save_blockers_.end(); ++i)
4037ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    STLDeleteValues(&power_save_blockers_[i->first]);
4038ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  power_save_blockers_.clear();
4039ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
4040ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
4041010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)gfx::Size WebContentsImpl::GetSizeForNewRenderView() {
4042424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  gfx::Size size;
4043424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  if (delegate_)
4044424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    size = delegate_->GetSizeForNewRenderView(this);
4045424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  if (size.IsEmpty())
4046010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    size = GetContainerBounds().size();
4047424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  return size;
4048424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
4049424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
40504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void WebContentsImpl::OnFrameRemoved(
40514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    RenderViewHostImpl* render_view_host,
4052a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    int frame_routing_id) {
40534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   FOR_EACH_OBSERVER(WebContentsObserver, observers_,
4054a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                     FrameDetached(render_view_host, frame_routing_id));
40554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
40564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
40575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::OnPreferredSizeChanged(const gfx::Size& old_size) {
40585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!delegate_)
40595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
40605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const gfx::Size new_size = GetPreferredSize();
40615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (new_size != old_size)
40625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    delegate_->UpdatePreferredSize(this, new_size);
40635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
40645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
40655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
4066