OLD | NEW |
---|---|
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 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/strings/utf_string_conversions.h" | 5 #include "base/strings/utf_string_conversions.h" |
6 #include "content/public/common/context_menu_params.h" | 6 #include "content/public/common/context_menu_params.h" |
7 #include "content/renderer/render_frame_impl.h" | 7 #include "content/renderer/render_frame_impl.h" |
8 #include "testing/gtest/include/gtest/gtest.h" | 8 #include "testing/gtest/include/gtest/gtest.h" |
9 #include "third_party/WebKit/public/platform/WebURL.h" | |
10 #include "third_party/WebKit/public/platform/WebURLRequest.h" | |
11 #include "third_party/WebKit/public/platform/WebURLResponse.h" | |
12 #include "third_party/WebKit/public/platform/WebVector.h" | |
13 #include "third_party/WebKit/public/web/WebDataSource.h" | |
14 #include "third_party/WebKit/public/web/WebNavigationType.h" | |
9 #include "ui/gfx/range/range.h" | 15 #include "ui/gfx/range/range.h" |
16 #include "url/gurl.h" | |
17 | |
18 using blink::WebURL; | |
19 using blink::WebURLRequest; | |
20 using blink::WebURLResponse; | |
21 using blink::WebVector; | |
22 using blink::WebDataSource; | |
23 using blink::WebNavigationType; | |
24 using blink::WebNavigationTypeOther; | |
10 | 25 |
11 namespace content { | 26 namespace content { |
12 | 27 |
28 class WebDataSourceMock : public WebDataSource { | |
darin (slow to review)
2014/03/11 20:09:52
Note: This is not obvious, but if you implement We
hush (inactive)
2014/03/12 21:34:21
Thanks for note!
In order to call loadData() and o
| |
29 public: | |
30 void setUnreachableURL(const WebURL url) { | |
31 unreachable_url_ = url; | |
32 } | |
33 void setOriginalRequest(WebURLRequest request) { | |
34 original_request_ = request; | |
35 } | |
36 | |
37 // Override | |
38 const WebURLRequest& originalRequest() const { | |
39 return original_request_; | |
40 } | |
41 // Override | |
42 bool hasUnreachableURL() const { | |
43 return !unreachable_url_.isEmpty(); | |
44 } | |
45 // Override | |
46 WebURL unreachableURL() const { | |
47 return unreachable_url_; | |
48 } | |
49 // Override | |
50 void appendRedirect(const WebURL& url) { | |
51 redirects_.push_back(url); | |
52 } | |
53 // Override | |
54 void redirectChain(WebVector<WebURL>& result) const { | |
55 result = redirects_; | |
56 } | |
57 // Override | |
58 bool isClientRedirect() const { | |
59 return true; | |
60 } | |
61 // Override | |
62 bool replacesCurrentHistoryItem() const { | |
63 return unreachable_url_.isEmpty(); | |
64 } | |
65 // Override | |
66 WebNavigationType navigationType() const { | |
67 return WebNavigationTypeOther; | |
68 } | |
69 // Override | |
70 double triggeringEventTime() const { | |
71 return 0.0; | |
72 } | |
73 // Override | |
74 ExtraData* extraData() const { | |
75 return new ExtraData(); | |
76 } | |
77 // Override | |
78 void setExtraData(ExtraData* extraData) {} | |
79 // Override | |
80 void setNavigationStartTime(double startTime) {} | |
81 // Override | |
82 const WebURLRequest& request() const { | |
83 return request_; | |
84 } | |
85 // Override | |
86 const WebURLResponse& response() const { | |
87 return response_; | |
88 } | |
89 | |
90 private: | |
91 WebURL unreachable_url_; | |
92 WebURLRequest original_request_; | |
93 WebURLRequest request_; | |
94 WebURLResponse response_; | |
95 std::vector<WebURL> redirects_; | |
96 }; | |
97 | |
13 TEST(RenderFrameImplTest, ShouldUpdateSelectionTextFromContextMenuParams) { | 98 TEST(RenderFrameImplTest, ShouldUpdateSelectionTextFromContextMenuParams) { |
14 struct { | 99 struct { |
15 const char* selection_text; | 100 const char* selection_text; |
16 size_t selection_text_offset; | 101 size_t selection_text_offset; |
17 gfx::Range selection_range; | 102 gfx::Range selection_range; |
18 const char* params_selection_text; | 103 const char* params_selection_text; |
19 bool expected_result; | 104 bool expected_result; |
20 } cases[] = { | 105 } cases[] = { |
21 { "test", 0, gfx::Range(0, 4), "test", false }, | 106 { "test", 0, gfx::Range(0, 4), "test", false }, |
22 { "zebestest", 0, gfx::Range(2, 6), "best", false }, | 107 { "zebestest", 0, gfx::Range(2, 6), "best", false }, |
23 { "zebestest", 2, gfx::Range(2, 6), "best", true }, | 108 { "zebestest", 2, gfx::Range(2, 6), "best", true }, |
24 { "test", 0, gfx::Range(0, 4), "hello", true }, | 109 { "test", 0, gfx::Range(0, 4), "hello", true }, |
25 { "best test", 0, gfx::Range(0, 4), "best ", false }, | 110 { "best test", 0, gfx::Range(0, 4), "best ", false }, |
26 { "best test", 0, gfx::Range(0, 5), "best", false }, | 111 { "best test", 0, gfx::Range(0, 5), "best", false }, |
27 }; | 112 }; |
28 | 113 |
29 ContextMenuParams params; | 114 ContextMenuParams params; |
30 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) { | 115 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) { |
31 params.selection_text = base::UTF8ToUTF16(cases[i].params_selection_text); | 116 params.selection_text = base::UTF8ToUTF16(cases[i].params_selection_text); |
32 EXPECT_EQ(cases[i].expected_result, | 117 EXPECT_EQ(cases[i].expected_result, |
33 RenderFrameImpl::ShouldUpdateSelectionTextFromContextMenuParams( | 118 RenderFrameImpl::ShouldUpdateSelectionTextFromContextMenuParams( |
34 base::UTF8ToUTF16(cases[i].selection_text), | 119 base::UTF8ToUTF16(cases[i].selection_text), |
35 cases[i].selection_text_offset, | 120 cases[i].selection_text_offset, |
36 cases[i].selection_range, | 121 cases[i].selection_range, |
37 params)); | 122 params)); |
38 } | 123 } |
39 } | 124 } |
40 | 125 |
126 TEST(RenderFrameImplTest, GetOriginalRequestUrlViaLoadData) { | |
127 WebDataSourceMock ds = WebDataSourceMock(); | |
128 WebURL unreachable_url, base_url; | |
129 unreachable_url = GURL("http://i.am.history.url.in.load.data"); | |
130 base_url = GURL("http://i.am.base.url.in.load.data"); | |
131 | |
132 // When you loadData with base_url and history_url, WebDataSource will regard | |
133 // history_url as unreachable_url and it will push base_url to the redirect | |
134 // chain. But you actually didn't load base_url, because it is only used | |
135 // as the base url for relative paths in data. So history url should be | |
136 // treated as the original url in this case. | |
137 ds.setUnreachableURL(unreachable_url); | |
138 ds.appendRedirect(base_url); | |
139 | |
140 // history url should be treated as the original url | |
141 EXPECT_EQ(unreachable_url, RenderFrameImpl::GetOriginalRequestUrl(&ds)); | |
142 } | |
143 | |
144 TEST(RenderFrameImplTest, GetOriginalRequestUrlViaLoadUrlWithoutRedirects) { | |
145 // loadUrl scenario, no redirects | |
146 WebDataSourceMock ds = WebDataSourceMock(); | |
147 WebURL url = GURL("http://www.example.com"); | |
148 ds.setOriginalRequest(WebURLRequest(url)); | |
149 ds.appendRedirect(url); | |
150 | |
151 EXPECT_EQ(url, RenderFrameImpl::GetOriginalRequestUrl(&ds)); | |
152 } | |
153 | |
154 TEST(RenderFrameImplTest, GetOriginalRequestUrlViaLoadUrlWithRedirects) { | |
155 // loadUrl scenario, with redirects | |
156 WebDataSourceMock ds = WebDataSourceMock(); | |
157 WebURL url1 = GURL("http://url.redirected.from"); | |
158 WebURL url2 = GURL("http://url.redirected.to"); | |
159 ds.appendRedirect(url1); | |
160 ds.appendRedirect(url2); | |
161 ds.setOriginalRequest(WebURLRequest(url1)); | |
162 EXPECT_EQ(url1, RenderFrameImpl::GetOriginalRequestUrl(&ds)); | |
163 } | |
164 | |
41 } // namespace content | 165 } // namespace content |
OLD | NEW |