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)
5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/macros.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/api/web_navigation/frame_navigation_state.h"
8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/test/base/chrome_render_view_host_test_harness.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions {
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass FrameNavigationStateTest : public ChromeRenderViewHostTestHarness {
15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch protected:
16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  FrameNavigationStateTest() {}
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual ~FrameNavigationStateTest() {}
18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  FrameNavigationState navigation_state_;
20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private:
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(FrameNavigationStateTest);
23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch};
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that a frame is correctly tracked, and removed once the tab contents
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// goes away.
27116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(FrameNavigationStateTest, TrackFrame) {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL url1("http://www.google.com/");
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL url2("http://mail.google.com/");
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a main frame.
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(navigation_state_.CanSendEvents(main_rfh()));
33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(navigation_state_.IsValidFrame(main_rfh()));
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  navigation_state_.TrackFrame(main_rfh(), url1, false, false);
35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  navigation_state_.SetNavigationCommitted(main_rfh());
36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(navigation_state_.CanSendEvents(main_rfh()));
37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(navigation_state_.IsValidFrame(main_rfh()));
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add a sub frame.
40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  content::RenderFrameHost* sub_frame =
41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      content::RenderFrameHostTester::For(main_rfh())->AppendChild("child");
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(navigation_state_.CanSendEvents(sub_frame));
43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(navigation_state_.IsValidFrame(sub_frame));
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  navigation_state_.TrackFrame(sub_frame, url2, false, false);
45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  navigation_state_.SetNavigationCommitted(sub_frame);
46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(navigation_state_.CanSendEvents(sub_frame));
47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(navigation_state_.IsValidFrame(sub_frame));
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check frame state.
50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(url1, navigation_state_.GetUrl(main_rfh()));
51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(url2, navigation_state_.GetUrl(sub_frame));
52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(main_rfh(), navigation_state_.GetLastCommittedMainFrameHost());
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Drop the frames.
55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  navigation_state_.StopTrackingFramesInRVH(rvh(), NULL);
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(navigation_state_.CanSendEvents(main_rfh()));
57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(navigation_state_.IsValidFrame(main_rfh()));
58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(navigation_state_.CanSendEvents(sub_frame));
59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(navigation_state_.IsValidFrame(sub_frame));
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that no events can be sent for a frame after an error occurred, but
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// before a new navigation happened in this frame.
64116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(FrameNavigationStateTest, ErrorState) {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL url("http://www.google.com/");
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  navigation_state_.TrackFrame(main_rfh(), url, false, false);
68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(navigation_state_.CanSendEvents(main_rfh()));
69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(navigation_state_.GetErrorOccurredInFrame(main_rfh()));
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // After an error occurred, no further events should be sent.
72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  navigation_state_.SetErrorOccurredInFrame(main_rfh());
73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(navigation_state_.CanSendEvents(main_rfh()));
74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(navigation_state_.GetErrorOccurredInFrame(main_rfh()));
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigations to a network error page should be ignored.
77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  navigation_state_.TrackFrame(main_rfh(), GURL(), true, false);
78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(navigation_state_.CanSendEvents(main_rfh()));
79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(navigation_state_.GetErrorOccurredInFrame(main_rfh()));
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // However, when the frame navigates again, it should send events again.
82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  navigation_state_.TrackFrame(main_rfh(), url, false, false);
83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(navigation_state_.CanSendEvents(main_rfh()));
84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(navigation_state_.GetErrorOccurredInFrame(main_rfh()));
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that for a sub frame, no events are send after an error occurred, but
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// before a new navigation happened in this frame.
89116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(FrameNavigationStateTest, ErrorStateFrame) {
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL url("http://www.google.com/");
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  content::RenderFrameHost* sub_frame =
93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      content::RenderFrameHostTester::For(main_rfh())->AppendChild("child");
94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  navigation_state_.TrackFrame(main_rfh(), url, false, false);
95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  navigation_state_.TrackFrame(sub_frame, url, false, false);
96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(navigation_state_.CanSendEvents(main_rfh()));
97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(navigation_state_.CanSendEvents(sub_frame));
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // After an error occurred, no further events should be sent.
100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  navigation_state_.SetErrorOccurredInFrame(sub_frame);
101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(navigation_state_.CanSendEvents(main_rfh()));
102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(navigation_state_.CanSendEvents(sub_frame));
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigations to a network error page should be ignored.
105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  navigation_state_.TrackFrame(sub_frame, GURL(), true, false);
106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(navigation_state_.CanSendEvents(main_rfh()));
107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(navigation_state_.CanSendEvents(sub_frame));
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // However, when the frame navigates again, it should send events again.
110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  navigation_state_.TrackFrame(sub_frame, url, false, false);
111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(navigation_state_.CanSendEvents(main_rfh()));
112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(navigation_state_.CanSendEvents(sub_frame));
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that no events are send for a not web-safe scheme.
116116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(FrameNavigationStateTest, WebSafeScheme) {
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL url("unsafe://www.google.com/");
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  navigation_state_.TrackFrame(main_rfh(), url, false, false);
120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(navigation_state_.CanSendEvents(main_rfh()));
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test for <iframe srcdoc=""> frames.
124116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(FrameNavigationStateTest, SrcDoc) {
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const GURL url("http://www.google.com/");
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const GURL blank("about:blank");
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const GURL srcdoc("about:srcdoc");
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  content::RenderFrameHost* sub_frame =
130116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      content::RenderFrameHostTester::For(main_rfh())->AppendChild("child");
131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  navigation_state_.TrackFrame(main_rfh(), url, false, false);
132116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  navigation_state_.TrackFrame(sub_frame, blank, false, true);
133116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(navigation_state_.CanSendEvents(main_rfh()));
134116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(navigation_state_.CanSendEvents(sub_frame));
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
136116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(url, navigation_state_.GetUrl(main_rfh()));
137116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(srcdoc, navigation_state_.GetUrl(sub_frame));
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(navigation_state_.IsValidUrl(srcdoc));
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test that an individual frame can be detached.
143116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(FrameNavigationStateTest, DetachFrame) {
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const GURL url1("http://www.google.com/");
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const GURL url2("http://mail.google.com/");
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Create a main frame.
148116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(navigation_state_.CanSendEvents(main_rfh()));
149116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(navigation_state_.IsValidFrame(main_rfh()));
150116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  navigation_state_.TrackFrame(main_rfh(), url1, false, false);
151116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  navigation_state_.SetNavigationCommitted(main_rfh());
152116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(navigation_state_.CanSendEvents(main_rfh()));
153116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(navigation_state_.IsValidFrame(main_rfh()));
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Add a sub frame.
156116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  content::RenderFrameHost* sub_frame =
157116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      content::RenderFrameHostTester::For(main_rfh())->AppendChild("child");
158116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(navigation_state_.CanSendEvents(sub_frame));
159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(navigation_state_.IsValidFrame(sub_frame));
160116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  navigation_state_.TrackFrame(sub_frame, url2, false, false);
161116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  navigation_state_.SetNavigationCommitted(sub_frame);
162116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(navigation_state_.CanSendEvents(sub_frame));
163116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(navigation_state_.IsValidFrame(sub_frame));
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Check frame state.
166116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(url1, navigation_state_.GetUrl(main_rfh()));
167116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(url2, navigation_state_.GetUrl(sub_frame));
168116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(main_rfh(), navigation_state_.GetLastCommittedMainFrameHost());
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Drop one frame.
171116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  navigation_state_.FrameDetached(sub_frame);
172116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(url1, navigation_state_.GetUrl(main_rfh()));
173116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(main_rfh(), navigation_state_.GetLastCommittedMainFrameHost());
174116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(navigation_state_.CanSendEvents(sub_frame));
175116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(navigation_state_.IsValidFrame(sub_frame));
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace extensions
179