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 { |
| 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 |