OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 } |
OLD | NEW |