| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 <memory> | 5 #include <memory> |
| 6 | 6 |
| 7 #include "base/json/json_reader.h" | 7 #include "base/json/json_reader.h" |
| 8 #include "base/json/json_writer.h" | 8 #include "base/json/json_writer.h" |
| 9 #include "base/message_loop/message_loop.h" | 9 #include "base/message_loop/message_loop.h" |
| 10 #include "base/run_loop.h" | 10 #include "base/run_loop.h" |
| (...skipping 660 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 671 MaybeTestIsolation(); | 671 MaybeTestIsolation(); |
| 672 } | 672 } |
| 673 | 673 |
| 674 void MaybeTestIsolation() { | 674 void MaybeTestIsolation() { |
| 675 if (page_id_one_.empty() || page_id_two_.empty()) | 675 if (page_id_one_.empty() || page_id_two_.empty()) |
| 676 return; | 676 return; |
| 677 | 677 |
| 678 devtools_client_->GetTarget()->GetExperimental()->AttachToTarget( | 678 devtools_client_->GetTarget()->GetExperimental()->AttachToTarget( |
| 679 target::AttachToTargetParams::Builder() | 679 target::AttachToTargetParams::Builder() |
| 680 .SetTargetId(page_id_one_) | 680 .SetTargetId(page_id_one_) |
| 681 .Build(), | 681 .Build()); |
| 682 base::Bind(&TargetDomainCreateTwoContexts::OnAttachedToTargetOne, | |
| 683 base::Unretained(this))); | |
| 684 | 682 |
| 685 devtools_client_->GetTarget()->GetExperimental()->AttachToTarget( | 683 devtools_client_->GetTarget()->GetExperimental()->AttachToTarget( |
| 686 target::AttachToTargetParams::Builder() | 684 target::AttachToTargetParams::Builder() |
| 687 .SetTargetId(page_id_two_) | 685 .SetTargetId(page_id_two_) |
| 688 .Build(), | 686 .Build()); |
| 689 base::Bind(&TargetDomainCreateTwoContexts::OnAttachedToTargetTwo, | |
| 690 base::Unretained(this))); | |
| 691 } | 687 } |
| 692 | 688 |
| 693 void OnAttachedToTargetOne( | 689 void OnAttachedToTarget( |
| 694 std::unique_ptr<target::AttachToTargetResult> result) { | 690 const target::AttachedToTargetParams& params) override { |
| 695 StopNavigationOnTarget(101, page_id_one_); | 691 if (session_id_one_.empty()) { |
| 692 session_id_one_ = params.GetSessionId(); |
| 693 StopNavigationOnTarget(101, session_id_one_); |
| 694 } else { |
| 695 EXPECT_TRUE(session_id_two_.empty()); |
| 696 session_id_two_ = params.GetSessionId(); |
| 697 StopNavigationOnTarget(102, session_id_two_); |
| 698 } |
| 696 } | 699 } |
| 697 | 700 |
| 698 void OnAttachedToTargetTwo( | 701 void StopNavigationOnTarget(int message_id, std::string session_id) { |
| 699 std::unique_ptr<target::AttachToTargetResult> result) { | |
| 700 StopNavigationOnTarget(102, page_id_two_); | |
| 701 } | |
| 702 | |
| 703 void StopNavigationOnTarget(int message_id, std::string target_id) { | |
| 704 // Avoid triggering Page.loadEventFired for about://blank if loading hasn't | 702 // Avoid triggering Page.loadEventFired for about://blank if loading hasn't |
| 705 // finished yet. | 703 // finished yet. |
| 706 devtools_client_->GetTarget()->GetExperimental()->SendMessageToTarget( | 704 devtools_client_->GetTarget()->GetExperimental()->SendMessageToTarget( |
| 707 target::SendMessageToTargetParams::Builder() | 705 target::SendMessageToTargetParams::Builder() |
| 708 .SetTargetId(target_id) | 706 .SetSessionId(session_id) |
| 709 .SetMessage("{\"id\":" + std::to_string(message_id) + | 707 .SetMessage("{\"id\":" + std::to_string(message_id) + |
| 710 ", \"method\": \"Page.stopLoading\"}") | 708 ", \"method\": \"Page.stopLoading\"}") |
| 711 .Build()); | 709 .Build()); |
| 712 } | 710 } |
| 713 | 711 |
| 714 void EnablePageOnTarget(int message_id, std::string target_id) { | 712 void EnablePageOnTarget(int message_id, std::string session_id) { |
| 715 devtools_client_->GetTarget()->GetExperimental()->SendMessageToTarget( | 713 devtools_client_->GetTarget()->GetExperimental()->SendMessageToTarget( |
| 716 target::SendMessageToTargetParams::Builder() | 714 target::SendMessageToTargetParams::Builder() |
| 717 .SetTargetId(target_id) | 715 .SetSessionId(session_id) |
| 718 .SetMessage("{\"id\":" + std::to_string(message_id) + | 716 .SetMessage("{\"id\":" + std::to_string(message_id) + |
| 719 ", \"method\": \"Page.enable\"}") | 717 ", \"method\": \"Page.enable\"}") |
| 720 .Build()); | 718 .Build()); |
| 721 } | 719 } |
| 722 | 720 |
| 723 void NavigateTarget(int message_id, std::string target_id) { | 721 void NavigateTarget(int message_id, std::string session_id) { |
| 724 devtools_client_->GetTarget()->GetExperimental()->SendMessageToTarget( | 722 devtools_client_->GetTarget()->GetExperimental()->SendMessageToTarget( |
| 725 target::SendMessageToTargetParams::Builder() | 723 target::SendMessageToTargetParams::Builder() |
| 726 .SetTargetId(target_id) | 724 .SetSessionId(session_id) |
| 727 .SetMessage( | 725 .SetMessage( |
| 728 "{\"id\":" + std::to_string(message_id) + | 726 "{\"id\":" + std::to_string(message_id) + |
| 729 ", \"method\": \"Page.navigate\", \"params\": {\"url\": \"" + | 727 ", \"method\": \"Page.navigate\", \"params\": {\"url\": \"" + |
| 730 embedded_test_server()->GetURL("/hello.html").spec() + "\"}}") | 728 embedded_test_server()->GetURL("/hello.html").spec() + "\"}}") |
| 731 .Build()); | 729 .Build()); |
| 732 } | 730 } |
| 733 | 731 |
| 734 void MaybeSetCookieOnPageOne() { | 732 void MaybeSetCookieOnPageOne() { |
| 735 if (!page_one_loaded_ || !page_two_loaded_) | 733 if (!page_one_loaded_ || !page_two_loaded_) |
| 736 return; | 734 return; |
| 737 | 735 |
| 738 devtools_client_->GetTarget()->GetExperimental()->SendMessageToTarget( | 736 devtools_client_->GetTarget()->GetExperimental()->SendMessageToTarget( |
| 739 target::SendMessageToTargetParams::Builder() | 737 target::SendMessageToTargetParams::Builder() |
| 740 .SetTargetId(page_id_one_) | 738 .SetSessionId(session_id_one_) |
| 741 .SetMessage("{\"id\":401, \"method\": \"Runtime.evaluate\", " | 739 .SetMessage("{\"id\":401, \"method\": \"Runtime.evaluate\", " |
| 742 "\"params\": {\"expression\": " | 740 "\"params\": {\"expression\": " |
| 743 "\"document.cookie = 'foo=bar';\"}}") | 741 "\"document.cookie = 'foo=bar';\"}}") |
| 744 .Build()); | 742 .Build()); |
| 745 } | 743 } |
| 746 | 744 |
| 747 void OnReceivedMessageFromTarget( | 745 void OnReceivedMessageFromTarget( |
| 748 const target::ReceivedMessageFromTargetParams& params) override { | 746 const target::ReceivedMessageFromTargetParams& params) override { |
| 749 std::unique_ptr<base::Value> message = | 747 std::unique_ptr<base::Value> message = |
| 750 base::JSONReader::Read(params.GetMessage(), base::JSON_PARSE_RFC); | 748 base::JSONReader::Read(params.GetMessage(), base::JSON_PARSE_RFC); |
| 751 const base::DictionaryValue* message_dict; | 749 const base::DictionaryValue* message_dict; |
| 752 if (!message || !message->GetAsDictionary(&message_dict)) { | 750 if (!message || !message->GetAsDictionary(&message_dict)) { |
| 753 return; | 751 return; |
| 754 } | 752 } |
| 755 | 753 |
| 756 std::string method; | 754 std::string method; |
| 757 if (message_dict->GetString("method", &method) && | 755 if (message_dict->GetString("method", &method) && |
| 758 method == "Page.loadEventFired") { | 756 method == "Page.loadEventFired") { |
| 759 if (params.GetTargetId() == page_id_one_) { | 757 if (params.GetSessionId() == session_id_one_) { |
| 760 page_one_loaded_ = true; | 758 page_one_loaded_ = true; |
| 761 } else if (params.GetTargetId() == page_id_two_) { | 759 } else if (params.GetSessionId() == session_id_two_) { |
| 762 page_two_loaded_ = true; | 760 page_two_loaded_ = true; |
| 763 } | 761 } |
| 764 MaybeSetCookieOnPageOne(); | 762 MaybeSetCookieOnPageOne(); |
| 765 return; | 763 return; |
| 766 } | 764 } |
| 767 | 765 |
| 768 int message_id = 0; | 766 int message_id = 0; |
| 769 if (!message_dict->GetInteger("id", &message_id)) | 767 if (!message_dict->GetInteger("id", &message_id)) |
| 770 return; | 768 return; |
| 771 const base::DictionaryValue* result_dict; | 769 const base::DictionaryValue* result_dict; |
| 772 if (message_dict->GetDictionary("result", &result_dict)) { | 770 if (message_dict->GetDictionary("result", &result_dict)) { |
| 773 if (message_id == 101) { | 771 if (message_id == 101) { |
| 774 // 101: Page.stopNavigation on target one. | 772 // 101: Page.stopNavigation on target one. |
| 775 EXPECT_EQ(page_id_one_, params.GetTargetId()); | 773 EXPECT_EQ(session_id_one_, params.GetSessionId()); |
| 776 EnablePageOnTarget(201, page_id_one_); | 774 EnablePageOnTarget(201, session_id_one_); |
| 777 } else if (message_id == 102) { | 775 } else if (message_id == 102) { |
| 778 // 102: Page.stopNavigation on target two. | 776 // 102: Page.stopNavigation on target two. |
| 779 EXPECT_EQ(page_id_two_, params.GetTargetId()); | 777 EXPECT_EQ(session_id_two_, params.GetSessionId()); |
| 780 EnablePageOnTarget(202, page_id_two_); | 778 EnablePageOnTarget(202, session_id_two_); |
| 781 } else if (message_id == 201) { | 779 } else if (message_id == 201) { |
| 782 // 201: Page.enable on target one. | 780 // 201: Page.enable on target one. |
| 783 EXPECT_EQ(page_id_one_, params.GetTargetId()); | 781 EXPECT_EQ(session_id_one_, params.GetSessionId()); |
| 784 NavigateTarget(301, page_id_one_); | 782 NavigateTarget(301, session_id_one_); |
| 785 } else if (message_id == 202) { | 783 } else if (message_id == 202) { |
| 786 // 202: Page.enable on target two. | 784 // 202: Page.enable on target two. |
| 787 EXPECT_EQ(page_id_two_, params.GetTargetId()); | 785 EXPECT_EQ(session_id_two_, params.GetSessionId()); |
| 788 NavigateTarget(302, page_id_two_); | 786 NavigateTarget(302, session_id_two_); |
| 789 } else if (message_id == 401) { | 787 } else if (message_id == 401) { |
| 790 // 401: Runtime.evaluate on target one. | 788 // 401: Runtime.evaluate on target one. |
| 791 EXPECT_EQ(page_id_one_, params.GetTargetId()); | 789 EXPECT_EQ(session_id_one_, params.GetSessionId()); |
| 792 | 790 |
| 793 // TODO(alexclarke): Make some better bindings | 791 // TODO(alexclarke): Make some better bindings |
| 794 // for Target.SendMessageToTarget. | 792 // for Target.SendMessageToTarget. |
| 795 devtools_client_->GetTarget()->GetExperimental()->SendMessageToTarget( | 793 devtools_client_->GetTarget()->GetExperimental()->SendMessageToTarget( |
| 796 target::SendMessageToTargetParams::Builder() | 794 target::SendMessageToTargetParams::Builder() |
| 797 .SetTargetId(page_id_two_) | 795 .SetSessionId(session_id_two_) |
| 798 .SetMessage("{\"id\":402, \"method\": \"Runtime.evaluate\", " | 796 .SetMessage("{\"id\":402, \"method\": \"Runtime.evaluate\", " |
| 799 "\"params\": {\"expression\": " | 797 "\"params\": {\"expression\": " |
| 800 "\"document.cookie;\"}}") | 798 "\"document.cookie;\"}}") |
| 801 .Build()); | 799 .Build()); |
| 802 } else if (message_id == 402) { | 800 } else if (message_id == 402) { |
| 803 // 402: Runtime.evaluate on target two. | 801 // 402: Runtime.evaluate on target two. |
| 804 EXPECT_EQ(page_id_two_, params.GetTargetId()); | 802 EXPECT_EQ(session_id_two_, params.GetSessionId()); |
| 805 | 803 |
| 806 // There's a nested result. We want the inner one. | 804 // There's a nested result. We want the inner one. |
| 807 EXPECT_TRUE(result_dict->GetDictionary("result", &result_dict)); | 805 EXPECT_TRUE(result_dict->GetDictionary("result", &result_dict)); |
| 808 | 806 |
| 809 std::string value; | 807 std::string value; |
| 810 EXPECT_TRUE(result_dict->GetString("value", &value)); | 808 EXPECT_TRUE(result_dict->GetString("value", &value)); |
| 811 EXPECT_EQ("", value) << "Page 2 should not share cookies from page one"; | 809 EXPECT_EQ("", value) << "Page 2 should not share cookies from page one"; |
| 812 | 810 |
| 813 devtools_client_->GetTarget()->GetExperimental()->CloseTarget( | 811 devtools_client_->GetTarget()->GetExperimental()->CloseTarget( |
| 814 target::CloseTargetParams::Builder() | 812 target::CloseTargetParams::Builder() |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 857 return; | 855 return; |
| 858 | 856 |
| 859 FinishAsynchronousTest(); | 857 FinishAsynchronousTest(); |
| 860 } | 858 } |
| 861 | 859 |
| 862 private: | 860 private: |
| 863 std::string context_id_one_; | 861 std::string context_id_one_; |
| 864 std::string context_id_two_; | 862 std::string context_id_two_; |
| 865 std::string page_id_one_; | 863 std::string page_id_one_; |
| 866 std::string page_id_two_; | 864 std::string page_id_two_; |
| 865 std::string session_id_one_; |
| 866 std::string session_id_two_; |
| 867 bool page_one_loaded_ = false; | 867 bool page_one_loaded_ = false; |
| 868 bool page_two_loaded_ = false; | 868 bool page_two_loaded_ = false; |
| 869 int page_close_count_ = 0; | 869 int page_close_count_ = 0; |
| 870 int context_closed_count_ = 0; | 870 int context_closed_count_ = 0; |
| 871 }; | 871 }; |
| 872 | 872 |
| 873 HEADLESS_ASYNC_DEVTOOLED_TEST_F(TargetDomainCreateTwoContexts); | 873 HEADLESS_ASYNC_DEVTOOLED_TEST_F(TargetDomainCreateTwoContexts); |
| 874 | 874 |
| 875 class HeadlessDevToolsNavigationControlTest | 875 class HeadlessDevToolsNavigationControlTest |
| 876 : public HeadlessAsyncDevTooledBrowserTest, | 876 : public HeadlessAsyncDevTooledBrowserTest, |
| (...skipping 1374 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2251 << " Style # " << i; | 2251 << " Style # " << i; |
| 2252 } | 2252 } |
| 2253 | 2253 |
| 2254 FinishAsynchronousTest(); | 2254 FinishAsynchronousTest(); |
| 2255 } | 2255 } |
| 2256 }; | 2256 }; |
| 2257 | 2257 |
| 2258 HEADLESS_ASYNC_DEVTOOLED_TEST_F(DomTreeExtractionBrowserTest); | 2258 HEADLESS_ASYNC_DEVTOOLED_TEST_F(DomTreeExtractionBrowserTest); |
| 2259 | 2259 |
| 2260 } // namespace headless | 2260 } // namespace headless |
| OLD | NEW |