| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/browser/frame_host/render_frame_host_impl.h" | 5 #include "content/browser/frame_host/render_frame_host_impl.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| 11 #include "base/command_line.h" | 11 #include "base/command_line.h" |
| 12 #include "base/containers/hash_tables.h" | 12 #include "base/containers/hash_tables.h" |
| 13 #include "base/debug/dump_without_crashing.h" | 13 #include "base/debug/dump_without_crashing.h" |
| 14 #include "base/lazy_instance.h" | 14 #include "base/lazy_instance.h" |
| 15 #include "base/memory/ptr_util.h" | 15 #include "base/memory/ptr_util.h" |
| 16 #include "base/metrics/histogram_macros.h" | 16 #include "base/metrics/histogram_macros.h" |
| 17 #include "base/process/kill.h" | 17 #include "base/process/kill.h" |
| 18 #include "base/time/time.h" | 18 #include "base/time/time.h" |
| 19 #include "build/build_config.h" | 19 #include "build/build_config.h" |
| 20 #include "content/browser/accessibility/ax_tree_id_registry.h" | |
| 21 #include "content/browser/accessibility/browser_accessibility_manager.h" | 20 #include "content/browser/accessibility/browser_accessibility_manager.h" |
| 22 #include "content/browser/accessibility/browser_accessibility_state_impl.h" | 21 #include "content/browser/accessibility/browser_accessibility_state_impl.h" |
| 23 #include "content/browser/bluetooth/web_bluetooth_service_impl.h" | 22 #include "content/browser/bluetooth/web_bluetooth_service_impl.h" |
| 24 #include "content/browser/browser_main_loop.h" | 23 #include "content/browser/browser_main_loop.h" |
| 25 #include "content/browser/child_process_security_policy_impl.h" | 24 #include "content/browser/child_process_security_policy_impl.h" |
| 26 #include "content/browser/devtools/render_frame_devtools_agent_host.h" | 25 #include "content/browser/devtools/render_frame_devtools_agent_host.h" |
| 27 #include "content/browser/download/mhtml_generation_manager.h" | 26 #include "content/browser/download/mhtml_generation_manager.h" |
| 28 #include "content/browser/frame_host/cross_process_frame_connector.h" | 27 #include "content/browser/frame_host/cross_process_frame_connector.h" |
| 29 #include "content/browser/frame_host/debug_urls.h" | 28 #include "content/browser/frame_host/debug_urls.h" |
| 30 #include "content/browser/frame_host/frame_tree.h" | 29 #include "content/browser/frame_host/frame_tree.h" |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 101 #include "device/wake_lock/wake_lock_service_context.h" | 100 #include "device/wake_lock/wake_lock_service_context.h" |
| 102 #include "media/base/media_switches.h" | 101 #include "media/base/media_switches.h" |
| 103 #include "media/media_features.h" | 102 #include "media/media_features.h" |
| 104 #include "media/mojo/interfaces/media_service.mojom.h" | 103 #include "media/mojo/interfaces/media_service.mojom.h" |
| 105 #include "media/mojo/interfaces/remoting.mojom.h" | 104 #include "media/mojo/interfaces/remoting.mojom.h" |
| 106 #include "mojo/public/cpp/bindings/associated_interface_ptr.h" | 105 #include "mojo/public/cpp/bindings/associated_interface_ptr.h" |
| 107 #include "mojo/public/cpp/bindings/strong_binding.h" | 106 #include "mojo/public/cpp/bindings/strong_binding.h" |
| 108 #include "services/service_manager/public/cpp/connector.h" | 107 #include "services/service_manager/public/cpp/connector.h" |
| 109 #include "services/service_manager/public/cpp/interface_provider.h" | 108 #include "services/service_manager/public/cpp/interface_provider.h" |
| 110 #include "ui/accessibility/ax_tree.h" | 109 #include "ui/accessibility/ax_tree.h" |
| 110 #include "ui/accessibility/ax_tree_id_registry.h" |
| 111 #include "ui/accessibility/ax_tree_update.h" | 111 #include "ui/accessibility/ax_tree_update.h" |
| 112 #include "ui/gfx/geometry/quad_f.h" | 112 #include "ui/gfx/geometry/quad_f.h" |
| 113 #include "url/gurl.h" | 113 #include "url/gurl.h" |
| 114 | 114 |
| 115 #if defined(OS_ANDROID) | 115 #if defined(OS_ANDROID) |
| 116 #include "content/browser/android/app_web_message_port_message_filter.h" | 116 #include "content/browser/android/app_web_message_port_message_filter.h" |
| 117 #include "content/public/browser/android/java_interfaces.h" | 117 #include "content/public/browser/android/java_interfaces.h" |
| 118 #include "content/browser/media/android/media_player_renderer.h" | 118 #include "content/browser/media/android/media_player_renderer.h" |
| 119 #include "media/base/audio_renderer_sink.h" | 119 #include "media/base/audio_renderer_sink.h" |
| 120 #include "media/base/video_renderer_sink.h" | 120 #include "media/base/video_renderer_sink.h" |
| (...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 291 } | 291 } |
| 292 | 292 |
| 293 // static | 293 // static |
| 294 RenderFrameHost* RenderFrameHost::FromAXTreeID( | 294 RenderFrameHost* RenderFrameHost::FromAXTreeID( |
| 295 int ax_tree_id) { | 295 int ax_tree_id) { |
| 296 return RenderFrameHostImpl::FromAXTreeID(ax_tree_id); | 296 return RenderFrameHostImpl::FromAXTreeID(ax_tree_id); |
| 297 } | 297 } |
| 298 | 298 |
| 299 // static | 299 // static |
| 300 RenderFrameHostImpl* RenderFrameHostImpl::FromAXTreeID( | 300 RenderFrameHostImpl* RenderFrameHostImpl::FromAXTreeID( |
| 301 AXTreeIDRegistry::AXTreeID ax_tree_id) { | 301 ui::AXTreeIDRegistry::AXTreeID ax_tree_id) { |
| 302 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 302 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 303 AXTreeIDRegistry::FrameID frame_id = | 303 ui::AXTreeIDRegistry::FrameID frame_id = |
| 304 AXTreeIDRegistry::GetInstance()->GetFrameID(ax_tree_id); | 304 ui::AXTreeIDRegistry::GetInstance()->GetFrameID(ax_tree_id); |
| 305 return RenderFrameHostImpl::FromID(frame_id.first, frame_id.second); | 305 return RenderFrameHostImpl::FromID(frame_id.first, frame_id.second); |
| 306 } | 306 } |
| 307 | 307 |
| 308 RenderFrameHostImpl::RenderFrameHostImpl(SiteInstance* site_instance, | 308 RenderFrameHostImpl::RenderFrameHostImpl(SiteInstance* site_instance, |
| 309 RenderViewHostImpl* render_view_host, | 309 RenderViewHostImpl* render_view_host, |
| 310 RenderFrameHostDelegate* delegate, | 310 RenderFrameHostDelegate* delegate, |
| 311 RenderWidgetHostDelegate* rwh_delegate, | 311 RenderWidgetHostDelegate* rwh_delegate, |
| 312 FrameTree* frame_tree, | 312 FrameTree* frame_tree, |
| 313 FrameTreeNode* frame_tree_node, | 313 FrameTreeNode* frame_tree_node, |
| 314 int32_t routing_id, | 314 int32_t routing_id, |
| (...skipping 14 matching lines...) Expand all Loading... |
| 329 is_waiting_for_swapout_ack_(false), | 329 is_waiting_for_swapout_ack_(false), |
| 330 render_frame_created_(false), | 330 render_frame_created_(false), |
| 331 navigations_suspended_(false), | 331 navigations_suspended_(false), |
| 332 is_waiting_for_beforeunload_ack_(false), | 332 is_waiting_for_beforeunload_ack_(false), |
| 333 unload_ack_is_for_navigation_(false), | 333 unload_ack_is_for_navigation_(false), |
| 334 is_loading_(false), | 334 is_loading_(false), |
| 335 pending_commit_(false), | 335 pending_commit_(false), |
| 336 nav_entry_id_(0), | 336 nav_entry_id_(0), |
| 337 accessibility_reset_token_(0), | 337 accessibility_reset_token_(0), |
| 338 accessibility_reset_count_(0), | 338 accessibility_reset_count_(0), |
| 339 browser_plugin_embedder_ax_tree_id_(AXTreeIDRegistry::kNoAXTreeID), | 339 browser_plugin_embedder_ax_tree_id_(ui::AXTreeIDRegistry::kNoAXTreeID), |
| 340 no_create_browser_accessibility_manager_for_testing_(false), | 340 no_create_browser_accessibility_manager_for_testing_(false), |
| 341 web_ui_type_(WebUI::kNoWebUI), | 341 web_ui_type_(WebUI::kNoWebUI), |
| 342 pending_web_ui_type_(WebUI::kNoWebUI), | 342 pending_web_ui_type_(WebUI::kNoWebUI), |
| 343 should_reuse_web_ui_(false), | 343 should_reuse_web_ui_(false), |
| 344 has_selection_(false), | 344 has_selection_(false), |
| 345 last_navigation_previews_state_(PREVIEWS_UNSPECIFIED), | 345 last_navigation_previews_state_(PREVIEWS_UNSPECIFIED), |
| 346 frame_host_binding_(this), | 346 frame_host_binding_(this), |
| 347 waiting_for_init_(renderer_initiated_creation), | 347 waiting_for_init_(renderer_initiated_creation), |
| 348 has_focused_editable_element_(false), | 348 has_focused_editable_element_(false), |
| 349 weak_ptr_factory_(this) { | 349 weak_ptr_factory_(this) { |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 450 | 450 |
| 451 // Notify the FrameTree that this RFH is going away, allowing it to shut down | 451 // Notify the FrameTree that this RFH is going away, allowing it to shut down |
| 452 // the corresponding RenderViewHost if it is no longer needed. | 452 // the corresponding RenderViewHost if it is no longer needed. |
| 453 frame_tree_->ReleaseRenderViewHostRef(render_view_host_); | 453 frame_tree_->ReleaseRenderViewHostRef(render_view_host_); |
| 454 } | 454 } |
| 455 | 455 |
| 456 int RenderFrameHostImpl::GetRoutingID() { | 456 int RenderFrameHostImpl::GetRoutingID() { |
| 457 return routing_id_; | 457 return routing_id_; |
| 458 } | 458 } |
| 459 | 459 |
| 460 AXTreeIDRegistry::AXTreeID RenderFrameHostImpl::GetAXTreeID() { | 460 ui::AXTreeIDRegistry::AXTreeID RenderFrameHostImpl::GetAXTreeID() { |
| 461 return AXTreeIDRegistry::GetInstance()->GetOrCreateAXTreeID( | 461 return ui::AXTreeIDRegistry::GetInstance()->GetOrCreateAXTreeID( |
| 462 GetProcess()->GetID(), routing_id_); | 462 GetProcess()->GetID(), routing_id_); |
| 463 } | 463 } |
| 464 | 464 |
| 465 SiteInstanceImpl* RenderFrameHostImpl::GetSiteInstance() { | 465 SiteInstanceImpl* RenderFrameHostImpl::GetSiteInstance() { |
| 466 return site_instance_.get(); | 466 return site_instance_.get(); |
| 467 } | 467 } |
| 468 | 468 |
| 469 RenderProcessHost* RenderFrameHostImpl::GetProcess() { | 469 RenderProcessHost* RenderFrameHostImpl::GetProcess() { |
| 470 return process_; | 470 return process_; |
| 471 } | 471 } |
| (...skipping 2783 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3255 frame_tree_node_->current_url().SchemeIs(kChromeDevToolsScheme) || | 3255 frame_tree_node_->current_url().SchemeIs(kChromeDevToolsScheme) || |
| 3256 ChildProcessSecurityPolicyImpl::GetInstance()->HasWebUIBindings( | 3256 ChildProcessSecurityPolicyImpl::GetInstance()->HasWebUIBindings( |
| 3257 GetProcess()->GetID()) || | 3257 GetProcess()->GetID()) || |
| 3258 // It's possible to load about:blank in a Web UI renderer. | 3258 // It's possible to load about:blank in a Web UI renderer. |
| 3259 // See http://crbug.com/42547 | 3259 // See http://crbug.com/42547 |
| 3260 (frame_tree_node_->current_url().spec() == url::kAboutBlankURL) || | 3260 (frame_tree_node_->current_url().spec() == url::kAboutBlankURL) || |
| 3261 // InterstitialPageImpl should be the only case matching this. | 3261 // InterstitialPageImpl should be the only case matching this. |
| 3262 (delegate_->GetAsWebContents() == nullptr); | 3262 (delegate_->GetAsWebContents() == nullptr); |
| 3263 } | 3263 } |
| 3264 | 3264 |
| 3265 AXTreeIDRegistry::AXTreeID RenderFrameHostImpl::RoutingIDToAXTreeID( | 3265 ui::AXTreeIDRegistry::AXTreeID RenderFrameHostImpl::RoutingIDToAXTreeID( |
| 3266 int routing_id) { | 3266 int routing_id) { |
| 3267 RenderFrameHostImpl* rfh = nullptr; | 3267 RenderFrameHostImpl* rfh = nullptr; |
| 3268 RenderFrameProxyHost* rfph = RenderFrameProxyHost::FromID( | 3268 RenderFrameProxyHost* rfph = RenderFrameProxyHost::FromID( |
| 3269 GetProcess()->GetID(), routing_id); | 3269 GetProcess()->GetID(), routing_id); |
| 3270 if (rfph) { | 3270 if (rfph) { |
| 3271 FrameTree* frame_tree = rfph->frame_tree_node()->frame_tree(); | 3271 FrameTree* frame_tree = rfph->frame_tree_node()->frame_tree(); |
| 3272 FrameTreeNode* frame_tree_node = frame_tree->FindByRoutingID( | 3272 FrameTreeNode* frame_tree_node = frame_tree->FindByRoutingID( |
| 3273 GetProcess()->GetID(), routing_id); | 3273 GetProcess()->GetID(), routing_id); |
| 3274 rfh = frame_tree_node->render_manager()->current_frame_host(); | 3274 rfh = frame_tree_node->render_manager()->current_frame_host(); |
| 3275 } else { | 3275 } else { |
| 3276 rfh = RenderFrameHostImpl::FromID(GetProcess()->GetID(), routing_id); | 3276 rfh = RenderFrameHostImpl::FromID(GetProcess()->GetID(), routing_id); |
| 3277 | 3277 |
| 3278 // As a sanity check, make sure we're within the same frame tree and | 3278 // As a sanity check, make sure we're within the same frame tree and |
| 3279 // crash the renderer if not. | 3279 // crash the renderer if not. |
| 3280 if (rfh && | 3280 if (rfh && |
| 3281 rfh->frame_tree_node()->frame_tree() != | 3281 rfh->frame_tree_node()->frame_tree() != |
| 3282 frame_tree_node()->frame_tree()) { | 3282 frame_tree_node()->frame_tree()) { |
| 3283 AccessibilityFatalError(); | 3283 AccessibilityFatalError(); |
| 3284 return AXTreeIDRegistry::kNoAXTreeID; | 3284 return ui::AXTreeIDRegistry::kNoAXTreeID; |
| 3285 } | 3285 } |
| 3286 } | 3286 } |
| 3287 | 3287 |
| 3288 if (!rfh) | 3288 if (!rfh) |
| 3289 return AXTreeIDRegistry::kNoAXTreeID; | 3289 return ui::AXTreeIDRegistry::kNoAXTreeID; |
| 3290 | 3290 |
| 3291 return rfh->GetAXTreeID(); | 3291 return rfh->GetAXTreeID(); |
| 3292 } | 3292 } |
| 3293 | 3293 |
| 3294 AXTreeIDRegistry::AXTreeID | 3294 ui::AXTreeIDRegistry::AXTreeID |
| 3295 RenderFrameHostImpl::BrowserPluginInstanceIDToAXTreeID( | 3295 RenderFrameHostImpl::BrowserPluginInstanceIDToAXTreeID(int instance_id) { |
| 3296 int instance_id) { | |
| 3297 RenderFrameHostImpl* guest = static_cast<RenderFrameHostImpl*>( | 3296 RenderFrameHostImpl* guest = static_cast<RenderFrameHostImpl*>( |
| 3298 delegate()->GetGuestByInstanceID(this, instance_id)); | 3297 delegate()->GetGuestByInstanceID(this, instance_id)); |
| 3299 if (!guest) | 3298 if (!guest) |
| 3300 return AXTreeIDRegistry::kNoAXTreeID; | 3299 return ui::AXTreeIDRegistry::kNoAXTreeID; |
| 3301 | 3300 |
| 3302 // Create a mapping from the guest to its embedder's AX Tree ID, and | 3301 // Create a mapping from the guest to its embedder's AX Tree ID, and |
| 3303 // explicitly update the guest to propagate that mapping immediately. | 3302 // explicitly update the guest to propagate that mapping immediately. |
| 3304 guest->set_browser_plugin_embedder_ax_tree_id(GetAXTreeID()); | 3303 guest->set_browser_plugin_embedder_ax_tree_id(GetAXTreeID()); |
| 3305 guest->UpdateAXTreeData(); | 3304 guest->UpdateAXTreeData(); |
| 3306 | 3305 |
| 3307 return guest->GetAXTreeID(); | 3306 return guest->GetAXTreeID(); |
| 3308 } | 3307 } |
| 3309 | 3308 |
| 3310 void RenderFrameHostImpl::AXContentNodeDataToAXNodeData( | 3309 void RenderFrameHostImpl::AXContentNodeDataToAXNodeData( |
| (...skipping 30 matching lines...) Expand all Loading... |
| 3341 | 3340 |
| 3342 // Copy the common fields. | 3341 // Copy the common fields. |
| 3343 *dst = src; | 3342 *dst = src; |
| 3344 | 3343 |
| 3345 if (src.routing_id != -1) | 3344 if (src.routing_id != -1) |
| 3346 dst->tree_id = RoutingIDToAXTreeID(src.routing_id); | 3345 dst->tree_id = RoutingIDToAXTreeID(src.routing_id); |
| 3347 | 3346 |
| 3348 if (src.parent_routing_id != -1) | 3347 if (src.parent_routing_id != -1) |
| 3349 dst->parent_tree_id = RoutingIDToAXTreeID(src.parent_routing_id); | 3348 dst->parent_tree_id = RoutingIDToAXTreeID(src.parent_routing_id); |
| 3350 | 3349 |
| 3351 if (browser_plugin_embedder_ax_tree_id_ != AXTreeIDRegistry::kNoAXTreeID) | 3350 if (browser_plugin_embedder_ax_tree_id_ != ui::AXTreeIDRegistry::kNoAXTreeID) |
| 3352 dst->parent_tree_id = browser_plugin_embedder_ax_tree_id_; | 3351 dst->parent_tree_id = browser_plugin_embedder_ax_tree_id_; |
| 3353 | 3352 |
| 3354 // If this is not the root frame tree node, we're done. | 3353 // If this is not the root frame tree node, we're done. |
| 3355 if (frame_tree_node()->parent()) | 3354 if (frame_tree_node()->parent()) |
| 3356 return; | 3355 return; |
| 3357 | 3356 |
| 3358 // For the root frame tree node, also store the AXTreeID of the focused frame. | 3357 // For the root frame tree node, also store the AXTreeID of the focused frame. |
| 3359 // TODO(avallee): https://crbug.com/610795: No focus ax events. | 3358 // TODO(avallee): https://crbug.com/610795: No focus ax events. |
| 3360 // This is probably where we need to fix the bug to enable the test. | 3359 // This is probably where we need to fix the bug to enable the test. |
| 3361 FrameTreeNode* focused_frame_tree_node = frame_tree_->GetFocusedFrame(); | 3360 FrameTreeNode* focused_frame_tree_node = frame_tree_->GetFocusedFrame(); |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3506 // There is no pending NavigationEntry in these cases, so pass 0 as the | 3505 // There is no pending NavigationEntry in these cases, so pass 0 as the |
| 3507 // pending_nav_entry_id. If the previous handle was a prematurely aborted | 3506 // pending_nav_entry_id. If the previous handle was a prematurely aborted |
| 3508 // navigation loaded via LoadDataWithBaseURL, propagate the entry id. | 3507 // navigation loaded via LoadDataWithBaseURL, propagate the entry id. |
| 3509 return NavigationHandleImpl::Create( | 3508 return NavigationHandleImpl::Create( |
| 3510 params.url, params.redirects, frame_tree_node_, is_renderer_initiated, | 3509 params.url, params.redirects, frame_tree_node_, is_renderer_initiated, |
| 3511 params.was_within_same_page, base::TimeTicks::Now(), | 3510 params.was_within_same_page, base::TimeTicks::Now(), |
| 3512 entry_id_for_data_nav, false); // started_from_context_menu | 3511 entry_id_for_data_nav, false); // started_from_context_menu |
| 3513 } | 3512 } |
| 3514 | 3513 |
| 3515 } // namespace content | 3514 } // namespace content |
| OLD | NEW |