Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1282)

Unified Diff: ios/web/webui/crw_web_ui_page_builder_unittest.mm

Issue 1110213002: Upstream most of the iOS WebUI support in ios/web/ (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: ios/web/webui/crw_web_ui_page_builder_unittest.mm
diff --git a/ios/web/webui/crw_web_ui_page_builder_unittest.mm b/ios/web/webui/crw_web_ui_page_builder_unittest.mm
new file mode 100644
index 0000000000000000000000000000000000000000..fdefc3f40c6ac02c4662e39dcec1ba1408a795db
--- /dev/null
+++ b/ios/web/webui/crw_web_ui_page_builder_unittest.mm
@@ -0,0 +1,276 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ios/web/webui/crw_web_ui_page_builder.h"
+
+#import <Foundation/Foundation.h>
+
+#include "base/logging.h"
+#import "base/mac/scoped_nsobject.h"
+#include "base/strings/sys_string_conversions.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "testing/gtest_mac.h"
+#include "testing/platform_test.h"
+#include "url/gurl.h"
+
+namespace {
+
+// HTML page template.
+NSString* const kPageTemplate = @"<html><head>%@</head></html>";
+
+// URL for BuildSimplePage.
+const char* kSimplePageUrl("http://simplepage");
+// URL for BuildPageWithJSSubresource.
+const char* kJsPageUrl("http://javascriptpage");
+// URL for BuildPageWithCSSSubresource.
+const char* kCssPageUrl("http://csspage");
+// URL for BuildPageWithMultipleSubresources.
+const char* kMultipleResourcesPageUrl("http://multipleresourcespage");
+// URL for BuildPageWithCSSNestedSubresources.
+const char* kCssImportPageUrl("http://csspagewithimport");
+// URL for BuildPageWithRelativeSubresource.
+const char* kCssRelativePageUrl("http://css/csspage.html");
+// URL for BuildPageWithWebUIJS.
+const char* kCoreJsPageUrl("http://corejs");
+
+// URL for JS resource.
+const char* kJsResourceUrl("http://javascriptpage/resources/javascript.js");
+// URL for CSS resource.
+const char* kCssResourceUrl("http://csspage/resources/stylesheet.css");
+// URL for CSS resource with import.
+const char* kCssImportResourceUrl("http://csspage/resources/import.css");
+// Chrome URL for messaging JavaScript.
+const char* kCoreJsResourceUrl("chrome://resources/js/ios/core.js");
+// String for relative resource URL.
+const char* kRelativeCssString("myresource.css");
+
+// Template for JS tag with URL.
+NSString* const kJsTagTemplate = @"<script src=\"%@\"></script>";
+// Template for inlined JS tag.
+NSString* const kJsInlinedTemplate = @"<script>%@</script>";
+// Template for CSS tag with URL.
+NSString* const kCssTagTemplate = @"<link rel=\"stylesheet\" href=\"%@\">";
+// Template for inlined CSS tag.
+NSString* const kCssInlinedTemplate = @"<style>%@</style>";
+// Template for CSS with import statement.
+NSString* const kCssImportTemplate = @"@import url(%@); b {diplay:block;}";
+
+// Content for JS resource.
+NSString* const kJsContent = @"console.log('This is JavaScript');";
+// Content for CSS resource.
+NSString* const kCssContent = @"html {height:100%;}";
+// Content for relative CSS resource.
+NSString* const kRelativeCssContent = @"mytag {someprop:1}";
+// Dummy content for WebUI messaging JavaScript.
+NSString* kCoreJsContent = @"console.log('messaging javascript');";
+
+// Returns HTML string containing tag formed with tag_template and content.
+NSString* PageForTagTemplateAndContent(NSString* tag_template,
+ NSString* content) {
+ NSString* tag = [NSString stringWithFormat:tag_template, content];
+ return [NSString stringWithFormat:kPageTemplate, tag];
+}
+
+} // namespace
+
+// Mock subclass of CRWWebUIPageBuilder for testing.
+@interface MockCRWWebUIPageBuilder : CRWWebUIPageBuilder
+// Stub out webUIJavaScript method so resource bundle access is not needed.
+- (NSString*)webUIJavaScript;
+@end
+
+@implementation MockCRWWebUIPageBuilder
+- (NSString*)webUIJavaScript {
+ return kCoreJsContent;
+}
+@end
+
+// Mock CRWWebUIPageBuilderDelegate to serve responses for resource requests.
+@interface MockPageBuilderDelegate : NSObject<CRWWebUIPageBuilderDelegate>
+// Returns HTML page containing tag formed from tagTemplate and URL.
+- (NSString*)pageWithTagTemplate:(NSString*)tagTemplate URL:(const char*)URL;
+// Returns resource string for resourceURL.
+- (NSString*)resourceForURL:(const GURL&)resourceURL;
+@end
+
+@implementation MockPageBuilderDelegate
+
+- (void)webUIPageBuilder:(CRWWebUIPageBuilder*)webUIPageBuilder
+ fetchResourceWithURL:(const GURL&)resourceURL
+ completionHandler:(web::WebUIDelegateCompletion)completionHandler {
+ completionHandler([self resourceForURL:resourceURL], resourceURL);
+}
+
+- (NSString*)resourceForURL:(const GURL&)resourceURL {
+ // Resource for BuildSimplePage.
+ if (resourceURL == GURL(kSimplePageUrl))
+ return [NSString stringWithFormat:kPageTemplate, @""];
+ // Resources for BuildPageWithJSSubresource.
+ if (resourceURL == GURL(kJsPageUrl))
+ return [self pageWithTagTemplate:kJsTagTemplate URL:kJsResourceUrl];
+ if (resourceURL == GURL(kJsResourceUrl))
+ return kJsContent;
+ // Resources for BuildPageWithCSSSubresource.
+ if (resourceURL == GURL(kCssPageUrl))
+ return [self pageWithTagTemplate:kCssTagTemplate URL:kCssResourceUrl];
+ if (resourceURL == GURL(kCssResourceUrl))
+ return kCssContent;
+ // Resource for BuildPageWithMultipleSubresources.
+ if (resourceURL == GURL(kMultipleResourcesPageUrl)) {
+ NSString* JSTag =
+ [NSString stringWithFormat:kJsTagTemplate,
+ base::SysUTF8ToNSString(kJsResourceUrl)];
+ NSString* CSSTag =
+ [NSString stringWithFormat:kCssTagTemplate,
+ base::SysUTF8ToNSString(kCssResourceUrl)];
+ NSString* CoreJSTag =
+ [NSString stringWithFormat:kJsTagTemplate,
+ base::SysUTF8ToNSString(kCoreJsResourceUrl)];
+ NSString* tags = [[JSTag stringByAppendingString:CSSTag]
+ stringByAppendingString:CoreJSTag];
+ return [NSString stringWithFormat:kPageTemplate, tags];
+ }
+ // Resources for BuildPageWithCSSNestedSubresource.
+ if (resourceURL == GURL(kCssImportPageUrl)) {
+ return [self pageWithTagTemplate:kCssTagTemplate URL:kCssImportResourceUrl];
+ }
+ if (resourceURL == GURL(kCssImportResourceUrl)) {
+ return [NSString stringWithFormat:kCssImportTemplate,
+ base::SysUTF8ToNSString(kCssResourceUrl)];
+ }
+ // Resources for BuildPageWithRelativeSubresource.
+ GURL relativePageURL(kCssRelativePageUrl);
+ GURL cssRelativeResourceURL = relativePageURL.Resolve(kRelativeCssString);
+ if (resourceURL == relativePageURL) {
+ return [self pageWithTagTemplate:kCssTagTemplate URL:kRelativeCssString];
+ }
+ if (resourceURL == cssRelativeResourceURL)
+ return kRelativeCssContent;
+ // Resource for BuildPageWithWebUIJS.
+ if (resourceURL == GURL(kCoreJsPageUrl))
+ return [self pageWithTagTemplate:kJsTagTemplate URL:kCoreJsResourceUrl];
+
+ NOTREACHED();
+ return nil;
+}
+
+- (NSString*)pageWithTagTemplate:(NSString*)tagTemplate URL:(const char*)URL {
+ NSString* URLString = base::SysUTF8ToNSString(URL);
+ NSString* tag = [NSString stringWithFormat:tagTemplate, URLString];
+ return [NSString stringWithFormat:kPageTemplate, tag];
+}
+
+@end
+
+namespace web {
+
+class CRWWebUIPageBuilderTest : public PlatformTest {
+ protected:
+ void SetUp() override {
+ PlatformTest::SetUp();
+ delegate_.reset([[MockPageBuilderDelegate alloc] init]);
+ web_ui_page_builder_.reset(
+ [[MockCRWWebUIPageBuilder alloc] initWithDelegate:delegate_]);
+ }
+ // CRWWebUIPageBuilder for testing.
+ base::scoped_nsobject<MockCRWWebUIPageBuilder> web_ui_page_builder_;
+ // Delegate for test CRWWebUIPageBuilder.
+ base::scoped_nsobject<MockPageBuilderDelegate> delegate_;
+};
+
+// Tests that a page without imports is passed to completion handler unchanged.
+TEST_F(CRWWebUIPageBuilderTest, BuildSimplePage) {
+ NSString* simple_page_html = [NSString stringWithFormat:kPageTemplate, @""];
+ [web_ui_page_builder_ buildWebUIPageForURL:GURL(kSimplePageUrl)
+ completionHandler:^(NSString* result) {
+ EXPECT_NSEQ(simple_page_html, result);
+ }];
+}
+
+// Tests that a page with a JavaScript subresource is passed to the completion
+// handler with the resource inlined properly, i.e. <script
+// src="http://somejs.js"></script> becomes <script>some javascript;</script>.
+TEST_F(CRWWebUIPageBuilderTest, BuildPageWithJSSubresource) {
+ NSString* js_page_html =
+ PageForTagTemplateAndContent(kJsInlinedTemplate, kJsContent);
+ web::WebUIPageCompletion completionHandler = ^(NSString* result) {
+ EXPECT_NSEQ(js_page_html, result);
+ };
+ [web_ui_page_builder_ buildWebUIPageForURL:GURL(kJsPageUrl)
+ completionHandler:completionHandler];
+}
+
+// Tests that a page with a CSS subresource is passed to the completion handler
+// with the resource inlined properly, i.e. <link rel="stylesheet"
+// href="http://somecss.css"/> becomes <style>some css</style>.
+TEST_F(CRWWebUIPageBuilderTest, BuildPageWithCSSSubresource) {
+ NSString* css_page_html =
+ PageForTagTemplateAndContent(kCssInlinedTemplate, kCssContent);
+ [web_ui_page_builder_ buildWebUIPageForURL:GURL(kCssPageUrl)
+ completionHandler:^(NSString* result) {
+ EXPECT_NSEQ(css_page_html, result);
+ }];
+}
+
+TEST_F(CRWWebUIPageBuilderTest, BuildPageWithMultipleSubresources) {
+ NSString* js_tag = [NSString stringWithFormat:kJsInlinedTemplate, kJsContent];
+ NSString* css_tag =
+ [NSString stringWithFormat:kCssInlinedTemplate, kCssContent];
+ NSString* core_js_tag =
+ [NSString stringWithFormat:kJsInlinedTemplate, kCoreJsContent];
+ NSString* tags = [[js_tag stringByAppendingString:css_tag]
+ stringByAppendingString:core_js_tag];
+ NSString* multiple_resources_html =
+ [NSString stringWithFormat:kPageTemplate, tags];
+ [web_ui_page_builder_ buildWebUIPageForURL:GURL(kMultipleResourcesPageUrl)
+ completionHandler:^(NSString* result) {
+ EXPECT_NSEQ(multiple_resources_html, result);
+ }];
+}
+
+// Tests that a page with a CSS subresource that contains an @import statement
+// for another CSS subresource is passed to the completion handler with the
+// resource inlined properly, i.e. if somecss.css from above has the statement
+// @import url(morecss.css), the original tag becomes <style>contents of
+// morecss</style><style>some css</style>.
+TEST_F(CRWWebUIPageBuilderTest, BuildPageWithCSSNestedSubresource) {
+ NSString* css_inlined_tag =
+ [NSString stringWithFormat:kCssInlinedTemplate, kCssContent];
+ NSString* css_inlined_content =
+ [NSString stringWithFormat:kCssImportTemplate,
+ base::SysUTF8ToNSString(kCssResourceUrl)];
+ NSString* css_import_inlined_tag =
+ [NSString stringWithFormat:kCssInlinedTemplate, css_inlined_content];
+ NSString* tags =
+ [css_inlined_tag stringByAppendingString:css_import_inlined_tag];
+ NSString* css_import_page_html =
+ [NSString stringWithFormat:kPageTemplate, tags];
+ [web_ui_page_builder_ buildWebUIPageForURL:GURL(kCssImportPageUrl)
+ completionHandler:^(NSString* result) {
+ EXPECT_NSEQ(css_import_page_html, result);
+ }];
+}
+
+// Tests that a page with a relative subresource is properly resolved.
+TEST_F(CRWWebUIPageBuilderTest, BuildPageWithRelativeSubresource) {
+ NSString* css_page_html =
+ PageForTagTemplateAndContent(kCssInlinedTemplate, kRelativeCssContent);
+ [web_ui_page_builder_ buildWebUIPageForURL:GURL(kCssRelativePageUrl)
+ completionHandler:^(NSString* result) {
+ EXPECT_NSEQ(css_page_html, result);
+ }];
+}
+
+// Tests that the JavaScript for connecting WebUI messaging to web controller
+// messaging is properly inlined.
+TEST_F(CRWWebUIPageBuilderTest, BuildPageWithWebUIJS) {
+ NSString* core_js_html =
+ PageForTagTemplateAndContent(kJsInlinedTemplate, kCoreJsContent);
+ [web_ui_page_builder_ buildWebUIPageForURL:GURL(kCoreJsPageUrl)
+ completionHandler:^(NSString* result) {
+ EXPECT_NSEQ(core_js_html, result);
+ }];
+}
+
+} // namespace web

Powered by Google App Engine
This is Rietveld 408576698