1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// found in the LICENSE file.
4cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/renderer/render_frame.h"
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/test/frame_load_waiter.h"
7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/public/test/render_view_test.h"
8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "extensions/renderer/script_context.h"
9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "third_party/WebKit/public/web/WebDocument.h"
10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "third_party/WebKit/public/web/WebLocalFrame.h"
11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "url/gurl.h"
12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)using blink::WebFrame;
14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace extensions {
16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace {
17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class ScriptContextTest : public content::RenderViewTest {
19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) protected:
20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  GURL GetEffectiveDocumentURL(const WebFrame* frame) {
21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return ScriptContext::GetEffectiveDocumentURL(
22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        frame, frame->document().url(), true);
23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(ScriptContextTest, GetEffectiveDocumentURL) {
27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  GURL top_url("http://example.com/");
28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  GURL different_url("http://example.net/");
29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  GURL blank_url("about:blank");
30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  GURL srcdoc_url("about:srcdoc");
31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const char frame_html[] =
33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      "<iframe name='frame1' srcdoc=\""
34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      "  <iframe name='frame1_1'></iframe>"
35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      "  <iframe name='frame1_2' sandbox=''></iframe>"
36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      "\"></iframe>"
37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      "<iframe name='frame2' sandbox='' srcdoc=\""
38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      "  <iframe name='frame2_1'></iframe>"
39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      "\"></iframe>"
40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      "<iframe name='frame3'></iframe>";
41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const char frame3_html[] = "<iframe name='frame3_1'></iframe>";
43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  WebFrame* frame = GetMainFrame();
45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_TRUE(frame);
46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  frame->loadHTMLString(frame_html, top_url);
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  content::FrameLoadWaiter(content::RenderFrame::FromWebFrame(frame)).Wait();
49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  WebFrame* frame1 = frame->findChildByName("frame1");
51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_TRUE(frame1);
52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  WebFrame* frame1_1 = frame1->findChildByName("frame1_1");
53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_TRUE(frame1_1);
54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  WebFrame* frame1_2 = frame1->findChildByName("frame1_2");
55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_TRUE(frame1_2);
56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  WebFrame* frame2 = frame->findChildByName("frame2");
57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_TRUE(frame2);
58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  WebFrame* frame2_1 = frame2->findChildByName("frame2_1");
59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_TRUE(frame2_1);
60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  WebFrame* frame3 = frame->findChildByName("frame3");
61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_TRUE(frame3);
62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Load a blank document in a frame from a different origin.
64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  frame3->loadHTMLString(frame3_html, different_url);
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  content::FrameLoadWaiter(content::RenderFrame::FromWebFrame(frame3)).Wait();
66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  WebFrame* frame3_1 = frame->findChildByName("frame3");
68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_TRUE(frame3_1);
69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Top-level frame
71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(GetEffectiveDocumentURL(frame), top_url);
72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // top -> srcdoc = inherit
73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(GetEffectiveDocumentURL(frame1), top_url);
74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // top -> srcdoc -> about:blank = inherit
75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(GetEffectiveDocumentURL(frame1_1), top_url);
76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // top -> srcdoc -> about:blank sandboxed = same URL
77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(GetEffectiveDocumentURL(frame1_2), blank_url);
78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // top -> srcdoc [sandboxed] = same URL
80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(GetEffectiveDocumentURL(frame2), srcdoc_url);
81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // top -> srcdoc [sandboxed] -> about:blank = same URL
82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(GetEffectiveDocumentURL(frame2_1), blank_url);
83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // top -> different origin = different origin
85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(GetEffectiveDocumentURL(frame3), different_url);
86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // top -> different origin -> about:blank = inherit
87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(GetEffectiveDocumentURL(frame3_1), different_url);
88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}  // namespace
91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}  // namespace extensions
92