Chromium Code Reviews| 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/navigation_controller_impl.h" | 5 #include "content/browser/frame_host/navigation_controller_impl.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <memory> | 10 #include <memory> |
| (...skipping 2442 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2453 main_test_rfh()->OnCreateChildFrame( | 2453 main_test_rfh()->OnCreateChildFrame( |
| 2454 process()->GetNextRoutingID(), blink::WebTreeScopeType::Document, | 2454 process()->GetNextRoutingID(), blink::WebTreeScopeType::Document, |
| 2455 std::string(), unique_name, blink::WebSandboxFlags::None, | 2455 std::string(), unique_name, blink::WebSandboxFlags::None, |
| 2456 FrameOwnerProperties()); | 2456 FrameOwnerProperties()); |
| 2457 TestRenderFrameHost* subframe = static_cast<TestRenderFrameHost*>( | 2457 TestRenderFrameHost* subframe = static_cast<TestRenderFrameHost*>( |
| 2458 contents()->GetFrameTree()->root()->child_at(0)->current_frame_host()); | 2458 contents()->GetFrameTree()->root()->child_at(0)->current_frame_host()); |
| 2459 const GURL subframe_url("http://foo1/subframe"); | 2459 const GURL subframe_url("http://foo1/subframe"); |
| 2460 | 2460 |
| 2461 // Compute the sequence number assigned by Blink. | 2461 // Compute the sequence number assigned by Blink. |
| 2462 int64_t item_sequence_number1 = base::Time::Now().ToDoubleT() * 1000000; | 2462 int64_t item_sequence_number1 = base::Time::Now().ToDoubleT() * 1000000; |
| 2463 int64_t document_sequence_number1 = base::Time::Now().ToDoubleT() * 1000000; | |
|
nasko
2016/09/08 00:18:59
Let's use the same strategy that Blink uses for th
ananta
2016/09/08 00:41:38
Thanks. Added a function GenerateSequenceNumbers()
| |
| 2463 | 2464 |
| 2464 { | 2465 { |
| 2465 FrameHostMsg_DidCommitProvisionalLoad_Params params; | 2466 FrameHostMsg_DidCommitProvisionalLoad_Params params; |
| 2466 params.page_id = 1; | 2467 params.page_id = 1; |
| 2467 params.nav_entry_id = 0; | 2468 params.nav_entry_id = 0; |
| 2468 params.frame_unique_name = unique_name; | 2469 params.frame_unique_name = unique_name; |
| 2469 params.did_create_new_entry = false; | 2470 params.did_create_new_entry = false; |
| 2470 params.url = subframe_url; | 2471 params.url = subframe_url; |
| 2471 params.transition = ui::PAGE_TRANSITION_AUTO_SUBFRAME; | 2472 params.transition = ui::PAGE_TRANSITION_AUTO_SUBFRAME; |
| 2472 params.should_update_history = false; | 2473 params.should_update_history = false; |
| 2473 params.gesture = NavigationGestureUser; | 2474 params.gesture = NavigationGestureUser; |
| 2474 params.method = "GET"; | 2475 params.method = "GET"; |
| 2475 params.page_state = PageState::CreateFromURL(subframe_url); | 2476 params.page_state = PageState::CreateForTestingWithSequenceNumbers( |
| 2477 subframe_url, item_sequence_number1, document_sequence_number1); | |
| 2476 params.item_sequence_number = item_sequence_number1; | 2478 params.item_sequence_number = item_sequence_number1; |
| 2477 | 2479 |
| 2478 // Navigating should do nothing. | 2480 // Navigating should do nothing. |
| 2479 subframe->SendRendererInitiatedNavigationRequest(subframe_url, false); | 2481 subframe->SendRendererInitiatedNavigationRequest(subframe_url, false); |
| 2480 subframe->PrepareForCommit(); | 2482 subframe->PrepareForCommit(); |
| 2481 subframe->SendNavigateWithParams(¶ms); | 2483 subframe->SendNavigateWithParams(¶ms); |
| 2482 | 2484 |
| 2483 // In UseSubframeNavigationEntries mode, we notify of a PageState update to | 2485 // In UseSubframeNavigationEntries mode, we notify of a PageState update to |
| 2484 // the entry here rather than during UpdateState. | 2486 // the entry here rather than during UpdateState. |
| 2485 if (SiteIsolationPolicy::UseSubframeNavigationEntries()) | 2487 if (SiteIsolationPolicy::UseSubframeNavigationEntries()) |
| 2486 EXPECT_TRUE(notifications.Check1AndReset(NOTIFICATION_NAV_ENTRY_CHANGED)); | 2488 EXPECT_TRUE(notifications.Check1AndReset(NOTIFICATION_NAV_ENTRY_CHANGED)); |
| 2487 else | 2489 else |
| 2488 EXPECT_EQ(0U, notifications.size()); | 2490 EXPECT_EQ(0U, notifications.size()); |
| 2489 } | 2491 } |
| 2490 | 2492 |
| 2491 // First manual subframe navigation. | 2493 // First manual subframe navigation. |
| 2492 const GURL url2("http://foo2"); | 2494 const GURL url2("http://foo2"); |
| 2493 int64_t item_sequence_number2 = base::Time::Now().ToDoubleT() * 1000000; | 2495 int64_t item_sequence_number2 = base::Time::Now().ToDoubleT() * 1000000; |
| 2496 int64_t document_sequence_number2 = base::Time::Now().ToDoubleT() * 1000000; | |
| 2494 FrameHostMsg_DidCommitProvisionalLoad_Params params; | 2497 FrameHostMsg_DidCommitProvisionalLoad_Params params; |
| 2495 params.page_id = 2; | 2498 params.page_id = 2; |
| 2496 params.nav_entry_id = 0; | 2499 params.nav_entry_id = 0; |
| 2497 params.frame_unique_name = unique_name; | 2500 params.frame_unique_name = unique_name; |
| 2498 params.did_create_new_entry = true; | 2501 params.did_create_new_entry = true; |
| 2499 params.url = url2; | 2502 params.url = url2; |
| 2500 params.transition = ui::PAGE_TRANSITION_MANUAL_SUBFRAME; | 2503 params.transition = ui::PAGE_TRANSITION_MANUAL_SUBFRAME; |
| 2501 params.should_update_history = false; | 2504 params.should_update_history = false; |
| 2502 params.gesture = NavigationGestureUser; | 2505 params.gesture = NavigationGestureUser; |
| 2503 params.method = "GET"; | 2506 params.method = "GET"; |
| 2504 params.page_state = PageState::CreateFromURL(url2); | 2507 params.page_state = PageState::CreateForTestingWithSequenceNumbers( |
| 2508 url2, item_sequence_number2, document_sequence_number2); | |
| 2505 params.item_sequence_number = item_sequence_number2; | 2509 params.item_sequence_number = item_sequence_number2; |
| 2506 | 2510 |
| 2507 // This should generate a new entry. | 2511 // This should generate a new entry. |
| 2508 subframe->SendRendererInitiatedNavigationRequest(url2, false); | 2512 subframe->SendRendererInitiatedNavigationRequest(url2, false); |
| 2509 subframe->PrepareForCommit(); | 2513 subframe->PrepareForCommit(); |
| 2510 subframe->SendNavigateWithParams(¶ms); | 2514 subframe->SendNavigateWithParams(¶ms); |
| 2511 NavigationEntryImpl* entry2 = controller.GetLastCommittedEntry(); | 2515 NavigationEntryImpl* entry2 = controller.GetLastCommittedEntry(); |
| 2512 EXPECT_EQ(1U, navigation_entry_committed_counter_); | 2516 EXPECT_EQ(1U, navigation_entry_committed_counter_); |
| 2513 navigation_entry_committed_counter_ = 0; | 2517 navigation_entry_committed_counter_ = 0; |
| 2514 EXPECT_EQ(2, controller.GetEntryCount()); | 2518 EXPECT_EQ(2, controller.GetEntryCount()); |
| 2515 | 2519 |
| 2516 // Verify subframe entries if they're enabled (e.g. in --site-per-process). | 2520 // Verify subframe entries if they're enabled (e.g. in --site-per-process). |
| 2517 if (SiteIsolationPolicy::UseSubframeNavigationEntries()) { | 2521 if (SiteIsolationPolicy::UseSubframeNavigationEntries()) { |
| 2518 // The entry should have a subframe FrameNavigationEntry. | 2522 // The entry should have a subframe FrameNavigationEntry. |
| 2519 ASSERT_EQ(1U, entry2->root_node()->children.size()); | 2523 ASSERT_EQ(1U, entry2->root_node()->children.size()); |
| 2520 EXPECT_EQ(url2, entry2->root_node()->children[0]->frame_entry->url()); | 2524 EXPECT_EQ(url2, entry2->root_node()->children[0]->frame_entry->url()); |
| 2521 } else { | 2525 } else { |
| 2522 // There are no subframe FrameNavigationEntries by default. | 2526 // There are no subframe FrameNavigationEntries by default. |
| 2523 EXPECT_EQ(0U, entry2->root_node()->children.size()); | 2527 EXPECT_EQ(0U, entry2->root_node()->children.size()); |
| 2524 } | 2528 } |
| 2525 | 2529 |
| 2526 | 2530 |
| 2527 // Second manual subframe navigation should also make a new entry. | 2531 // Second manual subframe navigation should also make a new entry. |
| 2528 const GURL url3("http://foo3"); | 2532 const GURL url3("http://foo3"); |
| 2533 int64_t item_sequence_number3 = base::Time::Now().ToDoubleT() * 1000000; | |
| 2534 int64_t document_sequence_number3 = base::Time::Now().ToDoubleT() * 1000000; | |
| 2529 params.page_id = 3; | 2535 params.page_id = 3; |
| 2530 params.nav_entry_id = 0; | 2536 params.nav_entry_id = 0; |
| 2531 params.frame_unique_name = unique_name; | 2537 params.frame_unique_name = unique_name; |
| 2532 params.did_create_new_entry = true; | 2538 params.did_create_new_entry = true; |
| 2533 params.url = url3; | 2539 params.url = url3; |
| 2534 params.transition = ui::PAGE_TRANSITION_MANUAL_SUBFRAME; | 2540 params.transition = ui::PAGE_TRANSITION_MANUAL_SUBFRAME; |
| 2535 params.page_state = PageState::CreateFromURL(url3); | 2541 params.item_sequence_number = item_sequence_number3; |
|
nasko
2016/09/08 00:18:59
Let's be consistent and set ISN and DSN for each p
ananta
2016/09/08 00:41:38
Done.
| |
| 2536 params.item_sequence_number = base::Time::Now().ToDoubleT() * 1000000; | 2542 params.page_state = PageState::CreateForTestingWithSequenceNumbers( |
| 2543 url3, item_sequence_number3, document_sequence_number3); | |
| 2537 subframe->SendRendererInitiatedNavigationRequest(url3, false); | 2544 subframe->SendRendererInitiatedNavigationRequest(url3, false); |
| 2538 subframe->PrepareForCommit(); | 2545 subframe->PrepareForCommit(); |
| 2539 subframe->SendNavigateWithParams(¶ms); | 2546 subframe->SendNavigateWithParams(¶ms); |
| 2540 EXPECT_EQ(1U, navigation_entry_committed_counter_); | 2547 EXPECT_EQ(1U, navigation_entry_committed_counter_); |
| 2541 navigation_entry_committed_counter_ = 0; | 2548 navigation_entry_committed_counter_ = 0; |
| 2542 NavigationEntryImpl* entry3 = controller.GetLastCommittedEntry(); | 2549 NavigationEntryImpl* entry3 = controller.GetLastCommittedEntry(); |
| 2543 EXPECT_EQ(3, controller.GetEntryCount()); | 2550 EXPECT_EQ(3, controller.GetEntryCount()); |
| 2544 EXPECT_EQ(2, controller.GetCurrentEntryIndex()); | 2551 EXPECT_EQ(2, controller.GetCurrentEntryIndex()); |
| 2545 | 2552 |
| 2546 // Verify subframe entries if they're enabled (e.g. in --site-per-process). | 2553 // Verify subframe entries if they're enabled (e.g. in --site-per-process). |
| 2547 if (SiteIsolationPolicy::UseSubframeNavigationEntries()) { | 2554 if (SiteIsolationPolicy::UseSubframeNavigationEntries()) { |
| 2548 // The entry should have a subframe FrameNavigationEntry. | 2555 // The entry should have a subframe FrameNavigationEntry. |
| 2549 ASSERT_EQ(1U, entry3->root_node()->children.size()); | 2556 ASSERT_EQ(1U, entry3->root_node()->children.size()); |
| 2550 EXPECT_EQ(url3, entry3->root_node()->children[0]->frame_entry->url()); | 2557 EXPECT_EQ(url3, entry3->root_node()->children[0]->frame_entry->url()); |
| 2551 } else { | 2558 } else { |
| 2552 // There are no subframe FrameNavigationEntries by default. | 2559 // There are no subframe FrameNavigationEntries by default. |
| 2553 EXPECT_EQ(0U, entry3->root_node()->children.size()); | 2560 EXPECT_EQ(0U, entry3->root_node()->children.size()); |
| 2554 } | 2561 } |
| 2555 | 2562 |
| 2556 // Go back one. | 2563 // Go back one. |
| 2557 controller.GoBack(); | 2564 controller.GoBack(); |
| 2558 params.page_id = 2; | 2565 params.page_id = 2; |
| 2559 params.nav_entry_id = entry2->GetUniqueID(); | 2566 params.nav_entry_id = entry2->GetUniqueID(); |
| 2560 params.frame_unique_name = unique_name; | 2567 params.frame_unique_name = unique_name; |
| 2561 params.did_create_new_entry = false; | 2568 params.did_create_new_entry = false; |
| 2562 params.url = url2; | 2569 params.url = url2; |
| 2563 params.transition = ui::PAGE_TRANSITION_AUTO_SUBFRAME; | 2570 params.transition = ui::PAGE_TRANSITION_AUTO_SUBFRAME; |
| 2564 params.page_state = PageState::CreateFromURL(url2); | 2571 params.page_state = PageState::CreateForTestingWithSequenceNumbers( |
| 2572 url2, item_sequence_number2, document_sequence_number2); | |
| 2565 params.item_sequence_number = item_sequence_number2; | 2573 params.item_sequence_number = item_sequence_number2; |
| 2566 subframe->PrepareForCommit(); | 2574 subframe->PrepareForCommit(); |
| 2567 subframe->SendNavigateWithParams(¶ms); | 2575 subframe->SendNavigateWithParams(¶ms); |
| 2568 EXPECT_EQ(1U, navigation_entry_committed_counter_); | 2576 EXPECT_EQ(1U, navigation_entry_committed_counter_); |
| 2569 navigation_entry_committed_counter_ = 0; | 2577 navigation_entry_committed_counter_ = 0; |
| 2570 EXPECT_EQ(entry2, controller.GetLastCommittedEntry()); | 2578 EXPECT_EQ(entry2, controller.GetLastCommittedEntry()); |
| 2571 EXPECT_EQ(3, controller.GetEntryCount()); | 2579 EXPECT_EQ(3, controller.GetEntryCount()); |
| 2572 EXPECT_EQ(1, controller.GetCurrentEntryIndex()); | 2580 EXPECT_EQ(1, controller.GetCurrentEntryIndex()); |
| 2573 EXPECT_EQ(-1, controller.GetPendingEntryIndex()); | 2581 EXPECT_EQ(-1, controller.GetPendingEntryIndex()); |
| 2574 EXPECT_FALSE(controller.GetPendingEntry()); | 2582 EXPECT_FALSE(controller.GetPendingEntry()); |
| 2575 | 2583 |
| 2576 // Go back one more. | 2584 // Go back one more. |
| 2577 controller.GoBack(); | 2585 controller.GoBack(); |
| 2578 params.page_id = 1; | 2586 params.page_id = 1; |
| 2579 params.nav_entry_id = entry1->GetUniqueID(); | 2587 params.nav_entry_id = entry1->GetUniqueID(); |
| 2580 params.frame_unique_name = unique_name; | 2588 params.frame_unique_name = unique_name; |
| 2581 params.did_create_new_entry = false; | 2589 params.did_create_new_entry = false; |
| 2582 params.url = subframe_url; | 2590 params.url = subframe_url; |
| 2583 params.transition = ui::PAGE_TRANSITION_AUTO_SUBFRAME; | 2591 params.transition = ui::PAGE_TRANSITION_AUTO_SUBFRAME; |
| 2584 params.page_state = PageState::CreateFromURL(subframe_url); | 2592 params.page_state = PageState::CreateForTestingWithSequenceNumbers( |
| 2593 subframe_url, item_sequence_number1, document_sequence_number1); | |
| 2585 params.item_sequence_number = item_sequence_number1; | 2594 params.item_sequence_number = item_sequence_number1; |
| 2586 subframe->PrepareForCommit(); | 2595 subframe->PrepareForCommit(); |
| 2587 subframe->SendNavigateWithParams(¶ms); | 2596 subframe->SendNavigateWithParams(¶ms); |
| 2588 EXPECT_EQ(1U, navigation_entry_committed_counter_); | 2597 EXPECT_EQ(1U, navigation_entry_committed_counter_); |
| 2589 navigation_entry_committed_counter_ = 0; | 2598 navigation_entry_committed_counter_ = 0; |
| 2590 EXPECT_EQ(entry1, controller.GetLastCommittedEntry()); | 2599 EXPECT_EQ(entry1, controller.GetLastCommittedEntry()); |
| 2591 EXPECT_EQ(3, controller.GetEntryCount()); | 2600 EXPECT_EQ(3, controller.GetEntryCount()); |
| 2592 EXPECT_EQ(0, controller.GetCurrentEntryIndex()); | 2601 EXPECT_EQ(0, controller.GetCurrentEntryIndex()); |
| 2593 EXPECT_EQ(-1, controller.GetPendingEntryIndex()); | 2602 EXPECT_EQ(-1, controller.GetPendingEntryIndex()); |
| 2594 EXPECT_FALSE(controller.GetPendingEntry()); | 2603 EXPECT_FALSE(controller.GetPendingEntry()); |
| (...skipping 2723 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5318 // means that occasionally a navigation conflict will end up with one entry | 5327 // means that occasionally a navigation conflict will end up with one entry |
| 5319 // bubbling to the end of the entry list, but that's the least-bad option. | 5328 // bubbling to the end of the entry list, but that's the least-bad option. |
| 5320 EXPECT_EQ(3, controller.GetEntryCount()); | 5329 EXPECT_EQ(3, controller.GetEntryCount()); |
| 5321 EXPECT_EQ(2, controller.GetCurrentEntryIndex()); | 5330 EXPECT_EQ(2, controller.GetCurrentEntryIndex()); |
| 5322 EXPECT_EQ(url_a, controller.GetEntryAtIndex(0)->GetURL()); | 5331 EXPECT_EQ(url_a, controller.GetEntryAtIndex(0)->GetURL()); |
| 5323 EXPECT_EQ(url_c, controller.GetEntryAtIndex(1)->GetURL()); | 5332 EXPECT_EQ(url_c, controller.GetEntryAtIndex(1)->GetURL()); |
| 5324 EXPECT_EQ(url_b, controller.GetEntryAtIndex(2)->GetURL()); | 5333 EXPECT_EQ(url_b, controller.GetEntryAtIndex(2)->GetURL()); |
| 5325 } | 5334 } |
| 5326 | 5335 |
| 5327 } // namespace content | 5336 } // namespace content |
| OLD | NEW |