OLD | NEW |
1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 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 #import "ios/chrome/browser/ui/static_content/static_html_view_controller.h" | 5 #import "ios/chrome/browser/ui/static_content/static_html_view_controller.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 | 8 |
9 #import "base/mac/foundation_util.h" | 9 #import "base/mac/foundation_util.h" |
10 #include "base/mac/scoped_nsautorelease_pool.h" | |
11 #include "base/mac/scoped_nsobject.h" | |
12 #include "base/memory/ptr_util.h" | 10 #include "base/memory/ptr_util.h" |
13 #import "base/test/ios/wait_util.h" | 11 #import "base/test/ios/wait_util.h" |
14 #include "ios/chrome/browser/browser_state/test_chrome_browser_state.h" | 12 #include "ios/chrome/browser/browser_state/test_chrome_browser_state.h" |
15 #import "ios/chrome/browser/ui/url_loader.h" | 13 #import "ios/chrome/browser/ui/url_loader.h" |
16 #include "ios/chrome/grit/ios_strings.h" | 14 #include "ios/chrome/grit/ios_strings.h" |
17 #import "ios/testing/ocmock_complex_type_helper.h" | 15 #import "ios/testing/ocmock_complex_type_helper.h" |
18 #include "ios/web/public/referrer.h" | 16 #include "ios/web/public/referrer.h" |
19 #import "ios/web/public/test/fakes/test_web_client.h" | 17 #import "ios/web/public/test/fakes/test_web_client.h" |
20 #import "ios/web/public/test/js_test_util.h" | 18 #import "ios/web/public/test/js_test_util.h" |
21 #include "ios/web/public/test/scoped_testing_web_client.h" | 19 #include "ios/web/public/test/scoped_testing_web_client.h" |
22 #include "ios/web/public/test/test_web_thread_bundle.h" | 20 #include "ios/web/public/test/test_web_thread_bundle.h" |
23 #import "ios/web/public/web_state/ui/crw_native_content.h" | 21 #import "ios/web/public/web_state/ui/crw_native_content.h" |
24 #import "net/base/mac/url_conversions.h" | 22 #import "net/base/mac/url_conversions.h" |
25 #include "testing/gtest/include/gtest/gtest.h" | 23 #include "testing/gtest/include/gtest/gtest.h" |
26 #include "testing/gtest_mac.h" | 24 #include "testing/gtest_mac.h" |
27 #include "testing/platform_test.h" | 25 #include "testing/platform_test.h" |
28 #import "third_party/ocmock/OCMock/OCMock.h" | 26 #import "third_party/ocmock/OCMock/OCMock.h" |
29 #include "third_party/ocmock/gtest_support.h" | 27 #include "third_party/ocmock/gtest_support.h" |
30 #include "ui/base/l10n/l10n_util_mac.h" | 28 #include "ui/base/l10n/l10n_util_mac.h" |
31 | 29 |
| 30 #if !defined(__has_feature) || !__has_feature(objc_arc) |
| 31 #error "This file requires ARC support." |
| 32 #endif |
| 33 |
32 // Generator that returns the value of a localized identifier. | 34 // Generator that returns the value of a localized identifier. |
33 @interface L10nHtmlGenerator : NSObject<HtmlGenerator> { | 35 @interface L10nHtmlGenerator : NSObject<HtmlGenerator> { |
34 @private | 36 @private |
35 int messageId_; | 37 int messageId_; |
36 } | 38 } |
37 - (id)initWithMessageId:(int)messageId; | 39 - (id)initWithMessageId:(int)messageId; |
38 @end | 40 @end |
39 | 41 |
40 @implementation L10nHtmlGenerator | 42 @implementation L10nHtmlGenerator |
41 - (id)initWithMessageId:(int)messageId { | 43 - (id)initWithMessageId:(int)messageId { |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
100 : web_client_(base::MakeUnique<web::TestWebClient>()) {} | 102 : web_client_(base::MakeUnique<web::TestWebClient>()) {} |
101 | 103 |
102 protected: | 104 protected: |
103 void SetUp() override { | 105 void SetUp() override { |
104 PlatformTest::SetUp(); | 106 PlatformTest::SetUp(); |
105 chrome_browser_state_ = TestChromeBrowserState::Builder().Build(); | 107 chrome_browser_state_ = TestChromeBrowserState::Builder().Build(); |
106 } | 108 } |
107 | 109 |
108 web::TestWebThreadBundle thread_bundle_; | 110 web::TestWebThreadBundle thread_bundle_; |
109 std::unique_ptr<TestChromeBrowserState> chrome_browser_state_; | 111 std::unique_ptr<TestChromeBrowserState> chrome_browser_state_; |
110 // Private autorelease pool so objects are released as soon as possible. | |
111 base::mac::ScopedNSAutoreleasePool pool_; | |
112 web::ScopedTestingWebClient web_client_; | 112 web::ScopedTestingWebClient web_client_; |
113 }; | 113 }; |
114 | 114 |
115 // Tests the creation of a StaticHtmlViewController displaying a resource file. | 115 // Tests the creation of a StaticHtmlViewController displaying a resource file. |
116 TEST_F(StaticHtmlViewControllerTest, LoadResourceTest) { | 116 TEST_F(StaticHtmlViewControllerTest, LoadResourceTest) { |
117 base::scoped_nsobject<id> loader; | 117 id loader = [[LoadTestMockLoader alloc] |
118 loader.reset([[LoadTestMockLoader alloc] | |
119 initWithRepresentedObject:[OCMockObject | 118 initWithRepresentedObject:[OCMockObject |
120 mockForProtocol:@protocol(UrlLoader)]]); | 119 mockForProtocol:@protocol(UrlLoader)]]; |
121 | 120 |
122 id<CRWNativeContentDelegate> delegate = | 121 id<CRWNativeContentDelegate> delegate = |
123 [OCMockObject mockForProtocol:@protocol(CRWNativeContentDelegate)]; | 122 [OCMockObject mockForProtocol:@protocol(CRWNativeContentDelegate)]; |
124 GURL referrer_url("chrome://foo"); | 123 GURL referrer_url("chrome://foo"); |
125 web::Referrer referrer(referrer_url, web::ReferrerPolicyDefault); | 124 web::Referrer referrer(referrer_url, web::ReferrerPolicyDefault); |
126 base::scoped_nsobject<StaticHtmlViewController> content( | 125 StaticHtmlViewController* content = [[StaticHtmlViewController alloc] |
127 [[StaticHtmlViewController alloc] | 126 initWithResource:@"terms_en.html" |
128 initWithResource:@"terms_en.html" | 127 browserState:chrome_browser_state_.get()]; |
129 browserState:chrome_browser_state_.get()]); | |
130 [content setLoader:loader referrer:referrer]; | 128 [content setLoader:loader referrer:referrer]; |
131 [content setDelegate:delegate]; | 129 [content setDelegate:delegate]; |
132 [[(OCMockObject*)delegate expect] | 130 [[(OCMockObject*)delegate expect] |
133 nativeContent:content.get() | 131 nativeContent:content |
134 titleDidChange:[OCMArg checkWithBlock:^BOOL(id value) { | 132 titleDidChange:[OCMArg checkWithBlock:^BOOL(id value) { |
135 isRunLoopDry = true; | 133 isRunLoopDry = true; |
136 return [@"Google Chrome Terms of Service" | 134 return [@"Google Chrome Terms of Service" |
137 isEqualToString:(NSString*)value]; | 135 isEqualToString:(NSString*)value]; |
138 }]]; | 136 }]]; |
139 [content triggerPendingLoad]; | 137 [content triggerPendingLoad]; |
140 DryRunLoop(false); | 138 DryRunLoop(false); |
141 ASSERT_OCMOCK_VERIFY(loader.get()); | 139 ASSERT_OCMOCK_VERIFY(loader); |
142 ASSERT_OCMOCK_VERIFY((OCMockObject*)delegate); | 140 ASSERT_OCMOCK_VERIFY((OCMockObject*)delegate); |
143 base::scoped_nsobject<id> block( | 141 id block = [(id) ^ (const GURL& url, const web::Referrer& referrer, |
144 [(id) ^ (const GURL& url, const web::Referrer& referrer, | 142 ui::PageTransition transition, BOOL rendererInitiated) { |
145 ui::PageTransition transition, BOOL rendererInitiated) { | 143 EXPECT_EQ(url, GURL()); |
146 EXPECT_EQ(url, GURL()); | 144 EXPECT_EQ(referrer.url, referrer_url); |
147 EXPECT_EQ(referrer.url, referrer_url); | 145 EXPECT_EQ(referrer.policy, web::ReferrerPolicyDefault); |
148 EXPECT_EQ(referrer.policy, web::ReferrerPolicyDefault); | 146 EXPECT_TRUE(PageTransitionCoreTypeIs(transition, ui::PAGE_TRANSITION_LINK)); |
149 EXPECT_TRUE( | 147 EXPECT_TRUE(rendererInitiated); |
150 PageTransitionCoreTypeIs(transition, ui::PAGE_TRANSITION_LINK)); | 148 } copy]; |
151 EXPECT_TRUE(rendererInitiated); | |
152 } copy]); | |
153 | 149 |
154 [loader onSelector:@selector(loadURL:referrer:transition:rendererInitiated:) | 150 [loader onSelector:@selector(loadURL:referrer:transition:rendererInitiated:) |
155 callBlockExpectation:block]; | 151 callBlockExpectation:block]; |
156 | 152 |
157 DryRunLoop(true); | 153 DryRunLoop(true); |
158 ASSERT_OCMOCK_VERIFY(loader.get()); | 154 ASSERT_OCMOCK_VERIFY(loader); |
159 ASSERT_OCMOCK_VERIFY((OCMockObject*)delegate); | 155 ASSERT_OCMOCK_VERIFY((OCMockObject*)delegate); |
160 } | 156 } |
161 | 157 |
162 // Tests the creation of a StaticHtmlViewController displaying a local file. | 158 // Tests the creation of a StaticHtmlViewController displaying a local file. |
163 TEST_F(StaticHtmlViewControllerTest, LoadFileURLTest) { | 159 TEST_F(StaticHtmlViewControllerTest, LoadFileURLTest) { |
164 base::scoped_nsobject<id> loader; | 160 id loader = [[LoadTestMockLoader alloc] |
165 loader.reset([[LoadTestMockLoader alloc] | |
166 initWithRepresentedObject:[OCMockObject | 161 initWithRepresentedObject:[OCMockObject |
167 mockForProtocol:@protocol(UrlLoader)]]); | 162 mockForProtocol:@protocol(UrlLoader)]]; |
168 | 163 |
169 id<CRWNativeContentDelegate> delegate = | 164 id<CRWNativeContentDelegate> delegate = |
170 [OCMockObject mockForProtocol:@protocol(CRWNativeContentDelegate)]; | 165 [OCMockObject mockForProtocol:@protocol(CRWNativeContentDelegate)]; |
171 GURL referrer_url("chrome://foo"); | 166 GURL referrer_url("chrome://foo"); |
172 web::Referrer referrer(referrer_url, web::ReferrerPolicyDefault); | 167 web::Referrer referrer(referrer_url, web::ReferrerPolicyDefault); |
173 NSURL* fileURL = [NSURL | 168 NSURL* fileURL = [NSURL |
174 fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"terms_en.html" | 169 fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"terms_en.html" |
175 ofType:nil | 170 ofType:nil |
176 inDirectory:nil]]; | 171 inDirectory:nil]]; |
177 base::scoped_nsobject<StaticHtmlViewController> content( | 172 StaticHtmlViewController* content = [[StaticHtmlViewController alloc] |
178 [[StaticHtmlViewController alloc] | 173 initWithFileURL:net::GURLWithNSURL(fileURL) |
179 initWithFileURL:net::GURLWithNSURL(fileURL) | 174 allowingReadAccessToURL:net::GURLWithNSURL( |
180 allowingReadAccessToURL:net::GURLWithNSURL( | 175 [fileURL URLByDeletingLastPathComponent]) |
181 [fileURL URLByDeletingLastPathComponent]) | 176 browserState:chrome_browser_state_.get()]; |
182 browserState:chrome_browser_state_.get()]); | |
183 [content setLoader:loader referrer:referrer]; | 177 [content setLoader:loader referrer:referrer]; |
184 [content setDelegate:delegate]; | 178 [content setDelegate:delegate]; |
185 [[(OCMockObject*)delegate expect] | 179 [[(OCMockObject*)delegate expect] |
186 nativeContent:content.get() | 180 nativeContent:content |
187 titleDidChange:[OCMArg checkWithBlock:^BOOL(id value) { | 181 titleDidChange:[OCMArg checkWithBlock:^BOOL(id value) { |
188 isRunLoopDry = true; | 182 isRunLoopDry = true; |
189 return [@"Google Chrome Terms of Service" | 183 return [@"Google Chrome Terms of Service" |
190 isEqualToString:(NSString*)value]; | 184 isEqualToString:(NSString*)value]; |
191 }]]; | 185 }]]; |
192 [content triggerPendingLoad]; | 186 [content triggerPendingLoad]; |
193 DryRunLoop(false); | 187 DryRunLoop(false); |
194 ASSERT_OCMOCK_VERIFY(loader.get()); | 188 ASSERT_OCMOCK_VERIFY(loader); |
195 ASSERT_OCMOCK_VERIFY((OCMockObject*)delegate); | 189 ASSERT_OCMOCK_VERIFY((OCMockObject*)delegate); |
196 base::scoped_nsobject<id> block( | 190 id block = [(id) ^ (const GURL& url, const web::Referrer& referrer, |
197 [(id) ^ (const GURL& url, const web::Referrer& referrer, | 191 ui::PageTransition transition, BOOL rendererInitiated) { |
198 ui::PageTransition transition, BOOL rendererInitiated) { | 192 EXPECT_EQ(url, GURL()); |
199 EXPECT_EQ(url, GURL()); | 193 EXPECT_EQ(referrer.url, referrer_url); |
200 EXPECT_EQ(referrer.url, referrer_url); | 194 EXPECT_EQ(referrer.policy, web::ReferrerPolicyDefault); |
201 EXPECT_EQ(referrer.policy, web::ReferrerPolicyDefault); | 195 EXPECT_TRUE(PageTransitionCoreTypeIs(transition, ui::PAGE_TRANSITION_LINK)); |
202 EXPECT_TRUE( | 196 EXPECT_TRUE(rendererInitiated); |
203 PageTransitionCoreTypeIs(transition, ui::PAGE_TRANSITION_LINK)); | 197 } copy]; |
204 EXPECT_TRUE(rendererInitiated); | |
205 } copy]); | |
206 | 198 |
207 [loader onSelector:@selector(loadURL:referrer:transition:rendererInitiated:) | 199 [loader onSelector:@selector(loadURL:referrer:transition:rendererInitiated:) |
208 callBlockExpectation:block]; | 200 callBlockExpectation:block]; |
209 | 201 |
210 DryRunLoop(true); | 202 DryRunLoop(true); |
211 ASSERT_OCMOCK_VERIFY(loader.get()); | 203 ASSERT_OCMOCK_VERIFY(loader); |
212 ASSERT_OCMOCK_VERIFY((OCMockObject*)delegate); | 204 ASSERT_OCMOCK_VERIFY((OCMockObject*)delegate); |
213 } | 205 } |
214 | 206 |
215 // Tests that -[StaticHtmlViewController webView] returns a non-nil view. | 207 // Tests that -[StaticHtmlViewController webView] returns a non-nil view. |
216 TEST_F(StaticHtmlViewControllerTest, WebViewNonNil) { | 208 TEST_F(StaticHtmlViewControllerTest, WebViewNonNil) { |
217 base::scoped_nsobject<L10nHtmlGenerator> generator( | 209 L10nHtmlGenerator* generator = |
218 [[L10nHtmlGenerator alloc] initWithMessageId:IDS_IOS_TOOLS_MENU]); | 210 [[L10nHtmlGenerator alloc] initWithMessageId:IDS_IOS_TOOLS_MENU]; |
219 base::scoped_nsobject<StaticHtmlViewController> staticHtmlViewController( | 211 StaticHtmlViewController* staticHtmlViewController = |
220 [[StaticHtmlViewController alloc] | 212 [[StaticHtmlViewController alloc] |
221 initWithGenerator:generator | 213 initWithGenerator:generator |
222 browserState:chrome_browser_state_.get()]); | 214 browserState:chrome_browser_state_.get()]; |
223 EXPECT_TRUE([staticHtmlViewController webView]); | 215 EXPECT_TRUE([staticHtmlViewController webView]); |
224 } | 216 } |
225 | 217 |
226 // Tests the generated HTML is localized. | 218 // Tests the generated HTML is localized. |
227 TEST_F(StaticHtmlViewControllerTest, L10NTest) { | 219 TEST_F(StaticHtmlViewControllerTest, L10NTest) { |
228 base::scoped_nsobject<L10nHtmlGenerator> generator( | 220 L10nHtmlGenerator* generator = |
229 [[L10nHtmlGenerator alloc] initWithMessageId:IDS_IOS_TOOLS_MENU]); | 221 [[L10nHtmlGenerator alloc] initWithMessageId:IDS_IOS_TOOLS_MENU]; |
230 base::scoped_nsobject<StaticHtmlViewController> content( | 222 StaticHtmlViewController* content = [[StaticHtmlViewController alloc] |
231 [[StaticHtmlViewController alloc] | 223 initWithGenerator:generator |
232 initWithGenerator:generator | 224 browserState:chrome_browser_state_.get()]; |
233 browserState:chrome_browser_state_.get()]); | |
234 id<UrlLoader> loader = [OCMockObject mockForProtocol:@protocol(UrlLoader)]; | 225 id<UrlLoader> loader = [OCMockObject mockForProtocol:@protocol(UrlLoader)]; |
235 [content setLoader:loader | 226 [content setLoader:loader |
236 referrer:web::Referrer(GURL("chrome://foo"), | 227 referrer:web::Referrer(GURL("chrome://foo"), |
237 web::ReferrerPolicyDefault)]; | 228 web::ReferrerPolicyDefault)]; |
238 [content triggerPendingLoad]; | 229 [content triggerPendingLoad]; |
239 ASSERT_OCMOCK_VERIFY((OCMockObject*)loader); | 230 ASSERT_OCMOCK_VERIFY((OCMockObject*)loader); |
240 __block id string_in_page = nil; | 231 __block id string_in_page = nil; |
241 base::test::ios::WaitUntilCondition(^bool { | 232 base::test::ios::WaitUntilCondition(^bool { |
242 string_in_page = | 233 string_in_page = |
243 web::ExecuteJavaScript([content webView], @"document.body.innerHTML"); | 234 web::ExecuteJavaScript([content webView], @"document.body.innerHTML"); |
244 return ![string_in_page isEqual:@""]; | 235 return ![string_in_page isEqual:@""]; |
245 }); | 236 }); |
246 EXPECT_TRUE([string_in_page isKindOfClass:[NSString class]]); | 237 EXPECT_TRUE([string_in_page isKindOfClass:[NSString class]]); |
247 NSString* to_find = l10n_util::GetNSString(IDS_IOS_TOOLS_MENU); | 238 NSString* to_find = l10n_util::GetNSString(IDS_IOS_TOOLS_MENU); |
248 EXPECT_TRUE([string_in_page rangeOfString:to_find].length); | 239 EXPECT_TRUE([string_in_page rangeOfString:to_find].length); |
249 } | 240 } |
250 | 241 |
251 } // namespace | 242 } // namespace |
OLD | NEW |