| 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/public/browser/android/java_interfaces.h" | 116 #include "content/public/browser/android/java_interfaces.h" |
| 117 #include "content/browser/media/android/media_player_renderer.h" | 117 #include "content/browser/media/android/media_player_renderer.h" |
| 118 #include "media/base/audio_renderer_sink.h" | 118 #include "media/base/audio_renderer_sink.h" |
| 119 #include "media/base/video_renderer_sink.h" | 119 #include "media/base/video_renderer_sink.h" |
| 120 #include "media/mojo/services/mojo_renderer_service.h" // nogncheck | 120 #include "media/mojo/services/mojo_renderer_service.h" // nogncheck |
| (...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 290 } | 290 } |
| 291 | 291 |
| 292 // static | 292 // static |
| 293 RenderFrameHost* RenderFrameHost::FromAXTreeID( | 293 RenderFrameHost* RenderFrameHost::FromAXTreeID( |
| 294 int ax_tree_id) { | 294 int ax_tree_id) { |
| 295 return RenderFrameHostImpl::FromAXTreeID(ax_tree_id); | 295 return RenderFrameHostImpl::FromAXTreeID(ax_tree_id); |
| 296 } | 296 } |
| 297 | 297 |
| 298 // static | 298 // static |
| 299 RenderFrameHostImpl* RenderFrameHostImpl::FromAXTreeID( | 299 RenderFrameHostImpl* RenderFrameHostImpl::FromAXTreeID( |
| 300 AXTreeIDRegistry::AXTreeID ax_tree_id) { | 300 ui::AXTreeIDRegistry::AXTreeID ax_tree_id) { |
| 301 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 301 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 302 AXTreeIDRegistry::FrameID frame_id = | 302 ui::AXTreeIDRegistry::FrameID frame_id = |
| 303 AXTreeIDRegistry::GetInstance()->GetFrameID(ax_tree_id); | 303 ui::AXTreeIDRegistry::GetInstance()->GetFrameID(ax_tree_id); |
| 304 return RenderFrameHostImpl::FromID(frame_id.first, frame_id.second); | 304 return RenderFrameHostImpl::FromID(frame_id.first, frame_id.second); |
| 305 } | 305 } |
| 306 | 306 |
| 307 RenderFrameHostImpl::RenderFrameHostImpl(SiteInstance* site_instance, | 307 RenderFrameHostImpl::RenderFrameHostImpl(SiteInstance* site_instance, |
| 308 RenderViewHostImpl* render_view_host, | 308 RenderViewHostImpl* render_view_host, |
| 309 RenderFrameHostDelegate* delegate, | 309 RenderFrameHostDelegate* delegate, |
| 310 RenderWidgetHostDelegate* rwh_delegate, | 310 RenderWidgetHostDelegate* rwh_delegate, |
| 311 FrameTree* frame_tree, | 311 FrameTree* frame_tree, |
| 312 FrameTreeNode* frame_tree_node, | 312 FrameTreeNode* frame_tree_node, |
| 313 int32_t routing_id, | 313 int32_t routing_id, |
| (...skipping 14 matching lines...) Expand all Loading... |
| 328 is_waiting_for_swapout_ack_(false), | 328 is_waiting_for_swapout_ack_(false), |
| 329 render_frame_created_(false), | 329 render_frame_created_(false), |
| 330 navigations_suspended_(false), | 330 navigations_suspended_(false), |
| 331 is_waiting_for_beforeunload_ack_(false), | 331 is_waiting_for_beforeunload_ack_(false), |
| 332 unload_ack_is_for_navigation_(false), | 332 unload_ack_is_for_navigation_(false), |
| 333 is_loading_(false), | 333 is_loading_(false), |
| 334 pending_commit_(false), | 334 pending_commit_(false), |
| 335 nav_entry_id_(0), | 335 nav_entry_id_(0), |
| 336 accessibility_reset_token_(0), | 336 accessibility_reset_token_(0), |
| 337 accessibility_reset_count_(0), | 337 accessibility_reset_count_(0), |
| 338 browser_plugin_embedder_ax_tree_id_(AXTreeIDRegistry::kNoAXTreeID), | 338 browser_plugin_embedder_ax_tree_id_(ui::AXTreeIDRegistry::kNoAXTreeID), |
| 339 no_create_browser_accessibility_manager_for_testing_(false), | 339 no_create_browser_accessibility_manager_for_testing_(false), |
| 340 web_ui_type_(WebUI::kNoWebUI), | 340 web_ui_type_(WebUI::kNoWebUI), |
| 341 pending_web_ui_type_(WebUI::kNoWebUI), | 341 pending_web_ui_type_(WebUI::kNoWebUI), |
| 342 should_reuse_web_ui_(false), | 342 should_reuse_web_ui_(false), |
| 343 has_selection_(false), | 343 has_selection_(false), |
| 344 last_navigation_previews_state_(PREVIEWS_UNSPECIFIED), | 344 last_navigation_previews_state_(PREVIEWS_UNSPECIFIED), |
| 345 frame_host_binding_(this), | 345 frame_host_binding_(this), |
| 346 waiting_for_init_(renderer_initiated_creation), | 346 waiting_for_init_(renderer_initiated_creation), |
| 347 has_focused_editable_element_(false), | 347 has_focused_editable_element_(false), |
| 348 weak_ptr_factory_(this) { | 348 weak_ptr_factory_(this) { |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 449 | 449 |
| 450 // Notify the FrameTree that this RFH is going away, allowing it to shut down | 450 // Notify the FrameTree that this RFH is going away, allowing it to shut down |
| 451 // the corresponding RenderViewHost if it is no longer needed. | 451 // the corresponding RenderViewHost if it is no longer needed. |
| 452 frame_tree_->ReleaseRenderViewHostRef(render_view_host_); | 452 frame_tree_->ReleaseRenderViewHostRef(render_view_host_); |
| 453 } | 453 } |
| 454 | 454 |
| 455 int RenderFrameHostImpl::GetRoutingID() { | 455 int RenderFrameHostImpl::GetRoutingID() { |
| 456 return routing_id_; | 456 return routing_id_; |
| 457 } | 457 } |
| 458 | 458 |
| 459 AXTreeIDRegistry::AXTreeID RenderFrameHostImpl::GetAXTreeID() { | 459 ui::AXTreeIDRegistry::AXTreeID RenderFrameHostImpl::GetAXTreeID() { |
| 460 return AXTreeIDRegistry::GetInstance()->GetOrCreateAXTreeID( | 460 return ui::AXTreeIDRegistry::GetInstance()->GetOrCreateAXTreeID( |
| 461 GetProcess()->GetID(), routing_id_); | 461 GetProcess()->GetID(), routing_id_); |
| 462 } | 462 } |
| 463 | 463 |
| 464 SiteInstanceImpl* RenderFrameHostImpl::GetSiteInstance() { | 464 SiteInstanceImpl* RenderFrameHostImpl::GetSiteInstance() { |
| 465 return site_instance_.get(); | 465 return site_instance_.get(); |
| 466 } | 466 } |
| 467 | 467 |
| 468 RenderProcessHost* RenderFrameHostImpl::GetProcess() { | 468 RenderProcessHost* RenderFrameHostImpl::GetProcess() { |
| 469 return process_; | 469 return process_; |
| 470 } | 470 } |
| (...skipping 2755 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3226 frame_tree_node_->current_url().SchemeIs(kChromeDevToolsScheme) || | 3226 frame_tree_node_->current_url().SchemeIs(kChromeDevToolsScheme) || |
| 3227 ChildProcessSecurityPolicyImpl::GetInstance()->HasWebUIBindings( | 3227 ChildProcessSecurityPolicyImpl::GetInstance()->HasWebUIBindings( |
| 3228 GetProcess()->GetID()) || | 3228 GetProcess()->GetID()) || |
| 3229 // It's possible to load about:blank in a Web UI renderer. | 3229 // It's possible to load about:blank in a Web UI renderer. |
| 3230 // See http://crbug.com/42547 | 3230 // See http://crbug.com/42547 |
| 3231 (frame_tree_node_->current_url().spec() == url::kAboutBlankURL) || | 3231 (frame_tree_node_->current_url().spec() == url::kAboutBlankURL) || |
| 3232 // InterstitialPageImpl should be the only case matching this. | 3232 // InterstitialPageImpl should be the only case matching this. |
| 3233 (delegate_->GetAsWebContents() == nullptr); | 3233 (delegate_->GetAsWebContents() == nullptr); |
| 3234 } | 3234 } |
| 3235 | 3235 |
| 3236 AXTreeIDRegistry::AXTreeID RenderFrameHostImpl::RoutingIDToAXTreeID( | 3236 ui::AXTreeIDRegistry::AXTreeID RenderFrameHostImpl::RoutingIDToAXTreeID( |
| 3237 int routing_id) { | 3237 int routing_id) { |
| 3238 RenderFrameHostImpl* rfh = nullptr; | 3238 RenderFrameHostImpl* rfh = nullptr; |
| 3239 RenderFrameProxyHost* rfph = RenderFrameProxyHost::FromID( | 3239 RenderFrameProxyHost* rfph = RenderFrameProxyHost::FromID( |
| 3240 GetProcess()->GetID(), routing_id); | 3240 GetProcess()->GetID(), routing_id); |
| 3241 if (rfph) { | 3241 if (rfph) { |
| 3242 FrameTree* frame_tree = rfph->frame_tree_node()->frame_tree(); | 3242 FrameTree* frame_tree = rfph->frame_tree_node()->frame_tree(); |
| 3243 FrameTreeNode* frame_tree_node = frame_tree->FindByRoutingID( | 3243 FrameTreeNode* frame_tree_node = frame_tree->FindByRoutingID( |
| 3244 GetProcess()->GetID(), routing_id); | 3244 GetProcess()->GetID(), routing_id); |
| 3245 rfh = frame_tree_node->render_manager()->current_frame_host(); | 3245 rfh = frame_tree_node->render_manager()->current_frame_host(); |
| 3246 } else { | 3246 } else { |
| 3247 rfh = RenderFrameHostImpl::FromID(GetProcess()->GetID(), routing_id); | 3247 rfh = RenderFrameHostImpl::FromID(GetProcess()->GetID(), routing_id); |
| 3248 | 3248 |
| 3249 // As a sanity check, make sure we're within the same frame tree and | 3249 // As a sanity check, make sure we're within the same frame tree and |
| 3250 // crash the renderer if not. | 3250 // crash the renderer if not. |
| 3251 if (rfh && | 3251 if (rfh && |
| 3252 rfh->frame_tree_node()->frame_tree() != | 3252 rfh->frame_tree_node()->frame_tree() != |
| 3253 frame_tree_node()->frame_tree()) { | 3253 frame_tree_node()->frame_tree()) { |
| 3254 AccessibilityFatalError(); | 3254 AccessibilityFatalError(); |
| 3255 return AXTreeIDRegistry::kNoAXTreeID; | 3255 return ui::AXTreeIDRegistry::kNoAXTreeID; |
| 3256 } | 3256 } |
| 3257 } | 3257 } |
| 3258 | 3258 |
| 3259 if (!rfh) | 3259 if (!rfh) |
| 3260 return AXTreeIDRegistry::kNoAXTreeID; | 3260 return ui::AXTreeIDRegistry::kNoAXTreeID; |
| 3261 | 3261 |
| 3262 return rfh->GetAXTreeID(); | 3262 return rfh->GetAXTreeID(); |
| 3263 } | 3263 } |
| 3264 | 3264 |
| 3265 AXTreeIDRegistry::AXTreeID | 3265 ui::AXTreeIDRegistry::AXTreeID |
| 3266 RenderFrameHostImpl::BrowserPluginInstanceIDToAXTreeID( | 3266 RenderFrameHostImpl::BrowserPluginInstanceIDToAXTreeID(int instance_id) { |
| 3267 int instance_id) { | |
| 3268 RenderFrameHostImpl* guest = static_cast<RenderFrameHostImpl*>( | 3267 RenderFrameHostImpl* guest = static_cast<RenderFrameHostImpl*>( |
| 3269 delegate()->GetGuestByInstanceID(this, instance_id)); | 3268 delegate()->GetGuestByInstanceID(this, instance_id)); |
| 3270 if (!guest) | 3269 if (!guest) |
| 3271 return AXTreeIDRegistry::kNoAXTreeID; | 3270 return ui::AXTreeIDRegistry::kNoAXTreeID; |
| 3272 | 3271 |
| 3273 // Create a mapping from the guest to its embedder's AX Tree ID, and | 3272 // Create a mapping from the guest to its embedder's AX Tree ID, and |
| 3274 // explicitly update the guest to propagate that mapping immediately. | 3273 // explicitly update the guest to propagate that mapping immediately. |
| 3275 guest->set_browser_plugin_embedder_ax_tree_id(GetAXTreeID()); | 3274 guest->set_browser_plugin_embedder_ax_tree_id(GetAXTreeID()); |
| 3276 guest->UpdateAXTreeData(); | 3275 guest->UpdateAXTreeData(); |
| 3277 | 3276 |
| 3278 return guest->GetAXTreeID(); | 3277 return guest->GetAXTreeID(); |
| 3279 } | 3278 } |
| 3280 | 3279 |
| 3281 void RenderFrameHostImpl::AXContentNodeDataToAXNodeData( | 3280 void RenderFrameHostImpl::AXContentNodeDataToAXNodeData( |
| (...skipping 30 matching lines...) Expand all Loading... |
| 3312 | 3311 |
| 3313 // Copy the common fields. | 3312 // Copy the common fields. |
| 3314 *dst = src; | 3313 *dst = src; |
| 3315 | 3314 |
| 3316 if (src.routing_id != -1) | 3315 if (src.routing_id != -1) |
| 3317 dst->tree_id = RoutingIDToAXTreeID(src.routing_id); | 3316 dst->tree_id = RoutingIDToAXTreeID(src.routing_id); |
| 3318 | 3317 |
| 3319 if (src.parent_routing_id != -1) | 3318 if (src.parent_routing_id != -1) |
| 3320 dst->parent_tree_id = RoutingIDToAXTreeID(src.parent_routing_id); | 3319 dst->parent_tree_id = RoutingIDToAXTreeID(src.parent_routing_id); |
| 3321 | 3320 |
| 3322 if (browser_plugin_embedder_ax_tree_id_ != AXTreeIDRegistry::kNoAXTreeID) | 3321 if (browser_plugin_embedder_ax_tree_id_ != ui::AXTreeIDRegistry::kNoAXTreeID) |
| 3323 dst->parent_tree_id = browser_plugin_embedder_ax_tree_id_; | 3322 dst->parent_tree_id = browser_plugin_embedder_ax_tree_id_; |
| 3324 | 3323 |
| 3325 // If this is not the root frame tree node, we're done. | 3324 // If this is not the root frame tree node, we're done. |
| 3326 if (frame_tree_node()->parent()) | 3325 if (frame_tree_node()->parent()) |
| 3327 return; | 3326 return; |
| 3328 | 3327 |
| 3329 // For the root frame tree node, also store the AXTreeID of the focused frame. | 3328 // For the root frame tree node, also store the AXTreeID of the focused frame. |
| 3330 // TODO(avallee): https://crbug.com/610795: No focus ax events. | 3329 // TODO(avallee): https://crbug.com/610795: No focus ax events. |
| 3331 // This is probably where we need to fix the bug to enable the test. | 3330 // This is probably where we need to fix the bug to enable the test. |
| 3332 FrameTreeNode* focused_frame_tree_node = frame_tree_->GetFocusedFrame(); | 3331 FrameTreeNode* focused_frame_tree_node = frame_tree_->GetFocusedFrame(); |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3477 // There is no pending NavigationEntry in these cases, so pass 0 as the | 3476 // There is no pending NavigationEntry in these cases, so pass 0 as the |
| 3478 // pending_nav_entry_id. If the previous handle was a prematurely aborted | 3477 // pending_nav_entry_id. If the previous handle was a prematurely aborted |
| 3479 // navigation loaded via LoadDataWithBaseURL, propagate the entry id. | 3478 // navigation loaded via LoadDataWithBaseURL, propagate the entry id. |
| 3480 return NavigationHandleImpl::Create( | 3479 return NavigationHandleImpl::Create( |
| 3481 params.url, params.redirects, frame_tree_node_, is_renderer_initiated, | 3480 params.url, params.redirects, frame_tree_node_, is_renderer_initiated, |
| 3482 params.was_within_same_page, base::TimeTicks::Now(), | 3481 params.was_within_same_page, base::TimeTicks::Now(), |
| 3483 entry_id_for_data_nav, false); // started_from_context_menu | 3482 entry_id_for_data_nav, false); // started_from_context_menu |
| 3484 } | 3483 } |
| 3485 | 3484 |
| 3486 } // namespace content | 3485 } // namespace content |
| OLD | NEW |