Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(556)

Side by Side Diff: content/renderer/render_view_browsertest.cc

Issue 14985014: Introduce content::PageState (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix compilation issues. Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "base/basictypes.h" 5 #include "base/basictypes.h"
6 6
7 #include "base/shared_memory.h" 7 #include "base/shared_memory.h"
8 #include "base/string_util.h" 8 #include "base/string_util.h"
9 #include "base/utf_string_conversions.h" 9 #include "base/utf_string_conversions.h"
10 #include "content/common/view_messages.h" 10 #include "content/common/view_messages.h"
11 #include "content/public/browser/native_web_keyboard_event.h" 11 #include "content/public/browser/native_web_keyboard_event.h"
12 #include "content/public/browser/web_ui_controller_factory.h" 12 #include "content/public/browser/web_ui_controller_factory.h"
13 #include "content/public/common/bindings_policy.h" 13 #include "content/public/common/bindings_policy.h"
14 #include "content/public/common/url_constants.h" 14 #include "content/public/common/url_constants.h"
15 #include "content/public/renderer/document_state.h" 15 #include "content/public/renderer/document_state.h"
16 #include "content/public/renderer/history_item_serialization.h"
16 #include "content/public/renderer/navigation_state.h" 17 #include "content/public/renderer/navigation_state.h"
17 #include "content/public/test/render_view_test.h" 18 #include "content/public/test/render_view_test.h"
18 #include "content/renderer/render_view_impl.h" 19 #include "content/renderer/render_view_impl.h"
19 #include "content/shell/common/shell_content_client.h" 20 #include "content/shell/common/shell_content_client.h"
20 #include "content/shell/shell_content_browser_client.h" 21 #include "content/shell/shell_content_browser_client.h"
21 #include "content/test/mock_keyboard.h" 22 #include "content/test/mock_keyboard.h"
22 #include "net/base/net_errors.h" 23 #include "net/base/net_errors.h"
23 #include "testing/gtest/include/gtest/gtest.h" 24 #include "testing/gtest/include/gtest/gtest.h"
24 #include "third_party/WebKit/Source/Platform/chromium/public/WebData.h" 25 #include "third_party/WebKit/Source/Platform/chromium/public/WebData.h"
25 #include "third_party/WebKit/Source/Platform/chromium/public/WebHTTPBody.h" 26 #include "third_party/WebKit/Source/Platform/chromium/public/WebHTTPBody.h"
26 #include "third_party/WebKit/Source/Platform/chromium/public/WebString.h" 27 #include "third_party/WebKit/Source/Platform/chromium/public/WebString.h"
27 #include "third_party/WebKit/Source/Platform/chromium/public/WebURLError.h" 28 #include "third_party/WebKit/Source/Platform/chromium/public/WebURLError.h"
28 #include "third_party/WebKit/Source/WebKit/chromium/public/WebHistoryItem.h" 29 #include "third_party/WebKit/Source/WebKit/chromium/public/WebHistoryItem.h"
29 #include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" 30 #include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h"
30 #include "third_party/WebKit/Source/WebKit/chromium/public/WebWindowFeatures.h" 31 #include "third_party/WebKit/Source/WebKit/chromium/public/WebWindowFeatures.h"
31 #include "ui/base/keycodes/keyboard_codes.h" 32 #include "ui/base/keycodes/keyboard_codes.h"
32 #include "ui/base/range/range.h" 33 #include "ui/base/range/range.h"
33 #include "ui/gfx/codec/jpeg_codec.h" 34 #include "ui/gfx/codec/jpeg_codec.h"
34 #include "webkit/glue/glue_serialize.h"
35 #include "webkit/glue/web_io_operators.h" 35 #include "webkit/glue/web_io_operators.h"
36 36
37 #if defined(OS_LINUX) && !defined(USE_AURA) 37 #if defined(OS_LINUX) && !defined(USE_AURA)
38 #include "ui/base/gtk/event_synthesis_gtk.h" 38 #include "ui/base/gtk/event_synthesis_gtk.h"
39 #endif 39 #endif
40 40
41 #if defined(USE_AURA) 41 #if defined(USE_AURA)
42 #include "ui/base/events/event.h" 42 #include "ui/base/events/event.h"
43 #endif 43 #endif
44 44
(...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after
294 const IPC::Message* frame_navigate_msg = 294 const IPC::Message* frame_navigate_msg =
295 render_thread_->sink().GetUniqueMessageMatching( 295 render_thread_->sink().GetUniqueMessageMatching(
296 ViewHostMsg_FrameNavigate::ID); 296 ViewHostMsg_FrameNavigate::ID);
297 EXPECT_TRUE(frame_navigate_msg); 297 EXPECT_TRUE(frame_navigate_msg);
298 298
299 ViewHostMsg_FrameNavigate::Param host_nav_params; 299 ViewHostMsg_FrameNavigate::Param host_nav_params;
300 ViewHostMsg_FrameNavigate::Read(frame_navigate_msg, &host_nav_params); 300 ViewHostMsg_FrameNavigate::Read(frame_navigate_msg, &host_nav_params);
301 EXPECT_TRUE(host_nav_params.a.is_post); 301 EXPECT_TRUE(host_nav_params.a.is_post);
302 302
303 // Check post data sent to browser matches 303 // Check post data sent to browser matches
304 EXPECT_FALSE(host_nav_params.a.content_state.empty()); 304 EXPECT_TRUE(host_nav_params.a.page_state.IsValid());
305 const WebKit::WebHistoryItem item = webkit_glue::HistoryItemFromString( 305 const WebKit::WebHistoryItem item = PageStateToHistoryItem(
306 host_nav_params.a.content_state); 306 host_nav_params.a.page_state);
307 WebKit::WebHTTPBody body = item.httpBody(); 307 WebKit::WebHTTPBody body = item.httpBody();
308 WebKit::WebHTTPBody::Element element; 308 WebKit::WebHTTPBody::Element element;
309 bool successful = body.elementAt(0, element); 309 bool successful = body.elementAt(0, element);
310 EXPECT_TRUE(successful); 310 EXPECT_TRUE(successful);
311 EXPECT_EQ(WebKit::WebHTTPBody::Element::TypeData, element.type); 311 EXPECT_EQ(WebKit::WebHTTPBody::Element::TypeData, element.type);
312 EXPECT_EQ(length, element.data.size()); 312 EXPECT_EQ(length, element.data.size());
313 EXPECT_EQ(0, memcmp(raw_data, element.data.data(), length)); 313 EXPECT_EQ(0, memcmp(raw_data, element.data.data(), length));
314 } 314 }
315 315
316 TEST_F(RenderViewImplTest, DecideNavigationPolicy) { 316 TEST_F(RenderViewImplTest, DecideNavigationPolicy) {
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after
480 480
481 // Load page B, which will trigger an UpdateState message for page A. 481 // Load page B, which will trigger an UpdateState message for page A.
482 LoadHTML("<div>Page B</div>"); 482 LoadHTML("<div>Page B</div>");
483 483
484 // Check for a valid UpdateState message for page A. 484 // Check for a valid UpdateState message for page A.
485 ProcessPendingMessages(); 485 ProcessPendingMessages();
486 const IPC::Message* msg_A = render_thread_->sink().GetUniqueMessageMatching( 486 const IPC::Message* msg_A = render_thread_->sink().GetUniqueMessageMatching(
487 ViewHostMsg_UpdateState::ID); 487 ViewHostMsg_UpdateState::ID);
488 ASSERT_TRUE(msg_A); 488 ASSERT_TRUE(msg_A);
489 int page_id_A; 489 int page_id_A;
490 std::string state_A; 490 PageState state_A;
491 ViewHostMsg_UpdateState::Read(msg_A, &page_id_A, &state_A); 491 ViewHostMsg_UpdateState::Read(msg_A, &page_id_A, &state_A);
492 EXPECT_EQ(1, page_id_A); 492 EXPECT_EQ(1, page_id_A);
493 render_thread_->sink().ClearMessages(); 493 render_thread_->sink().ClearMessages();
494 494
495 // Back to page A (page_id 1) and commit. 495 // Back to page A (page_id 1) and commit.
496 ViewMsg_Navigate_Params params_A; 496 ViewMsg_Navigate_Params params_A;
497 params_A.navigation_type = ViewMsg_Navigate_Type::NORMAL; 497 params_A.navigation_type = ViewMsg_Navigate_Type::NORMAL;
498 params_A.transition = PAGE_TRANSITION_FORWARD_BACK; 498 params_A.transition = PAGE_TRANSITION_FORWARD_BACK;
499 params_A.current_history_list_length = 2; 499 params_A.current_history_list_length = 2;
500 params_A.current_history_list_offset = 1; 500 params_A.current_history_list_offset = 1;
501 params_A.pending_history_list_offset = 0; 501 params_A.pending_history_list_offset = 0;
502 params_A.page_id = 1; 502 params_A.page_id = 1;
503 params_A.state = state_A; 503 params_A.page_state = state_A;
504 view()->OnNavigate(params_A); 504 view()->OnNavigate(params_A);
505 ProcessPendingMessages(); 505 ProcessPendingMessages();
506 506
507 // Respond to a swap out request. 507 // Respond to a swap out request.
508 ViewMsg_SwapOut_Params params; 508 ViewMsg_SwapOut_Params params;
509 params.closing_process_id = 10; 509 params.closing_process_id = 10;
510 params.closing_route_id = 11; 510 params.closing_route_id = 11;
511 params.new_render_process_host_id = 12; 511 params.new_render_process_host_id = 12;
512 params.new_request_id = 13; 512 params.new_request_id = 13;
513 view()->OnSwapOut(params); 513 view()->OnSwapOut(params);
514 514
515 // Check for a OnSwapOutACK. 515 // Check for a OnSwapOutACK.
516 const IPC::Message* msg = render_thread_->sink().GetUniqueMessageMatching( 516 const IPC::Message* msg = render_thread_->sink().GetUniqueMessageMatching(
517 ViewHostMsg_SwapOut_ACK::ID); 517 ViewHostMsg_SwapOut_ACK::ID);
518 ASSERT_TRUE(msg); 518 ASSERT_TRUE(msg);
519 render_thread_->sink().ClearMessages(); 519 render_thread_->sink().ClearMessages();
520 520
521 // It is possible to get a reload request at this point, containing the 521 // It is possible to get a reload request at this point, containing the
522 // params.state of the initial page (e.g., if the new page fails the 522 // params.page_state of the initial page (e.g., if the new page fails the
523 // provisional load in the renderer process, after we unload the old page). 523 // provisional load in the renderer process, after we unload the old page).
524 // Ensure the old page gets reloaded, not swappedout://. 524 // Ensure the old page gets reloaded, not swappedout://.
525 ViewMsg_Navigate_Params nav_params; 525 ViewMsg_Navigate_Params nav_params;
526 nav_params.url = GURL("data:text/html,<div>Page A</div>"); 526 nav_params.url = GURL("data:text/html,<div>Page A</div>");
527 nav_params.navigation_type = ViewMsg_Navigate_Type::RELOAD; 527 nav_params.navigation_type = ViewMsg_Navigate_Type::RELOAD;
528 nav_params.transition = PAGE_TRANSITION_RELOAD; 528 nav_params.transition = PAGE_TRANSITION_RELOAD;
529 nav_params.current_history_list_length = 2; 529 nav_params.current_history_list_length = 2;
530 nav_params.current_history_list_offset = 0; 530 nav_params.current_history_list_offset = 0;
531 nav_params.pending_history_list_offset = 0; 531 nav_params.pending_history_list_offset = 0;
532 nav_params.page_id = 1; 532 nav_params.page_id = 1;
533 nav_params.state = state_A; 533 nav_params.page_state = state_A;
534 view()->OnNavigate(nav_params); 534 view()->OnNavigate(nav_params);
535 ProcessPendingMessages(); 535 ProcessPendingMessages();
536 536
537 // Verify page A committed, not swappedout://. 537 // Verify page A committed, not swappedout://.
538 const IPC::Message* frame_navigate_msg = 538 const IPC::Message* frame_navigate_msg =
539 render_thread_->sink().GetUniqueMessageMatching( 539 render_thread_->sink().GetUniqueMessageMatching(
540 ViewHostMsg_FrameNavigate::ID); 540 ViewHostMsg_FrameNavigate::ID);
541 EXPECT_TRUE(frame_navigate_msg); 541 EXPECT_TRUE(frame_navigate_msg);
542 542
543 // Read URL out of the parent trait of the params object. 543 // Read URL out of the parent trait of the params object.
(...skipping 12 matching lines...) Expand all
556 556
557 // Load page B, which will trigger an UpdateState message for page A. 557 // Load page B, which will trigger an UpdateState message for page A.
558 LoadHTML("<div>Page B</div>"); 558 LoadHTML("<div>Page B</div>");
559 559
560 // Check for a valid UpdateState message for page A. 560 // Check for a valid UpdateState message for page A.
561 ProcessPendingMessages(); 561 ProcessPendingMessages();
562 const IPC::Message* msg_A = render_thread_->sink().GetUniqueMessageMatching( 562 const IPC::Message* msg_A = render_thread_->sink().GetUniqueMessageMatching(
563 ViewHostMsg_UpdateState::ID); 563 ViewHostMsg_UpdateState::ID);
564 ASSERT_TRUE(msg_A); 564 ASSERT_TRUE(msg_A);
565 int page_id_A; 565 int page_id_A;
566 std::string state_A; 566 PageState state_A;
567 ViewHostMsg_UpdateState::Read(msg_A, &page_id_A, &state_A); 567 ViewHostMsg_UpdateState::Read(msg_A, &page_id_A, &state_A);
568 EXPECT_EQ(1, page_id_A); 568 EXPECT_EQ(1, page_id_A);
569 render_thread_->sink().ClearMessages(); 569 render_thread_->sink().ClearMessages();
570 570
571 // Load page C, which will trigger an UpdateState message for page B. 571 // Load page C, which will trigger an UpdateState message for page B.
572 LoadHTML("<div>Page C</div>"); 572 LoadHTML("<div>Page C</div>");
573 573
574 // Check for a valid UpdateState for page B. 574 // Check for a valid UpdateState for page B.
575 ProcessPendingMessages(); 575 ProcessPendingMessages();
576 const IPC::Message* msg_B = render_thread_->sink().GetUniqueMessageMatching( 576 const IPC::Message* msg_B = render_thread_->sink().GetUniqueMessageMatching(
577 ViewHostMsg_UpdateState::ID); 577 ViewHostMsg_UpdateState::ID);
578 ASSERT_TRUE(msg_B); 578 ASSERT_TRUE(msg_B);
579 int page_id_B; 579 int page_id_B;
580 std::string state_B; 580 PageState state_B;
581 ViewHostMsg_UpdateState::Read(msg_B, &page_id_B, &state_B); 581 ViewHostMsg_UpdateState::Read(msg_B, &page_id_B, &state_B);
582 EXPECT_EQ(2, page_id_B); 582 EXPECT_EQ(2, page_id_B);
583 EXPECT_NE(state_A, state_B); 583 EXPECT_NE(state_A, state_B);
584 render_thread_->sink().ClearMessages(); 584 render_thread_->sink().ClearMessages();
585 585
586 // Load page D, which will trigger an UpdateState message for page C. 586 // Load page D, which will trigger an UpdateState message for page C.
587 LoadHTML("<div>Page D</div>"); 587 LoadHTML("<div>Page D</div>");
588 588
589 // Check for a valid UpdateState for page C. 589 // Check for a valid UpdateState for page C.
590 ProcessPendingMessages(); 590 ProcessPendingMessages();
591 const IPC::Message* msg_C = render_thread_->sink().GetUniqueMessageMatching( 591 const IPC::Message* msg_C = render_thread_->sink().GetUniqueMessageMatching(
592 ViewHostMsg_UpdateState::ID); 592 ViewHostMsg_UpdateState::ID);
593 ASSERT_TRUE(msg_C); 593 ASSERT_TRUE(msg_C);
594 int page_id_C; 594 int page_id_C;
595 std::string state_C; 595 PageState state_C;
596 ViewHostMsg_UpdateState::Read(msg_C, &page_id_C, &state_C); 596 ViewHostMsg_UpdateState::Read(msg_C, &page_id_C, &state_C);
597 EXPECT_EQ(3, page_id_C); 597 EXPECT_EQ(3, page_id_C);
598 EXPECT_NE(state_B, state_C); 598 EXPECT_NE(state_B, state_C);
599 render_thread_->sink().ClearMessages(); 599 render_thread_->sink().ClearMessages();
600 600
601 // Go back to C and commit, preparing for our real test. 601 // Go back to C and commit, preparing for our real test.
602 ViewMsg_Navigate_Params params_C; 602 ViewMsg_Navigate_Params params_C;
603 params_C.navigation_type = ViewMsg_Navigate_Type::NORMAL; 603 params_C.navigation_type = ViewMsg_Navigate_Type::NORMAL;
604 params_C.transition = PAGE_TRANSITION_FORWARD_BACK; 604 params_C.transition = PAGE_TRANSITION_FORWARD_BACK;
605 params_C.current_history_list_length = 4; 605 params_C.current_history_list_length = 4;
606 params_C.current_history_list_offset = 3; 606 params_C.current_history_list_offset = 3;
607 params_C.pending_history_list_offset = 2; 607 params_C.pending_history_list_offset = 2;
608 params_C.page_id = 3; 608 params_C.page_id = 3;
609 params_C.state = state_C; 609 params_C.page_state = state_C;
610 view()->OnNavigate(params_C); 610 view()->OnNavigate(params_C);
611 ProcessPendingMessages(); 611 ProcessPendingMessages();
612 render_thread_->sink().ClearMessages(); 612 render_thread_->sink().ClearMessages();
613 613
614 // Go back twice quickly, such that page B does not have a chance to commit. 614 // Go back twice quickly, such that page B does not have a chance to commit.
615 // This leads to two changes to the back/forward list but only one change to 615 // This leads to two changes to the back/forward list but only one change to
616 // the RenderView's page ID. 616 // the RenderView's page ID.
617 617
618 // Back to page B (page_id 2), without committing. 618 // Back to page B (page_id 2), without committing.
619 ViewMsg_Navigate_Params params_B; 619 ViewMsg_Navigate_Params params_B;
620 params_B.navigation_type = ViewMsg_Navigate_Type::NORMAL; 620 params_B.navigation_type = ViewMsg_Navigate_Type::NORMAL;
621 params_B.transition = PAGE_TRANSITION_FORWARD_BACK; 621 params_B.transition = PAGE_TRANSITION_FORWARD_BACK;
622 params_B.current_history_list_length = 4; 622 params_B.current_history_list_length = 4;
623 params_B.current_history_list_offset = 2; 623 params_B.current_history_list_offset = 2;
624 params_B.pending_history_list_offset = 1; 624 params_B.pending_history_list_offset = 1;
625 params_B.page_id = 2; 625 params_B.page_id = 2;
626 params_B.state = state_B; 626 params_B.page_state = state_B;
627 view()->OnNavigate(params_B); 627 view()->OnNavigate(params_B);
628 628
629 // Back to page A (page_id 1) and commit. 629 // Back to page A (page_id 1) and commit.
630 ViewMsg_Navigate_Params params; 630 ViewMsg_Navigate_Params params;
631 params.navigation_type = ViewMsg_Navigate_Type::NORMAL; 631 params.navigation_type = ViewMsg_Navigate_Type::NORMAL;
632 params.transition = PAGE_TRANSITION_FORWARD_BACK; 632 params.transition = PAGE_TRANSITION_FORWARD_BACK;
633 params_B.current_history_list_length = 4; 633 params_B.current_history_list_length = 4;
634 params_B.current_history_list_offset = 2; 634 params_B.current_history_list_offset = 2;
635 params_B.pending_history_list_offset = 0; 635 params_B.pending_history_list_offset = 0;
636 params.page_id = 1; 636 params.page_id = 1;
637 params.state = state_A; 637 params.page_state = state_A;
638 view()->OnNavigate(params); 638 view()->OnNavigate(params);
639 ProcessPendingMessages(); 639 ProcessPendingMessages();
640 640
641 // Now ensure that the UpdateState message we receive is consistent 641 // Now ensure that the UpdateState message we receive is consistent
642 // and represents page C in both page_id and state. 642 // and represents page C in both page_id and state.
643 const IPC::Message* msg = render_thread_->sink().GetUniqueMessageMatching( 643 const IPC::Message* msg = render_thread_->sink().GetUniqueMessageMatching(
644 ViewHostMsg_UpdateState::ID); 644 ViewHostMsg_UpdateState::ID);
645 ASSERT_TRUE(msg); 645 ASSERT_TRUE(msg);
646 int page_id; 646 int page_id;
647 std::string state; 647 PageState state;
648 ViewHostMsg_UpdateState::Read(msg, &page_id, &state); 648 ViewHostMsg_UpdateState::Read(msg, &page_id, &state);
649 EXPECT_EQ(page_id_C, page_id); 649 EXPECT_EQ(page_id_C, page_id);
650 EXPECT_NE(state_A, state); 650 EXPECT_NE(state_A, state);
651 EXPECT_NE(state_B, state); 651 EXPECT_NE(state_B, state);
652 EXPECT_EQ(state_C, state); 652 EXPECT_EQ(state_C, state);
653 } 653 }
654 654
655 // Test that the history_page_ids_ list can reveal when a stale back/forward 655 // Test that the history_page_ids_ list can reveal when a stale back/forward
656 // navigation arrives from the browser and can be ignored. See 656 // navigation arrives from the browser and can be ignored. See
657 // http://crbug.com/86758. 657 // http://crbug.com/86758.
658 TEST_F(RenderViewImplTest, StaleNavigationsIgnored) { 658 TEST_F(RenderViewImplTest, StaleNavigationsIgnored) {
659 // Load page A. 659 // Load page A.
660 LoadHTML("<div>Page A</div>"); 660 LoadHTML("<div>Page A</div>");
661 EXPECT_EQ(1, view()->history_list_length_); 661 EXPECT_EQ(1, view()->history_list_length_);
662 EXPECT_EQ(0, view()->history_list_offset_); 662 EXPECT_EQ(0, view()->history_list_offset_);
663 EXPECT_EQ(1, view()->history_page_ids_[0]); 663 EXPECT_EQ(1, view()->history_page_ids_[0]);
664 664
665 // Load page B, which will trigger an UpdateState message for page A. 665 // Load page B, which will trigger an UpdateState message for page A.
666 LoadHTML("<div>Page B</div>"); 666 LoadHTML("<div>Page B</div>");
667 EXPECT_EQ(2, view()->history_list_length_); 667 EXPECT_EQ(2, view()->history_list_length_);
668 EXPECT_EQ(1, view()->history_list_offset_); 668 EXPECT_EQ(1, view()->history_list_offset_);
669 EXPECT_EQ(2, view()->history_page_ids_[1]); 669 EXPECT_EQ(2, view()->history_page_ids_[1]);
670 670
671 // Check for a valid UpdateState message for page A. 671 // Check for a valid UpdateState message for page A.
672 ProcessPendingMessages(); 672 ProcessPendingMessages();
673 const IPC::Message* msg_A = render_thread_->sink().GetUniqueMessageMatching( 673 const IPC::Message* msg_A = render_thread_->sink().GetUniqueMessageMatching(
674 ViewHostMsg_UpdateState::ID); 674 ViewHostMsg_UpdateState::ID);
675 ASSERT_TRUE(msg_A); 675 ASSERT_TRUE(msg_A);
676 int page_id_A; 676 int page_id_A;
677 std::string state_A; 677 PageState state_A;
678 ViewHostMsg_UpdateState::Read(msg_A, &page_id_A, &state_A); 678 ViewHostMsg_UpdateState::Read(msg_A, &page_id_A, &state_A);
679 EXPECT_EQ(1, page_id_A); 679 EXPECT_EQ(1, page_id_A);
680 render_thread_->sink().ClearMessages(); 680 render_thread_->sink().ClearMessages();
681 681
682 // Back to page A (page_id 1) and commit. 682 // Back to page A (page_id 1) and commit.
683 ViewMsg_Navigate_Params params_A; 683 ViewMsg_Navigate_Params params_A;
684 params_A.navigation_type = ViewMsg_Navigate_Type::NORMAL; 684 params_A.navigation_type = ViewMsg_Navigate_Type::NORMAL;
685 params_A.transition = PAGE_TRANSITION_FORWARD_BACK; 685 params_A.transition = PAGE_TRANSITION_FORWARD_BACK;
686 params_A.current_history_list_length = 2; 686 params_A.current_history_list_length = 2;
687 params_A.current_history_list_offset = 1; 687 params_A.current_history_list_offset = 1;
688 params_A.pending_history_list_offset = 0; 688 params_A.pending_history_list_offset = 0;
689 params_A.page_id = 1; 689 params_A.page_id = 1;
690 params_A.state = state_A; 690 params_A.page_state = state_A;
691 view()->OnNavigate(params_A); 691 view()->OnNavigate(params_A);
692 ProcessPendingMessages(); 692 ProcessPendingMessages();
693 693
694 // A new navigation commits, clearing the forward history. 694 // A new navigation commits, clearing the forward history.
695 LoadHTML("<div>Page C</div>"); 695 LoadHTML("<div>Page C</div>");
696 EXPECT_EQ(2, view()->history_list_length_); 696 EXPECT_EQ(2, view()->history_list_length_);
697 EXPECT_EQ(1, view()->history_list_offset_); 697 EXPECT_EQ(1, view()->history_list_offset_);
698 EXPECT_EQ(3, view()->history_page_ids_[1]); 698 EXPECT_EQ(3, view()->history_page_ids_[1]);
699 699
700 // The browser then sends a stale navigation to B, which should be ignored. 700 // The browser then sends a stale navigation to B, which should be ignored.
701 ViewMsg_Navigate_Params params_B; 701 ViewMsg_Navigate_Params params_B;
702 params_B.navigation_type = ViewMsg_Navigate_Type::NORMAL; 702 params_B.navigation_type = ViewMsg_Navigate_Type::NORMAL;
703 params_B.transition = PAGE_TRANSITION_FORWARD_BACK; 703 params_B.transition = PAGE_TRANSITION_FORWARD_BACK;
704 params_B.current_history_list_length = 2; 704 params_B.current_history_list_length = 2;
705 params_B.current_history_list_offset = 0; 705 params_B.current_history_list_offset = 0;
706 params_B.pending_history_list_offset = 1; 706 params_B.pending_history_list_offset = 1;
707 params_B.page_id = 2; 707 params_B.page_id = 2;
708 params_B.state = state_A; // Doesn't matter, just has to be present. 708 params_B.page_state = state_A; // Doesn't matter, just has to be present.
709 view()->OnNavigate(params_B); 709 view()->OnNavigate(params_B);
710 710
711 // State should be unchanged. 711 // State should be unchanged.
712 EXPECT_EQ(2, view()->history_list_length_); 712 EXPECT_EQ(2, view()->history_list_length_);
713 EXPECT_EQ(1, view()->history_list_offset_); 713 EXPECT_EQ(1, view()->history_list_offset_);
714 EXPECT_EQ(3, view()->history_page_ids_[1]); 714 EXPECT_EQ(3, view()->history_page_ids_[1]);
715 } 715 }
716 716
717 // Test that we do not ignore navigations after the entry limit is reached, 717 // Test that we do not ignore navigations after the entry limit is reached,
718 // in which case the browser starts dropping entries from the front. In this 718 // in which case the browser starts dropping entries from the front. In this
(...skipping 13 matching lines...) Expand all
732 EXPECT_EQ(2, view()->history_list_length_); 732 EXPECT_EQ(2, view()->history_list_length_);
733 EXPECT_EQ(1, view()->history_list_offset_); 733 EXPECT_EQ(1, view()->history_list_offset_);
734 EXPECT_EQ(2, view()->history_page_ids_[1]); 734 EXPECT_EQ(2, view()->history_page_ids_[1]);
735 735
736 // Check for a valid UpdateState message for page A. 736 // Check for a valid UpdateState message for page A.
737 ProcessPendingMessages(); 737 ProcessPendingMessages();
738 const IPC::Message* msg_A = render_thread_->sink().GetUniqueMessageMatching( 738 const IPC::Message* msg_A = render_thread_->sink().GetUniqueMessageMatching(
739 ViewHostMsg_UpdateState::ID); 739 ViewHostMsg_UpdateState::ID);
740 ASSERT_TRUE(msg_A); 740 ASSERT_TRUE(msg_A);
741 int page_id_A; 741 int page_id_A;
742 std::string state_A; 742 PageState state_A;
743 ViewHostMsg_UpdateState::Read(msg_A, &page_id_A, &state_A); 743 ViewHostMsg_UpdateState::Read(msg_A, &page_id_A, &state_A);
744 EXPECT_EQ(1, page_id_A); 744 EXPECT_EQ(1, page_id_A);
745 render_thread_->sink().ClearMessages(); 745 render_thread_->sink().ClearMessages();
746 746
747 // Load page C, which will trigger an UpdateState message for page B. 747 // Load page C, which will trigger an UpdateState message for page B.
748 LoadHTML("<div>Page C</div>"); 748 LoadHTML("<div>Page C</div>");
749 EXPECT_EQ(3, view()->history_list_length_); 749 EXPECT_EQ(3, view()->history_list_length_);
750 EXPECT_EQ(2, view()->history_list_offset_); 750 EXPECT_EQ(2, view()->history_list_offset_);
751 EXPECT_EQ(3, view()->history_page_ids_[2]); 751 EXPECT_EQ(3, view()->history_page_ids_[2]);
752 752
753 // Check for a valid UpdateState message for page B. 753 // Check for a valid UpdateState message for page B.
754 ProcessPendingMessages(); 754 ProcessPendingMessages();
755 const IPC::Message* msg_B = render_thread_->sink().GetUniqueMessageMatching( 755 const IPC::Message* msg_B = render_thread_->sink().GetUniqueMessageMatching(
756 ViewHostMsg_UpdateState::ID); 756 ViewHostMsg_UpdateState::ID);
757 ASSERT_TRUE(msg_B); 757 ASSERT_TRUE(msg_B);
758 int page_id_B; 758 int page_id_B;
759 std::string state_B; 759 PageState state_B;
760 ViewHostMsg_UpdateState::Read(msg_B, &page_id_B, &state_B); 760 ViewHostMsg_UpdateState::Read(msg_B, &page_id_B, &state_B);
761 EXPECT_EQ(2, page_id_B); 761 EXPECT_EQ(2, page_id_B);
762 render_thread_->sink().ClearMessages(); 762 render_thread_->sink().ClearMessages();
763 763
764 // Suppose the browser has limited the number of NavigationEntries to 2. 764 // Suppose the browser has limited the number of NavigationEntries to 2.
765 // It has now dropped the first entry, but the renderer isn't notified. 765 // It has now dropped the first entry, but the renderer isn't notified.
766 // Ensure that going back to page B (page_id 2) at offset 0 is successful. 766 // Ensure that going back to page B (page_id 2) at offset 0 is successful.
767 ViewMsg_Navigate_Params params_B; 767 ViewMsg_Navigate_Params params_B;
768 params_B.navigation_type = ViewMsg_Navigate_Type::NORMAL; 768 params_B.navigation_type = ViewMsg_Navigate_Type::NORMAL;
769 params_B.transition = PAGE_TRANSITION_FORWARD_BACK; 769 params_B.transition = PAGE_TRANSITION_FORWARD_BACK;
770 params_B.current_history_list_length = 2; 770 params_B.current_history_list_length = 2;
771 params_B.current_history_list_offset = 1; 771 params_B.current_history_list_offset = 1;
772 params_B.pending_history_list_offset = 0; 772 params_B.pending_history_list_offset = 0;
773 params_B.page_id = 2; 773 params_B.page_id = 2;
774 params_B.state = state_B; 774 params_B.page_state = state_B;
775 view()->OnNavigate(params_B); 775 view()->OnNavigate(params_B);
776 ProcessPendingMessages(); 776 ProcessPendingMessages();
777 777
778 EXPECT_EQ(2, view()->history_list_length_); 778 EXPECT_EQ(2, view()->history_list_length_);
779 EXPECT_EQ(0, view()->history_list_offset_); 779 EXPECT_EQ(0, view()->history_list_offset_);
780 EXPECT_EQ(2, view()->history_page_ids_[0]); 780 EXPECT_EQ(2, view()->history_page_ids_[0]);
781 } 781 }
782 782
783 // Test that our IME backend sends a notification message when the input focus 783 // Test that our IME backend sends a notification message when the input focus
784 // changes. 784 // changes.
(...skipping 1064 matching lines...) Expand 10 before | Expand all | Expand 10 after
1849 1849
1850 // Copy the document content to std::wstring and compare with the 1850 // Copy the document content to std::wstring and compare with the
1851 // expected result. 1851 // expected result.
1852 const int kMaxOutputCharacters = 256; 1852 const int kMaxOutputCharacters = 256;
1853 std::wstring output = UTF16ToWideHack( 1853 std::wstring output = UTF16ToWideHack(
1854 GetMainFrame()->contentAsText(kMaxOutputCharacters)); 1854 GetMainFrame()->contentAsText(kMaxOutputCharacters));
1855 EXPECT_EQ(output, L"hello \n\nworld"); 1855 EXPECT_EQ(output, L"hello \n\nworld");
1856 } 1856 }
1857 1857
1858 } // namespace content 1858 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698