| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/test/content_browser_test_utils_internal.h" | 5 #include "content/test/content_browser_test_utils_internal.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <map> | 10 #include <map> |
| 11 #include <set> | 11 #include <set> |
| 12 #include <vector> | 12 #include <vector> |
| 13 | 13 |
| 14 #include "base/strings/stringprintf.h" | 14 #include "base/strings/stringprintf.h" |
| 15 #include "base/test/test_timeouts.h" | 15 #include "base/test/test_timeouts.h" |
| 16 #include "base/threading/thread_task_runner_handle.h" | 16 #include "base/threading/thread_task_runner_handle.h" |
| 17 #include "cc/surfaces/surface.h" | 17 #include "cc/surfaces/surface.h" |
| 18 #include "cc/surfaces/surface_manager.h" | 18 #include "cc/surfaces/surface_manager.h" |
| 19 #include "content/browser/compositor/surface_utils.h" | 19 #include "content/browser/compositor/surface_utils.h" |
| 20 #include "content/browser/frame_host/cross_process_frame_connector.h" | 20 #include "content/browser/frame_host/cross_process_frame_connector.h" |
| 21 #include "content/browser/frame_host/frame_tree_node.h" | 21 #include "content/browser/frame_host/frame_tree_node.h" |
| 22 #include "content/browser/frame_host/navigator.h" | 22 #include "content/browser/frame_host/navigator.h" |
| 23 #include "content/browser/frame_host/render_frame_proxy_host.h" | 23 #include "content/browser/frame_host/render_frame_proxy_host.h" |
| 24 #include "content/browser/frame_host/render_widget_host_view_child_frame.h" | 24 #include "content/browser/frame_host/render_widget_host_view_child_frame.h" |
| 25 #include "content/browser/renderer_host/delegated_frame_host.h" | 25 #include "content/browser/renderer_host/delegated_frame_host.h" |
| 26 #include "content/browser/renderer_host/render_widget_host_view_base.h" | 26 #include "content/browser/renderer_host/render_widget_host_view_base.h" |
| 27 #include "content/public/browser/navigation_handle.h" |
| 27 #include "content/public/browser/render_frame_host.h" | 28 #include "content/public/browser/render_frame_host.h" |
| 28 #include "content/public/browser/resource_dispatcher_host.h" | 29 #include "content/public/browser/resource_dispatcher_host.h" |
| 29 #include "content/public/browser/resource_throttle.h" | 30 #include "content/public/browser/resource_throttle.h" |
| 30 #include "content/public/browser/web_contents.h" | |
| 31 #include "content/public/common/file_chooser_file_info.h" | 31 #include "content/public/common/file_chooser_file_info.h" |
| 32 #include "content/public/common/file_chooser_params.h" | 32 #include "content/public/common/file_chooser_params.h" |
| 33 #include "content/public/test/browser_test_utils.h" | 33 #include "content/public/test/browser_test_utils.h" |
| 34 #include "content/public/test/content_browser_test_utils.h" | 34 #include "content/public/test/content_browser_test_utils.h" |
| 35 #include "content/shell/browser/shell.h" | 35 #include "content/shell/browser/shell.h" |
| 36 #include "content/shell/browser/shell_javascript_dialog_manager.h" | 36 #include "content/shell/browser/shell_javascript_dialog_manager.h" |
| 37 #include "content/test/test_frame_navigation_observer.h" | 37 #include "content/test/test_frame_navigation_observer.h" |
| 38 #include "net/url_request/url_request.h" | 38 #include "net/url_request/url_request.h" |
| 39 | 39 |
| 40 namespace content { | 40 namespace content { |
| 41 | 41 |
| 42 namespace { | |
| 43 | |
| 44 // Helper class used by the TestNavigationManager to pause navigations. | |
| 45 class TestNavigationManagerThrottle : public NavigationThrottle { | |
| 46 public: | |
| 47 TestNavigationManagerThrottle(NavigationHandle* handle, | |
| 48 base::Closure on_will_start_request_closure) | |
| 49 : NavigationThrottle(handle), | |
| 50 on_will_start_request_closure_(on_will_start_request_closure) {} | |
| 51 ~TestNavigationManagerThrottle() override {} | |
| 52 | |
| 53 private: | |
| 54 // NavigationThrottle implementation. | |
| 55 NavigationThrottle::ThrottleCheckResult WillStartRequest() override { | |
| 56 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | |
| 57 on_will_start_request_closure_); | |
| 58 return NavigationThrottle::DEFER; | |
| 59 } | |
| 60 | |
| 61 base::Closure on_will_start_request_closure_; | |
| 62 }; | |
| 63 | |
| 64 } // namespace | |
| 65 | |
| 66 void NavigateFrameToURL(FrameTreeNode* node, const GURL& url) { | 42 void NavigateFrameToURL(FrameTreeNode* node, const GURL& url) { |
| 67 TestFrameNavigationObserver observer(node); | 43 TestFrameNavigationObserver observer(node); |
| 68 NavigationController::LoadURLParams params(url); | 44 NavigationController::LoadURLParams params(url); |
| 69 params.transition_type = ui::PAGE_TRANSITION_LINK; | 45 params.transition_type = ui::PAGE_TRANSITION_LINK; |
| 70 params.frame_tree_node_id = node->frame_tree_node_id(); | 46 params.frame_tree_node_id = node->frame_tree_node_id(); |
| 71 node->navigator()->GetController()->LoadURLWithParams(params); | 47 node->navigator()->GetController()->LoadURLWithParams(params); |
| 72 observer.Wait(); | 48 observer.Wait(); |
| 73 } | 49 } |
| 74 | 50 |
| 75 void SetShouldProceedOnBeforeUnload(Shell* shell, bool proceed) { | 51 void SetShouldProceedOnBeforeUnload(Shell* shell, bool proceed) { |
| (...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 360 net::URLRequest* request, | 336 net::URLRequest* request, |
| 361 content::ResourceContext* resource_context, | 337 content::ResourceContext* resource_context, |
| 362 content::AppCacheService* appcache_service, | 338 content::AppCacheService* appcache_service, |
| 363 ResourceType resource_type, | 339 ResourceType resource_type, |
| 364 ScopedVector<content::ResourceThrottle>* throttles) { | 340 ScopedVector<content::ResourceThrottle>* throttles) { |
| 365 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); | 341 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); |
| 366 if (request->url() == url_) | 342 if (request->url() == url_) |
| 367 throttles->push_back(new HttpRequestStallThrottle); | 343 throttles->push_back(new HttpRequestStallThrottle); |
| 368 } | 344 } |
| 369 | 345 |
| 370 TestNavigationManager::TestNavigationManager( | |
| 371 int filtering_frame_tree_node_id, | |
| 372 WebContents* web_contents, | |
| 373 const GURL& url) | |
| 374 : WebContentsObserver(web_contents), | |
| 375 filtering_frame_tree_node_id_(filtering_frame_tree_node_id), | |
| 376 url_(url), | |
| 377 navigation_paused_(false), | |
| 378 handle_(nullptr), | |
| 379 weak_factory_(this) {} | |
| 380 | |
| 381 TestNavigationManager::TestNavigationManager(WebContents* web_contents, | |
| 382 const GURL& url) | |
| 383 : TestNavigationManager(FrameTreeNode::kFrameTreeNodeInvalidId, | |
| 384 web_contents, | |
| 385 url) {} | |
| 386 | |
| 387 TestNavigationManager::~TestNavigationManager() { | |
| 388 ResumeNavigation(); | |
| 389 } | |
| 390 | |
| 391 void TestNavigationManager::WaitForWillStartRequest() { | |
| 392 DCHECK(!did_finish_loop_runner_); | |
| 393 if (navigation_paused_) | |
| 394 return; | |
| 395 will_start_loop_runner_ = new MessageLoopRunner(); | |
| 396 will_start_loop_runner_->Run(); | |
| 397 will_start_loop_runner_ = nullptr; | |
| 398 } | |
| 399 | |
| 400 void TestNavigationManager::WaitForNavigationFinished() { | |
| 401 DCHECK(!will_start_loop_runner_); | |
| 402 // Ensure the navigation is resumed if the manager paused it previously. | |
| 403 if (navigation_paused_) | |
| 404 ResumeNavigation(); | |
| 405 did_finish_loop_runner_ = new MessageLoopRunner(); | |
| 406 did_finish_loop_runner_->Run(); | |
| 407 did_finish_loop_runner_ = nullptr; | |
| 408 } | |
| 409 | |
| 410 void TestNavigationManager::DidStartNavigation(NavigationHandle* handle) { | |
| 411 if (handle_ || handle->GetURL() != url_) | |
| 412 return; | |
| 413 | |
| 414 if (filtering_frame_tree_node_id_ != FrameTreeNode::kFrameTreeNodeInvalidId && | |
| 415 handle->GetFrameTreeNodeId() != filtering_frame_tree_node_id_) { | |
| 416 return; | |
| 417 } | |
| 418 | |
| 419 handle_ = handle; | |
| 420 std::unique_ptr<NavigationThrottle> throttle( | |
| 421 new TestNavigationManagerThrottle( | |
| 422 handle_, base::Bind(&TestNavigationManager::OnWillStartRequest, | |
| 423 weak_factory_.GetWeakPtr()))); | |
| 424 handle_->RegisterThrottleForTesting(std::move(throttle)); | |
| 425 } | |
| 426 | |
| 427 void TestNavigationManager::DidFinishNavigation(NavigationHandle* handle) { | |
| 428 if (handle != handle_) | |
| 429 return; | |
| 430 handle_ = nullptr; | |
| 431 navigation_paused_ = false; | |
| 432 if (did_finish_loop_runner_) | |
| 433 did_finish_loop_runner_->Quit(); | |
| 434 } | |
| 435 | |
| 436 void TestNavigationManager::OnWillStartRequest() { | |
| 437 navigation_paused_ = true; | |
| 438 if (will_start_loop_runner_) | |
| 439 will_start_loop_runner_->Quit(); | |
| 440 | |
| 441 // If waiting for the navigation to finish, resume the navigation. | |
| 442 if (did_finish_loop_runner_) | |
| 443 ResumeNavigation(); | |
| 444 } | |
| 445 | |
| 446 void TestNavigationManager::ResumeNavigation() { | |
| 447 if (!navigation_paused_ || !handle_) | |
| 448 return; | |
| 449 navigation_paused_ = false; | |
| 450 handle_->Resume(); | |
| 451 } | |
| 452 | |
| 453 FileChooserDelegate::FileChooserDelegate(const base::FilePath& file) | 346 FileChooserDelegate::FileChooserDelegate(const base::FilePath& file) |
| 454 : file_(file), file_chosen_(false) {} | 347 : file_(file), file_chosen_(false) {} |
| 455 | 348 |
| 456 void FileChooserDelegate::RunFileChooser(RenderFrameHost* render_frame_host, | 349 void FileChooserDelegate::RunFileChooser(RenderFrameHost* render_frame_host, |
| 457 const FileChooserParams& params) { | 350 const FileChooserParams& params) { |
| 458 // Send the selected file to the renderer process. | 351 // Send the selected file to the renderer process. |
| 459 FileChooserFileInfo file_info; | 352 FileChooserFileInfo file_info; |
| 460 file_info.file_path = file_; | 353 file_info.file_path = file_; |
| 461 std::vector<FileChooserFileInfo> files; | 354 std::vector<FileChooserFileInfo> files; |
| 462 files.push_back(file_info); | 355 files.push_back(file_info); |
| 463 render_frame_host->FilesSelectedInChooser(files, FileChooserParams::Open); | 356 render_frame_host->FilesSelectedInChooser(files, FileChooserParams::Open); |
| 464 | 357 |
| 465 file_chosen_ = true; | 358 file_chosen_ = true; |
| 466 } | 359 } |
| 467 | 360 |
| 361 PerFrameTestNavigationManager::PerFrameTestNavigationManager( |
| 362 int filtering_frame_tree_node_id, |
| 363 WebContents* web_contents, |
| 364 const GURL& url) |
| 365 : TestNavigationManager(web_contents, url), |
| 366 filtering_frame_tree_node_id_(filtering_frame_tree_node_id) {} |
| 367 |
| 368 bool PerFrameTestNavigationManager::ShouldMonitorNavigation( |
| 369 NavigationHandle* handle) { |
| 370 return TestNavigationManager::ShouldMonitorNavigation(handle) && |
| 371 handle->GetFrameTreeNodeId() == filtering_frame_tree_node_id_; |
| 372 } |
| 373 |
| 468 } // namespace content | 374 } // namespace content |
| OLD | NEW |