Chromium Code Reviews| 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 |