frame_navigation_state_unittest.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/api/web_navigation/frame_navigation_state.h"
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions {
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)content::RenderViewHost* fake_rvh =
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reinterpret_cast<content::RenderViewHost*>(31337);
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that a frame is correctly tracked, and removed once the tab contents
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// goes away.
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FrameNavigationStateTest, TrackFrame) {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FrameNavigationState navigation_state;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const FrameNavigationState::FrameID frame_id0(-1, fake_rvh);
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const FrameNavigationState::FrameID frame_id1(23, fake_rvh);
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const FrameNavigationState::FrameID frame_id2(42, fake_rvh);
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL url1("http://www.google.com/");
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL url2("http://mail.google.com/");
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a main frame.
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(navigation_state.CanSendEvents(frame_id1));
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(navigation_state.IsValidFrame(frame_id1));
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  navigation_state.TrackFrame(frame_id1, frame_id0, url1, true, false, false);
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  navigation_state.SetNavigationCommitted(frame_id1);
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(navigation_state.CanSendEvents(frame_id1));
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(navigation_state.IsValidFrame(frame_id1));
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add a sub frame.
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(navigation_state.CanSendEvents(frame_id2));
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(navigation_state.IsValidFrame(frame_id2));
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  navigation_state.TrackFrame(frame_id2, frame_id1, url2, false, false, false);
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  navigation_state.SetNavigationCommitted(frame_id2);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(navigation_state.CanSendEvents(frame_id2));
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(navigation_state.IsValidFrame(frame_id2));
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check frame state.
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(navigation_state.IsMainFrame(frame_id1));
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(url1, navigation_state.GetUrl(frame_id1));
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(navigation_state.IsMainFrame(frame_id2));
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(url2, navigation_state.GetUrl(frame_id2));
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(frame_id1, navigation_state.GetMainFrameID());
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Drop the frames.
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  navigation_state.StopTrackingFramesInRVH(fake_rvh,
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           FrameNavigationState::FrameID());
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(navigation_state.CanSendEvents(frame_id1));
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(navigation_state.IsValidFrame(frame_id1));
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(navigation_state.CanSendEvents(frame_id2));
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(navigation_state.IsValidFrame(frame_id2));
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that no events can be sent for a frame after an error occurred, but
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// before a new navigation happened in this frame.
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FrameNavigationStateTest, ErrorState) {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FrameNavigationState navigation_state;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const FrameNavigationState::FrameID frame_id0(-1, fake_rvh);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const FrameNavigationState::FrameID frame_id1(42, fake_rvh);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL url("http://www.google.com/");
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  navigation_state.TrackFrame(frame_id1, frame_id0, url, true, false, false);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(navigation_state.CanSendEvents(frame_id1));
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(navigation_state.GetErrorOccurredInFrame(frame_id1));
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // After an error occurred, no further events should be sent.
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  navigation_state.SetErrorOccurredInFrame(frame_id1);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(navigation_state.CanSendEvents(frame_id1));
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(navigation_state.GetErrorOccurredInFrame(frame_id1));
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigations to a network error page should be ignored.
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  navigation_state.TrackFrame(frame_id1, frame_id0, GURL(), true, true, false);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(navigation_state.CanSendEvents(frame_id1));
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(navigation_state.GetErrorOccurredInFrame(frame_id1));
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // However, when the frame navigates again, it should send events again.
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  navigation_state.TrackFrame(frame_id1, frame_id0, url, true, false, false);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(navigation_state.CanSendEvents(frame_id1));
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(navigation_state.GetErrorOccurredInFrame(frame_id1));
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that for a sub frame, no events are send after an error occurred, but
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// before a new navigation happened in this frame.
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FrameNavigationStateTest, ErrorStateFrame) {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FrameNavigationState navigation_state;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const FrameNavigationState::FrameID frame_id0(-1, fake_rvh);
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const FrameNavigationState::FrameID frame_id1(23, fake_rvh);
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const FrameNavigationState::FrameID frame_id2(42, fake_rvh);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL url("http://www.google.com/");
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  navigation_state.TrackFrame(frame_id1, frame_id0, url, true, false, false);
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  navigation_state.TrackFrame(frame_id2, frame_id1, url, false, false, false);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(navigation_state.CanSendEvents(frame_id1));
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(navigation_state.CanSendEvents(frame_id2));
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // After an error occurred, no further events should be sent.
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  navigation_state.SetErrorOccurredInFrame(frame_id2);
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(navigation_state.CanSendEvents(frame_id1));
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(navigation_state.CanSendEvents(frame_id2));
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigations to a network error page should be ignored.
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  navigation_state.TrackFrame(frame_id2, frame_id1, GURL(), false, true, false);
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(navigation_state.CanSendEvents(frame_id1));
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(navigation_state.CanSendEvents(frame_id2));
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // However, when the frame navigates again, it should send events again.
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  navigation_state.TrackFrame(frame_id2, frame_id1, url, false, false, false);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(navigation_state.CanSendEvents(frame_id1));
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(navigation_state.CanSendEvents(frame_id2));
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that no events are send for a not web-safe scheme.
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FrameNavigationStateTest, WebSafeScheme) {
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FrameNavigationState navigation_state;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const FrameNavigationState::FrameID frame_id0(-1, fake_rvh);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const FrameNavigationState::FrameID frame_id1(23, fake_rvh);
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL url("unsafe://www.google.com/");
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  navigation_state.TrackFrame(frame_id1, frame_id0, url, true, false, false);
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(navigation_state.CanSendEvents(frame_id1));
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that parent frame IDs are tracked.
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FrameNavigationStateTest, ParentFrameID) {
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FrameNavigationState navigation_state;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const FrameNavigationState::FrameID frame_id0(-1, fake_rvh);
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const FrameNavigationState::FrameID frame_id1(23, fake_rvh);
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const FrameNavigationState::FrameID frame_id2(42, fake_rvh);
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL url("http://www.google.com/");
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  navigation_state.TrackFrame(frame_id1, frame_id0, url, true, false, false);
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  navigation_state.TrackFrame(frame_id2, frame_id1, url, false, false, false);
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(navigation_state.CanSendEvents(frame_id1));
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(navigation_state.CanSendEvents(frame_id2));
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(navigation_state.GetParentFrameID(frame_id1) == frame_id0);
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(navigation_state.GetParentFrameID(frame_id2) == frame_id1);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test for <iframe srcdoc=""> frames.
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(FrameNavigationStateTest, SrcDoc) {
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FrameNavigationState navigation_state;
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const FrameNavigationState::FrameID frame_id0(-1, fake_rvh);
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const FrameNavigationState::FrameID frame_id1(23, fake_rvh);
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const FrameNavigationState::FrameID frame_id2(42, fake_rvh);
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const GURL url("http://www.google.com/");
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const GURL blank("about:blank");
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const GURL srcdoc("about:srcdoc");
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  navigation_state.TrackFrame(frame_id1, frame_id0, url, true, false, false);
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  navigation_state.TrackFrame(frame_id2, frame_id1, blank, false, false, true);
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(navigation_state.CanSendEvents(frame_id1));
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(navigation_state.CanSendEvents(frame_id2));
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(navigation_state.GetUrl(frame_id1) == url);
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(navigation_state.GetUrl(frame_id2) == srcdoc);
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(navigation_state.IsValidUrl(srcdoc));
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test that an individual frame can be detached.
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(FrameNavigationStateTest, DetachFrame) {
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FrameNavigationState navigation_state;
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const FrameNavigationState::FrameID frame_id0(-1, fake_rvh);
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const FrameNavigationState::FrameID frame_id1(23, fake_rvh);
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const FrameNavigationState::FrameID frame_id2(42, fake_rvh);
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const GURL url1("http://www.google.com/");
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const GURL url2("http://mail.google.com/");
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Create a main frame.
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(navigation_state.CanSendEvents(frame_id1));
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(navigation_state.IsValidFrame(frame_id1));
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  navigation_state.TrackFrame(frame_id1, frame_id0, url1, true, false, false);
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  navigation_state.SetNavigationCommitted(frame_id1);
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(navigation_state.CanSendEvents(frame_id1));
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(navigation_state.IsValidFrame(frame_id1));
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Add a sub frame.
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(navigation_state.CanSendEvents(frame_id2));
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(navigation_state.IsValidFrame(frame_id2));
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  navigation_state.TrackFrame(frame_id2, frame_id1, url2, false, false, false);
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  navigation_state.SetNavigationCommitted(frame_id2);
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(navigation_state.CanSendEvents(frame_id2));
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(navigation_state.IsValidFrame(frame_id2));
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Check frame state.
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(navigation_state.IsMainFrame(frame_id1));
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(url1, navigation_state.GetUrl(frame_id1));
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(navigation_state.IsMainFrame(frame_id2));
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(url2, navigation_state.GetUrl(frame_id2));
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(frame_id1, navigation_state.GetMainFrameID());
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Drop one frame.
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  navigation_state.FrameDetached(frame_id2);
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(navigation_state.IsMainFrame(frame_id1));
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(url1, navigation_state.GetUrl(frame_id1));
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(frame_id1, navigation_state.GetMainFrameID());
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(navigation_state.CanSendEvents(frame_id2));
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(navigation_state.IsValidFrame(frame_id2));
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace extensions
206