| 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 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 100 #include "device/wake_lock/wake_lock_service_context.h" | 99 #include "device/wake_lock/wake_lock_service_context.h" |
| 101 #include "media/base/media_switches.h" | 100 #include "media/base/media_switches.h" |
| 102 #include "media/media_features.h" | 101 #include "media/media_features.h" |
| 103 #include "media/mojo/interfaces/media_service.mojom.h" | 102 #include "media/mojo/interfaces/media_service.mojom.h" |
| 104 #include "media/mojo/interfaces/remoting.mojom.h" | 103 #include "media/mojo/interfaces/remoting.mojom.h" |
| 105 #include "mojo/public/cpp/bindings/associated_interface_ptr.h" | 104 #include "mojo/public/cpp/bindings/associated_interface_ptr.h" |
| 106 #include "mojo/public/cpp/bindings/strong_binding.h" | 105 #include "mojo/public/cpp/bindings/strong_binding.h" |
| 107 #include "services/service_manager/public/cpp/connector.h" | 106 #include "services/service_manager/public/cpp/connector.h" |
| 108 #include "services/service_manager/public/cpp/interface_provider.h" | 107 #include "services/service_manager/public/cpp/interface_provider.h" |
| 109 #include "ui/accessibility/ax_tree.h" | 108 #include "ui/accessibility/ax_tree.h" |
| 109 #include "ui/accessibility/ax_tree_id_registry.h" |
| 110 #include "ui/accessibility/ax_tree_update.h" | 110 #include "ui/accessibility/ax_tree_update.h" |
| 111 #include "ui/gfx/geometry/quad_f.h" | 111 #include "ui/gfx/geometry/quad_f.h" |
| 112 #include "url/gurl.h" | 112 #include "url/gurl.h" |
| 113 | 113 |
| 114 #if defined(OS_ANDROID) | 114 #if defined(OS_ANDROID) |
| 115 #include "content/browser/android/app_web_message_port_message_filter.h" | 115 #include "content/browser/android/app_web_message_port_message_filter.h" |
| 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" |
| (...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 286 } | 286 } |
| 287 | 287 |
| 288 // static | 288 // static |
| 289 RenderFrameHost* RenderFrameHost::FromAXTreeID( | 289 RenderFrameHost* RenderFrameHost::FromAXTreeID( |
| 290 int ax_tree_id) { | 290 int ax_tree_id) { |
| 291 return RenderFrameHostImpl::FromAXTreeID(ax_tree_id); | 291 return RenderFrameHostImpl::FromAXTreeID(ax_tree_id); |
| 292 } | 292 } |
| 293 | 293 |
| 294 // static | 294 // static |
| 295 RenderFrameHostImpl* RenderFrameHostImpl::FromAXTreeID( | 295 RenderFrameHostImpl* RenderFrameHostImpl::FromAXTreeID( |
| 296 AXTreeIDRegistry::AXTreeID ax_tree_id) { | 296 ui::AXTreeIDRegistry::AXTreeID ax_tree_id) { |
| 297 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 297 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 298 AXTreeIDRegistry::FrameID frame_id = | 298 ui::AXTreeIDRegistry::FrameID frame_id = |
| 299 AXTreeIDRegistry::GetInstance()->GetFrameID(ax_tree_id); | 299 ui::AXTreeIDRegistry::GetInstance()->GetFrameID(ax_tree_id); |
| 300 return RenderFrameHostImpl::FromID(frame_id.first, frame_id.second); | 300 return RenderFrameHostImpl::FromID(frame_id.first, frame_id.second); |
| 301 } | 301 } |
| 302 | 302 |
| 303 RenderFrameHostImpl::RenderFrameHostImpl(SiteInstance* site_instance, | 303 RenderFrameHostImpl::RenderFrameHostImpl(SiteInstance* site_instance, |
| 304 RenderViewHostImpl* render_view_host, | 304 RenderViewHostImpl* render_view_host, |
| 305 RenderFrameHostDelegate* delegate, | 305 RenderFrameHostDelegate* delegate, |
| 306 RenderWidgetHostDelegate* rwh_delegate, | 306 RenderWidgetHostDelegate* rwh_delegate, |
| 307 FrameTree* frame_tree, | 307 FrameTree* frame_tree, |
| 308 FrameTreeNode* frame_tree_node, | 308 FrameTreeNode* frame_tree_node, |
| 309 int32_t routing_id, | 309 int32_t routing_id, |
| (...skipping 14 matching lines...) Expand all Loading... |
| 324 is_waiting_for_swapout_ack_(false), | 324 is_waiting_for_swapout_ack_(false), |
| 325 render_frame_created_(false), | 325 render_frame_created_(false), |
| 326 navigations_suspended_(false), | 326 navigations_suspended_(false), |
| 327 is_waiting_for_beforeunload_ack_(false), | 327 is_waiting_for_beforeunload_ack_(false), |
| 328 unload_ack_is_for_navigation_(false), | 328 unload_ack_is_for_navigation_(false), |
| 329 is_loading_(false), | 329 is_loading_(false), |
| 330 pending_commit_(false), | 330 pending_commit_(false), |
| 331 nav_entry_id_(0), | 331 nav_entry_id_(0), |
| 332 accessibility_reset_token_(0), | 332 accessibility_reset_token_(0), |
| 333 accessibility_reset_count_(0), | 333 accessibility_reset_count_(0), |
| 334 browser_plugin_embedder_ax_tree_id_(AXTreeIDRegistry::kNoAXTreeID), | 334 browser_plugin_embedder_ax_tree_id_(ui::AXTreeIDRegistry::kNoAXTreeID), |
| 335 no_create_browser_accessibility_manager_for_testing_(false), | 335 no_create_browser_accessibility_manager_for_testing_(false), |
| 336 web_ui_type_(WebUI::kNoWebUI), | 336 web_ui_type_(WebUI::kNoWebUI), |
| 337 pending_web_ui_type_(WebUI::kNoWebUI), | 337 pending_web_ui_type_(WebUI::kNoWebUI), |
| 338 should_reuse_web_ui_(false), | 338 should_reuse_web_ui_(false), |
| 339 has_selection_(false), | 339 has_selection_(false), |
| 340 last_navigation_previews_state_(PREVIEWS_UNSPECIFIED), | 340 last_navigation_previews_state_(PREVIEWS_UNSPECIFIED), |
| 341 frame_host_binding_(this), | 341 frame_host_binding_(this), |
| 342 waiting_for_init_(renderer_initiated_creation), | 342 waiting_for_init_(renderer_initiated_creation), |
| 343 has_focused_editable_element_(false), | 343 has_focused_editable_element_(false), |
| 344 weak_ptr_factory_(this) { | 344 weak_ptr_factory_(this) { |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 441 | 441 |
| 442 // Notify the FrameTree that this RFH is going away, allowing it to shut down | 442 // Notify the FrameTree that this RFH is going away, allowing it to shut down |
| 443 // the corresponding RenderViewHost if it is no longer needed. | 443 // the corresponding RenderViewHost if it is no longer needed. |
| 444 frame_tree_->ReleaseRenderViewHostRef(render_view_host_); | 444 frame_tree_->ReleaseRenderViewHostRef(render_view_host_); |
| 445 } | 445 } |
| 446 | 446 |
| 447 int RenderFrameHostImpl::GetRoutingID() { | 447 int RenderFrameHostImpl::GetRoutingID() { |
| 448 return routing_id_; | 448 return routing_id_; |
| 449 } | 449 } |
| 450 | 450 |
| 451 AXTreeIDRegistry::AXTreeID RenderFrameHostImpl::GetAXTreeID() { | 451 ui::AXTreeIDRegistry::AXTreeID RenderFrameHostImpl::GetAXTreeID() { |
| 452 return AXTreeIDRegistry::GetInstance()->GetOrCreateAXTreeID( | 452 return ui::AXTreeIDRegistry::GetInstance()->GetOrCreateAXTreeID( |
| 453 GetProcess()->GetID(), routing_id_); | 453 GetProcess()->GetID(), routing_id_); |
| 454 } | 454 } |
| 455 | 455 |
| 456 SiteInstanceImpl* RenderFrameHostImpl::GetSiteInstance() { | 456 SiteInstanceImpl* RenderFrameHostImpl::GetSiteInstance() { |
| 457 return site_instance_.get(); | 457 return site_instance_.get(); |
| 458 } | 458 } |
| 459 | 459 |
| 460 RenderProcessHost* RenderFrameHostImpl::GetProcess() { | 460 RenderProcessHost* RenderFrameHostImpl::GetProcess() { |
| 461 return process_; | 461 return process_; |
| 462 } | 462 } |
| (...skipping 2712 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3175 frame_tree_node_->current_url().SchemeIs(kChromeDevToolsScheme) || | 3175 frame_tree_node_->current_url().SchemeIs(kChromeDevToolsScheme) || |
| 3176 ChildProcessSecurityPolicyImpl::GetInstance()->HasWebUIBindings( | 3176 ChildProcessSecurityPolicyImpl::GetInstance()->HasWebUIBindings( |
| 3177 GetProcess()->GetID()) || | 3177 GetProcess()->GetID()) || |
| 3178 // It's possible to load about:blank in a Web UI renderer. | 3178 // It's possible to load about:blank in a Web UI renderer. |
| 3179 // See http://crbug.com/42547 | 3179 // See http://crbug.com/42547 |
| 3180 (frame_tree_node_->current_url().spec() == url::kAboutBlankURL) || | 3180 (frame_tree_node_->current_url().spec() == url::kAboutBlankURL) || |
| 3181 // InterstitialPageImpl should be the only case matching this. | 3181 // InterstitialPageImpl should be the only case matching this. |
| 3182 (delegate_->GetAsWebContents() == nullptr); | 3182 (delegate_->GetAsWebContents() == nullptr); |
| 3183 } | 3183 } |
| 3184 | 3184 |
| 3185 AXTreeIDRegistry::AXTreeID RenderFrameHostImpl::RoutingIDToAXTreeID( | 3185 ui::AXTreeIDRegistry::AXTreeID RenderFrameHostImpl::RoutingIDToAXTreeID( |
| 3186 int routing_id) { | 3186 int routing_id) { |
| 3187 RenderFrameHostImpl* rfh = nullptr; | 3187 RenderFrameHostImpl* rfh = nullptr; |
| 3188 RenderFrameProxyHost* rfph = RenderFrameProxyHost::FromID( | 3188 RenderFrameProxyHost* rfph = RenderFrameProxyHost::FromID( |
| 3189 GetProcess()->GetID(), routing_id); | 3189 GetProcess()->GetID(), routing_id); |
| 3190 if (rfph) { | 3190 if (rfph) { |
| 3191 FrameTree* frame_tree = rfph->frame_tree_node()->frame_tree(); | 3191 FrameTree* frame_tree = rfph->frame_tree_node()->frame_tree(); |
| 3192 FrameTreeNode* frame_tree_node = frame_tree->FindByRoutingID( | 3192 FrameTreeNode* frame_tree_node = frame_tree->FindByRoutingID( |
| 3193 GetProcess()->GetID(), routing_id); | 3193 GetProcess()->GetID(), routing_id); |
| 3194 rfh = frame_tree_node->render_manager()->current_frame_host(); | 3194 rfh = frame_tree_node->render_manager()->current_frame_host(); |
| 3195 } else { | 3195 } else { |
| 3196 rfh = RenderFrameHostImpl::FromID(GetProcess()->GetID(), routing_id); | 3196 rfh = RenderFrameHostImpl::FromID(GetProcess()->GetID(), routing_id); |
| 3197 | 3197 |
| 3198 // As a sanity check, make sure we're within the same frame tree and | 3198 // As a sanity check, make sure we're within the same frame tree and |
| 3199 // crash the renderer if not. | 3199 // crash the renderer if not. |
| 3200 if (rfh && | 3200 if (rfh && |
| 3201 rfh->frame_tree_node()->frame_tree() != | 3201 rfh->frame_tree_node()->frame_tree() != |
| 3202 frame_tree_node()->frame_tree()) { | 3202 frame_tree_node()->frame_tree()) { |
| 3203 AccessibilityFatalError(); | 3203 AccessibilityFatalError(); |
| 3204 return AXTreeIDRegistry::kNoAXTreeID; | 3204 return ui::AXTreeIDRegistry::kNoAXTreeID; |
| 3205 } | 3205 } |
| 3206 } | 3206 } |
| 3207 | 3207 |
| 3208 if (!rfh) | 3208 if (!rfh) |
| 3209 return AXTreeIDRegistry::kNoAXTreeID; | 3209 return ui::AXTreeIDRegistry::kNoAXTreeID; |
| 3210 | 3210 |
| 3211 return rfh->GetAXTreeID(); | 3211 return rfh->GetAXTreeID(); |
| 3212 } | 3212 } |
| 3213 | 3213 |
| 3214 AXTreeIDRegistry::AXTreeID | 3214 ui::AXTreeIDRegistry::AXTreeID |
| 3215 RenderFrameHostImpl::BrowserPluginInstanceIDToAXTreeID( | 3215 RenderFrameHostImpl::BrowserPluginInstanceIDToAXTreeID(int instance_id) { |
| 3216 int instance_id) { | |
| 3217 RenderFrameHostImpl* guest = static_cast<RenderFrameHostImpl*>( | 3216 RenderFrameHostImpl* guest = static_cast<RenderFrameHostImpl*>( |
| 3218 delegate()->GetGuestByInstanceID(this, instance_id)); | 3217 delegate()->GetGuestByInstanceID(this, instance_id)); |
| 3219 if (!guest) | 3218 if (!guest) |
| 3220 return AXTreeIDRegistry::kNoAXTreeID; | 3219 return ui::AXTreeIDRegistry::kNoAXTreeID; |
| 3221 | 3220 |
| 3222 // Create a mapping from the guest to its embedder's AX Tree ID, and | 3221 // Create a mapping from the guest to its embedder's AX Tree ID, and |
| 3223 // explicitly update the guest to propagate that mapping immediately. | 3222 // explicitly update the guest to propagate that mapping immediately. |
| 3224 guest->set_browser_plugin_embedder_ax_tree_id(GetAXTreeID()); | 3223 guest->set_browser_plugin_embedder_ax_tree_id(GetAXTreeID()); |
| 3225 guest->UpdateAXTreeData(); | 3224 guest->UpdateAXTreeData(); |
| 3226 | 3225 |
| 3227 return guest->GetAXTreeID(); | 3226 return guest->GetAXTreeID(); |
| 3228 } | 3227 } |
| 3229 | 3228 |
| 3230 void RenderFrameHostImpl::AXContentNodeDataToAXNodeData( | 3229 void RenderFrameHostImpl::AXContentNodeDataToAXNodeData( |
| (...skipping 30 matching lines...) Expand all Loading... |
| 3261 | 3260 |
| 3262 // Copy the common fields. | 3261 // Copy the common fields. |
| 3263 *dst = src; | 3262 *dst = src; |
| 3264 | 3263 |
| 3265 if (src.routing_id != -1) | 3264 if (src.routing_id != -1) |
| 3266 dst->tree_id = RoutingIDToAXTreeID(src.routing_id); | 3265 dst->tree_id = RoutingIDToAXTreeID(src.routing_id); |
| 3267 | 3266 |
| 3268 if (src.parent_routing_id != -1) | 3267 if (src.parent_routing_id != -1) |
| 3269 dst->parent_tree_id = RoutingIDToAXTreeID(src.parent_routing_id); | 3268 dst->parent_tree_id = RoutingIDToAXTreeID(src.parent_routing_id); |
| 3270 | 3269 |
| 3271 if (browser_plugin_embedder_ax_tree_id_ != AXTreeIDRegistry::kNoAXTreeID) | 3270 if (browser_plugin_embedder_ax_tree_id_ != ui::AXTreeIDRegistry::kNoAXTreeID) |
| 3272 dst->parent_tree_id = browser_plugin_embedder_ax_tree_id_; | 3271 dst->parent_tree_id = browser_plugin_embedder_ax_tree_id_; |
| 3273 | 3272 |
| 3274 // If this is not the root frame tree node, we're done. | 3273 // If this is not the root frame tree node, we're done. |
| 3275 if (frame_tree_node()->parent()) | 3274 if (frame_tree_node()->parent()) |
| 3276 return; | 3275 return; |
| 3277 | 3276 |
| 3278 // For the root frame tree node, also store the AXTreeID of the focused frame. | 3277 // For the root frame tree node, also store the AXTreeID of the focused frame. |
| 3279 // TODO(avallee): https://crbug.com/610795: No focus ax events. | 3278 // TODO(avallee): https://crbug.com/610795: No focus ax events. |
| 3280 // This is probably where we need to fix the bug to enable the test. | 3279 // This is probably where we need to fix the bug to enable the test. |
| 3281 FrameTreeNode* focused_frame_tree_node = frame_tree_->GetFocusedFrame(); | 3280 FrameTreeNode* focused_frame_tree_node = frame_tree_->GetFocusedFrame(); |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3406 // There is no pending NavigationEntry in these cases, so pass 0 as the | 3405 // There is no pending NavigationEntry in these cases, so pass 0 as the |
| 3407 // pending_nav_entry_id. If the previous handle was a prematurely aborted | 3406 // pending_nav_entry_id. If the previous handle was a prematurely aborted |
| 3408 // navigation loaded via LoadDataWithBaseURL, propagate the entry id. | 3407 // navigation loaded via LoadDataWithBaseURL, propagate the entry id. |
| 3409 return NavigationHandleImpl::Create( | 3408 return NavigationHandleImpl::Create( |
| 3410 params.url, frame_tree_node_, is_renderer_initiated, | 3409 params.url, frame_tree_node_, is_renderer_initiated, |
| 3411 params.was_within_same_page, base::TimeTicks::Now(), | 3410 params.was_within_same_page, base::TimeTicks::Now(), |
| 3412 entry_id_for_data_nav, false); // started_from_context_menu | 3411 entry_id_for_data_nav, false); // started_from_context_menu |
| 3413 } | 3412 } |
| 3414 | 3413 |
| 3415 } // namespace content | 3414 } // namespace content |
| OLD | NEW |