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

Side by Side Diff: chrome/android/java/src/org/chromium/chrome/browser/customtabs/PostMessageHandler.java

Issue 2422793002: HTML MessagePort as mojo::MessagePipeHandle (Closed)
Patch Set: Rebase Created 3 years, 11 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 unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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 package org.chromium.chrome.browser.customtabs; 5 package org.chromium.chrome.browser.customtabs;
6 6
7 import android.net.Uri; 7 import android.net.Uri;
8 import android.support.customtabs.CustomTabsService; 8 import android.support.customtabs.CustomTabsService;
9 import android.support.customtabs.CustomTabsSessionToken; 9 import android.support.customtabs.CustomTabsSessionToken;
10 10
11 import org.chromium.base.ThreadUtils; 11 import org.chromium.base.ThreadUtils;
12 import org.chromium.chrome.browser.tab.Tab; 12 import org.chromium.chrome.browser.tab.Tab;
13 import org.chromium.content.browser.AppWebMessagePort; 13 import org.chromium.content.browser.AppWebMessagePort;
14 import org.chromium.content.browser.AppWebMessagePortService; 14 import org.chromium.content.browser.AppWebMessagePortService;
15 import org.chromium.content.browser.AppWebMessagePortService.MessageChannelObser ver;
16 import org.chromium.content.browser.PostMessageSender;
17 import org.chromium.content.browser.PostMessageSender.PostMessageSenderDelegate;
18 import org.chromium.content_public.browser.MessagePort; 15 import org.chromium.content_public.browser.MessagePort;
19 import org.chromium.content_public.browser.MessagePort.MessageCallback; 16 import org.chromium.content_public.browser.MessagePort.MessageCallback;
20 import org.chromium.content_public.browser.WebContents; 17 import org.chromium.content_public.browser.WebContents;
21 import org.chromium.content_public.browser.WebContentsObserver; 18 import org.chromium.content_public.browser.WebContentsObserver;
22 19
23 /** 20 /**
24 * A class that handles postMessage communications with a designated {@link Cust omTabsSessionToken}. 21 * A class that handles postMessage communications with a designated {@link Cust omTabsSessionToken}.
25 */ 22 */
26 public class PostMessageHandler { 23 public class PostMessageHandler {
27 private static AppWebMessagePortService sService; 24 private static AppWebMessagePortService sService;
28 25
29 private final CustomTabsSessionToken mSession; 26 private final CustomTabsSessionToken mSession;
30 private final MessageCallback mMessageCallback; 27 private final MessageCallback mMessageCallback;
31 private AppWebMessagePort[] mChannel; 28 private AppWebMessagePort[] mChannel;
32 private PostMessageSender mPostMessageSender;
33 private PostMessageSenderDelegate mSenderDelegate;
34 private Uri mOrigin; 29 private Uri mOrigin;
35 30
36 private static AppWebMessagePortService getAppWebMessagePortService() { 31 private static AppWebMessagePortService getAppWebMessagePortService() {
37 if (sService == null) sService = new AppWebMessagePortService(); 32 if (sService == null) sService = new AppWebMessagePortService();
38 return sService; 33 return sService;
39 } 34 }
40 35
41 /** 36 /**
42 * Basic constructor. Everytime the given {@link CustomTabsSessionToken} is associated with a 37 * Basic constructor. Everytime the given {@link CustomTabsSessionToken} is associated with a
43 * new {@link WebContents}, 38 * new {@link WebContents},
(...skipping 23 matching lines...) Expand all
67 new WebContentsObserver(webContents) { 62 new WebContentsObserver(webContents) {
68 private boolean mNavigatedOnce; 63 private boolean mNavigatedOnce;
69 64
70 @Override 65 @Override
71 public void didNavigateMainFrame(String url, String baseUrl, 66 public void didNavigateMainFrame(String url, String baseUrl,
72 boolean isNavigationToDifferentPage, boolean isFragmentNavig ation, 67 boolean isNavigationToDifferentPage, boolean isFragmentNavig ation,
73 int statusCode) { 68 int statusCode) {
74 if (mNavigatedOnce && isNavigationToDifferentPage && mChannel != null) { 69 if (mNavigatedOnce && isNavigationToDifferentPage && mChannel != null) {
75 mChannel[0].close(); 70 mChannel[0].close();
76 mChannel = null; 71 mChannel = null;
77 mSenderDelegate = null;
78 mPostMessageSender = null;
79 webContents.removeObserver(this); 72 webContents.removeObserver(this);
80 return; 73 return;
81 } 74 }
82 mNavigatedOnce = true; 75 mNavigatedOnce = true;
83 } 76 }
84 77
85 @Override 78 @Override
86 public void documentLoadedInFrame(long frameId, boolean isMainFrame) { 79 public void documentLoadedInFrame(long frameId, boolean isMainFrame) {
87 if (!isMainFrame || mChannel != null) return; 80 if (!isMainFrame || mChannel != null) return;
88 81
89 final AppWebMessagePortService service = getAppWebMessagePortSer vice(); 82 final AppWebMessagePortService service = getAppWebMessagePortSer vice();
90 mChannel = (AppWebMessagePort[]) webContents.createMessageChanne l(service); 83 mChannel = (AppWebMessagePort[]) webContents.createMessageChanne l(service);
91 mChannel[0].setMessageCallback(mMessageCallback, null); 84 mChannel[0].setMessageCallback(mMessageCallback, null);
92 mSenderDelegate = new PostMessageSenderDelegate() {
93 @Override
94 public void postMessageToWeb(
95 String frameName, String message, String targetOrigi n,
96 int[] sentPortIds) {
97 webContents.postMessageToFrame(
98 frameName, message, targetOrigin, sentPortIds);
99 }
100 85
101 @Override 86 webContents.postMessageToFrame(null, "", "", new AppWebMessagePo rt[] {mChannel[1]});
Yusuf 2017/01/26 22:53:54 Thanks for the cleanup! This looks much simpler no
102 public void onPostMessageQueueEmpty() {}
103 87
104 @Override 88 mSession.getCallback().onMessageChannelReady(mOrigin, null);
105 public boolean isPostMessageSenderReady() {
106 return true;
107 }
108 };
109 mPostMessageSender = new PostMessageSender(
110 mSenderDelegate, getAppWebMessagePortService());
111 service.addObserver(new MessageChannelObserver() {
112 @Override
113 public void onMessageChannelCreated() {
114 service.removeObserver(this);
115 if (mChannel == null) return;
116 mPostMessageSender.postMessage(
117 null, "", "", new AppWebMessagePort[] {mChannel[ 1]});
118 mSession.getCallback().onMessageChannelReady(mOrigin, nu ll);
119 }
120 });
121 } 89 }
122 }; 90 };
123 } 91 }
124 92
125 /** 93 /**
126 * Sets the postMessage origin for this session to the given {@link Uri}. 94 * Sets the postMessage origin for this session to the given {@link Uri}.
127 * @param origin The origin value to be set. 95 * @param origin The origin value to be set.
128 */ 96 */
129 public void setPostMessageOrigin(Uri origin) { 97 public void setPostMessageOrigin(Uri origin) {
130 mOrigin = origin; 98 mOrigin = origin;
(...skipping 14 matching lines...) Expand all
145 public void run() { 113 public void run() {
146 // It is still possible that the page has navigated while this t ask is in the queue. 114 // It is still possible that the page has navigated while this t ask is in the queue.
147 // If that happens fail gracefully. 115 // If that happens fail gracefully.
148 if (mChannel == null || mChannel[0].isClosed()) return; 116 if (mChannel == null || mChannel[0].isClosed()) return;
149 mChannel[0].postMessage(message, null); 117 mChannel[0].postMessage(message, null);
150 } 118 }
151 }); 119 });
152 return CustomTabsService.RESULT_SUCCESS; 120 return CustomTabsService.RESULT_SUCCESS;
153 } 121 }
154 } 122 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698