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:

committed by
Commit Bot

parent
fa3e9eb699
commit
cc46239381
ios/web/web_state/ui
@ -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);
|
||||
|
Reference in New Issue
Block a user