web_contents_impl.cc revision 68043e1e95eeb07d5cae7aca370b26518b0867d6
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"
15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h"
16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_number_conversions.h"
17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/sys_info.h"
20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/base/switches.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/browser_plugin/browser_plugin_embedder.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/browser_plugin/browser_plugin_guest.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/browser_plugin/browser_plugin_guest_manager.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/child_process_security_policy_impl.h"
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/devtools/devtools_manager_impl.h"
27bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "content/browser/dom_storage/dom_storage_context_wrapper.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/dom_storage/session_storage_namespace_impl.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/download/download_stats.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/download/mhtml_generation_manager.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/download/save_package.h"
323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "content/browser/gpu/compositor_util.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/gpu/gpu_data_manager_impl.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/gpu/gpu_process_host.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/host_zoom_map_impl.h"
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/loader/resource_dispatcher_host_impl.h"
37ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/browser/power_save_blocker_impl.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/render_process_host_impl.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/render_view_host_impl.h"
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/render_widget_host_impl.h"
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/site_instance_impl.h"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/web_contents/interstitial_page_impl.h"
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/web_contents/navigation_entry_impl.h"
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/web_contents/web_contents_view_guest.h"
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/webui/generic_handler.h"
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/webui/web_ui_controller_factory_registry.h"
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/webui/web_ui_impl.h"
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/common/browser_plugin/browser_plugin_constants.h"
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/common/browser_plugin/browser_plugin_messages.h"
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/common/image_messages.h"
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/ssl_status_serialization.h"
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/view_messages.h"
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/port/browser/render_view_host_delegate_view.h"
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/port/browser/render_widget_host_view_port.h"
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_context.h"
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/color_chooser.h"
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/content_browser_client.h"
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/devtools_agent_host.h"
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_manager.h"
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_url_parameters.h"
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/invalidate_type.h"
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/javascript_dialog_manager.h"
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/load_from_memory_cache_details.h"
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/load_notification_details.h"
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_details.h"
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_details.h"
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h"
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/resource_request_details.h"
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/storage_partition.h"
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/user_metrics.h"
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_delegate.h"
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_observer.h"
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_view.h"
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/bindings_policy.h"
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_constants.h"
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_switches.h"
7758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch#include "content/public/common/page_zoom.h"
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/url_constants.h"
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/mime_util.h"
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_util.h"
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/network_change_notifier.h"
8258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "net/http/http_cache.h"
8358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "net/http/http_transaction_factory.h"
8458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "net/url_request/url_request_context.h"
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context_getter.h"
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/layout.h"
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/touch/touch_device.h"
88a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "ui/base/touch/touch_enabled.h"
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/ui_base_switches.h"
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/display.h"
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/screen.h"
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gl_switches.h"
93868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "webkit/common/webpreferences.h"
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_ANDROID)
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/android/date_time_chooser_android.h"
97868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/public/browser/android/content_view_core.h"
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/mac/foundation_util.h"
1027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ui/gl/io_surface_support_mac.h"
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if defined(OS_ANDROID)
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/renderer_host/java/java_bridge_dispatcher_host_manager.h"
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (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)//
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - 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
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   its renderer until the onbeforeunload 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)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   that it has a pending cross-site request.  ResourceDispatcherHost will
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   check for this when the response arrives.
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - The current RVH runs its onbeforeunload 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
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   main resource load on the pending RVH. It checks CrossSiteRequestManager
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   to see that it is a cross-site request, and installs a
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   CrossSiteResourceHandler.
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
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   download, it pauses the response to first run the old page's onunload
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   handler.  It does this by asynchronously calling the OnCrossSiteResponse
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   method of WebContentsImpl on the UI thread, which sends a SwapOut message
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   to the current RVH.
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Once the onunload handler is finished, a SwapOut_ACK message is sent to
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   the ResourceDispatcherHost, who unpauses the response.  Data is then sent
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   to the pending RVH.
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - The pending renderer sends a FrameNavigate message that invokes the
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   DidNavigate method.  This replaces the current RVH with the
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   pending RVH.
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - The previous renderer is kept swapped out in RenderViewHostManager in case
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   the user goes back.  The process only stays live if another tab is using
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   it, but if so, the existing frame relationships will be maintained.
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kDotGoogleDotCom[] = ".google.com";
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
156868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)base::LazyInstance<std::vector<WebContents::CreatedCallback> >
157868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)g_created_callbacks = LAZY_INSTANCE_INITIALIZER;
158868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static int StartDownload(content::RenderViewHost* rvh,
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         const GURL& url,
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         bool is_favicon,
162d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                         uint32_t max_bitmap_size) {
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static int g_next_image_download_id = 0;
164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  rvh->Send(new ImageMsg_DownloadImage(rvh->GetRoutingID(),
165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       ++g_next_image_download_id,
166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       url,
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       is_favicon,
168d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                       max_bitmap_size));
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return g_next_image_download_id;
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ViewMsg_Navigate_Type::Value GetNavigationType(
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserContext* browser_context, const NavigationEntryImpl& entry,
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NavigationController::ReloadType reload_type) {
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (reload_type) {
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case NavigationControllerImpl::RELOAD:
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return ViewMsg_Navigate_Type::RELOAD;
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case NavigationControllerImpl::RELOAD_IGNORING_CACHE:
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return ViewMsg_Navigate_Type::RELOAD_IGNORING_CACHE;
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case NavigationControllerImpl::RELOAD_ORIGINAL_REQUEST_URL:
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return ViewMsg_Navigate_Type::RELOAD_ORIGINAL_REQUEST_URL;
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case NavigationControllerImpl::NO_RELOAD:
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;  // Fall through to rest of function.
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |RenderViewImpl::PopulateStateFromPendingNavigationParams| differentiates
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // between |RESTORE_WITH_POST| and |RESTORE|.
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (entry.restore_type() ==
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NavigationEntryImpl::RESTORE_LAST_SESSION_EXITED_CLEANLY) {
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (entry.GetHasPostData())
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return ViewMsg_Navigate_Type::RESTORE_WITH_POST;
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ViewMsg_Navigate_Type::RESTORE;
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ViewMsg_Navigate_Type::NORMAL;
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MakeNavigateParams(const NavigationEntryImpl& entry,
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        const NavigationControllerImpl& controller,
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        WebContentsDelegate* delegate,
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        NavigationController::ReloadType reload_type,
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        ViewMsg_Navigate_Params* params) {
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params->page_id = entry.GetPageID();
204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  params->should_clear_history_list = entry.should_clear_history_list();
205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (entry.should_clear_history_list()) {
206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Set the history list related parameters to the same values a
207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // NavigationController would return before its first navigation. This will
208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // fully clear the RenderView's view of the session history.
209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    params->pending_history_list_offset = -1;
210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    params->current_history_list_offset = -1;
211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    params->current_history_list_length = 0;
212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  } else {
213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    params->pending_history_list_offset = controller.GetIndexOfEntry(&entry);
214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    params->current_history_list_offset =
215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        controller.GetLastCommittedEntryIndex();
216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    params->current_history_list_length = controller.GetEntryCount();
217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!entry.GetBaseURLForDataURL().is_empty()) {
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    params->base_url_for_data_url = entry.GetBaseURLForDataURL();
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    params->history_url_for_data_url = entry.GetVirtualURL();
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params->referrer = entry.GetReferrer();
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params->transition = entry.GetTransitionType();
22490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  params->page_state = entry.GetPageState();
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params->navigation_type =
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetNavigationType(controller.GetBrowserContext(), entry, reload_type);
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params->request_time = base::Time::Now();
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params->extra_headers = entry.extra_headers();
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params->transferred_request_child_id =
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      entry.transferred_global_request_id().child_id;
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params->transferred_request_request_id =
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      entry.transferred_global_request_id().request_id;
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params->is_overriding_user_agent = entry.GetIsOverridingUserAgent();
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Avoid downloading when in view-source mode.
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params->allow_download = !entry.IsViewSourceMode();
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params->is_post = entry.GetHasPostData();
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if(entry.GetBrowserInitiatedPostData()) {
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      params->browser_initiated_post_data.assign(
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          entry.GetBrowserInitiatedPostData()->front(),
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          entry.GetBrowserInitiatedPostData()->front() +
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              entry.GetBrowserInitiatedPostData()->size());
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (reload_type == NavigationControllerImpl::RELOAD_ORIGINAL_REQUEST_URL &&
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      entry.GetOriginalRequestURL().is_valid() && !entry.GetHasPostData()) {
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We may have been redirected when navigating to the current URL.
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Use the URL the user originally intended to visit, if it's valid and if a
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // POST wasn't involved; the latter case avoids issues with sending data to
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // the wrong page.
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    params->url = entry.GetOriginalRequestURL();
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    params->url = entry.GetURL();
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params->can_load_local_resources = entry.GetCanLoadLocalResources();
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params->frame_to_navigate = entry.GetFrameToNavigate();
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate->AddNavigationHeaders(params->url, &params->extra_headers);
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void NotifyCacheOnIO(
26458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    scoped_refptr<net::URLRequestContextGetter> request_context,
26558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const GURL& url,
26658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const std::string& http_method) {
26758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  request_context->GetURLRequestContext()->http_transaction_factory()->
26858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      GetCache()->OnExternalCacheHit(url, http_method);
26958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
27058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebContents* WebContents::Create(const WebContents::CreateParams& params) {
274a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return WebContentsImpl::CreateWithOpener(
275a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      params, static_cast<WebContentsImpl*>(params.opener));
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContents* WebContents::CreateWithSessionStorage(
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const WebContents::CreateParams& params,
280ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    const SessionStorageNamespaceMap& session_storage_namespace_map) {
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContentsImpl* new_contents = new WebContentsImpl(
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      params.browser_context, NULL);
283ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
284ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  for (SessionStorageNamespaceMap::const_iterator it =
285ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch           session_storage_namespace_map.begin();
286ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch       it != session_storage_namespace_map.end();
287ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch       ++it) {
288ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    new_contents->GetController()
289ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        .SetSessionStorageNamespace(it->first, it->second.get());
290ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
291ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  new_contents->Init(params);
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new_contents;
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
296868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void WebContents::AddCreatedCallback(const CreatedCallback& callback) {
297868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  g_created_callbacks.Get().push_back(callback);
298868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
299868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
300868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void WebContents::RemoveCreatedCallback(const CreatedCallback& callback) {
301868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  for (size_t i = 0; i < g_created_callbacks.Get().size(); ++i) {
302868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (g_created_callbacks.Get().at(i).Equals(callback)) {
303868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      g_created_callbacks.Get().erase(g_created_callbacks.Get().begin() + i);
304868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      return;
305868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    }
306868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
307868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
308868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContents* WebContents::FromRenderViewHost(const RenderViewHost* rvh) {
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return rvh->GetDelegate()->GetAsWebContents();
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// WebContentsImpl::DestructionObserver ----------------------------------------
31490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
31590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class WebContentsImpl::DestructionObserver : public WebContentsObserver {
31690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public:
31790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DestructionObserver(WebContentsImpl* owner, WebContents* watched_contents)
31890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      : WebContentsObserver(watched_contents),
31990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        owner_(owner) {
32090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
32190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
32290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // WebContentsObserver:
32390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void WebContentsDestroyed(WebContents* web_contents) OVERRIDE {
32490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    owner_->OnWebContentsDestroyed(static_cast<WebContentsImpl*>(web_contents));
32590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
32690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
32790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private:
32890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  WebContentsImpl* owner_;
32990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
33090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DestructionObserver);
33190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
33290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebContentsImpl -------------------------------------------------------------
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsImpl::WebContentsImpl(
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserContext* browser_context,
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebContentsImpl* opener)
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : delegate_(NULL),
339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      controller_(this, browser_context),
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      render_view_host_delegate_view_(NULL),
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      opener_(opener),
342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_WIN) && defined(USE_AURA)
343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      accessible_parent_(NULL),
344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      render_manager_(this, this, this),
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      is_loading_(false),
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      crashed_status_(base::TERMINATION_STATUS_STILL_RUNNING),
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      crashed_error_code_(0),
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      waiting_for_response_(false),
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      load_state_(net::LOAD_STATE_IDLE, string16()),
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      upload_size_(0),
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      upload_position_(0),
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      displayed_insecure_content_(false),
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      capturer_count_(0),
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      should_normally_be_visible_(true),
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      is_being_destroyed_(false),
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      notify_disconnection_(false),
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      dialog_manager_(NULL),
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      is_showing_before_unload_dialog_(false),
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      closed_by_user_gesture_(false),
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      minimum_zoom_percent_(static_cast<int>(kMinimumZoomFactor * 100)),
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      maximum_zoom_percent_(static_cast<int>(kMaximumZoomFactor * 100)),
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      temporary_zoom_settings_(false),
36490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      color_chooser_identifier_(0),
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      message_source_(NULL),
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      fullscreen_widget_routing_id_(MSG_ROUTING_NONE) {
367868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  for (size_t i = 0; i < g_created_callbacks.Get().size(); i++)
368868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    g_created_callbacks.Get().at(i).Run(this);
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsImpl::~WebContentsImpl() {
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_being_destroyed_ = true;
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
374ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  ClearAllPowerSaveBlockers();
375ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (std::set<RenderWidgetHostImpl*>::iterator iter =
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           created_widgets_.begin(); iter != created_widgets_.end(); ++iter) {
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    (*iter)->DetachDelegate();
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  created_widgets_.clear();
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clear out any JavaScript state.
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (dialog_manager_)
384a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    dialog_manager_->WebContentsDestroyed(this);
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (color_chooser_)
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    color_chooser_->End();
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotifyDisconnected();
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notify any observer that have a reference on this WebContents.
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotificationService::current()->Notify(
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTIFICATION_WEB_CONTENTS_DESTROYED,
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Source<WebContents>(this),
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NotificationService::NoDetails());
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(brettw) this should be moved to the view.
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) && !defined(USE_AURA)
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If we still have a window handle, destroy it. GetNativeView can return
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NULL if this contents was part of a window that closed.
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (view_->GetNativeView()) {
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RenderViewHost* host = GetRenderViewHost();
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (host && host->GetView())
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      RenderWidgetHostViewPort::FromRWHV(host->GetView())->WillWmDestroy();
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver,
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    observers_,
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    WebContentsImplDestroyed());
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetDelegate(NULL);
41390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
41490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  STLDeleteContainerPairSecondPointers(destruction_observers_.begin(),
41590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                       destruction_observers_.end());
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsImpl* WebContentsImpl::CreateWithOpener(
4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const WebContents::CreateParams& params,
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebContentsImpl* opener) {
4217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  TRACE_EVENT0("browser", "WebContentsImpl::CreateWithOpener");
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContentsImpl* new_contents = new WebContentsImpl(
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      params.browser_context, opener);
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  new_contents->Init(params);
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new_contents;
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BrowserPluginGuest* WebContentsImpl::CreateGuest(
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserContext* browser_context,
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SiteInstance* site_instance,
433eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    int guest_instance_id,
434eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    scoped_ptr<base::DictionaryValue> extra_params) {
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContentsImpl* new_contents = new WebContentsImpl(browser_context, NULL);
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This makes |new_contents| act as a guest.
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For more info, see comment above class BrowserPluginGuest.
439eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  BrowserPluginGuest::Create(
440eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      guest_instance_id, new_contents, extra_params.Pass());
4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents::CreateParams create_params(browser_context, site_instance);
4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  new_contents->Init(create_params);
4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // We are instantiating a WebContents for browser plugin. Set its subframe bit
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // to true.
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static_cast<RenderViewHostImpl*>(
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new_contents->GetRenderViewHost())->set_is_subframe(true);
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return new_contents->browser_plugin_guest_.get();
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebPreferences WebContentsImpl::GetWebkitPrefs(RenderViewHost* rvh,
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               const GURL& url) {
4557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  TRACE_EVENT0("browser", "WebContentsImpl::GetWebkitPrefs");
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebPreferences prefs;
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const CommandLine& command_line = *CommandLine::ForCurrentProcess();
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs.javascript_enabled =
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !command_line.HasSwitch(switches::kDisableJavaScript);
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs.web_security_enabled =
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !command_line.HasSwitch(switches::kDisableWebSecurity);
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs.plugins_enabled =
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !command_line.HasSwitch(switches::kDisablePlugins);
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs.java_enabled =
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !command_line.HasSwitch(switches::kDisableJava);
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs.remote_fonts_enabled =
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !command_line.HasSwitch(switches::kDisableRemoteFonts);
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs.xss_auditor_enabled =
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !command_line.HasSwitch(switches::kDisableXSSAuditor);
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs.application_cache_enabled =
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !command_line.HasSwitch(switches::kDisableApplicationCache);
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs.local_storage_enabled =
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !command_line.HasSwitch(switches::kDisableLocalStorage);
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs.databases_enabled =
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !command_line.HasSwitch(switches::kDisableDatabases);
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs.webaudio_enabled =
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !command_line.HasSwitch(switches::kDisableWebAudio);
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs.experimental_webgl_enabled =
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GpuProcessHost::gpu_enabled() &&
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !command_line.HasSwitch(switches::kDisable3DAPIs) &&
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !command_line.HasSwitch(switches::kDisableExperimentalWebGL);
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs.flash_3d_enabled =
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GpuProcessHost::gpu_enabled() &&
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !command_line.HasSwitch(switches::kDisableFlash3d);
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs.flash_stage3d_enabled =
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GpuProcessHost::gpu_enabled() &&
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !command_line.HasSwitch(switches::kDisableFlashStage3d);
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prefs.flash_stage3d_baseline_enabled =
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GpuProcessHost::gpu_enabled() &&
4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      !command_line.HasSwitch(switches::kDisableFlashStage3d);
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs.gl_multisampling_enabled =
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !command_line.HasSwitch(switches::kDisableGLMultisampling);
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs.privileged_webgl_extensions_enabled =
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      command_line.HasSwitch(switches::kEnablePrivilegedWebGLExtensions);
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs.site_specific_quirks_enabled =
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !command_line.HasSwitch(switches::kDisableSiteSpecificQuirks);
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs.allow_file_access_from_file_urls =
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      command_line.HasSwitch(switches::kAllowFileAccessFromFiles);
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prefs.accelerated_compositing_for_overflow_scroll_enabled = false;
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (command_line.HasSwitch(switches::kEnableAcceleratedOverflowScroll))
5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    prefs.accelerated_compositing_for_overflow_scroll_enabled = true;
5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (command_line.HasSwitch(switches::kDisableAcceleratedOverflowScroll))
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    prefs.accelerated_compositing_for_overflow_scroll_enabled = false;
5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prefs.accelerated_compositing_for_scrollable_frames_enabled =
5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      command_line.HasSwitch(switches::kEnableAcceleratedScrollableFrames);
5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prefs.composited_scrolling_for_frames_enabled =
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      command_line.HasSwitch(switches::kEnableCompositedScrollingForFrames);
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs.show_paint_rects =
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      command_line.HasSwitch(switches::kShowPaintRects);
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs.accelerated_compositing_enabled =
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GpuProcessHost::gpu_enabled() &&
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !command_line.HasSwitch(switches::kDisableAcceleratedCompositing);
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs.force_compositing_mode =
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::IsForceCompositingModeEnabled() &&
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !command_line.HasSwitch(switches::kDisableForceCompositingMode);
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs.accelerated_2d_canvas_enabled =
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GpuProcessHost::gpu_enabled() &&
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !command_line.HasSwitch(switches::kDisableAccelerated2dCanvas);
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prefs.antialiased_2d_canvas_disabled =
5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      command_line.HasSwitch(switches::kDisable2dCanvasAntialiasing);
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs.accelerated_filters_enabled =
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GpuProcessHost::gpu_enabled() &&
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      command_line.HasSwitch(switches::kEnableAcceleratedFilters);
5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prefs.accelerated_compositing_for_3d_transforms_enabled =
5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prefs.accelerated_compositing_for_animation_enabled =
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          !command_line.HasSwitch(switches::kDisableAcceleratedLayers);
5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prefs.accelerated_compositing_for_plugins_enabled =
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !command_line.HasSwitch(switches::kDisableAcceleratedPlugins);
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prefs.accelerated_compositing_for_video_enabled =
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !command_line.HasSwitch(switches::kDisableAcceleratedVideo);
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs.fullscreen_enabled =
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !command_line.HasSwitch(switches::kDisableFullScreen);
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs.css_sticky_position_enabled =
5437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      command_line.HasSwitch(switches::kEnableExperimentalWebPlatformFeatures);
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs.css_shaders_enabled =
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      command_line.HasSwitch(switches::kEnableCssShaders);
546c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  prefs.lazy_layout_enabled =
5477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      command_line.HasSwitch(switches::kEnableExperimentalWebPlatformFeatures);
5487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  prefs.region_based_columns_enabled =
5497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      command_line.HasSwitch(switches::kEnableRegionBasedColumns);
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prefs.threaded_html_parser =
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      !command_line.HasSwitch(switches::kDisableThreadedHTMLParser);
55290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  prefs.experimental_websocket_enabled =
55390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      command_line.HasSwitch(switches::kEnableExperimentalWebSocket);
554eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (command_line.HasSwitch(cc::switches::kEnablePinchVirtualViewport)) {
555eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    prefs.pinch_virtual_viewport_enabled = true;
556eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    prefs.pinch_overlay_scrollbar_thickness = 10;
557eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
558c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_ANDROID)
56058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  prefs.use_solid_color_scrollbars = true;
5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prefs.user_gesture_required_for_media_playback = !command_line.HasSwitch(
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      switches::kDisableGestureRequirementForMediaPlayback);
563d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  prefs.user_gesture_required_for_media_fullscreen = !command_line.HasSwitch(
564d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      switches::kDisableGestureRequirementForMediaFullscreen);
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
567a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  prefs.touch_enabled = ui::AreTouchEventsEnabled();
568a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  prefs.device_supports_touch = prefs.touch_enabled &&
569a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      ui::IsTouchDevicePresent();
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID)
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs.device_supports_mouse = false;
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   prefs.touch_adjustment_enabled =
5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       !command_line.HasSwitch(switches::kDisableTouchAdjustment);
5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_MACOSX) || defined(OS_CHROMEOS)
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool default_enable_scroll_animator = true;
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool default_enable_scroll_animator = false;
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs.enable_scroll_animator = default_enable_scroll_animator;
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (command_line.HasSwitch(switches::kEnableSmoothScrolling))
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prefs.enable_scroll_animator = true;
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (command_line.HasSwitch(switches::kDisableSmoothScrolling))
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prefs.enable_scroll_animator = false;
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs.visual_word_movement_enabled =
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      command_line.HasSwitch(switches::kEnableVisualWordMovement);
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
591c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Certain GPU features might have been blacklisted.
592c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GpuDataManagerImpl::GetInstance()->UpdateRendererWebPrefs(&prefs);
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ChildProcessSecurityPolicyImpl::GetInstance()->HasWebUIBindings(
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          rvh->GetProcess()->GetID())) {
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prefs.loads_images_automatically = true;
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prefs.javascript_enabled = true;
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs.is_online = !net::NetworkChangeNotifier::IsOffline();
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
602868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#if !defined(USE_AURA)
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Force accelerated compositing and 2d canvas off for chrome: and about:
6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // pages (unless it's specifically allowed).
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if ((url.SchemeIs(chrome::kChromeUIScheme) ||
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (url.SchemeIs(chrome::kAboutScheme) &&
60790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)       url.spec() != kAboutBlankURL)) &&
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !command_line.HasSwitch(switches::kAllowWebUICompositing)) {
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prefs.accelerated_compositing_enabled = false;
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prefs.accelerated_2d_canvas_enabled = false;
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
612868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs.fixed_position_creates_stacking_context = !command_line.HasSwitch(
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      switches::kDisableFixedPositionCreatesStackingContext);
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_CHROMEOS)
6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prefs.gesture_tap_highlight_enabled = !command_line.HasSwitch(
6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      switches::kDisableGestureTapHighlight);
6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs.gesture_tap_highlight_enabled = command_line.HasSwitch(
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      switches::kEnableGestureTapHighlight);
6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs.number_of_cpu_cores = base::SysInfo::NumberOfProcessors();
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prefs.viewport_enabled = command_line.HasSwitch(switches::kEnableViewport);
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs.deferred_image_decoding_enabled =
6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      command_line.HasSwitch(switches::kEnableDeferredImageDecoding) ||
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      cc::switches::IsImplSidePaintingEnabled();
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
633c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  prefs.spatial_navigation_enabled = command_line.HasSwitch(
634c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      switches::kEnableSpatialNavigation);
635c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetContentClient()->browser()->OverrideWebkitPrefs(rvh, url, &prefs);
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Disable compositing in guests until we have compositing path implemented
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // for guests.
6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool guest_compositing_enabled = !command_line.HasSwitch(
6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      switches::kDisableBrowserPluginCompositing);
6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (rvh->GetProcess()->IsGuest() && !guest_compositing_enabled) {
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prefs.force_compositing_mode = false;
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prefs.accelerated_compositing_enabled = false;
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return prefs;
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderViewHostManager* WebContentsImpl::GetRenderManagerForTesting() {
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return &render_manager_;
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::OnMessageReceived(RenderViewHost* render_view_host,
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        const IPC::Message& message) {
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (GetWebUI() &&
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<WebUIImpl*>(GetWebUI())->OnMessageReceived(message)) {
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ObserverListBase<WebContentsObserver>::Iterator it(observers_);
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebContentsObserver* observer;
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while ((observer = it.GetNext()) != NULL)
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (observer->OnMessageReceived(message))
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Message handlers should be aware of which RenderViewHost sent the
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // message, which is temporarily stored in message_source_.
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_source_ = render_view_host;
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool handled = true;
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool message_is_ok = true;
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC_BEGIN_MESSAGE_MAP_EX(WebContentsImpl, message, message_is_ok)
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_DidLoadResourceFromMemoryCache,
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        OnDidLoadResourceFromMemoryCache)
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_DidDisplayInsecureContent,
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        OnDidDisplayInsecureContent)
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_DidRunInsecureContent,
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        OnDidRunInsecureContent)
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_DocumentLoadedInFrame,
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        OnDocumentLoadedInFrame)
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_DidFinishLoad, OnDidFinishLoad)
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_DidFailLoadWithError,
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        OnDidFailLoadWithError)
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_GoToEntryAtOffset, OnGoToEntryAtOffset)
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_UpdateZoomLimits, OnUpdateZoomLimits)
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_EnumerateDirectory, OnEnumerateDirectory)
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_JSOutOfMemory, OnJSOutOfMemory)
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_RegisterProtocolHandler,
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        OnRegisterProtocolHandler)
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_Find_Reply, OnFindReply)
69190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_DidProgrammaticallyScroll,
69290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                        OnDidProgrammaticallyScroll)
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_CrashedPlugin, OnCrashedPlugin)
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_AppCacheAccessed, OnAppCacheAccessed)
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_OpenColorChooser, OnOpenColorChooser)
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_EndColorChooser, OnEndColorChooser)
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_SetSelectedColorInColorChooser,
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        OnSetSelectedColorInColorChooser)
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_PepperPluginHung, OnPepperPluginHung)
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_WebUISend, OnWebUISend)
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_RequestPpapiBrokerPermission,
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        OnRequestPpapiBrokerPermission)
7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER_GENERIC(BrowserPluginHostMsg_AllocateInstanceID,
7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                OnBrowserPluginMessage(message))
7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER_GENERIC(BrowserPluginHostMsg_Attach,
7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                OnBrowserPluginMessage(message))
707c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ImageHostMsg_DidDownloadImage, OnDidDownloadImage)
708c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_UpdateFaviconURL, OnUpdateFaviconURL)
7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_ANDROID)
7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_FindMatchRects_Reply,
7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        OnFindMatchRectsReply)
7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_OpenDateTimeDialog,
7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        OnOpenDateTimeDialog)
7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
715b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_FrameAttached, OnFrameAttached)
7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_FrameDetached, OnFrameDetached)
717ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    IPC_MESSAGE_HANDLER(ViewHostMsg_MediaNotification, OnMediaNotification)
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_UNHANDLED(handled = false)
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC_END_MESSAGE_MAP_EX()
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_source_ = NULL;
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!message_is_ok) {
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RecordAction(UserMetricsAction("BadMessageTerminate_RVD"));
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetRenderProcessHost()->ReceivedBadMessage();
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return handled;
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RunFileChooser(
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RenderViewHost* render_view_host,
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FileChooserParams& params) {
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->RunFileChooser(this, params);
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NavigationControllerImpl& WebContentsImpl::GetController() {
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return controller_;
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const NavigationControllerImpl& WebContentsImpl::GetController() const {
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return controller_;
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserContext* WebContentsImpl::GetBrowserContext() const {
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return controller_.GetBrowserContext();
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GURL& WebContentsImpl::GetURL() const {
75090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // We may not have a navigation entry yet.
751868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  NavigationEntry* entry = controller_.GetVisibleEntry();
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return entry ? entry->GetVirtualURL() : GURL::EmptyGURL();
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochconst GURL& WebContentsImpl::GetVisibleURL() const {
75690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // We may not have a navigation entry yet.
757868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  NavigationEntry* entry = controller_.GetVisibleEntry();
75890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return entry ? entry->GetVirtualURL() : GURL::EmptyGURL();
75990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
76090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
76190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const GURL& WebContentsImpl::GetLastCommittedURL() const {
76290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // We may not have a navigation entry yet.
76390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  NavigationEntry* entry = controller_.GetLastCommittedEntry();
76490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return entry ? entry->GetVirtualURL() : GURL::EmptyGURL();
76590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
76690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsDelegate* WebContentsImpl::GetDelegate() {
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return delegate_;
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetDelegate(WebContentsDelegate* delegate) {
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(cbentzel): remove this debugging code?
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate == delegate_)
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->Detach(this);
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_ = delegate;
7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (delegate_) {
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->Attach(this);
7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Ensure the visible RVH reflects the new delegate's preferences.
7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (view_)
7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      view_->SetOverscrollControllerEnabled(delegate->CanOverscrollContent());
7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderProcessHost* WebContentsImpl::GetRenderProcessHost() const {
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderViewHostImpl* host = render_manager_.current_host();
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return host ? host->GetProcess() : NULL;
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderViewHost* WebContentsImpl::GetRenderViewHost() const {
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return render_manager_.current_host();
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::GetRenderViewHostAtPosition(
7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int x,
7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int y,
7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::Callback<void(RenderViewHost*, int, int)>& callback) {
7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BrowserPluginEmbedder* embedder = GetBrowserPluginEmbedder();
8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (embedder)
8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    embedder->GetRenderViewHostAtPosition(x, y, callback);
8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  else
8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    callback.Run(GetRenderViewHost(), x, y);
8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebContents* WebContentsImpl::GetEmbedderWebContents() const {
8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BrowserPluginGuest* guest = GetBrowserPluginGuest();
8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (guest)
8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return guest->embedder_web_contents();
8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return NULL;
8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int WebContentsImpl::GetEmbeddedInstanceID() const {
8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BrowserPluginGuest* guest = GetBrowserPluginGuest();
8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (guest)
8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return guest->instance_id();
8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return 0;
8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsImpl::GetRoutingID() const {
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetRenderViewHost())
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return MSG_ROUTING_NONE;
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetRenderViewHost()->GetRoutingID();
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int WebContentsImpl::GetFullscreenWidgetRoutingID() const {
8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return fullscreen_widget_routing_id_;
8292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderWidgetHostView* WebContentsImpl::GetRenderWidgetHostView() const {
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return render_manager_.GetRenderWidgetHostView();
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)RenderWidgetHostViewPort* WebContentsImpl::GetRenderWidgetHostViewPort() const {
8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BrowserPluginGuest* guest = GetBrowserPluginGuest();
8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (guest && guest->embedder_web_contents()) {
8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return guest->embedder_web_contents()->GetRenderWidgetHostViewPort();
8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return RenderWidgetHostViewPort::FromRWHV(GetRenderWidgetHostView());
8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
843d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)RenderWidgetHostView* WebContentsImpl::GetFullscreenRenderWidgetHostView()
844d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    const {
845d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  RenderWidgetHost* const widget_host =
846d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      RenderWidgetHostImpl::FromID(GetRenderProcessHost()->GetID(),
847d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                   GetFullscreenWidgetRoutingID());
848d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return widget_host ? widget_host->GetView() : NULL;
849d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
850d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsView* WebContentsImpl::GetView() const {
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return view_.get();
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebUI* WebContentsImpl::CreateWebUI(const GURL& url) {
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebUIImpl* web_ui = new WebUIImpl(this);
8572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebUIController* controller = WebUIControllerFactoryRegistry::GetInstance()->
8582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateWebUIControllerForURL(web_ui, url);
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (controller) {
8602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    web_ui->AddMessageHandler(new GenericHandler());
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_ui->SetController(controller);
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return web_ui;
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete web_ui;
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebUI* WebContentsImpl::GetWebUI() const {
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return render_manager_.web_ui() ? render_manager_.web_ui()
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : render_manager_.pending_web_ui();
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebUI* WebContentsImpl::GetCommittedWebUI() const {
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return render_manager_.web_ui();
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetUserAgentOverride(const std::string& override) {
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (GetUserAgentOverride() == override)
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  renderer_preferences_.user_agent_override = override;
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Send the new override string to the renderer.
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderViewHost* host = GetRenderViewHost();
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (host)
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    host->SyncRendererPrefs();
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reload the page if a load is currently in progress to avoid having
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // different parts of the page loaded using different user agents.
89168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  NavigationEntry* entry = controller_.GetActiveEntry();
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_loading_ && entry != NULL && entry->GetIsOverridingUserAgent())
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    controller_.ReloadIgnoringCache(true);
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver, observers_,
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    UserAgentOverrideSet(override));
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::string& WebContentsImpl::GetUserAgentOverride() const {
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return renderer_preferences_.user_agent_override;
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
903c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_WIN) && defined(USE_AURA)
904c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebContentsImpl::SetParentNativeViewAccessible(
905c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)gfx::NativeViewAccessible accessible_parent) {
906c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  accessible_parent_ = accessible_parent;
90790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (GetRenderViewHost())
90890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    GetRenderViewHostImpl()->SetParentNativeViewAccessible(accessible_parent);
909c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
910c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
911c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const string16& WebContentsImpl::GetTitle() const {
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Transient entries take precedence. They are used for interstitial pages
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // that are shown on top of existing pages.
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigationEntry* entry = controller_.GetTransientEntry();
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string accept_languages =
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetContentClient()->browser()->GetAcceptLangs(
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          GetBrowserContext());
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (entry) {
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return entry->GetTitleForDisplay(accept_languages);
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebUI* our_web_ui = render_manager_.pending_web_ui() ?
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      render_manager_.pending_web_ui() : render_manager_.web_ui();
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (our_web_ui) {
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Don't override the title in view source mode.
926868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    entry = controller_.GetVisibleEntry();
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!(entry && entry->IsViewSourceMode())) {
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Give the Web UI the chance to override our title.
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const string16& title = our_web_ui->GetOverriddenTitle();
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!title.empty())
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return title;
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We use the title for the last committed entry rather than a pending
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // navigation entry. For example, when the user types in a URL, we want to
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // keep the old page's title until the new load has committed and we get a new
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // title.
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry = controller_.GetLastCommittedEntry();
940868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
941868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // We make an exception for initial navigations, because we can have a
942868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // committed entry for an initial navigation when doing a history navigation
943868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // in a new tab, such as Ctrl+Back.
944868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (entry && controller_.IsInitialNavigation())
945868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    entry = controller_.GetVisibleEntry();
946868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (entry) {
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return entry->GetTitleForDisplay(accept_languages);
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |page_title_when_no_navigation_entry_| is finally used
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // if no title cannot be retrieved.
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return page_title_when_no_navigation_entry_;
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32 WebContentsImpl::GetMaxPageID() {
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetMaxPageIDForSiteInstance(GetSiteInstance());
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32 WebContentsImpl::GetMaxPageIDForSiteInstance(
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SiteInstance* site_instance) {
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (max_page_ids_.find(site_instance->GetId()) == max_page_ids_.end())
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    max_page_ids_[site_instance->GetId()] = -1;
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return max_page_ids_[site_instance->GetId()];
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdateMaxPageID(int32 page_id) {
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateMaxPageIDForSiteInstance(GetSiteInstance(), page_id);
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdateMaxPageIDForSiteInstance(
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SiteInstance* site_instance, int32 page_id) {
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (GetMaxPageIDForSiteInstance(site_instance) < page_id)
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    max_page_ids_[site_instance->GetId()] = page_id;
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::CopyMaxPageIDsFrom(WebContentsImpl* web_contents) {
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  max_page_ids_ = web_contents->max_page_ids_;
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SiteInstance* WebContentsImpl::GetSiteInstance() const {
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return render_manager_.current_host()->GetSiteInstance();
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SiteInstance* WebContentsImpl::GetPendingSiteInstance() const {
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderViewHost* dest_rvh = render_manager_.pending_render_view_host() ?
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      render_manager_.pending_render_view_host() :
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      render_manager_.current_host();
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return dest_rvh->GetSiteInstance();
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::IsLoading() const {
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return is_loading_;
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::IsWaitingForResponse() const {
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return waiting_for_response_;
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const net::LoadStateWithParam& WebContentsImpl::GetLoadState() const {
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return load_state_;
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const string16& WebContentsImpl::GetLoadStateHost() const {
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return load_state_host_;
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint64 WebContentsImpl::GetUploadSize() const {
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return upload_size_;
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint64 WebContentsImpl::GetUploadPosition() const {
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return upload_position_;
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)std::set<GURL> WebContentsImpl::GetSitesInTab() const {
10187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  BrowserContext* browser_context = GetBrowserContext();
10197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::set<GURL> sites;
10207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!frame_tree_root_.get())
10217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return sites;
10227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
10237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Iterates over the FrameTreeNodes to find each unique site URL that is
10247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // currently committed.
10257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  FrameTreeNode* node = NULL;
10267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::queue<FrameTreeNode*> queue;
10277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  queue.push(frame_tree_root_.get());
10287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
10297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  while (!queue.empty()) {
10307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    node = queue.front();
10317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    queue.pop();
10327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    sites.insert(SiteInstance::GetSiteForURL(browser_context,
10337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                             node->current_url()));
10347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
10357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    for (size_t i = 0; i < node->child_count(); ++i)
10367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      queue.push(node->child_at(i));
10377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
10387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
10397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return sites;
10407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
10417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::string& WebContentsImpl::GetEncoding() const {
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return encoding_;
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::DisplayedInsecureContent() const {
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return displayed_insecure_content_;
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::IncrementCapturerCount() {
10512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(!is_being_destroyed_);
10522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ++capturer_count_;
10532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DVLOG(1) << "There are now " << capturer_count_
10542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           << " capturing(s) of WebContentsImpl@" << this;
10552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::DecrementCapturerCount() {
10582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  --capturer_count_;
10592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DVLOG(1) << "There are now " << capturer_count_
10602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           << " capturing(s) of WebContentsImpl@" << this;
10612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK_LE(0, capturer_count_);
10622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (is_being_destroyed_)
10642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
10652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (IsHidden()) {
10672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DVLOG(1) << "Executing delayed WasHidden().";
10682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WasHidden();
10692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1072ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochint WebContentsImpl::GetCapturerCount() const {
1073ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  return capturer_count_;
1074ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
1075ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::IsCrashed() const {
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (crashed_status_ == base::TERMINATION_STATUS_PROCESS_CRASHED ||
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          crashed_status_ == base::TERMINATION_STATUS_ABNORMAL_TERMINATION ||
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          crashed_status_ == base::TERMINATION_STATUS_PROCESS_WAS_KILLED);
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetIsCrashed(base::TerminationStatus status,
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   int error_code) {
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (status == crashed_status_)
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  crashed_status_ = status;
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  crashed_error_code_ = error_code;
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotifyNavigationStateChanged(INVALIDATE_TYPE_TAB);
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::TerminationStatus WebContentsImpl::GetCrashedStatus() const {
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return crashed_status_;
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::IsBeingDestroyed() const {
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return is_being_destroyed_;
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::NotifyNavigationStateChanged(unsigned changed_flags) {
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->NavigationStateChanged(this, changed_flags);
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::TimeTicks WebContentsImpl::GetLastSelectedTime() const {
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return last_selected_time_;
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::WasShown() {
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  controller_.SetActive(true);
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderWidgetHostViewPort* rwhv =
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      RenderWidgetHostViewPort::FromRWHV(GetRenderWidgetHostView());
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (rwhv) {
111468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    rwhv->Show();
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rwhv->SetActive(true);
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  last_selected_time_ = base::TimeTicks::Now();
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver, observers_, WasShown());
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The resize rect might have changed while this was inactive -- send the new
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // one to make sure it's up to date.
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderViewHostImpl* rvh =
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<RenderViewHostImpl*>(GetRenderViewHost());
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (rvh) {
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rvh->ResizeRectChanged(GetRootWindowResizerRect());
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  should_normally_be_visible_ = true;
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotificationService::current()->Notify(
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTIFICATION_WEB_CONTENTS_VISIBILITY_CHANGED,
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Source<WebContents>(this),
11362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Details<const bool>(&should_normally_be_visible_));
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::WasHidden() {
11402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If there are entities capturing screenshots or video (e.g., mirroring),
11412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // don't activate the "disable rendering" optimization.
11422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (capturer_count_ == 0) {
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // |GetRenderViewHost()| can be NULL if the user middle clicks a link to
11442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // open a tab in the background, then closes the tab before selecting it.
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // This is because closing the tab calls WebContentsImpl::Destroy(), which
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // removes the |GetRenderViewHost()|; then when we actually destroy the
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // window, OnWindowPosChanged() notices and calls WasHidden() (which
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // calls us).
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RenderWidgetHostViewPort* rwhv =
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        RenderWidgetHostViewPort::FromRWHV(GetRenderWidgetHostView());
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (rwhv)
115268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      rwhv->Hide();
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  should_normally_be_visible_ = false;
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotificationService::current()->Notify(
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTIFICATION_WEB_CONTENTS_VISIBILITY_CHANGED,
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Source<WebContents>(this),
11592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Details<const bool>(&should_normally_be_visible_));
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::NeedToFireBeforeUnload() {
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(creis): Should we fire even for interstitial pages?
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return WillNotifyDisconnection() &&
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !ShowingInterstitialPage() &&
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !static_cast<RenderViewHostImpl*>(
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          GetRenderViewHost())->SuddenTerminationAllowed();
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::Stop() {
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  render_manager_.Stop();
11723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver, observers_, NavigationStopped());
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContents* WebContentsImpl::Clone() {
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We use our current SiteInstance since the cloned entry will use it anyway.
11772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // We pass our own opener so that the cloned page can access it if it was
11782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // before.
11792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateParams create_params(GetBrowserContext(), GetSiteInstance());
11802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  create_params.initial_size = view_->GetContainerSize();
11812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContentsImpl* tc = CreateWithOpener(create_params, opener_);
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tc->GetController().CopyStateFrom(controller_);
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver,
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    observers_,
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    DidCloneToNewWebContents(this, tc));
11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return tc;
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::Observe(int type,
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const NotificationSource& source,
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const NotificationDetails& details) {
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (type) {
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED: {
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      RenderWidgetHost* host = Source<RenderWidgetHost>(source).ptr();
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (PendingWidgetViews::iterator i = pending_widget_views_.begin();
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           i != pending_widget_views_.end(); ++i) {
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (host->GetView() == i->second) {
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          pending_widget_views_.erase(i);
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::Init(const WebContents::CreateParams& params) {
12102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  render_manager_.Init(
1211868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      params.browser_context, params.site_instance, params.routing_id,
1212868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      params.main_frame_routing_id);
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  view_.reset(GetContentClient()->browser()->
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      OverrideCreateWebContentsView(this, &render_view_host_delegate_view_));
1216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (view_) {
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CHECK(render_view_host_delegate_view_);
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebContentsViewDelegate* delegate =
12202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        GetContentClient()->browser()->GetWebContentsViewDelegate(this);
12212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (browser_plugin_guest_) {
12237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      scoped_ptr<WebContentsViewPort> platform_view(CreateWebContentsView(
12247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          this, delegate, &render_view_host_delegate_view_));
12252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      WebContentsViewGuest* rv = new WebContentsViewGuest(
12277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          this, browser_plugin_guest_.get(), platform_view.Pass(),
12287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          render_view_host_delegate_view_);
12292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      render_view_host_delegate_view_ = rv;
12302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      view_.reset(rv);
12312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else {
12322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Regular WebContentsView.
12332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      view_.reset(CreateWebContentsView(
12342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          this, delegate, &render_view_host_delegate_view_));
12352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CHECK(render_view_host_delegate_view_);
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(view_.get());
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Size initial_size = params.initial_size;
12412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  view_->CreateView(initial_size, params.context);
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Listen for whether our opener gets destroyed.
124490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (opener_)
124590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    AddDestructionObserver(opener_);
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registrar_.Add(this,
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED,
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 NotificationService::AllBrowserContextsAndSources());
12507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if defined(OS_ANDROID)
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  java_bridge_dispatcher_host_manager_.reset(
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new JavaBridgeDispatcherHostManager(this));
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
12542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_ANDROID)
12562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  date_time_chooser_.reset(new DateTimeChooserAndroid());
12572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
126090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WebContentsImpl::OnWebContentsDestroyed(WebContentsImpl* web_contents) {
126190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  RemoveDestructionObserver(web_contents);
126290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clear the opener if it has been closed.
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (web_contents == opener_) {
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    opener_ = NULL;
12662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
12672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
12682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Clear a pending contents that has been closed before being shown.
12692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (PendingContents::iterator iter = pending_contents_.begin();
12702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       iter != pending_contents_.end();
12712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       ++iter) {
12722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (iter->second != web_contents)
12732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      continue;
12742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    pending_contents_.erase(iter);
12752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NOTREACHED();
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
128090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WebContentsImpl::AddDestructionObserver(WebContentsImpl* web_contents) {
128190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!ContainsKey(destruction_observers_, web_contents)) {
128290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    destruction_observers_[web_contents] =
128390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        new DestructionObserver(this, web_contents);
128490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
128590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
128690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
128790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WebContentsImpl::RemoveDestructionObserver(WebContentsImpl* web_contents) {
128890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DestructionObservers::iterator iter =
128990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      destruction_observers_.find(web_contents);
129090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (iter != destruction_observers_.end()) {
129190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    delete destruction_observers_[web_contents];
129290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    destruction_observers_.erase(iter);
129390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
129490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
129590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::AddObserver(WebContentsObserver* observer) {
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  observers_.AddObserver(observer);
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RemoveObserver(WebContentsObserver* observer) {
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  observers_.RemoveObserver(observer);
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::Activate() {
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->ActivateContents(this);
13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::Deactivate() {
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->DeactivateContents(this);
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::LostCapture() {
13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->LostCapture();
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RenderWidgetDeleted(
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RenderWidgetHostImpl* render_widget_host) {
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_being_destroyed_) {
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // |created_widgets_| might have been destroyed.
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<RenderWidgetHostImpl*>::iterator iter =
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      created_widgets_.find(render_widget_host);
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (iter != created_widgets_.end())
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    created_widgets_.erase(iter);
13302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (render_widget_host &&
13322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      render_widget_host->GetRoutingID() == fullscreen_widget_routing_id_) {
1333d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    if (delegate_ && delegate_->EmbedsFullscreenWidget())
1334d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      delegate_->ToggleFullscreenModeForTab(this, false);
13352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FOR_EACH_OBSERVER(WebContentsObserver,
13362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      observers_,
13372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      DidDestroyFullscreenWidget(
13382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          fullscreen_widget_routing_id_));
13392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    fullscreen_widget_routing_id_ = MSG_ROUTING_NONE;
13402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::PreHandleKeyboardEvent(
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const NativeWebKeyboardEvent& event,
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool* is_keyboard_shortcut) {
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return delegate_ &&
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delegate_->PreHandleKeyboardEvent(this, event, is_keyboard_shortcut);
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::HandleKeyboardEvent(const NativeWebKeyboardEvent& event) {
13517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (browser_plugin_embedder_ &&
13527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      browser_plugin_embedder_->HandleKeyboardEvent(event)) {
13537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
13547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
13557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->HandleKeyboardEvent(this, event);
13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool WebContentsImpl::PreHandleWheelEvent(
13612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const WebKit::WebMouseWheelEvent& event) {
1362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if !defined(OS_MACOSX)
1363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // On platforms other than Mac, control+mousewheel changes zoom. On Mac, this
1364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // isn't done for two reasons:
1365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  //   -the OS already has a gesture to do this through pinch-zoom
1366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  //   -if a user starts an inertial scroll, let's go, and presses control
1367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  //      (i.e. control+tab) then the OS's buffered scroll events will come in
1368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  //      with control key set which isn't what the user wants
13692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (delegate_ &&
13702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      event.wheelTicksY &&
13712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      (event.modifiers & WebKit::WebInputEvent::ControlKey)) {
13722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    delegate_->ContentsZoomChange(event.wheelTicksY > 0);
13732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return true;
13742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
13762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
13782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
13792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_WIN) && defined(USE_AURA)
1381c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)gfx::NativeViewAccessible WebContentsImpl::GetParentNativeViewAccessible() {
1382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return accessible_parent_;
1383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
1385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::HandleMouseDown() {
13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->HandleMouseDown();
13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::HandleMouseUp() {
13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->HandleMouseUp();
13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::HandlePointerActivate() {
13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->HandlePointerActivate();
13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::HandleGestureBegin() {
14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->HandleGestureBegin();
14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::HandleGestureEnd() {
14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->HandleGestureEnd();
14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ToggleFullscreenMode(bool enter_fullscreen) {
1412d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // This method is being called to enter or leave renderer-initiated fullscreen
1413d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // mode.  Either way, make sure any existing fullscreen widget is shut down
1414d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // first.
1415d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  RenderWidgetHostView* const widget_view = GetFullscreenRenderWidgetHostView();
1416d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (widget_view)
1417d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    RenderWidgetHostImpl::From(widget_view->GetRenderWidgetHost())->Shutdown();
1418d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->ToggleFullscreenModeForTab(this, enter_fullscreen);
14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::IsFullscreenForCurrentTab() const {
14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return delegate_ ? delegate_->IsFullscreenForTabOrPending(this) : false;
14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RequestToLockMouse(bool user_gesture,
14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         bool last_unlocked_by_target) {
14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_) {
14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->RequestToLockMouse(this, user_gesture, last_unlocked_by_target);
14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GotResponseToLockMouseRequest(false);
14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::LostMouseLock() {
14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->LostMouseLock();
14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::CreateNewWindow(
14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int route_id,
1443868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    int main_frame_route_id,
14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ViewHostMsg_CreateWindow_Params& params,
14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SessionStorageNamespace* session_storage_namespace) {
14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We usually create the new window in the same BrowsingInstance (group of
14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // script-related windows), by passing in the current SiteInstance.  However,
14482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // if the opener is being suppressed (in a non-guest), we create a new
14492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // SiteInstance in its own BrowsingInstance.
14502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool is_guest = GetRenderProcessHost()->IsGuest();
14512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<SiteInstance> site_instance =
14532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      params.opener_suppressed && !is_guest ?
14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SiteInstance::CreateForURL(GetBrowserContext(), params.target_url) :
14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetSiteInstance();
14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We must assign the SessionStorageNamespace before calling Init().
14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // http://crbug.com/142685
1460ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  const std::string& partition_id =
1461ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      GetContentClient()->browser()->
1462ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch          GetStoragePartitionIdForSite(GetBrowserContext(),
1463ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                                       site_instance->GetSiteURL());
1464868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  StoragePartition* partition = BrowserContext::GetStoragePartition(
1465868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      GetBrowserContext(), site_instance.get());
1466bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  DOMStorageContextWrapper* dom_storage_context =
1467bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      static_cast<DOMStorageContextWrapper*>(partition->GetDOMStorageContext());
14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionStorageNamespaceImpl* session_storage_namespace_impl =
14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<SessionStorageNamespaceImpl*>(session_storage_namespace);
14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(session_storage_namespace_impl->IsFromContext(dom_storage_context));
14713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
14723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (delegate_ &&
14733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      !delegate_->ShouldCreateWebContents(this,
14743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                          route_id,
14753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                          params.window_container_type,
14763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                          params.frame_name,
14773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                          params.target_url,
14783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                          partition_id,
14793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                          session_storage_namespace)) {
14803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    GetRenderViewHost()->GetProcess()->ResumeRequestsForView(route_id);
14813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    GetRenderViewHost()->GetProcess()->ResumeRequestsForView(
14823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        main_frame_route_id);
14833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return;
14843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
14853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
14863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Create the new web contents. This will automatically create the new
14873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // WebContentsView. In the future, we may want to create the view separately.
14883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  WebContentsImpl* new_contents =
14893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      new WebContentsImpl(GetBrowserContext(),
14903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                          params.opener_suppressed ? NULL : this);
14913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new_contents->GetController().SetSessionStorageNamespace(
1493ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      partition_id,
14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      session_storage_namespace);
1495868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  CreateParams create_params(GetBrowserContext(), site_instance.get());
14962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  create_params.routing_id = route_id;
1497868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  create_params.main_frame_routing_id = main_frame_route_id;
14982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!is_guest) {
14992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    create_params.context = view_->GetNativeView();
15002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    create_params.initial_size = view_->GetContainerSize();
15012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
15022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // This makes |new_contents| act as a guest.
15032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // For more info, see comment above class BrowserPluginGuest.
15042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int instance_id = GetBrowserPluginGuestManager()->get_next_instance_id();
15052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WebContentsImpl* new_contents_impl =
15062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        static_cast<WebContentsImpl*>(new_contents);
1507eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    BrowserPluginGuest::CreateWithOpener(instance_id, new_contents_impl,
1508eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        GetBrowserPluginGuest(), !!new_contents_impl->opener());
15092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
15103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (params.disposition == NEW_BACKGROUND_TAB)
15113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    create_params.initially_hidden = true;
15122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  new_contents->Init(create_params);
15132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Save the window for later if we're not suppressing the opener (since it
1515c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // will be shown immediately).
1516c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!params.opener_suppressed) {
1517c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!is_guest) {
1518c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      WebContentsViewPort* new_view = new_contents->view_.get();
1519c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1520c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // TODO(brettw): It seems bogus that we have to call this function on the
1521c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // newly created object and give it one of its own member variables.
1522c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      new_view->CreateViewForWidget(new_contents->GetRenderViewHost());
1523c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Save the created window associated with the route so we can show it
15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // later.
15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK_NE(MSG_ROUTING_NONE, route_id);
15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pending_contents_[route_id] = new_contents;
152890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    AddDestructionObserver(new_contents);
15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_) {
15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->WebContentsCreated(
15332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        this, params.opener_frame_id, params.frame_name,
15342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        params.target_url, new_contents);
15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (params.opener_suppressed) {
15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // When the opener is suppressed, the original renderer cannot access the
15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // new window.  As a result, we need to show and navigate the window here.
15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool was_blocked = false;
15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (delegate_) {
15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::Rect initial_pos;
15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delegate_->AddNewContents(
15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          this, new_contents, params.disposition, initial_pos,
15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          params.user_gesture, &was_blocked);
15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!was_blocked) {
15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      OpenURLParams open_params(params.target_url,
15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                Referrer(),
15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                CURRENT_TAB,
15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                PAGE_TRANSITION_LINK,
15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                true /* is_renderer_initiated */);
15537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      open_params.user_gesture = params.user_gesture;
15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_contents->OpenURL(open_params);
15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::CreateNewWidget(int route_id,
15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      WebKit::WebPopupType popup_type) {
15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateNewWidget(route_id, false, popup_type);
15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::CreateNewFullscreenWidget(int route_id) {
15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateNewWidget(route_id, true, WebKit::WebPopupTypeNone);
15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::CreateNewWidget(int route_id,
15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      bool is_fullscreen,
15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      WebKit::WebPopupType popup_type) {
15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderProcessHost* process = GetRenderProcessHost();
15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderWidgetHostImpl* widget_host =
15733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      new RenderWidgetHostImpl(this, process, route_id, IsHidden());
15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  created_widgets_.insert(widget_host);
15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderWidgetHostViewPort* widget_view = RenderWidgetHostViewPort::FromRWHV(
15772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      view_->CreateViewForPopupWidget(widget_host));
15782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!widget_view)
15792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!is_fullscreen) {
15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Popups should not get activated.
15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    widget_view->SetPopupType(popup_type);
15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Save the created widget associated with the route so we can show it later.
15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pending_widget_views_[route_id] = widget_view;
15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A RenderWidgetHostViewMac has lifetime scoped to the view. We'll retain it
15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to allow it to survive the trip without being hosted.
15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::mac::NSObjectRetain(widget_view->GetNativeView());
15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ShowCreatedWindow(int route_id,
15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        WindowOpenDisposition disposition,
15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        const gfx::Rect& initial_pos,
15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        bool user_gesture) {
15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebContentsImpl* contents = GetCreatedWindow(route_id);
15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (contents) {
16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebContentsDelegate* delegate = GetDelegate();
16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (delegate) {
16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delegate->AddNewContents(
16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          this, contents, disposition, initial_pos, user_gesture, NULL);
16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ShowCreatedWidget(int route_id,
16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        const gfx::Rect& initial_pos) {
16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShowCreatedWidget(route_id, false, initial_pos);
16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ShowCreatedFullscreenWidget(int route_id) {
16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShowCreatedWidget(route_id, true, gfx::Rect());
16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ShowCreatedWidget(int route_id,
16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        bool is_fullscreen,
16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        const gfx::Rect& initial_pos) {
16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->RenderWidgetShowing();
16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderWidgetHostViewPort* widget_host_view =
16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      RenderWidgetHostViewPort::FromRWHV(GetCreatedWidget(route_id));
16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!widget_host_view)
16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1627d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  bool allow_privileged = false;
1628d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (is_fullscreen) {
1629d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    if (delegate_ && delegate_->EmbedsFullscreenWidget()) {
1630d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      widget_host_view->InitAsChild(GetRenderWidgetHostView()->GetNativeView());
1631d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      delegate_->ToggleFullscreenModeForTab(this, true);
1632d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    } else {
1633d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      widget_host_view->InitAsFullscreen(GetRenderWidgetHostViewPort());
1634d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      // Only allow privileged mouse lock for fullscreen render widget, which is
1635d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      // used to implement Pepper Flash fullscreen.
1636d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      allow_privileged = true;
1637d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    }
1638d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1639d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    DCHECK_EQ(MSG_ROUTING_NONE, fullscreen_widget_routing_id_);
1640d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    fullscreen_widget_routing_id_ = route_id;
1641d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    FOR_EACH_OBSERVER(WebContentsObserver,
1642d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                      observers_,
1643d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                      DidShowFullscreenWidget(route_id));
1644d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    if (!widget_host_view->HasFocus())
1645d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      widget_host_view->Focus();
1646d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  } else {
16472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    widget_host_view->InitAsPopup(GetRenderWidgetHostViewPort(), initial_pos);
1648d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderWidgetHostImpl* render_widget_host_impl =
16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      RenderWidgetHostImpl::From(widget_host_view->GetRenderWidgetHost());
16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  render_widget_host_impl->Init();
1653d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  render_widget_host_impl->set_allow_privileged_mouse_lock(allow_privileged);
1654d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // TODO(miu): For now, all mouse lock requests by embedded Flash fullscreen
1655d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // will be denied.  This is to be rectified in a soon-upcoming change.
16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A RenderWidgetHostViewMac has lifetime scoped to the view. Now that it's
16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // properly embedded (or purposefully ignored) we can release the retain we
16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // took in CreateNewWidget().
16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::mac::NSObjectRelease(widget_host_view->GetNativeView());
16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsImpl* WebContentsImpl::GetCreatedWindow(int route_id) {
16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PendingContents::iterator iter = pending_contents_.find(route_id);
16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Certain systems can block the creation of new windows. If we didn't succeed
16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // in creating one, just return NULL.
16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (iter == pending_contents_.end()) {
16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebContentsImpl* new_contents = iter->second;
16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pending_contents_.erase(route_id);
167690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  RemoveDestructionObserver(new_contents);
16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1678c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Don't initialize the guest WebContents immediately.
1679c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (new_contents->GetRenderProcessHost()->IsGuest())
1680c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return new_contents;
1681c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!new_contents->GetRenderProcessHost()->HasConnection() ||
16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !new_contents->GetRenderViewHost()->GetView())
16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(brettw): It seems bogus to reach into here and initialize the host.
16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static_cast<RenderViewHostImpl*>(new_contents->GetRenderViewHost())->Init();
16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new_contents;
16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderWidgetHostView* WebContentsImpl::GetCreatedWidget(int route_id) {
16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PendingWidgetViews::iterator iter = pending_widget_views_.find(route_id);
16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (iter == pending_widget_views_.end()) {
16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(false);
16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderWidgetHostView* widget_host_view = iter->second;
16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pending_widget_views_.erase(route_id);
17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderWidgetHost* widget_host = widget_host_view->GetRenderWidgetHost();
17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!widget_host->GetProcess()->HasConnection()) {
17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The view has gone away or the renderer crashed. Nothing to do.
17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return widget_host_view;
17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void WebContentsImpl::ShowContextMenu(const ContextMenuParams& params) {
17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Allow WebContentsDelegates to handle the context menu operation first.
17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_ && delegate_->HandleContextMenu(params))
17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  render_view_host_delegate_view_->ShowContextMenu(params);
17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RequestMediaAccessPermission(
17192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const MediaStreamRequest& request,
17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const MediaResponseCallback& callback) {
17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->RequestMediaAccessPermission(this, request, callback);
17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
1724c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    callback.Run(MediaStreamDevices(), scoped_ptr<MediaStreamUI>());
17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1727a3f7b4e666c476898878fa745f637129375cd889Ben MurdochSessionStorageNamespace* WebContentsImpl::GetSessionStorageNamespace(
1728a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    SiteInstance* instance) {
1729a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  return controller_.GetSessionStorageNamespace(instance);
1730a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch}
1731a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
173290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WebContentsImpl::DidSendScreenRects(RenderWidgetHostImpl* rwh) {
173390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (browser_plugin_embedder_)
17347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    browser_plugin_embedder_->DidSendScreenRects();
173590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
173690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdatePreferredSize(const gfx::Size& pref_size) {
17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  preferred_size_ = pref_size;
17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->UpdatePreferredSize(this, pref_size);
17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ResizeDueToAutoResize(const gfx::Size& new_size) {
17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->ResizeDueToAutoResize(this, new_size);
17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContents* WebContentsImpl::OpenURL(const OpenURLParams& params) {
17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!delegate_)
17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebContents* new_contents = delegate_->OpenURLFromTab(this, params);
17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new_contents;
17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::Send(IPC::Message* message) {
17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetRenderViewHost()) {
17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete message;
17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetRenderViewHost()->Send(message);
17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::NavigateToPendingEntry(
17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NavigationController::ReloadType reload_type) {
17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NavigateToEntry(
17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *NavigationEntryImpl::FromNavigationEntry(controller_.GetPendingEntry()),
17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reload_type);
17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RenderViewForInterstitialPageCreated(
17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RenderViewHost* render_view_host) {
17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver, observers_,
17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    RenderViewForInterstitialPageCreated(render_view_host));
17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::AttachInterstitialPage(
17792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    InterstitialPageImpl* interstitial_page) {
17802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(interstitial_page);
17812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  render_manager_.set_interstitial_page(interstitial_page);
178268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
178368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Cancel any visible dialogs so that they don't interfere with the
178468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // interstitial.
178568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (dialog_manager_)
178668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    dialog_manager_->CancelActiveAndPendingDialogs(this);
178768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
17882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver, observers_,
17892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    DidAttachInterstitialPage());
17902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
17912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::DetachInterstitialPage() {
17932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (GetInterstitialPage())
17942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    render_manager_.remove_interstitial_page();
17952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver, observers_,
17962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    DidDetachInterstitialPage());
17972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
17982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::NavigateToEntry(
18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const NavigationEntryImpl& entry,
18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NavigationController::ReloadType reload_type) {
18027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  TRACE_EVENT0("browser", "WebContentsImpl::NavigateToEntry");
18037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The renderer will reject IPC messages with URLs longer than
18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // this limit, so don't attempt to navigate with a longer URL.
180658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (entry.GetURL().spec().size() > kMaxURLChars) {
180758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    LOG(WARNING) << "Refusing to load URL as it exceeds " << kMaxURLChars
180858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                 << " characters.";
18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
181058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderViewHostImpl* dest_render_view_host =
18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<RenderViewHostImpl*>(render_manager_.Navigate(entry));
18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!dest_render_view_host)
18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;  // Unable to create the desired render view host.
18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For security, we should never send non-Web-UI URLs to a Web UI renderer.
18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Double check that here.
18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int enabled_bindings = dest_render_view_host->GetEnabledBindings();
18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool data_urls_allowed = delegate_ && delegate_->CanLoadDataURLsInWebUI();
18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_allowed_in_web_ui_renderer =
18222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      WebUIControllerFactoryRegistry::GetInstance()->IsURLAcceptableForWebUI(
18232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          GetBrowserContext(), entry.GetURL(), data_urls_allowed);
18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if ((enabled_bindings & BINDINGS_POLICY_WEB_UI) &&
18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !is_allowed_in_web_ui_renderer) {
18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Log the URL to help us diagnose any future failures of this CHECK.
18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetContentClient()->SetActiveURL(entry.GetURL());
18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CHECK(0);
18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notify observers that we will navigate in this RV.
18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver,
18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    observers_,
18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    AboutToNavigateRenderView(dest_render_view_host));
18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used for page load time metrics.
18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  current_load_start_ = base::TimeTicks::Now();
18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate in the desired RenderViewHost.
18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ViewMsg_Navigate_Params navigate_params;
18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MakeNavigateParams(entry, controller_, delegate_, reload_type,
18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     &navigate_params);
18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dest_render_view_host->Navigate(navigate_params);
18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (entry.GetPageID() == -1) {
18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // HACK!!  This code suppresses javascript: URLs from being added to
18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // session history, which is what we want to do for javascript: URLs that
18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // do not generate content.  What we really need is a message from the
18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // renderer telling us that a new page was not created.  The same message
18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // could be used for mailto: URLs and the like.
18513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (entry.GetURL().SchemeIs(kJavaScriptScheme))
18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notify observers about navigation.
18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver,
18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    observers_,
18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    NavigateToPendingEntry(entry.GetURL(), reload_type));
18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->DidNavigateToPendingEntry(this);
18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetHistoryLengthAndPrune(
18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const SiteInstance* site_instance,
18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int history_length,
18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int32 minimum_page_id) {
18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SetHistoryLengthAndPrune doesn't work when there are pending cross-site
18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // navigations. Callers should ensure that this is the case.
18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (render_manager_.pending_render_view_host()) {
18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderViewHostImpl* rvh = GetRenderViewHostImpl();
18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!rvh) {
18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (site_instance && rvh->GetSiteInstance() != site_instance) {
18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new ViewMsg_SetHistoryLengthAndPrune(GetRoutingID(),
18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            history_length,
18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            minimum_page_id));
18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::FocusThroughTabTraversal(bool reverse) {
18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ShowingInterstitialPage()) {
18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    render_manager_.interstitial_page()->FocusThroughTabTraversal(reverse);
18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetRenderViewHostImpl()->SetInitialFocus(reverse);
18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::ShowingInterstitialPage() const {
18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return render_manager_.interstitial_page() != NULL;
19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)InterstitialPage* WebContentsImpl::GetInterstitialPage() const {
19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return render_manager_.interstitial_page();
19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::IsSavable() {
19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // WebKit creates Document object when MIME type is application/xhtml+xml,
19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // so we also support this MIME type.
19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return contents_mime_type_ == "text/html" ||
19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         contents_mime_type_ == "text/xml" ||
19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         contents_mime_type_ == "application/xhtml+xml" ||
19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         contents_mime_type_ == "text/plain" ||
19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         contents_mime_type_ == "text/css" ||
19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         net::IsSupportedJavascriptMimeType(contents_mime_type_.c_str());
19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnSavePage() {
19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If we can not save the page, try to download it.
19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!IsSavable()) {
19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RecordDownloadSource(INITIATED_BY_SAVE_PACKAGE_ON_NON_HTML);
1921ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    SaveFrame(GetURL(), Referrer());
19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Stop();
19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create the save package and possibly prompt the user for the name to save
19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the page as. The user prompt is an asynchronous operation that runs on
19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // another thread.
19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  save_package_ = new SavePackage(this);
19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  save_package_->GetSaveInfo();
19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Used in automated testing to bypass prompting the user for file names.
19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Instead, the names and paths are hard coded rather than running them through
19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// file name sanitation and extension / mime checking.
19372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool WebContentsImpl::SavePage(const base::FilePath& main_file,
19382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               const base::FilePath& dir_path,
19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               SavePageType save_type) {
19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Stop the page from navigating.
19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Stop();
19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  save_package_ = new SavePackage(this, save_type, main_file, dir_path);
19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return save_package_->Init(SavePackageDownloadCreatedCallback());
19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1947ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid WebContentsImpl::SaveFrame(const GURL& url,
1948ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                                const Referrer& referrer) {
1949ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (!GetURL().is_valid())
1950ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return;
1951ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  bool is_main_frame = (url == GetURL());
1952ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1953ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  DownloadManager* dlm =
1954ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      BrowserContext::GetDownloadManager(GetBrowserContext());
1955ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (!dlm)
1956ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return;
1957ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  int64 post_id = -1;
1958ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (is_main_frame) {
195968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    const NavigationEntry* entry = controller_.GetActiveEntry();
1960ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    if (entry)
1961ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      post_id = entry->GetPostID();
1962ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
1963ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  scoped_ptr<DownloadUrlParameters> params(
1964ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      DownloadUrlParameters::FromWebContents(this, url));
1965ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  params->set_referrer(referrer);
1966ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  params->set_post_id(post_id);
1967ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  params->set_prefer_cache(true);
1968ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (post_id >= 0)
1969ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    params->set_method("POST");
1970ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  params->set_prompt(true);
1971ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  dlm->DownloadUrl(params.Pass());
1972ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
1973ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::GenerateMHTML(
19752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& file,
1976424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    const base::Callback<void(int64)>& callback) {
1977424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  MHTMLGenerationManager::GetInstance()->SaveMHTML(this, file, callback);
19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::IsActiveEntry(int32 page_id) {
198168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  NavigationEntryImpl* active_entry =
198268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      NavigationEntryImpl::FromNavigationEntry(controller_.GetActiveEntry());
198368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return (active_entry != NULL &&
198468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          active_entry->site_instance() == GetSiteInstance() &&
198568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          active_entry->GetPageID() == page_id);
19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::string& WebContentsImpl::GetContentsMimeType() const {
19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return contents_mime_type_;
19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::WillNotifyDisconnection() const {
19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return notify_disconnection_;
19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetOverrideEncoding(const std::string& encoding) {
19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetEncoding(encoding);
19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new ViewMsg_SetPageEncoding(GetRoutingID(), encoding));
19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ResetOverrideEncoding() {
20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  encoding_.clear();
20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new ViewMsg_ResetPageEncodingToDefault(GetRoutingID()));
20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RendererPreferences* WebContentsImpl::GetMutableRendererPrefs() {
20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return &renderer_preferences_;
20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::Close() {
20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Close(GetRenderViewHost());
20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2014c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebContentsImpl::DragSourceEndedAt(int client_x, int client_y,
2015c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    int screen_x, int screen_y, WebKit::WebDragOperation operation) {
2016c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (browser_plugin_embedder_.get())
2017c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    browser_plugin_embedder_->DragSourceEndedAt(client_x, client_y,
2018c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        screen_x, screen_y, operation);
2019c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (GetRenderViewHost())
2020c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    GetRenderViewHostImpl()->DragSourceEndedAt(client_x, client_y,
2021c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        screen_x, screen_y, operation);
2022c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
2023c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2024c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebContentsImpl::DragSourceMovedTo(int client_x, int client_y,
2025c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                        int screen_x, int screen_y) {
2026c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (browser_plugin_embedder_.get())
2027c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    browser_plugin_embedder_->DragSourceMovedTo(client_x, client_y,
2028c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                screen_x, screen_y);
2029c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (GetRenderViewHost())
2030c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    GetRenderViewHostImpl()->DragSourceMovedTo(client_x, client_y,
2031c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                               screen_x, screen_y);
2032c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
2033c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SystemDragEnded() {
20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (GetRenderViewHost())
20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetRenderViewHostImpl()->DragSourceSystemDragEnded();
20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->DragEnded();
2039c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (browser_plugin_embedder_.get())
2040c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    browser_plugin_embedder_->SystemDragEnded();
20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UserGestureDone() {
20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnUserGesture();
20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetClosedByUserGesture(bool value) {
20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  closed_by_user_gesture_ = value;
20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::GetClosedByUserGesture() const {
20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return closed_by_user_gesture_;
20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)double WebContentsImpl::GetZoomLevel() const {
20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HostZoomMapImpl* zoom_map = static_cast<HostZoomMapImpl*>(
20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HostZoomMap::GetForBrowserContext(GetBrowserContext()));
20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!zoom_map)
20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  double zoom_level;
20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (temporary_zoom_settings_) {
20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    zoom_level = zoom_map->GetTemporaryZoomLevel(
20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GetRenderProcessHost()->GetID(), GetRenderViewHost()->GetRoutingID());
20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url;
206768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    NavigationEntry* active_entry = GetController().GetActiveEntry();
20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Since zoom map is updated using rewritten URL, use rewritten URL
20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // to get the zoom level.
207068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    url = active_entry ? active_entry->GetURL() : GURL::EmptyGURL();
20712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    zoom_level = zoom_map->GetZoomLevelForHostAndScheme(url.scheme(),
20722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        net::GetHostOrSpecFromURL(url));
20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return zoom_level;
20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsImpl::GetZoomPercent(bool* enable_increment,
20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    bool* enable_decrement) const {
20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *enable_decrement = *enable_increment = false;
20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Calculate the zoom percent from the factor. Round up to the nearest whole
20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // number.
20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int percent = static_cast<int>(
208358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch      ZoomLevelToZoomFactor(GetZoomLevel()) * 100 + 0.5);
20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *enable_decrement = percent > minimum_zoom_percent_;
20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *enable_increment = percent < maximum_zoom_percent_;
20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return percent;
20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ViewSource() {
20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!delegate_)
20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
209368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  NavigationEntry* active_entry = GetController().GetActiveEntry();
209468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (!active_entry)
20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
209768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  delegate_->ViewSourceForTab(this, active_entry->GetURL());
20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ViewFrameSource(const GURL& url,
210190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                      const PageState& page_state) {
21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!delegate_)
21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
210590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  delegate_->ViewSourceForFrame(this, url, page_state);
21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsImpl::GetMinimumZoomPercent() const {
21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return minimum_zoom_percent_;
21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsImpl::GetMaximumZoomPercent() const {
21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return maximum_zoom_percent_;
21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Size WebContentsImpl::GetPreferredSize() const {
21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return preferred_size_;
21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::GotResponseToLockMouseRequest(bool allowed) {
21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetRenderViewHost() ?
21225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetRenderViewHostImpl()->GotResponseToLockMouseRequest(allowed) : false;
21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::HasOpener() const {
21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return opener_ != NULL;
21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
212990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WebContentsImpl::DidChooseColorInColorChooser(SkColor color) {
21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new ViewMsg_DidChooseColorResponse(
213190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      GetRoutingID(), color_chooser_identifier_, color));
21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
213490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WebContentsImpl::DidEndColorChooser() {
213590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  Send(new ViewMsg_DidEndColorChooser(GetRoutingID(),
213690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                      color_chooser_identifier_));
213790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  color_chooser_.reset();
213890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  color_chooser_identifier_ = 0;
21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)int WebContentsImpl::DownloadImage(const GURL& url,
2142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                   bool is_favicon,
2143d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                   uint32_t max_bitmap_size,
2144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                   const ImageDownloadCallback& callback) {
21452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderViewHost* host = GetRenderViewHost();
2146d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  int id = StartDownload(host, url, is_favicon, max_bitmap_size);
2147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  image_download_map_[id] = callback;
21482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return id;
21492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
21502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::FocusLocationBarByDefault() {
215268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  NavigationEntry* entry = controller_.GetActiveEntry();
215390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (entry && entry->GetURL() == GURL(kAboutBlankURL))
21542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return true;
21552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return delegate_ && delegate_->ShouldFocusLocationBarByDefault(this);
21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetFocusToLocationBar(bool select_all) {
21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->SetFocusToLocationBar(select_all);
21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::DidStartProvisionalLoadForFrame(
21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RenderViewHost* render_view_host,
21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 frame_id,
21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 parent_frame_id,
21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool is_main_frame,
21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& url) {
21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_error_page = (url.spec() == kUnreachableWebDataURL);
217090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool is_iframe_srcdoc = (url.spec() == kAboutSrcDocURL);
21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL validated_url(url);
21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderProcessHost* render_process_host =
21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      render_view_host->GetProcess();
21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderViewHost::FilterURL(render_process_host, false, &validated_url);
21752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2176ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  if (is_main_frame) {
21772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DidChangeLoadProgress(0);
21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2179ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    // If there is no browser-initiated pending entry for this navigation and it
2180ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    // is not for the error URL, create a pending entry using the current
2181ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    // SiteInstance, and ensure the address bar updates accordingly.  We don't
2182ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    // know the referrer or extra headers at this point, but the referrer will
2183ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    // be set properly upon commit.
2184ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    NavigationEntry* pending_entry = controller_.GetPendingEntry();
2185ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    bool has_browser_initiated_pending_entry = pending_entry &&
2186ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        !NavigationEntryImpl::FromNavigationEntry(pending_entry)->
2187ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch            is_renderer_initiated();
2188ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    if (!has_browser_initiated_pending_entry && !is_error_page) {
2189ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      NavigationEntryImpl* entry = NavigationEntryImpl::FromNavigationEntry(
2190ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          controller_.CreateNavigationEntry(validated_url,
2191ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                            content::Referrer(),
2192ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                            content::PAGE_TRANSITION_LINK,
2193ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                            true /* is_renderer_initiated */,
2194ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                            std::string(),
2195ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                            GetBrowserContext()));
2196ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      entry->set_site_instance(
2197ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          static_cast<SiteInstanceImpl*>(GetSiteInstance()));
2198ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      controller_.SetPendingEntry(entry);
2199ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      NotifyNavigationStateChanged(content::INVALIDATE_TYPE_URL);
2200ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    }
2201868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
2202868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notify observers about the start of the provisional load.
22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver, observers_,
22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    DidStartProvisionalLoadForFrame(frame_id, parent_frame_id,
22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    is_main_frame, validated_url, is_error_page,
22072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    is_iframe_srcdoc, render_view_host));
22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_main_frame) {
22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Notify observers about the provisional change in the main frame URL.
22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FOR_EACH_OBSERVER(WebContentsObserver, observers_,
22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      ProvisionalChangeToMainFrameUrl(validated_url,
22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      render_view_host));
22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::DidRedirectProvisionalLoad(
22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RenderViewHost* render_view_host,
22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int32 page_id,
22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& source_url,
22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& target_url) {
22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(creis): Remove this method and have the pre-rendering code listen to
222358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // WebContentsObserver::DidGetRedirectForResourceRequest instead.
222458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // See http://crbug.com/78512.
22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL validated_source_url(source_url);
22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL validated_target_url(target_url);
22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderProcessHost* render_process_host =
22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      render_view_host->GetProcess();
22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderViewHost::FilterURL(render_process_host, false, &validated_source_url);
22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderViewHost::FilterURL(render_process_host, false, &validated_target_url);
22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigationEntry* entry;
22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (page_id == -1) {
22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry = controller_.GetPendingEntry();
22345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
22355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry = controller_.GetEntryWithPageID(render_view_host->GetSiteInstance(),
22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           page_id);
22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!entry || entry->GetURL() != validated_source_url)
22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notify observers about the provisional change in the main frame URL.
22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver, observers_,
22435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    ProvisionalChangeToMainFrameUrl(validated_target_url,
22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    render_view_host));
22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::DidFailProvisionalLoadWithError(
22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RenderViewHost* render_view_host,
22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ViewHostMsg_DidFailProvisionalLoadWithError_Params& params) {
22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VLOG(1) << "Failed Provisional Load: " << params.url.possibly_invalid_spec()
22515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          << ", error_code: " << params.error_code
22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          << ", error_description: " << params.error_description
22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          << ", is_main_frame: " << params.is_main_frame
22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          << ", showing_repost_interstitial: " <<
22555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            params.showing_repost_interstitial
22565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          << ", frame_id: " << params.frame_id;
22575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL validated_url(params.url);
22585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderProcessHost* render_process_host =
22595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      render_view_host->GetProcess();
22605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderViewHost::FilterURL(render_process_host, false, &validated_url);
22615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (net::ERR_ABORTED == params.error_code) {
22635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // EVIL HACK ALERT! Ignore failed loads when we're showing interstitials.
22645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // This means that the interstitial won't be torn down properly, which is
22655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // bad. But if we have an interstitial, go back to another tab type, and
22665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // then load the same interstitial again, we could end up getting the first
22675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // interstitial's "failed" message (as a result of the cancel) when we're on
22685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // the second one.
22695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //
22705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We can't tell this apart, so we think we're tearing down the current page
22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // which will cause a crash later one. There is also some code in
22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // RenderViewHostManager::RendererAbortedProvisionalLoad that is commented
22735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // out because of this problem.
22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //
22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // http://code.google.com/p/chromium/issues/detail?id=2855
22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Because this will not tear down the interstitial properly, if "back" is
22775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // back to another tab type, the interstitial will still be somewhat alive
22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // in the previous tab type. If you navigate somewhere that activates the
22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // tab with the interstitial again, you'll see a flash before the new load
22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // commits of the interstitial page.
22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ShowingInterstitialPage()) {
22825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LOG(WARNING) << "Discarding message during interstitial.";
22835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
22845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
22855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    render_manager_.RendererAbortedProvisionalLoad(render_view_host);
22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
22885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
228958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Do not usually clear the pending entry if one exists, so that the user's
229058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // typed URL is not lost when a navigation fails or is aborted.  However, in
229158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // cases that we don't show the pending entry (e.g., renderer-initiated
229258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // navigations in an existing tab), we don't keep it around.  That prevents
229358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // spoofs on in-page navigations that don't go through
229458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // DidStartProvisionalLoadForFrame.
229558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // In general, we allow the view to clear the pending entry and typed URL if
229658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // the user requests (e.g., hitting Escape with focus in the address bar).
229758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Note: don't touch the transient entry, since an interstitial may exist.
229858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (controller_.GetPendingEntry() != controller_.GetVisibleEntry())
229958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    controller_.DiscardPendingEntry();
230058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
23015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver,
23025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    observers_,
23035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    DidFailProvisionalLoad(params.frame_id,
23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           params.is_main_frame,
23055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           validated_url,
23065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           params.error_code,
23075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           params.error_description,
23085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           render_view_host));
23095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnDidLoadResourceFromMemoryCache(
23125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& url,
23135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& security_info,
23145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& http_method,
23155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& mime_type,
23165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ResourceType::Type resource_type) {
23175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::StatsCounter cache("WebKit.CacheHit");
23185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cache.Increment();
23195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Send out a notification that we loaded a resource from our memory cache.
23215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int cert_id = 0;
23225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::CertStatus cert_status = 0;
23235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int security_bits = -1;
23245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int connection_status = 0;
23255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeserializeSecurityInfo(security_info, &cert_id, &cert_status,
23265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          &security_bits, &connection_status);
23275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadFromMemoryCacheDetails details(
23285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      url, GetRenderProcessHost()->GetID(), cert_id, cert_status, http_method,
23295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      mime_type, resource_type);
23305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
233158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  controller_.ssl_manager()->DidLoadFromMemoryCache(details);
233258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
233358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver, observers_,
233458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                    DidLoadResourceFromMemoryCache(details));
233558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
233658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // TODO(avi): Remove. http://crbug.com/170921
23375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotificationService::current()->Notify(
23385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTIFICATION_LOAD_FROM_MEMORY_CACHE,
23395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Source<NavigationController>(&controller_),
23405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Details<LoadFromMemoryCacheDetails>(&details));
234158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
234258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (url.is_valid() && url.SchemeIsHTTPOrHTTPS()) {
234358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    scoped_refptr<net::URLRequestContextGetter> request_context(
234458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        resource_type == ResourceType::MEDIA ?
234558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            GetBrowserContext()->GetMediaRequestContextForRenderProcess(
234658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                GetRenderProcessHost()->GetID()) :
234758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            GetBrowserContext()->GetRequestContextForRenderProcess(
234858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                GetRenderProcessHost()->GetID()));
234958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    BrowserThread::PostTask(
235058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        BrowserThread::IO,
235158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        FROM_HERE,
235258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        base::Bind(&NotifyCacheOnIO, request_context, url, http_method));
235358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
23545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnDidDisplayInsecureContent() {
23575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RecordAction(UserMetricsAction("SSL.DisplayedInsecureContent"));
23585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  displayed_insecure_content_ = true;
23592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SSLManager::NotifySSLInternalStateChanged(
23602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetController().GetBrowserContext());
23615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnDidRunInsecureContent(
23645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& security_origin, const GURL& target_url) {
23655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LOG(INFO) << security_origin << " ran insecure content from "
23665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            << target_url.possibly_invalid_spec();
23675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RecordAction(UserMetricsAction("SSL.RanInsecureContent"));
23685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (EndsWith(security_origin, kDotGoogleDotCom, false))
23695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RecordAction(UserMetricsAction("SSL.RanInsecureContentGoogle"));
23705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  controller_.ssl_manager()->DidRunInsecureContent(security_origin);
23715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  displayed_insecure_content_ = true;
23722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SSLManager::NotifySSLInternalStateChanged(
23732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetController().GetBrowserContext());
23745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnDocumentLoadedInFrame(int64 frame_id) {
23775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver, observers_,
23785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    DocumentLoadedInFrame(frame_id, message_source_));
23795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnDidFinishLoad(
23825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 frame_id,
23832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const GURL& url,
23845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool is_main_frame) {
23852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL validated_url(url);
23862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderProcessHost* render_process_host = message_source_->GetProcess();
23872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderViewHost::FilterURL(render_process_host, false, &validated_url);
23885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver, observers_,
23895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    DidFinishLoad(frame_id, validated_url, is_main_frame,
23905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  message_source_));
23915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnDidFailLoadWithError(
23945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 frame_id,
23952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const GURL& url,
23965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool is_main_frame,
23975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int error_code,
23985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const string16& error_description) {
23992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL validated_url(url);
24002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderProcessHost* render_process_host = message_source_->GetProcess();
24012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderViewHost::FilterURL(render_process_host, false, &validated_url);
24025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver, observers_,
24035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    DidFailLoad(frame_id, validated_url, is_main_frame,
24045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                error_code, error_description,
24055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                message_source_));
24065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
24075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnGoToEntryAtOffset(int offset) {
24095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!delegate_ || delegate_->OnGoToEntryOffset(offset)) {
24105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NavigationEntryImpl* entry = NavigationEntryImpl::FromNavigationEntry(
24115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        controller_.GetEntryAtOffset(offset));
24125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!entry)
24135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
24145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Note that we don't call NavigationController::GotToOffset() as we don't
24155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // want to create a pending navigation entry (it might end up lingering
24165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // http://crbug.com/51680).
24175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry->SetTransitionType(
24185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        PageTransitionFromInt(
24195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            entry->GetTransitionType() |
24205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            PAGE_TRANSITION_FORWARD_BACK));
24215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NavigateToEntry(*entry, NavigationControllerImpl::NO_RELOAD);
24225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // If the entry is being restored and doesn't have a SiteInstance yet, fill
24245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // it in now that we know. This allows us to find the entry when it commits.
24255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!entry->site_instance() &&
24265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        entry->restore_type() != NavigationEntryImpl::RESTORE_NONE) {
24275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      entry->set_site_instance(
24285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          static_cast<SiteInstanceImpl*>(GetPendingSiteInstance()));
24295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
24305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
24315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
24325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnUpdateZoomLimits(int minimum_percent,
24345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         int maximum_percent,
24355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         bool remember) {
24365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  minimum_zoom_percent_ = minimum_percent;
24375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  maximum_zoom_percent_ = maximum_percent;
24385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  temporary_zoom_settings_ = !remember;
24395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
24405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnEnumerateDirectory(int request_id,
24422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           const base::FilePath& path) {
24435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!delegate_)
24445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
24455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ChildProcessSecurityPolicyImpl* policy =
24475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ChildProcessSecurityPolicyImpl::GetInstance();
24485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (policy->CanReadDirectory(GetRenderProcessHost()->GetID(), path))
24495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->EnumerateDirectory(this, request_id, path);
24505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
24515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnJSOutOfMemory() {
24535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
24545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->JSOutOfMemory(this);
24555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
24565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnRegisterProtocolHandler(const std::string& protocol,
24585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                const GURL& url,
24595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                const string16& title,
24605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                bool user_gesture) {
24615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!delegate_)
24625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
24635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ChildProcessSecurityPolicyImpl* policy =
24655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ChildProcessSecurityPolicyImpl::GetInstance();
2466868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (policy->IsPseudoScheme(protocol))
24675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2468868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
24695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_->RegisterProtocolHandler(this, protocol, url, title, user_gesture);
24705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
24715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnFindReply(int request_id,
24735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  int number_of_matches,
24745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  const gfx::Rect& selection_rect,
24755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  int active_match_ordinal,
24765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  bool final_update) {
24775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_) {
24785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->FindReply(this, request_id, number_of_matches, selection_rect,
24795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         active_match_ordinal, final_update);
24805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
24815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
24825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
248390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WebContentsImpl::OnDidProgrammaticallyScroll(
248490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    const gfx::Vector2d& scroll_point) {
248590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (delegate_)
248690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    delegate_->DidProgrammaticallyScroll(this, scroll_point);
248790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
248890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
24895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID)
24905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnFindMatchRectsReply(
24915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int version,
24925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::vector<gfx::RectF>& rects,
24935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::RectF& active_rect) {
24945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
24955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->FindMatchRectsReply(this, version, rects, active_rect);
24965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
24972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
24982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::OnOpenDateTimeDialog(
24992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ViewHostMsg_DateTimeDialogValue_Params& value) {
25003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  date_time_chooser_->ShowDialog(ContentViewCore::FromWebContents(this),
25013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                 GetRenderViewHost(),
25023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                 value.dialog_type,
25033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                 value.year,
25043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                 value.month,
25053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                 value.day,
25063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                 value.hour,
25073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                 value.minute,
25083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                 value.second,
25093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                 value.milli,
25103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                 value.week,
25113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                 value.minimum,
25123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                 value.maximum,
25133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                 value.step);
25142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
25152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
25165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
25175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::OnCrashedPlugin(const base::FilePath& plugin_path,
25192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      base::ProcessId plugin_pid) {
25205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver, observers_,
25212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    PluginCrashed(plugin_path, plugin_pid));
25225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnAppCacheAccessed(const GURL& manifest_url,
25255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         bool blocked_by_policy) {
25265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notify observers about navigation.
25275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver, observers_,
25285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    AppCacheAccessed(manifest_url, blocked_by_policy));
25295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnOpenColorChooser(int color_chooser_id,
25325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         SkColor color) {
253390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ColorChooser* new_color_chooser = delegate_->OpenColorChooser(this, color);
253490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (color_chooser_ == new_color_chooser)
253590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return;
253690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  color_chooser_.reset(new_color_chooser);
253790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  color_chooser_identifier_ = color_chooser_id;
25385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnEndColorChooser(int color_chooser_id) {
25415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (color_chooser_ &&
254290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      color_chooser_id == color_chooser_identifier_)
25435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    color_chooser_->End();
25445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnSetSelectedColorInColorChooser(int color_chooser_id,
25475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                       SkColor color) {
25485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (color_chooser_ &&
254990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      color_chooser_id == color_chooser_identifier_)
25505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    color_chooser_->SetSelectedColor(color);
25515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnPepperPluginHung(int plugin_child_id,
25542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                         const base::FilePath& path,
25555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         bool is_hung) {
25565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UMA_HISTOGRAM_COUNTS("Pepper.PluginHung", 1);
25575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver, observers_,
25595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    PluginHungStatusChanged(plugin_child_id, path, is_hung));
25605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This exists for render views that don't have a WebUI, but do have WebUI
25635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// bindings enabled.
25645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnWebUISend(const GURL& source_url,
25655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  const std::string& name,
25665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  const base::ListValue& args) {
25675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
25685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->WebUISend(this, source_url, name, args);
25695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnRequestPpapiBrokerPermission(
25723240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    int routing_id,
25735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& url,
25742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& plugin_path) {
25752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!delegate_) {
25763240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    OnPpapiBrokerPermissionResult(routing_id, false);
25772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
25785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
25795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!delegate_->RequestPpapiBrokerPermission(
25812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this, url, plugin_path,
25822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&WebContentsImpl::OnPpapiBrokerPermissionResult,
25833240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch                 base::Unretained(this), routing_id))) {
25842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    NOTIMPLEMENTED();
25853240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    OnPpapiBrokerPermissionResult(routing_id, false);
25862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
25875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25893240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochvoid WebContentsImpl::OnPpapiBrokerPermissionResult(int routing_id,
25905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    bool result) {
25913240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  Send(new ViewMsg_PpapiBrokerPermissionResult(routing_id, result));
25925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::OnBrowserPluginMessage(const IPC::Message& message) {
25955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This creates a BrowserPluginEmbedder, which handles all the BrowserPlugin
25962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // specific messages for this WebContents. This means that any message from
25972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // a BrowserPlugin prior to this will be ignored.
25985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For more info, see comment above classes BrowserPluginEmbedder and
25995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // BrowserPluginGuest.
26005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(!browser_plugin_embedder_.get());
26012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  browser_plugin_embedder_.reset(BrowserPluginEmbedder::Create(this));
26022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  browser_plugin_embedder_->OnMessageReceived(message);
26032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
26042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2605c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebContentsImpl::OnDidDownloadImage(
26062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int id,
260790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    int http_status_code,
26082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const GURL& image_url,
2609d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    const std::vector<SkBitmap>& bitmaps,
2610d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    const std::vector<gfx::Size>& original_bitmap_sizes) {
2611c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ImageDownloadMap::iterator iter = image_download_map_.find(id);
2612c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (iter == image_download_map_.end()) {
26132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Currently WebContents notifies us of ANY downloads so that it is
26142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // possible to get here.
26152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
26162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
26172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!iter->second.is_null()) {
2618d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    iter->second.Run(
2619d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        id, http_status_code, image_url, bitmaps, original_bitmap_sizes);
26202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2621c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  image_download_map_.erase(id);
26222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
26232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
26242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::OnUpdateFaviconURL(
26252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int32 page_id,
26262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::vector<FaviconURL>& candidates) {
26272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver, observers_,
26282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    DidUpdateFaviconURL(page_id, candidates));
26292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
26302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2631b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)FrameTreeNode* WebContentsImpl::FindFrameTreeNodeByID(int64 frame_id) {
2632868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // TODO(nasko): Remove this check once we move to creating the root node
2633868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // through RenderFrameHost creation.
2634868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!frame_tree_root_.get())
2635868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return NULL;
2636868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2637b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  FrameTreeNode* node = NULL;
2638b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  std::queue<FrameTreeNode*> queue;
2639b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  queue.push(frame_tree_root_.get());
2640b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
2641b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  while (!queue.empty()) {
2642b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    node = queue.front();
2643b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    queue.pop();
2644b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    if (node->frame_id() == frame_id)
2645b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      return node;
2646b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
2647b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    for (size_t i = 0; i < node->child_count(); ++i)
2648b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      queue.push(node->child_at(i));
2649b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
2650b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
2651b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  return NULL;
2652b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
2653b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
2654b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)void WebContentsImpl::OnFrameAttached(
2655b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    int64 parent_frame_id,
2656b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    int64 frame_id,
2657b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    const std::string& frame_name) {
2658b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  FrameTreeNode* parent = FindFrameTreeNodeByID(parent_frame_id);
2659b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (!parent)
2660b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    return;
2661b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
2662b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  FrameTreeNode* node = new FrameTreeNode(frame_id, frame_name);
2663b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  parent->AddChild(node);
2664b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
2665b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
2666b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)void WebContentsImpl::OnFrameDetached(int64 parent_frame_id, int64 frame_id) {
26672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver, observers_,
26682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    FrameDetached(message_source_, frame_id));
2669b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
2670b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  FrameTreeNode* parent = FindFrameTreeNodeByID(parent_frame_id);
2671b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (!parent)
2672b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    return;
2673b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
2674b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  parent->RemoveChild(frame_id);
26752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
26762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2677ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid WebContentsImpl::OnMediaNotification(int64 player_cookie,
2678ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                                          bool has_video,
2679ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                                          bool has_audio,
2680ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                                          bool is_playing) {
2681ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Chrome OS does its own detection of audio and video.
2682ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#if !defined(OS_CHROMEOS)
2683ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (is_playing) {
2684ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    scoped_ptr<PowerSaveBlocker> blocker;
2685ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    if (has_video) {
2686ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      blocker = PowerSaveBlocker::Create(
2687ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch          PowerSaveBlocker::kPowerSaveBlockPreventDisplaySleep,
2688ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch          "Playing video");
2689ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#if defined(OS_ANDROID)
2690ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      static_cast<PowerSaveBlockerImpl*>(blocker.get())->
2691ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          InitDisplaySleepBlocker(GetView()->GetNativeView());
2692ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#endif
2693ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    } else if (has_audio) {
2694ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      blocker = PowerSaveBlocker::Create(
2695ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch          PowerSaveBlocker::kPowerSaveBlockPreventAppSuspension,
2696ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch          "Playing audio");
2697ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    }
2698ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
2699ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    if (blocker)
2700ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      power_save_blockers_[message_source_][player_cookie] = blocker.release();
2701ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  } else {
2702ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    delete power_save_blockers_[message_source_][player_cookie];
2703ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    power_save_blockers_[message_source_].erase(player_cookie);
2704ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
2705ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#endif  // !defined(OS_CHROMEOS)
2706ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
2707ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
2708ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
27092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::DidChangeVisibleSSLState() {
27102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver, observers_,
27112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    DidChangeVisibleSSLState());
27122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
27132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
27142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::NotifyBeforeFormRepostWarningShow() {
27152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver, observers_,
27162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    BeforeFormRepostWarningShow());
27175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
27185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Notifies the RenderWidgetHost instance about the fact that the page is
27205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// loading, or done loading and calls the base implementation.
27215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetIsLoading(bool is_loading,
27225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   LoadNotificationDetails* details) {
27235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_loading == is_loading_)
27245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
27255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!is_loading) {
27275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    load_state_ = net::LoadStateWithParam(net::LOAD_STATE_IDLE, string16());
27285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    load_state_host_.clear();
27295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    upload_size_ = 0;
27305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    upload_position_ = 0;
27315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
27325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  render_manager_.SetIsLoading(is_loading);
27345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_loading_ = is_loading;
27365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  waiting_for_response_ = is_loading;
27375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
27395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->LoadingStateChanged(this);
27405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotifyNavigationStateChanged(INVALIDATE_TYPE_LOAD);
27415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (is_loading)
27432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TRACE_EVENT_ASYNC_BEGIN0("browser", "WebContentsImpl Loading", this);
27442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  else
27452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TRACE_EVENT_ASYNC_END0("browser", "WebContentsImpl Loading", this);
27465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int type = is_loading ? NOTIFICATION_LOAD_START : NOTIFICATION_LOAD_STOP;
27475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotificationDetails det = NotificationService::NoDetails();
27485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (details)
27495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      det = Details<LoadNotificationDetails>(details);
27505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotificationService::current()->Notify(
27515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      type, Source<NavigationController>(&controller_), det);
27525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
27535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::DidNavigateMainFramePostCommit(
27555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const LoadCommittedDetails& details,
27565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ViewHostMsg_FrameNavigate_Params& params) {
27575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (details.is_navigation_to_different_page()) {
27585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Clear the status bubble. This is a workaround for a bug where WebKit
27595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // doesn't let us know that the cursor left an element during a
27605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // transition (this is also why the mouse cursor remains as a hand after
27615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // clicking on a link); see bugs 1184641 and 980803. We don't want to
27625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // clear the bubble when a user navigates to a named anchor in the same
27635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // page.
27645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UpdateTargetURL(details.entry->GetPageID(), GURL());
27655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
27665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!details.is_in_page) {
27685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Once the main frame is navigated, we're no longer considered to have
27695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // displayed insecure content.
27705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    displayed_insecure_content_ = false;
2771a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    SSLManager::NotifySSLInternalStateChanged(
2772a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        GetController().GetBrowserContext());
27735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
27745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notify observers about navigation.
27765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver, observers_,
27775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    DidNavigateMainFrame(details, params));
27785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
27795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::DidNavigateAnyFramePostCommit(
27815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RenderViewHost* render_view_host,
27825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const LoadCommittedDetails& details,
27835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ViewHostMsg_FrameNavigate_Params& params) {
2784a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // If we navigate off the page, close all JavaScript dialogs.
2785a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (dialog_manager_ && !details.is_in_page)
2786a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    dialog_manager_->CancelActiveAndPendingDialogs(this);
27875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notify observers about navigation.
27895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver, observers_,
27905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    DidNavigateAnyFrame(details, params));
27915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
27925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2793eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool WebContentsImpl::ShouldAssignSiteForURL(const GURL& url) {
27947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // about:blank should not "use up" a new SiteInstance.  The SiteInstance can
27957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // still be used for a normal web site.
27967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (url == GURL(kAboutBlankURL))
27977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return false;
27987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
27997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // The embedder will then have the opportunity to determine if the URL
28007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // should "use up" the SiteInstance.
28017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return GetContentClient()->browser()->ShouldAssignSiteForURL(url);
2802eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
2803eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
28045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdateMaxPageIDIfNecessary(RenderViewHost* rvh) {
28055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If we are creating a RVH for a restored controller, then we need to make
28065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // sure the RenderView starts with a next_page_id_ larger than the number
28075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // of restored entries.  This must be called before the RenderView starts
28085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // navigating (to avoid a race between the browser updating max_page_id and
28095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the renderer updating next_page_id_).  Because of this, we only call this
28105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // from CreateRenderView and allow that to notify the RenderView for us.
28115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int max_restored_page_id = controller_.GetMaxRestoredPageID();
28125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (max_restored_page_id >
28135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetMaxPageIDForSiteInstance(rvh->GetSiteInstance()))
28145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UpdateMaxPageIDForSiteInstance(rvh->GetSiteInstance(),
28155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   max_restored_page_id);
28165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
28175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::UpdateTitleForEntry(NavigationEntryImpl* entry,
28195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          const string16& title) {
28205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For file URLs without a title, use the pathname instead. In the case of a
28215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // synthesized title, we don't want the update to count toward the "one set
28225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // per page of the title to history."
28235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 final_title;
28245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool explicit_set;
28255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (entry && entry->GetURL().SchemeIsFile() && title.empty()) {
28265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    final_title = UTF8ToUTF16(entry->GetURL().ExtractFileName());
28275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    explicit_set = false;  // Don't count synthetic titles toward the set limit.
28285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
28295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TrimWhitespace(title, TRIM_ALL, &final_title);
28305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    explicit_set = true;
28315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
28325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If a page is created via window.open and never navigated,
28345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // there will be no navigation entry. In this situation,
28355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |page_title_when_no_navigation_entry_| will be used for page title.
28365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (entry) {
28375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (final_title == entry->GetTitle())
28385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;  // Nothing changed, don't bother.
28395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry->SetTitle(final_title);
28415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
28425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (page_title_when_no_navigation_entry_ == final_title)
28435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;  // Nothing changed, don't bother.
28445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    page_title_when_no_navigation_entry_ = final_title;
28465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
28475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Lastly, set the title for the view.
28495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  view_->SetPageTitle(final_title);
28505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::pair<NavigationEntry*, bool> details =
28525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::make_pair(entry, explicit_set);
28535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotificationService::current()->Notify(
28555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTIFICATION_WEB_CONTENTS_TITLE_UPDATED,
28565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Source<WebContents>(this),
28575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Details<std::pair<NavigationEntry*, bool> >(&details));
28585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
28605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
28615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::NotifySwapped(RenderViewHost* old_render_view_host) {
28635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // After sending out a swap notification, we need to send a disconnect
28645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // notification so that clients that pick up a pointer to |this| can NULL the
28655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // pointer.  See Bug 1230284.
28665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  notify_disconnection_ = true;
286758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver, observers_,
286858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                    RenderViewHostSwapped(old_render_view_host));
286958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
287058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // TODO(avi): Remove. http://crbug.com/170921
28715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotificationService::current()->Notify(
28725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTIFICATION_WEB_CONTENTS_SWAPPED,
28735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Source<WebContents>(this),
28742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Details<RenderViewHost>(old_render_view_host));
28755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ensure that the associated embedder gets cleared after a RenderViewHost
28775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // gets swapped, so we don't reuse the same embedder next time a
28785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // RenderViewHost is attached to this WebContents.
28795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RemoveBrowserPluginEmbedder();
28805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
28815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
288258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// TODO(avi): Remove this entire function because this notification is already
288358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// covered by two observer functions. http://crbug.com/170921
28845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::NotifyDisconnected() {
28855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!notify_disconnection_)
28865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
28875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  notify_disconnection_ = false;
28895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotificationService::current()->Notify(
28905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTIFICATION_WEB_CONTENTS_DISCONNECTED,
28915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Source<WebContents>(this),
28925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NotificationService::NoDetails());
28935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
28945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2895868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void WebContentsImpl::NotifyNavigationEntryCommitted(
2896868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const LoadCommittedDetails& load_details) {
2897868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FOR_EACH_OBSERVER(
2898868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      WebContentsObserver, observers_, NavigationEntryCommitted(load_details));
2899868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
2900868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
29015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderViewHostDelegateView* WebContentsImpl::GetDelegateView() {
29025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return render_view_host_delegate_view_;
29035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
29045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderViewHostDelegate::RendererManagement*
29065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsImpl::GetRendererManagementDelegate() {
29075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return &render_manager_;
29085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
29095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RendererPreferences WebContentsImpl::GetRendererPrefs(
29115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserContext* browser_context) const {
29125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return renderer_preferences_;
29135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
29145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContents* WebContentsImpl::GetAsWebContents() {
29165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return this;
29175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
29185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Rect WebContentsImpl::GetRootWindowResizerRect() const {
29205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
29215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return delegate_->GetRootWindowResizerRect();
29225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return gfx::Rect();
29235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
29245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RemoveBrowserPluginEmbedder() {
2926c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (browser_plugin_embedder_)
29275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    browser_plugin_embedder_.reset();
29285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
29295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RenderViewCreated(RenderViewHost* render_view_host) {
29315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Don't send notifications if we are just creating a swapped-out RVH for
29325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the opener chain.  These won't be used for view-source or WebUI, so it's
29335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ok to return early.
29345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (static_cast<RenderViewHostImpl*>(render_view_host)->is_swapped_out())
29355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
29365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (delegate_)
29382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    view_->SetOverscrollControllerEnabled(delegate_->CanOverscrollContent());
29392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
29405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotificationService::current()->Notify(
29415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTIFICATION_WEB_CONTENTS_RENDER_VIEW_HOST_CREATED,
29425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Source<WebContents>(this),
29435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Details<RenderViewHost>(render_view_host));
29445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // When we're creating views, we're still doing initial setup, so we always
29465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // use the pending Web UI rather than any possibly existing committed one.
29475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (render_manager_.pending_web_ui())
29485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    render_manager_.pending_web_ui()->RenderViewCreated(render_view_host);
29495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  NavigationEntry* entry = controller_.GetActiveEntry();
2951424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  if (entry && entry->IsViewSourceMode()) {
29525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Put the renderer in view source mode.
29535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    render_view_host->Send(
29545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new ViewMsg_EnableViewSourceMode(render_view_host->GetRoutingID()));
29555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
29565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  view_->RenderViewCreated(render_view_host);
29585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FOR_EACH_OBSERVER(
29605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WebContentsObserver, observers_, RenderViewCreated(render_view_host));
29615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
29625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RenderViewReady(RenderViewHost* rvh) {
29645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (rvh != GetRenderViewHost()) {
29655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Don't notify the world, since this came from a renderer in the
29665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // background.
29675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
29685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
29695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
297058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  notify_disconnection_ = true;
297158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // TODO(avi): Remove. http://crbug.com/170921
297258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  NotificationService::current()->Notify(
297358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      NOTIFICATION_WEB_CONTENTS_CONNECTED,
297458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      Source<WebContents>(this),
297558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      NotificationService::NoDetails());
297658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
29775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool was_crashed = IsCrashed();
29785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetIsCrashed(base::TERMINATION_STATUS_STILL_RUNNING, 0);
29795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Restore the focus to the tab (otherwise the focus will be on the top
29815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // window).
29825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (was_crashed && !FocusLocationBarByDefault() &&
29835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (!delegate_ || delegate_->ShouldFocusPageAfterCrash())) {
29842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    view_->Focus();
29855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
29865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver, observers_, RenderViewReady());
29885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
29895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2990c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebContentsImpl::RenderViewTerminated(RenderViewHost* rvh,
2991c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           base::TerminationStatus status,
2992c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           int error_code) {
29935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (rvh != GetRenderViewHost()) {
29945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The pending page's RenderViewHost is gone.
29955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
29965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
29975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2998ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  ClearPowerSaveBlockers(rvh);
29995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetIsLoading(false, NULL);
30005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotifyDisconnected();
30015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetIsCrashed(status, error_code);
30025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetView()->OnTabCrashed(GetCrashedStatus(), crashed_error_code_);
30035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver,
30055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    observers_,
30067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                    RenderProcessGone(GetCrashedStatus()));
30075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
30085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RenderViewDeleted(RenderViewHost* rvh) {
3010ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  ClearPowerSaveBlockers(rvh);
30115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  render_manager_.RenderViewDeleted(rvh);
30125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver, observers_, RenderViewDeleted(rvh));
30135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
30145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
301558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void WebContentsImpl::DidGetResourceResponseStart(
301658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const ResourceRequestDetails& details) {
301758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  controller_.ssl_manager()->DidStartResourceResponse(details);
301858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
301958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver, observers_,
302058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                    DidGetResourceResponseStart(details));
302158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
302258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // TODO(avi): Remove. http://crbug.com/170921
302358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  NotificationService::current()->Notify(
302458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      NOTIFICATION_RESOURCE_RESPONSE_STARTED,
302558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      Source<WebContents>(this),
302658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      Details<const ResourceRequestDetails>(&details));
302758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
302858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
302958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void WebContentsImpl::DidGetRedirectForResourceRequest(
303058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const ResourceRedirectDetails& details) {
303158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  controller_.ssl_manager()->DidReceiveResourceRedirect(details);
303258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
303358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver, observers_,
303458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                    DidGetRedirectForResourceRequest(details));
303558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
303658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // TODO(avi): Remove. http://crbug.com/170921
303758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  NotificationService::current()->Notify(
303858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      NOTIFICATION_RESOURCE_RECEIVED_REDIRECT,
303958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      Source<WebContents>(this),
304058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      Details<const ResourceRedirectDetails>(&details));
304158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
304258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
30435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::DidNavigate(
30445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RenderViewHost* rvh,
30455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ViewHostMsg_FrameNavigate_Params& params) {
3046b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // If we don't have a frame tree root yet, this is the first navigation in
3047b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // using the current RenderViewHost, so we need to create it with the proper
3048b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // frame id.
3049b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (!frame_tree_root_.get()) {
3050b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    DCHECK(PageTransitionIsMainFrame(params.transition));
3051b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    frame_tree_root_.reset(new FrameTreeNode(params.frame_id, std::string()));
3052b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
3053b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
30542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (PageTransitionIsMainFrame(params.transition)) {
30552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // When overscroll navigation gesture is enabled, a screenshot of the page
30562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // in its current state is taken so that it can be used during the
30572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // nav-gesture. It is necessary to take the screenshot here, before calling
30582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // RenderViewHostManager::DidNavigateMainFrame, because that can change
30592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // WebContents::GetRenderViewHost to return the new host, instead of the one
30602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // that may have just been swapped out.
30612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (delegate_ && delegate_->CanOverscrollContent())
30622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      controller_.TakeScreenshot();
30632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
30645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    render_manager_.DidNavigateMainFrame(rvh);
30652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
30665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3067b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // We expect to have a valid frame tree root node at all times when
3068b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // navigating.
3069b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  DCHECK(frame_tree_root_.get());
3070b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
30715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Update the site of the SiteInstance if it doesn't have one yet, unless
3072eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // assigning a site is not necessary for this URL.  In that case, the
3073eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // SiteInstance can still be considered unused until a navigation to a real
3074eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // page.
30755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!static_cast<SiteInstanceImpl*>(GetSiteInstance())->HasSite() &&
3076eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      ShouldAssignSiteForURL(params.url)) {
30775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static_cast<SiteInstanceImpl*>(GetSiteInstance())->SetSite(params.url);
30785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
30795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Need to update MIME type here because it's referred to in
30815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // UpdateNavigationCommands() called by RendererDidNavigate() to
30825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // determine whether or not to enable the encoding menu.
30835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // It's updated only for the main frame. For a subframe,
30845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // RenderView::UpdateURL does not set params.contents_mime_type.
30855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (see http://code.google.com/p/chromium/issues/detail?id=2929 )
30865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(jungshik): Add a test for the encoding menu to avoid
30875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // regressing it again.
30885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (PageTransitionIsMainFrame(params.transition))
30895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    contents_mime_type_ = params.contents_mime_type;
30905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadCommittedDetails details;
30925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool did_navigate = controller_.RendererDidNavigate(params, &details);
30935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // For now, keep track of each frame's URL in its FrameTreeNode.  This lets
30957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // us estimate our process count for implementing OOP iframes.
30967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // TODO(creis): Remove this when we track which pages commit in each frame.
30977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  FrameTreeNode* node = FindFrameTreeNodeByID(params.frame_id);
30987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (node)
30997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    node->set_current_url(params.url);
31007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
31015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Send notification about committed provisional loads. This notification is
31025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // different from the NAV_ENTRY_COMMITTED notification which doesn't include
31035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the actual URL navigated to and isn't sent for AUTO_SUBFRAME navigations.
31045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (details.type != NAVIGATION_TYPE_NAV_IGNORE) {
31055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // For AUTO_SUBFRAME navigations, an event for the main frame is generated
31065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // that is not recorded in the navigation history. For the purpose of
31075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // tracking navigation events, we treat this event as a sub frame navigation
31085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // event.
31095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool is_main_frame = did_navigate ? details.is_main_frame : false;
31105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PageTransition transition_type = params.transition;
31115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Whether or not a page transition was triggered by going backward or
31125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // forward in the history is only stored in the navigation controller's
31135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // entry list.
31145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (did_navigate &&
311568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        (controller_.GetActiveEntry()->GetTransitionType() &
31165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            PAGE_TRANSITION_FORWARD_BACK)) {
31175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      transition_type = PageTransitionFromInt(
31185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          params.transition | PAGE_TRANSITION_FORWARD_BACK);
31195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
31205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Notify observers about the commit of the provisional load.
31215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FOR_EACH_OBSERVER(WebContentsObserver, observers_,
31225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      DidCommitProvisionalLoadForFrame(params.frame_id,
31235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      is_main_frame, params.url, transition_type, rvh));
31245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
31255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!did_navigate)
31275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;  // No navigation happened.
31285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // DO NOT ADD MORE STUFF TO THIS FUNCTION! Your component should either listen
31305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // for the appropriate notification (best) or you can add it to
31315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // DidNavigateMainFramePostCommit / DidNavigateAnyFramePostCommit (only if
31325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // necessary, please).
31335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Run post-commit tasks.
31355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (details.is_main_frame) {
31365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DidNavigateMainFramePostCommit(details, params);
31372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (delegate_) {
31385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delegate_->DidNavigateMainFramePostCommit(this);
31392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      view_->SetOverscrollControllerEnabled(delegate_->CanOverscrollContent());
31402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
31415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
31425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DidNavigateAnyFramePostCommit(rvh, details, params);
31435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
31445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdateState(RenderViewHost* rvh,
31465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  int32 page_id,
314790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                  const PageState& page_state) {
31485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ensure that this state update comes from either the active RVH or one of
31495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the swapped out RVHs.  We don't expect to hear from any other RVHs.
3150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(rvh == GetRenderViewHost() || render_manager_.IsOnSwappedOutList(rvh));
31515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We must be prepared to handle state updates for any page, these occur
31535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // when the user is scrolling and entering form data, as well as when we're
31545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // leaving a page, in which case our state may have already been moved to
31555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the next page. The navigation controller will look up the appropriate
31565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NavigationEntry and update it when it is notified via the delegate.
31575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int entry_index = controller_.GetEntryIndexWithPageID(
31595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rvh->GetSiteInstance(), page_id);
31605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (entry_index < 0)
31615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
31625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigationEntry* entry = controller_.GetEntryAtIndex(entry_index);
31635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
316490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (page_state == entry->GetPageState())
31655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;  // Nothing to update.
316690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  entry->SetPageState(page_state);
31675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  controller_.NotifyEntryChanged(entry, entry_index);
31685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
31695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdateTitle(RenderViewHost* rvh,
31715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  int32 page_id,
31725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  const string16& title,
31735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  base::i18n::TextDirection title_direction) {
31745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If we have a title, that's a pretty good indication that we've started
31755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // getting useful data.
31765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetNotWaitingForResponse();
31775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Try to find the navigation entry, which might not be the current one.
31795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For example, it might be from a pending RVH for the pending entry.
31805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigationEntryImpl* entry = controller_.GetEntryWithPageID(
31815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rvh->GetSiteInstance(), page_id);
31825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We can handle title updates when we don't have an entry in
31845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // UpdateTitleForEntry, but only if the update is from the current RVH.
31855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!entry && rvh != GetRenderViewHost())
31865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
31875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(evan): make use of title_direction.
31895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // http://code.google.com/p/chromium/issues/detail?id=27094
31905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!UpdateTitleForEntry(entry, title))
31915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
31925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Broadcast notifications when the UI should be updated.
31945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (entry == controller_.GetEntryAtOffset(0))
31955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NotifyNavigationStateChanged(INVALIDATE_TYPE_TITLE);
31965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
31975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdateEncoding(RenderViewHost* render_view_host,
31995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     const std::string& encoding) {
32005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetEncoding(encoding);
32015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
32025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdateTargetURL(int32 page_id, const GURL& url) {
32045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
32055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->UpdateTargetURL(this, page_id, url);
32065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
32075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::Close(RenderViewHost* rvh) {
32092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_MACOSX)
32105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The UI may be in an event-tracking loop, such as between the
32115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // mouse-down and mouse-up in text selection or a button click.
32125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Defer the close until after tracking is complete, so that we
32135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // don't free objects out from under the UI.
32145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(shess): This could get more fine-grained.  For instance,
32155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // closing a tab in another window while selecting text in the
32165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // current window's Omnibox should be just fine.
32172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (view_->IsEventTracking()) {
32182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    view_->CloseTabAfterEventTracking();
32195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
32205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
32212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
32225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ignore this if it comes from a RenderViewHost that we aren't showing.
32245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_ && rvh == GetRenderViewHost())
32255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->CloseContents(this);
32265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
32275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SwappedOut(RenderViewHost* rvh) {
32295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_ && rvh == GetRenderViewHost())
32305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->SwappedOut(this);
32317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
32327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Allow the navigation to proceed.
32337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  render_manager_.SwappedOut(rvh);
32345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
32355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RequestMove(const gfx::Rect& new_bounds) {
32375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_ && delegate_->IsPopupOrPanel(this))
32385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->MoveContents(this, new_bounds);
32395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
32405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::DidStartLoading(RenderViewHost* render_view_host) {
32425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetIsLoading(true, NULL);
32435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notify observers about navigation.
32455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver, observers_,
32465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    DidStartLoading(render_view_host));
32475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
32485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::DidStopLoading(RenderViewHost* render_view_host) {
32505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<LoadNotificationDetails> details;
32515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Use the last committed entry rather than the active one, in case a
3253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // pending entry has been created.
3254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  NavigationEntry* entry = controller_.GetLastCommittedEntry();
3255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
32565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // An entry may not exist for a stop when loading an initial blank page or
32575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // if an iframe injected by script into a blank page finishes loading.
32585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (entry) {
32595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::TimeDelta elapsed = base::TimeTicks::Now() - current_load_start_;
32605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    details.reset(new LoadNotificationDetails(
32625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        entry->GetVirtualURL(),
32635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        entry->GetTransitionType(),
32645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        elapsed,
32655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &controller_,
32665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        controller_.GetCurrentEntryIndex()));
32675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
32685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetIsLoading(false, details.get());
32705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notify observers about navigation.
32725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver, observers_,
32735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    DidStopLoading(render_view_host));
32745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
32755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::DidCancelLoading() {
32775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  controller_.DiscardNonCommittedEntries();
32785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Update the URL display.
32805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotifyNavigationStateChanged(INVALIDATE_TYPE_URL);
32815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
32825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::DidChangeLoadProgress(double progress) {
32845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
32855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->LoadProgressChanged(this, progress);
32865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
32875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::DidDisownOpener(RenderViewHost* rvh) {
3289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (opener_) {
3290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Clear our opener so that future cross-process navigations don't have an
3291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // opener assigned.
329290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    RemoveDestructionObserver(opener_);
3293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    opener_ = NULL;
3294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
32952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
32962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notify all swapped out RenderViewHosts for this tab.  This is important
32972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // in case we go back to them, or if another window in those processes tries
32982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // to access window.opener.
32992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  render_manager_.DidDisownOpener(rvh);
33002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
33012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3302868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void WebContentsImpl::DidAccessInitialDocument() {
3303868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Update the URL display.
3304868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  NotifyNavigationStateChanged(content::INVALIDATE_TYPE_URL);
3305868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
3306868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
33075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::DocumentAvailableInMainFrame(
33085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RenderViewHost* render_view_host) {
33095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver, observers_,
33105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    DocumentAvailableInMainFrame());
33115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
33125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::DocumentOnLoadCompletedInMainFrame(
33145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RenderViewHost* render_view_host,
33155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int32 page_id) {
33165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotificationService::current()->Notify(
33175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTIFICATION_LOAD_COMPLETED_MAIN_FRAME,
33185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Source<WebContents>(this),
33195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Details<int>(&page_id));
33205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
33215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RequestOpenURL(RenderViewHost* rvh,
33235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     const GURL& url,
33245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     const Referrer& referrer,
33255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     WindowOpenDisposition disposition,
33262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     int64 source_frame_id,
3327ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                                     bool should_replace_current_entry,
33287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                     bool user_gesture) {
33295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If this came from a swapped out RenderViewHost, we only allow the request
33305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // if we are still in the same BrowsingInstance.
33315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (static_cast<RenderViewHostImpl*>(rvh)->is_swapped_out() &&
33325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !rvh->GetSiteInstance()->IsRelatedSiteInstance(GetSiteInstance())) {
33335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
33345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
33355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Delegate to RequestTransferURL because this is just the generic
33375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // case where |old_request_id| is empty.
33385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RequestTransferURL(url, referrer, disposition, source_frame_id,
3339ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                     GlobalRequestID(),
3340ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                     should_replace_current_entry, user_gesture);
33415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
33425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RequestTransferURL(
33445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& url,
33455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Referrer& referrer,
33465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WindowOpenDisposition disposition,
33475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 source_frame_id,
33482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const GlobalRequestID& old_request_id,
3349ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    bool should_replace_current_entry,
33507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    bool user_gesture) {
33515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebContents* new_contents = NULL;
33525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PageTransition transition_type = PAGE_TRANSITION_LINK;
335358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  GURL dest_url(url);
335458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (!GetContentClient()->browser()->ShouldAllowOpenURL(
335558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      GetSiteInstance(), url))
335658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    dest_url = GURL(kAboutBlankURL);
335758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
33585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (render_manager_.web_ui()) {
33595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // When we're a Web UI, it will provide a page transition type for us (this
33605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // is so the new tab page can specify AUTO_BOOKMARK for automatically
33615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // generated suggestions).
33625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //
33635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Note also that we hide the referrer for Web UI pages. We don't really
33645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // want web sites to see a referrer of "chrome://blah" (and some
33655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // chrome: URLs might have search terms or other stuff we don't want to
33665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // send to the site), so we send no referrer.
336758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    OpenURLParams params(dest_url, Referrer(), source_frame_id, disposition,
33685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        render_manager_.web_ui()->GetLinkTransitionType(),
33695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        false /* is_renderer_initiated */);
33705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    params.transferred_global_request_id = old_request_id;
33715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_contents = OpenURL(params);
33725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    transition_type = render_manager_.web_ui()->GetLinkTransitionType();
33735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
337458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    OpenURLParams params(dest_url, referrer, source_frame_id, disposition,
33755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        PAGE_TRANSITION_LINK, true /* is_renderer_initiated */);
33765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    params.transferred_global_request_id = old_request_id;
3377ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    params.should_replace_current_entry = should_replace_current_entry;
33787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    params.user_gesture = user_gesture;
33795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_contents = OpenURL(params);
33805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
33815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (new_contents) {
33825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Notify observers.
33835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FOR_EACH_OBSERVER(WebContentsObserver, observers_,
33845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      DidOpenRequestedURL(new_contents,
338558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                          dest_url,
33865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          referrer,
33875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          disposition,
33885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          transition_type,
33895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          source_frame_id));
33905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
33915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
33925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RouteCloseEvent(RenderViewHost* rvh) {
33945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tell the active RenderViewHost to run unload handlers and close, as long
33955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // as the request came from a RenderViewHost in the same BrowsingInstance.
33965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // In most cases, we receive this from a swapped out RenderViewHost.
33975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // It is possible to receive it from one that has just been swapped in,
33985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // in which case we might as well deliver the message anyway.
33995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (rvh->GetSiteInstance()->IsRelatedSiteInstance(GetSiteInstance()))
34005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetRenderViewHost()->ClosePage();
34015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
34025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RouteMessageEvent(
34045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RenderViewHost* rvh,
34055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ViewMsg_PostMessage_Params& params) {
34065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Only deliver the message to the active RenderViewHost if the request
34075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // came from a RenderViewHost in the same BrowsingInstance or if this
34085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // WebContents is dedicated to a browser plugin guest.
34095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note: This check means that an embedder could theoretically receive a
34105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // postMessage from anyone (not just its own guests). However, this is
34115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // probably not a risk for apps since other pages won't have references
34125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to App windows.
34135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!rvh->GetSiteInstance()->IsRelatedSiteInstance(GetSiteInstance()) &&
34145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !GetBrowserPluginGuest() && !GetBrowserPluginEmbedder())
34155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
34165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ViewMsg_PostMessage_Params new_params(params);
34185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If there is a source_routing_id, translate it to the routing ID for
34205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the equivalent swapped out RVH in the target process.  If we need
34215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to create a swapped out RVH for the source tab, we create its opener
34225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // chain as well, since those will also be accessible to the target page.
34235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (new_params.source_routing_id != MSG_ROUTING_NONE) {
34245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Try to look up the WebContents for the source page.
34255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebContentsImpl* source_contents = NULL;
34265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RenderViewHostImpl* source_rvh = RenderViewHostImpl::FromID(
34275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rvh->GetProcess()->GetID(), params.source_routing_id);
34285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (source_rvh) {
34295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      source_contents = static_cast<WebContentsImpl*>(
34305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          source_rvh->GetDelegate()->GetAsWebContents());
34315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
34325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (source_contents) {
34345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (GetBrowserPluginGuest()) {
34355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // We create a swapped out RenderView for the embedder in the guest's
34365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // render process but we intentionally do not expose the embedder's
34375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // opener chain to it.
34385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new_params.source_routing_id =
34395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            source_contents->CreateSwappedOutRenderView(GetSiteInstance());
34405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else {
34415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new_params.source_routing_id =
34425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            source_contents->CreateOpenerRenderViews(GetSiteInstance());
34435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
34445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
34455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // We couldn't find it, so don't pass a source frame.
34465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_params.source_routing_id = MSG_ROUTING_NONE;
34475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
34485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
34495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // In most cases, we receive this from a swapped out RenderViewHost.
34515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // It is possible to receive it from one that has just been swapped in,
34525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // in which case we might as well deliver the message anyway.
34535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new ViewMsg_PostMessageEvent(GetRoutingID(), new_params));
34545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
34555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RunJavaScriptMessage(
34575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RenderViewHost* rvh,
34585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const string16& message,
34595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const string16& default_prompt,
34605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& frame_url,
34615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    JavaScriptMessageType javascript_message_type,
34625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_msg,
34635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool* did_suppress_message) {
34645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Suppress JavaScript dialogs when requested. Also suppress messages when
34655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // showing an interstitial as it's shown over the previous page and we don't
34665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // want the hidden page's dialogs to interfere with the interstitial.
34675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool suppress_this_message =
34685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<RenderViewHostImpl*>(rvh)->is_swapped_out() ||
34695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ShowingInterstitialPage() ||
34705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !delegate_ ||
34715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delegate_->ShouldSuppressDialogs() ||
34722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      !delegate_->GetJavaScriptDialogManager();
34735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!suppress_this_message) {
34755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string accept_lang = GetContentClient()->browser()->
34765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetAcceptLangs(GetBrowserContext());
34772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    dialog_manager_ = delegate_->GetJavaScriptDialogManager();
34782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    dialog_manager_->RunJavaScriptDialog(
34795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this,
34805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        frame_url.GetOrigin(),
34815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        accept_lang,
34825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        javascript_message_type,
34835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        message,
34845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        default_prompt,
34855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&WebContentsImpl::OnDialogClosed,
34865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   base::Unretained(this),
34875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   rvh,
34885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   reply_msg),
34895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &suppress_this_message);
34905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
34915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
349258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  *did_suppress_message = suppress_this_message;
349358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
34945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (suppress_this_message) {
34955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // If we are suppressing messages, just reply as if the user immediately
34965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // pressed "Cancel".
34975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OnDialogClosed(rvh, reply_msg, false, string16());
34985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
34995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
350058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // OnDialogClosed (two lines up) may have caused deletion of this object (see
350158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // http://crbug.com/288961 ). The only safe thing to do here is return.
35025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
35035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RunBeforeUnloadConfirm(RenderViewHost* rvh,
35055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             const string16& message,
35065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             bool is_reload,
35075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             IPC::Message* reply_msg) {
35085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderViewHostImpl* rvhi = static_cast<RenderViewHostImpl*>(rvh);
35095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
35105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->WillRunBeforeUnloadConfirm();
35115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool suppress_this_message =
35135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rvhi->is_swapped_out() ||
35145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !delegate_ ||
35155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delegate_->ShouldSuppressDialogs() ||
35162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      !delegate_->GetJavaScriptDialogManager();
35175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (suppress_this_message) {
35185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The reply must be sent to the RVH that sent the request.
35195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rvhi->JavaScriptDialogClosed(reply_msg, true, string16());
35205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
35215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
35225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_showing_before_unload_dialog_ = true;
35242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dialog_manager_ = delegate_->GetJavaScriptDialogManager();
35252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dialog_manager_->RunBeforeUnloadDialog(
35265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this, message, is_reload,
35275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&WebContentsImpl::OnDialogClosed, base::Unretained(this), rvh,
35285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 reply_msg));
35295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
35305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::AddMessageToConsole(int32 level,
35325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          const string16& message,
35335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          int32 line_no,
353458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                          const string16& source_id) {
35355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!delegate_)
35365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
35375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return delegate_->AddMessageToConsole(this, level, message, line_no,
35385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        source_id);
35395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
35405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebPreferences WebContentsImpl::GetWebkitPrefs() {
35425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We want to base the page config off of the real URL, rather than the
35435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // display URL.
354468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  GURL url = controller_.GetActiveEntry()
354568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      ? controller_.GetActiveEntry()->GetURL() : GURL::EmptyGURL();
35465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetWebkitPrefs(GetRenderViewHost(), url);
35475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
35485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsImpl::CreateSwappedOutRenderView(
35505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SiteInstance* instance) {
35513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return render_manager_.CreateRenderView(instance, MSG_ROUTING_NONE,
35523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                          true, true);
35535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
35545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnUserGesture() {
35565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notify observers.
35575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver, observers_, DidGetUserGesture());
35585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResourceDispatcherHostImpl* rdh = ResourceDispatcherHostImpl::Get();
35605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (rdh)  // NULL in unittests.
35615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rdh->OnUserGesture(this);
35625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
35635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnIgnoredUIEvent() {
35655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notify observers.
35665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver, observers_, DidGetIgnoredUIEvent());
35675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
35685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RendererUnresponsive(RenderViewHost* rvh,
35703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                           bool is_during_beforeunload,
35715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           bool is_during_unload) {
35725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Don't show hung renderer dialog for a swapped out RVH.
35735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (rvh != GetRenderViewHost())
35745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
35755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderViewHostImpl* rvhi = static_cast<RenderViewHostImpl*>(rvh);
35775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ignore renderer unresponsive event if debugger is attached to the tab
35795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // since the event may be a result of the renderer sitting on a breakpoint.
35805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // See http://crbug.com/65458
35812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (DevToolsAgentHost::IsDebuggerAttached(this))
35825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
35835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (is_during_beforeunload || is_during_unload) {
35855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Hang occurred while firing the beforeunload/unload handler.
35865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Pretend the handler fired so tab closing continues as if it had.
35875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rvhi->set_sudden_termination_allowed(true);
35885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!render_manager_.ShouldCloseTabOnUnresponsiveRenderer())
35905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
35915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // If the tab hangs in the beforeunload/unload handler there's really
35933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // nothing we can do to recover. If the hang is in the beforeunload handler,
35943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // pretend the beforeunload listeners have all fired and allow the delegate
35953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // to continue closing; the user will not have the option of cancelling the
35963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // close. Otherwise, pretend the unload listeners have all fired and close
35973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // the tab.
35983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    bool close = true;
35993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (is_during_beforeunload) {
36003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      delegate_->BeforeUnloadFired(this, true, &close);
36013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    }
36023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (close)
36033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      Close(rvh);
36045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
36055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
36065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetRenderViewHostImpl() || !GetRenderViewHostImpl()->IsRenderViewLive())
36085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
36095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
36115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->RendererUnresponsive(this);
36125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
36135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RendererResponsive(RenderViewHost* render_view_host) {
36155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
36165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->RendererResponsive(this);
36175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
36185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::LoadStateChanged(
36205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& url,
36215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const net::LoadStateWithParam& load_state,
36225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint64 upload_position,
36235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint64 upload_size) {
36245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  load_state_ = load_state;
36255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  upload_position_ = upload_position;
36265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  upload_size_ = upload_size;
36275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  load_state_host_ = net::IDNToUnicode(url.host(),
36285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetContentClient()->browser()->GetAcceptLangs(
36295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          GetBrowserContext()));
36305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (load_state_.state == net::LOAD_STATE_READING_RESPONSE)
36315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetNotWaitingForResponse();
36325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (IsLoading()) {
36335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NotifyNavigationStateChanged(INVALIDATE_TYPE_LOAD | INVALIDATE_TYPE_TAB);
36345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
36355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
36365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::WorkerCrashed() {
36385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
36395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->WorkerCrashed(this);
36405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
36415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::BeforeUnloadFiredFromRenderManager(
36435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool proceed, const base::TimeTicks& proceed_time,
36445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool* proceed_to_fire_unload) {
36457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  FOR_EACH_OBSERVER(WebContentsObserver, observers_,
36467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                    BeforeUnloadFired(proceed_time));
36475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
36485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->BeforeUnloadFired(this, proceed, proceed_to_fire_unload);
3649eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Note: |this| might be deleted at this point.
36505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
36515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid WebContentsImpl::RenderProcessGoneFromRenderManager(
36535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RenderViewHost* render_view_host) {
36545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(crashed_status_ != base::TERMINATION_STATUS_STILL_RUNNING);
3655c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderViewTerminated(render_view_host, crashed_status_, crashed_error_code_);
36565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
36575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdateRenderViewSizeForRenderManager() {
36595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(brettw) this is a hack. See WebContentsView::SizeContents.
3660424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  gfx::Size size = GetSizeForNewRenderView();
36615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 0x0 isn't a valid window size (minimal window size is 1x1) but it may be
36625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // here during container initialization and normal window size will be set
36635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // later. In case of tab duplication this resizing to 0x0 prevents setting
36645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // normal size later so just ignore it.
36655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!size.IsEmpty())
36665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    view_->SizeContents(size);
36675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
36685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::NotifySwappedFromRenderManager(RenderViewHost* rvh) {
36702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotifySwapped(rvh);
36712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
36722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Make sure the visible RVH reflects the new delegate's preferences.
36732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (delegate_)
36742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    view_->SetOverscrollControllerEnabled(delegate_->CanOverscrollContent());
36752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
36762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  view_->RenderViewSwappedIn(render_manager_.current_host());
3677b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
3678b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  FrameTreeNode* root = NULL;
3679b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  RenderViewHostImpl* new_rvh = static_cast<RenderViewHostImpl*>(
3680b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      render_manager_.current_host());
3681b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
3682b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // We are doing a cross-site navigation and swapping processes. Since frame
3683b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // ids are unique to a process, we need to recreate the frame tree with the
3684b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // proper main frame id.
3685b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // Note that it is possible for this method to be called before the new RVH
3686b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // has committed a navigation (if RenderViewHostManager short-circuits the
3687b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // CommitPending call because the current RVH is dead). In that case, we
3688b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // haven't heard a valid frame id to use to initialize the root node, so clear
3689b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // out the root node and the first subsequent navigation message will set it
3690b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // correctly.
3691b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (new_rvh->main_frame_id() != -1)
3692b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    root = new FrameTreeNode(new_rvh->main_frame_id(), std::string());
3693b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
3694b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  frame_tree_root_.reset(root);
36955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
36965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsImpl::CreateOpenerRenderViewsForRenderManager(
36985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SiteInstance* instance) {
36995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!opener_)
37005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return MSG_ROUTING_NONE;
37015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Recursively create RenderViews for anything else in the opener chain.
37035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return opener_->CreateOpenerRenderViews(instance);
37045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
37055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsImpl::CreateOpenerRenderViews(SiteInstance* instance) {
37075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int opener_route_id = MSG_ROUTING_NONE;
37085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If this tab has an opener, ensure it has a RenderView in the given
37105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SiteInstance as well.
37115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (opener_)
37125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    opener_route_id = opener_->CreateOpenerRenderViews(instance);
37135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If any of the renderers (current, pending, or swapped out) for this
37152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // WebContents has the same SiteInstance, use it.
37165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (render_manager_.current_host()->GetSiteInstance() == instance)
37175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return render_manager_.current_host()->GetRoutingID();
37185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (render_manager_.pending_render_view_host() &&
37202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      render_manager_.pending_render_view_host()->GetSiteInstance() == instance)
37212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return render_manager_.pending_render_view_host()->GetRoutingID();
37222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
37235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderViewHostImpl* rvh = render_manager_.GetSwappedOutRenderViewHost(
37245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      instance);
37255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (rvh)
37265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return rvh->GetRoutingID();
37275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a swapped out RenderView in the given SiteInstance if none exists,
37295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // setting its opener to the given route_id.  Return the new view's route_id.
37303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return render_manager_.CreateRenderView(instance, opener_route_id,
37313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                          true, true);
37325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
37335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NavigationControllerImpl& WebContentsImpl::GetControllerForRenderManager() {
37355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetController();
37365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
37375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebUIImpl* WebContentsImpl::CreateWebUIForRenderManager(const GURL& url) {
37395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return static_cast<WebUIImpl*>(CreateWebUI(url));
37405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
37415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NavigationEntry*
37435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebContentsImpl::GetLastCommittedNavigationEntryForRenderManager() {
37445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return controller_.GetLastCommittedEntry();
37455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
37465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::CreateRenderViewForRenderManager(
37485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RenderViewHost* render_view_host, int opener_route_id) {
37497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  TRACE_EVENT0("browser", "WebContentsImpl::CreateRenderViewForRenderManager");
37505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Can be NULL during tests.
37515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderWidgetHostView* rwh_view = view_->CreateViewForWidget(render_view_host);
37525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now that the RenderView has been created, we need to tell it its size.
37545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (rwh_view)
3755424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    rwh_view->SetSize(GetSizeForNewRenderView());
37565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure we use the correct starting page_id in the new RenderView.
37585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateMaxPageIDIfNecessary(render_view_host);
37595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32 max_page_id =
37605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetMaxPageIDForSiteInstance(render_view_host->GetSiteInstance());
37615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!static_cast<RenderViewHostImpl*>(
37635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          render_view_host)->CreateRenderView(string16(),
37645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              opener_route_id,
37655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              max_page_id)) {
37665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
37675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
37685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
376968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_ANDROID)
37705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Force a ViewMsg_Resize to be sent, needed to make plugins show up on
37715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // linux. See crbug.com/83941.
37725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (rwh_view) {
37735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (RenderWidgetHost* render_widget_host = rwh_view->GetRenderWidgetHost())
37745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      render_widget_host->WasResized();
37755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
37765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
37775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
37795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
37805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#if defined(OS_ANDROID)
37823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool WebContentsImpl::CreateRenderViewForInitialEmptyDocument() {
37833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return CreateRenderViewForRenderManager(GetRenderViewHost(),
37843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                          MSG_ROUTING_NONE);
37853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
37863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#endif
37873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
37885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnDialogClosed(RenderViewHost* rvh,
37895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     IPC::Message* reply_msg,
37905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     bool success,
37915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     const string16& user_input) {
37925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_showing_before_unload_dialog_ && !success) {
37935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // If a beforeunload dialog is canceled, we need to stop the throbber from
37945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // spinning, since we forced it to start spinning in Navigate.
37955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DidStopLoading(rvh);
37965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    controller_.DiscardNonCommittedEntries();
37977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
37987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    FOR_EACH_OBSERVER(WebContentsObserver, observers_,
37997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                      BeforeUnloadDialogCancelled());
38005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
38015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_showing_before_unload_dialog_ = false;
38025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static_cast<RenderViewHostImpl*>(
38035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rvh)->JavaScriptDialogClosed(reply_msg, success, user_input);
38045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
38055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetEncoding(const std::string& encoding) {
38075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  encoding_ = GetContentClient()->browser()->
38085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetCanonicalEncodingNameByAliasName(encoding);
38095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
38105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::CreateViewAndSetSizeForRVH(RenderViewHost* rvh) {
38122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderWidgetHostView* rwh_view = view_->CreateViewForWidget(rvh);
38135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Can be NULL during tests.
38145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (rwh_view)
38155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rwh_view->SetSize(GetView()->GetContainerSize());
38165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
38175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool WebContentsImpl::IsHidden() {
38193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return capturer_count_ == 0 && !should_normally_be_visible_;
38203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
38213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
38225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderViewHostImpl* WebContentsImpl::GetRenderViewHostImpl() {
38235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return static_cast<RenderViewHostImpl*>(GetRenderViewHost());
38245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
38255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BrowserPluginGuest* WebContentsImpl::GetBrowserPluginGuest() const {
38275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return browser_plugin_guest_.get();
38285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
38295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3830eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid WebContentsImpl::SetBrowserPluginGuest(BrowserPluginGuest* guest) {
3831eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  CHECK(!browser_plugin_guest_);
3832eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  browser_plugin_guest_.reset(guest);
3833eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
3834eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
38352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BrowserPluginEmbedder* WebContentsImpl::GetBrowserPluginEmbedder() const {
38365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return browser_plugin_embedder_.get();
38375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
38385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BrowserPluginGuestManager*
38402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WebContentsImpl::GetBrowserPluginGuestManager() const {
38412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return static_cast<BrowserPluginGuestManager*>(
38422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetBrowserContext()->GetUserData(
38432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          browser_plugin::kBrowserPluginGuestManagerKeyName));
38442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
38452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3846ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid WebContentsImpl::ClearPowerSaveBlockers(
3847ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    RenderViewHost* render_view_host) {
3848ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  STLDeleteValues(&power_save_blockers_[render_view_host]);
3849ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  power_save_blockers_.erase(render_view_host);
3850ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
3851ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
3852ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid WebContentsImpl::ClearAllPowerSaveBlockers() {
3853ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  for (PowerSaveBlockerMap::iterator i(power_save_blockers_.begin());
3854ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch       i != power_save_blockers_.end(); ++i)
3855ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    STLDeleteValues(&power_save_blockers_[i->first]);
3856ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  power_save_blockers_.clear();
3857ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
3858ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
3859424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)gfx::Size WebContentsImpl::GetSizeForNewRenderView() const {
3860424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  gfx::Size size;
3861424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  if (delegate_)
3862424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    size = delegate_->GetSizeForNewRenderView(this);
3863424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  if (size.IsEmpty())
3864424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    size = view_->GetContainerSize();
3865424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  return size;
3866424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
3867424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
38685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
3869