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

Unified Diff: ios/web/web_state/js/crw_js_post_request_loader_unittest.mm

Issue 1375023002: Adds support for POST request with bodies on WKWebView. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: missing file Created 5 years 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/web_state/js/crw_js_post_request_loader_unittest.mm
diff --git a/ios/web/web_state/js/crw_js_post_request_loader_unittest.mm b/ios/web/web_state/js/crw_js_post_request_loader_unittest.mm
new file mode 100644
index 0000000000000000000000000000000000000000..fe0354fd1774e84114f51c60fc74978d2a9dca16
--- /dev/null
+++ b/ios/web/web_state/js/crw_js_post_request_loader_unittest.mm
@@ -0,0 +1,122 @@
+// 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.
+
+#import "ios/web/web_state/js/crw_js_post_request_loader.h"
+
+#import <WebKit/WebKit.h>
+
+#import "base/strings/sys_string_conversions.h"
Eugene But (OOO till 7-30) 2015/12/02 17:06:15 s/import/include
stkhapugin 2015/12/03 15:43:02 Done.
+#import "base/test/ios/wait_util.h"
+#import "ios/web/web_state/ui/crw_wk_script_message_router.h"
+#import "testing/gtest_mac.h"
+#include "third_party/ocmock/OCMock/OCMock.h"
+
+namespace {
+
+typedef void (^SuccessCallback)();
+typedef void (^ErrorCallback)(NSError*);
+
+// The expected HTML to be load in WKWebView to execute a post request from
+// LoadsCorrectHTML test.
+std::string expectedHTML =
Eugene But (OOO till 7-30) 2015/12/02 17:06:15 FYI: Variables of class type with static storage d
stkhapugin 2015/12/03 15:43:02 Done.
+ R"delimeter(<html><script>var __crPostRequestHack={runPostRequest:function(k,l,m,n){var p=function(b,d,c,g){var e=new XMLHttpRequest;e.open("POST",b,!1);for(var a in d)d.hasOwnProperty(a)&&e.setRequestHeader(a,d[a]);b=atob(c);g=g||"";d=[];for(c=0;c<b.length;c+=512){a=b.slice(c,c+512);for(var h=Array(a.length),f=0;f<a.length;f++)h[f]=a.charCodeAt(f);a=new Uint8Array(h);d.push(a)}b=new Blob(d,{type:g});e.send(b);if(200!=e.status)throw e.status;return e.responseText};document.open();try{document.write(p(k,l,m,n)),window.webkit.messageHandlers.POSTSuccess.postMessage("")}catch(b){window.webkit.messageHandlers.POSTErrorHandler.postMessage(b)}document.close()}};
Eugene But (OOO till 7-30) 2015/12/02 17:06:15 This is too fragile, and will be breaking very oft
stkhapugin 2015/12/03 15:43:02 Done.
+__crPostRequestHack.runPostRequest("http://google.com", {}, "", "")</script></html>)delimeter";
+
+// Tests that the POST request is correctly executed by loading a HTML string.
+TEST(CRWJSPOSTRequestLoaderTest, LoadsCorrectHTML) {
+ CRWJSPOSTRequestLoader* loader =
+ [[[CRWJSPOSTRequestLoader alloc] init] autorelease];
+ id mockWebView = [OCMockObject mockForClass:[WKWebView class]];
+ NSURL* url = [NSURL URLWithString:@"http://google.com"];
+ NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:url];
+ request.HTTPMethod = @"POST";
+ id mockMessageRouter =
+ [OCMockObject niceMockForClass:[CRWWKScriptMessageRouter class]];
+ NSString* expectedHTMLString = base::SysUTF8ToNSString(expectedHTML);
+ [(WKWebView*)[mockWebView expect] loadHTMLString:expectedHTMLString
+ baseURL:url];
+
+ [loader loadPOSTRequest:request
+ inWebView:mockWebView
+ messageRouter:mockMessageRouter
+ errorBlock:^(NSError* error) {
+ }
+ successBlock:^{
+ }];
+
+ [mockWebView verify];
+}
+
+// Tests that success and error message handlers are installed and removed.
+TEST(CRWJSPOSTRequestLoaderTest, installsCallbacks) {
Eugene But (OOO till 7-30) 2015/12/02 17:06:16 Installing and removing script message router is t
Eugene But (OOO till 7-30) 2015/12/02 17:06:16 s/installsCallbacks/InstallsCallbacks
stkhapugin 2015/12/03 15:43:02 Acknowledged.
stkhapugin 2015/12/03 15:43:02 OK, I'll remove this test for simplicity.
+ CRWJSPOSTRequestLoader* loader =
+ [[[CRWJSPOSTRequestLoader alloc] init] autorelease];
+ id mockWebView = [OCMockObject niceMockForClass:[WKWebView class]];
+ NSURL* url = [NSURL URLWithString:@"http://google.com"];
+ NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:url];
+ request.HTTPMethod = @"POST";
+ id mockMessageRouter =
+ [OCMockObject mockForClass:[CRWWKScriptMessageRouter class]];
+
+ __block BOOL successBlockCalled = NO;
+ SuccessCallback successHandler = ^{
+ EXPECT_FALSE(successBlockCalled);
+ successBlockCalled = YES;
+ };
+ __block BOOL errorBlockCalled = NO;
+ ErrorCallback errorHandler = ^(NSError*) {
+ EXPECT_FALSE(errorBlockCalled);
+ errorBlockCalled = YES;
+ };
+
+ // Checks that successHandler is called and that handlers are removed.
+ id successArgChecker =
+ [OCMArg checkWithBlock:^BOOL(SuccessCallback actualSuccessHandler) {
+ [[mockMessageRouter expect]
+ removeScriptMessageHandlerForName:@"POSTErrorHandler"
+ webView:mockWebView];
+ [[mockMessageRouter expect]
+ removeScriptMessageHandlerForName:@"POSTSuccess"
+ webView:mockWebView];
+ actualSuccessHandler();
+ base::test::ios::WaitUntilCondition(^{
+ return successBlockCalled;
+ });
+ return successBlockCalled;
+ }];
+
+ // Checks that errorHandler is called and that handlers are removed.
+ id errorArgChecker =
+ [OCMArg checkWithBlock:^BOOL(ErrorCallback actualErrorHandler) {
+ [[mockMessageRouter expect]
+ removeScriptMessageHandlerForName:@"POSTErrorHandler"
+ webView:mockWebView];
+ [[mockMessageRouter expect]
+ removeScriptMessageHandlerForName:@"POSTSuccess"
+ webView:mockWebView];
+
+ actualErrorHandler(nil);
+ base::test::ios::WaitUntilCondition(^{
+ return errorBlockCalled;
+ });
+ return errorBlockCalled;
+ }];
+
+ [[mockMessageRouter expect] setScriptMessageHandler:successArgChecker
+ name:@"POSTSuccess"
+ webView:mockWebView];
+ [[mockMessageRouter expect] setScriptMessageHandler:errorArgChecker
+ name:@"POSTErrorHandler"
+ webView:mockWebView];
+
+ [loader loadPOSTRequest:request
+ inWebView:mockWebView
+ messageRouter:mockMessageRouter
+ errorBlock:errorHandler
+ successBlock:successHandler];
+
+ [mockMessageRouter verify];
+}
+
+} // namespace

Powered by Google App Engine
This is Rietveld 408576698