0

Ignore WKScriptmessages from internal placeholder pages.

With SlimNavigationManager enabled, a placeholder page is rendered at the start
of the navigation stack. Prevent this placeholder page from being registered as
a frame.

Bug: 869884
Cq-Include-Trybots: luci.chromium.try:ios-simulator-cronet;luci.chromium.try:ios-simulator-full-configs
Change-Id: I09907135bf48720ef4b25fb7ddaa607db4f03a27
Reviewed-on: https://chromium-review.googlesource.com/1234268
Commit-Queue: Mike Dougherty <michaeldo@chromium.org>
Reviewed-by: Danyao Wang <danyao@chromium.org>
Reviewed-by: Eugene But <eugenebut@chromium.org>
Cr-Commit-Position: refs/heads/master@{#593243}
This commit is contained in:
Mike Dougherty
2018-09-21 17:29:50 +00:00
committed by Commit Bot
parent fa3e9eb699
commit cc46239381
3 changed files with 18 additions and 4 deletions

@ -65,6 +65,8 @@ source_set("ui") {
source_set("crw_wk_script_message_router") {
deps = [
"//base",
"//ios/web/navigation:core",
"//net",
]
sources = [

@ -5,6 +5,8 @@
#import "ios/web/web_state/ui/crw_wk_script_message_router.h"
#include "base/logging.h"
#include "ios/web/navigation/wk_navigation_util.h"
#import "net/base/mac/url_conversions.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
@ -82,6 +84,12 @@
- (void)userContentController:(WKUserContentController*)userContentController
didReceiveScriptMessage:(WKScriptMessage*)message {
// Ignore frame registration messages from internal placeholder pages.
GURL url = net::GURLWithNSURL(message.frameInfo.request.URL);
if (web::wk_navigation_util::IsPlaceholderUrl(url)) {
return;
}
NSMapTable* webViewToHandlerMap = [_handlers objectForKey:message.name];
DCHECK(webViewToHandlerMap);
id handler = [webViewToHandlerMap objectForKey:message.webView];

@ -21,8 +21,11 @@
namespace {
// Returns WKScriptMessage mock.
id GetScriptMessageMock(WKWebView* web_view, NSString* name) {
id GetScriptMessageMock(WKFrameInfo* frame_info,
WKWebView* web_view,
NSString* name) {
id result = [OCMockObject mockForClass:[WKScriptMessage class]];
[[[result stub] andReturn:frame_info] frameInfo];
[[[result stub] andReturn:web_view] webView];
[[[result stub] andReturn:name] name];
return result;
@ -165,20 +168,21 @@ TEST_F(CRWWKScriptMessageRouterTest, RemoveAllHandlersLeak) {
// web view.
TEST_F(CRWWKScriptMessageRouterTest, Routing) {
// It's expected that messages handlers will be called once and in order.
WKFrameInfo* frame_info = [[WKFrameInfo alloc] init];
__block NSInteger last_called_handler = 0;
id message1 = GetScriptMessageMock(web_view1_, name1_);
id message1 = GetScriptMessageMock(frame_info, web_view1_, name1_);
id handler1 = ^(WKScriptMessage* message) {
EXPECT_EQ(0, last_called_handler);
EXPECT_EQ(message1, message);
last_called_handler = 1;
};
id message2 = GetScriptMessageMock(web_view2_, name2_);
id message2 = GetScriptMessageMock(frame_info, web_view2_, name2_);
id handler2 = ^(WKScriptMessage* message) {
EXPECT_EQ(1, last_called_handler);
EXPECT_EQ(message2, message);
last_called_handler = 2;
};
id message3 = GetScriptMessageMock(web_view3_, name2_);
id message3 = GetScriptMessageMock(frame_info, web_view3_, name2_);
id handler3 = ^(WKScriptMessage* message) {
EXPECT_EQ(2, last_called_handler);
EXPECT_EQ(message3, message);