OLD | NEW |
1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 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; | 5 package org.chromium.chrome.browser; |
6 | 6 |
7 import android.app.Activity; | 7 import android.app.Activity; |
8 import android.content.Context; | 8 import android.content.Context; |
9 import android.graphics.Bitmap; | 9 import android.graphics.Bitmap; |
10 import android.graphics.Color; | 10 import android.graphics.Color; |
(...skipping 22 matching lines...) Expand all Loading... |
33 import org.chromium.content.browser.WebContentsObserverAndroid; | 33 import org.chromium.content.browser.WebContentsObserverAndroid; |
34 import org.chromium.content_public.browser.WebContents; | 34 import org.chromium.content_public.browser.WebContents; |
35 import org.chromium.ui.base.Clipboard; | 35 import org.chromium.ui.base.Clipboard; |
36 import org.chromium.ui.base.WindowAndroid; | 36 import org.chromium.ui.base.WindowAndroid; |
37 | 37 |
38 import java.util.concurrent.atomic.AtomicInteger; | 38 import java.util.concurrent.atomic.AtomicInteger; |
39 | 39 |
40 /** | 40 /** |
41 * The basic Java representation of a tab. Contains and manages a {@link Conten
tView}. | 41 * The basic Java representation of a tab. Contains and manages a {@link Conten
tView}. |
42 * | 42 * |
43 * TabBase provides common functionality for ChromiumTestshell's Tab as well as
Chrome on Android's | 43 * Tab provides common functionality for ChromiumTestshell's Tab as well as Chro
me on Android's |
44 * tab. It is intended to be extended either on Java or both Java and C++, with
ownership managed | 44 * tab. It is intended to be extended either on Java or both Java and C++, with
ownership managed |
45 * by this base class. | 45 * by this base class. |
46 * | 46 * |
47 * Extending just Java: | 47 * Extending just Java: |
48 * - Just extend the class normally. Do not override initializeNative(). | 48 * - Just extend the class normally. Do not override initializeNative(). |
49 * Extending Java and C++: | 49 * Extending Java and C++: |
50 * - Because of the inner-workings of JNI, the subclass is responsible for cons
tructing the native | 50 * - Because of the inner-workings of JNI, the subclass is responsible for cons
tructing the native |
51 * subclass, which in turn constructs TabAndroid (the native counterpart to T
abBase), which in | 51 * subclass, which in turn constructs TabAndroid (the native counterpart to T
ab), which in |
52 * turn sets the native pointer for TabBase. For destruction, subclasses in
Java must clear | 52 * turn sets the native pointer for Tab. For destruction, subclasses in Java
must clear |
53 * their own native pointer reference, but TabBase#destroy() will handle dele
ting the native | 53 * their own native pointer reference, but Tab#destroy() will handle deleting
the native |
54 * object. | 54 * object. |
55 */ | 55 */ |
56 public abstract class TabBase implements NavigationClient { | 56 public abstract class Tab implements NavigationClient { |
57 public static final int INVALID_TAB_ID = -1; | 57 public static final int INVALID_TAB_ID = -1; |
58 | 58 |
59 /** Used for automatically generating tab ids. */ | 59 /** Used for automatically generating tab ids. */ |
60 private static final AtomicInteger sIdCounter = new AtomicInteger(); | 60 private static final AtomicInteger sIdCounter = new AtomicInteger(); |
61 | 61 |
62 private long mNativeTabAndroid; | 62 private long mNativeTabAndroid; |
63 | 63 |
64 /** Unique id of this tab (within its container). */ | 64 /** Unique id of this tab (within its container). */ |
65 private final int mId; | 65 private final int mId; |
66 | 66 |
67 /** Whether or not this tab is an incognito tab. */ | 67 /** Whether or not this tab is an incognito tab. */ |
68 private final boolean mIncognito; | 68 private final boolean mIncognito; |
69 | 69 |
70 /** An Application {@link Context}. Unlike {@link #mContext}, this is the o
nly one that is | 70 /** An Application {@link Context}. Unlike {@link #mContext}, this is the o
nly one that is |
71 * publicly exposed to help prevent leaking the {@link Activity}. */ | 71 * publicly exposed to help prevent leaking the {@link Activity}. */ |
72 private final Context mApplicationContext; | 72 private final Context mApplicationContext; |
73 | 73 |
74 /** The {@link Context} used to create {@link View}s and other Android compo
nents. Unlike | 74 /** The {@link Context} used to create {@link View}s and other Android compo
nents. Unlike |
75 * {@link #mApplicationContext}, this is not publicly exposed to help preven
t leaking the | 75 * {@link #mApplicationContext}, this is not publicly exposed to help preven
t leaking the |
76 * {@link Activity}. */ | 76 * {@link Activity}. */ |
77 private final Context mContext; | 77 private final Context mContext; |
78 | 78 |
79 /** Gives {@link TabBase} a way to interact with the Android window. */ | 79 /** Gives {@link Tab} a way to interact with the Android window. */ |
80 private final WindowAndroid mWindowAndroid; | 80 private final WindowAndroid mWindowAndroid; |
81 | 81 |
82 /** The current native page (e.g. chrome-native://newtab), or {@code null} i
f there is none. */ | 82 /** The current native page (e.g. chrome-native://newtab), or {@code null} i
f there is none. */ |
83 private NativePage mNativePage; | 83 private NativePage mNativePage; |
84 | 84 |
85 /** The {@link ContentView} showing the current page or {@code null} if the
tab is frozen. */ | 85 /** The {@link ContentView} showing the current page or {@code null} if the
tab is frozen. */ |
86 private ContentView mContentView; | 86 private ContentView mContentView; |
87 | 87 |
88 /** InfoBar container to show InfoBars for this tab. */ | 88 /** InfoBar container to show InfoBars for this tab. */ |
89 private InfoBarContainer mInfoBarContainer; | 89 private InfoBarContainer mInfoBarContainer; |
90 | 90 |
91 /** Manages app banners shown for this tab. */ | 91 /** Manages app banners shown for this tab. */ |
92 private AppBannerManager mAppBannerManager; | 92 private AppBannerManager mAppBannerManager; |
93 | 93 |
94 /** The sync id of the TabBase if session sync is enabled. */ | 94 /** The sync id of the Tab if session sync is enabled. */ |
95 private int mSyncId; | 95 private int mSyncId; |
96 | 96 |
97 /** | 97 /** |
98 * The {@link ContentViewCore} for the current page, provided for convenienc
e. This always | 98 * The {@link ContentViewCore} for the current page, provided for convenienc
e. This always |
99 * equals {@link ContentView#getContentViewCore()}, or {@code null} if mCont
entView is | 99 * equals {@link ContentView#getContentViewCore()}, or {@code null} if mCont
entView is |
100 * {@code null}. | 100 * {@code null}. |
101 */ | 101 */ |
102 private ContentViewCore mContentViewCore; | 102 private ContentViewCore mContentViewCore; |
103 | 103 |
104 /** | 104 /** |
105 * A list of TabBase observers. These are used to broadcast TabBase events
to listeners. | 105 * A list of Tab observers. These are used to broadcast Tab events to liste
ners. |
106 */ | 106 */ |
107 private final ObserverList<TabObserver> mObservers = new ObserverList<TabObs
erver>(); | 107 private final ObserverList<TabObserver> mObservers = new ObserverList<TabObs
erver>(); |
108 | 108 |
109 // Content layer Observers and Delegates | 109 // Content layer Observers and Delegates |
110 private ContentViewClient mContentViewClient; | 110 private ContentViewClient mContentViewClient; |
111 private WebContentsObserverAndroid mWebContentsObserver; | 111 private WebContentsObserverAndroid mWebContentsObserver; |
112 private VoiceSearchTabHelper mVoiceSearchTabHelper; | 112 private VoiceSearchTabHelper mVoiceSearchTabHelper; |
113 private TabBaseChromeWebContentsDelegateAndroid mWebContentsDelegate; | 113 private TabChromeWebContentsDelegateAndroid mWebContentsDelegate; |
114 | 114 |
115 /** | 115 /** |
116 * A default {@link ChromeContextMenuItemDelegate} that supports some of the
context menu | 116 * A default {@link ChromeContextMenuItemDelegate} that supports some of the
context menu |
117 * functionality. | 117 * functionality. |
118 */ | 118 */ |
119 protected class TabBaseChromeContextMenuItemDelegate | 119 protected class TabChromeContextMenuItemDelegate |
120 extends EmptyChromeContextMenuItemDelegate { | 120 extends EmptyChromeContextMenuItemDelegate { |
121 private final Clipboard mClipboard; | 121 private final Clipboard mClipboard; |
122 | 122 |
123 /** | 123 /** |
124 * Builds a {@link TabBaseChromeContextMenuItemDelegate} instance. | 124 * Builds a {@link TabChromeContextMenuItemDelegate} instance. |
125 */ | 125 */ |
126 public TabBaseChromeContextMenuItemDelegate() { | 126 public TabChromeContextMenuItemDelegate() { |
127 mClipboard = new Clipboard(getApplicationContext()); | 127 mClipboard = new Clipboard(getApplicationContext()); |
128 } | 128 } |
129 | 129 |
130 @Override | 130 @Override |
131 public boolean isIncognito() { | 131 public boolean isIncognito() { |
132 return mIncognito; | 132 return mIncognito; |
133 } | 133 } |
134 | 134 |
135 @Override | 135 @Override |
136 public void onSaveToClipboard(String text, boolean isUrl) { | 136 public void onSaveToClipboard(String text, boolean isUrl) { |
137 mClipboard.setText(text, text); | 137 mClipboard.setText(text, text); |
138 } | 138 } |
139 | 139 |
140 @Override | 140 @Override |
141 public void onSaveImageToClipboard(String url) { | 141 public void onSaveImageToClipboard(String url) { |
142 mClipboard.setHTMLText("<img src=\"" + url + "\">", url, url); | 142 mClipboard.setHTMLText("<img src=\"" + url + "\">", url, url); |
143 } | 143 } |
144 } | 144 } |
145 | 145 |
146 /** | 146 /** |
147 * A basic {@link ChromeWebContentsDelegateAndroid} that forwards some calls
to the registered | 147 * A basic {@link ChromeWebContentsDelegateAndroid} that forwards some calls
to the registered |
148 * {@link TabObserver}s. Meant to be overridden by subclasses. | 148 * {@link TabObserver}s. Meant to be overridden by subclasses. |
149 */ | 149 */ |
150 public class TabBaseChromeWebContentsDelegateAndroid | 150 public class TabChromeWebContentsDelegateAndroid |
151 extends ChromeWebContentsDelegateAndroid { | 151 extends ChromeWebContentsDelegateAndroid { |
152 @Override | 152 @Override |
153 public void onLoadProgressChanged(int progress) { | 153 public void onLoadProgressChanged(int progress) { |
154 for (TabObserver observer : mObservers) { | 154 for (TabObserver observer : mObservers) { |
155 observer.onLoadProgressChanged(TabBase.this, progress); | 155 observer.onLoadProgressChanged(Tab.this, progress); |
156 } | 156 } |
157 } | 157 } |
158 | 158 |
159 @Override | 159 @Override |
160 public void onUpdateUrl(String url) { | 160 public void onUpdateUrl(String url) { |
161 for (TabObserver observer : mObservers) observer.onUpdateUrl(TabBase
.this, url); | 161 for (TabObserver observer : mObservers) observer.onUpdateUrl(Tab.thi
s, url); |
162 } | 162 } |
163 | 163 |
164 @Override | 164 @Override |
165 public void showRepostFormWarningDialog(final ContentViewCore contentVie
wCore) { | 165 public void showRepostFormWarningDialog(final ContentViewCore contentVie
wCore) { |
166 RepostFormWarningDialog warningDialog = new RepostFormWarningDialog( | 166 RepostFormWarningDialog warningDialog = new RepostFormWarningDialog( |
167 new Runnable() { | 167 new Runnable() { |
168 @Override | 168 @Override |
169 public void run() { | 169 public void run() { |
170 contentViewCore.cancelPendingReload(); | 170 contentViewCore.cancelPendingReload(); |
171 } | 171 } |
172 }, new Runnable() { | 172 }, new Runnable() { |
173 @Override | 173 @Override |
174 public void run() { | 174 public void run() { |
175 contentViewCore.continuePendingReload(); | 175 contentViewCore.continuePendingReload(); |
176 } | 176 } |
177 }); | 177 }); |
178 Activity activity = (Activity) mContext; | 178 Activity activity = (Activity) mContext; |
179 warningDialog.show(activity.getFragmentManager(), null); | 179 warningDialog.show(activity.getFragmentManager(), null); |
180 } | 180 } |
181 | 181 |
182 @Override | 182 @Override |
183 public void toggleFullscreenModeForTab(boolean enableFullscreen) { | 183 public void toggleFullscreenModeForTab(boolean enableFullscreen) { |
184 for (TabObserver observer : mObservers) { | 184 for (TabObserver observer : mObservers) { |
185 observer.onToggleFullscreenMode(TabBase.this, enableFullscreen); | 185 observer.onToggleFullscreenMode(Tab.this, enableFullscreen); |
186 } | 186 } |
187 } | 187 } |
188 | 188 |
189 @Override | 189 @Override |
190 public void navigationStateChanged(int flags) { | 190 public void navigationStateChanged(int flags) { |
191 if ((flags & INVALIDATE_TYPE_TITLE) != 0) { | 191 if ((flags & INVALIDATE_TYPE_TITLE) != 0) { |
192 for (TabObserver observer : mObservers) observer.onTitleUpdated(
TabBase.this); | 192 for (TabObserver observer : mObservers) observer.onTitleUpdated(
Tab.this); |
193 } | 193 } |
194 if ((flags & INVALIDATE_TYPE_URL) != 0) { | 194 if ((flags & INVALIDATE_TYPE_URL) != 0) { |
195 for (TabObserver observer : mObservers) observer.onUrlUpdated(Ta
bBase.this); | 195 for (TabObserver observer : mObservers) observer.onUrlUpdated(Ta
b.this); |
196 } | 196 } |
197 } | 197 } |
198 } | 198 } |
199 | 199 |
200 private class TabBaseContextMenuPopulator extends ContextMenuPopulatorWrappe
r { | 200 private class TabContextMenuPopulator extends ContextMenuPopulatorWrapper { |
201 public TabBaseContextMenuPopulator(ContextMenuPopulator populator) { | 201 public TabContextMenuPopulator(ContextMenuPopulator populator) { |
202 super(populator); | 202 super(populator); |
203 } | 203 } |
204 | 204 |
205 @Override | 205 @Override |
206 public void buildContextMenu(ContextMenu menu, Context context, ContextM
enuParams params) { | 206 public void buildContextMenu(ContextMenu menu, Context context, ContextM
enuParams params) { |
207 super.buildContextMenu(menu, context, params); | 207 super.buildContextMenu(menu, context, params); |
208 for (TabObserver observer : mObservers) observer.onContextMenuShown(
TabBase.this, menu); | 208 for (TabObserver observer : mObservers) observer.onContextMenuShown(
Tab.this, menu); |
209 } | 209 } |
210 } | 210 } |
211 | 211 |
212 private class TabBaseWebContentsObserverAndroid extends WebContentsObserverA
ndroid { | 212 private class TabWebContentsObserverAndroid extends WebContentsObserverAndro
id { |
213 public TabBaseWebContentsObserverAndroid(ContentViewCore contentViewCore
) { | 213 public TabWebContentsObserverAndroid(ContentViewCore contentViewCore) { |
214 super(contentViewCore); | 214 super(contentViewCore); |
215 } | 215 } |
216 | 216 |
217 @Override | 217 @Override |
218 public void navigationEntryCommitted() { | 218 public void navigationEntryCommitted() { |
219 if (getNativePage() != null) { | 219 if (getNativePage() != null) { |
220 pushNativePageStateToNavigationEntry(); | 220 pushNativePageStateToNavigationEntry(); |
221 } | 221 } |
222 } | 222 } |
223 | 223 |
224 @Override | 224 @Override |
225 public void didFailLoad(boolean isProvisionalLoad, boolean isMainFrame,
int errorCode, | 225 public void didFailLoad(boolean isProvisionalLoad, boolean isMainFrame,
int errorCode, |
226 String description, String failingUrl) { | 226 String description, String failingUrl) { |
227 for (TabObserver observer : mObservers) { | 227 for (TabObserver observer : mObservers) { |
228 observer.onDidFailLoad(TabBase.this, isProvisionalLoad, isMainFr
ame, errorCode, | 228 observer.onDidFailLoad(Tab.this, isProvisionalLoad, isMainFrame,
errorCode, |
229 description, failingUrl); | 229 description, failingUrl); |
230 } | 230 } |
231 } | 231 } |
232 } | 232 } |
233 | 233 |
234 /** | 234 /** |
235 * Creates an instance of a {@link TabBase} with no id. | 235 * Creates an instance of a {@link Tab} with no id. |
236 * @param incognito Whether or not this tab is incognito. | 236 * @param incognito Whether or not this tab is incognito. |
237 * @param context An instance of a {@link Context}. | 237 * @param context An instance of a {@link Context}. |
238 * @param window An instance of a {@link WindowAndroid}. | 238 * @param window An instance of a {@link WindowAndroid}. |
239 */ | 239 */ |
240 public TabBase(boolean incognito, Context context, WindowAndroid window) { | 240 public Tab(boolean incognito, Context context, WindowAndroid window) { |
241 this(INVALID_TAB_ID, incognito, context, window); | 241 this(INVALID_TAB_ID, incognito, context, window); |
242 } | 242 } |
243 | 243 |
244 /** | 244 /** |
245 * Creates an instance of a {@link TabBase}. | 245 * Creates an instance of a {@link Tab}. |
246 * @param id The id this tab should be identified with. | 246 * @param id The id this tab should be identified with. |
247 * @param incognito Whether or not this tab is incognito. | 247 * @param incognito Whether or not this tab is incognito. |
248 * @param context An instance of a {@link Context}. | 248 * @param context An instance of a {@link Context}. |
249 * @param window An instance of a {@link WindowAndroid}. | 249 * @param window An instance of a {@link WindowAndroid}. |
250 */ | 250 */ |
251 public TabBase(int id, boolean incognito, Context context, WindowAndroid win
dow) { | 251 public Tab(int id, boolean incognito, Context context, WindowAndroid window)
{ |
252 // We need a valid Activity Context to build the ContentView with. | 252 // We need a valid Activity Context to build the ContentView with. |
253 assert context == null || context instanceof Activity; | 253 assert context == null || context instanceof Activity; |
254 | 254 |
255 mId = generateValidId(id); | 255 mId = generateValidId(id); |
256 mIncognito = incognito; | 256 mIncognito = incognito; |
257 // TODO(dtrainor): Only store application context here. | 257 // TODO(dtrainor): Only store application context here. |
258 mContext = context; | 258 mContext = context; |
259 mApplicationContext = context != null ? context.getApplicationContext()
: null; | 259 mApplicationContext = context != null ? context.getApplicationContext()
: null; |
260 mWindowAndroid = window; | 260 mWindowAndroid = window; |
261 } | 261 } |
262 | 262 |
263 /** | 263 /** |
264 * Adds a {@link TabObserver} to be notified on {@link TabBase} changes. | 264 * Adds a {@link TabObserver} to be notified on {@link Tab} changes. |
265 * @param observer The {@link TabObserver} to add. | 265 * @param observer The {@link TabObserver} to add. |
266 */ | 266 */ |
267 public final void addObserver(TabObserver observer) { | 267 public final void addObserver(TabObserver observer) { |
268 mObservers.addObserver(observer); | 268 mObservers.addObserver(observer); |
269 } | 269 } |
270 | 270 |
271 /** | 271 /** |
272 * Removes a {@link TabObserver}. | 272 * Removes a {@link TabObserver}. |
273 * @param observer The {@link TabObserver} to remove. | 273 * @param observer The {@link TabObserver} to remove. |
274 */ | 274 */ |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
326 } | 326 } |
327 | 327 |
328 /** | 328 /** |
329 * Requests the current navigation to be loaded upon the next call to loadIf
Necessary(). | 329 * Requests the current navigation to be loaded upon the next call to loadIf
Necessary(). |
330 */ | 330 */ |
331 protected void requestRestoreLoad() { | 331 protected void requestRestoreLoad() { |
332 if (mContentViewCore != null) mContentViewCore.requestRestoreLoad(); | 332 if (mContentViewCore != null) mContentViewCore.requestRestoreLoad(); |
333 } | 333 } |
334 | 334 |
335 /** | 335 /** |
336 * @return Whether or not the {@link TabBase} is currently showing an inters
titial page, such as | 336 * @return Whether or not the {@link Tab} is currently showing an interstiti
al page, such as |
337 * a bad HTTPS page. | 337 * a bad HTTPS page. |
338 */ | 338 */ |
339 public boolean isShowingInterstitialPage() { | 339 public boolean isShowingInterstitialPage() { |
340 ContentViewCore contentViewCore = getContentViewCore(); | 340 ContentViewCore contentViewCore = getContentViewCore(); |
341 return contentViewCore != null && contentViewCore.isShowingInterstitialP
age(); | 341 return contentViewCore != null && contentViewCore.isShowingInterstitialP
age(); |
342 } | 342 } |
343 | 343 |
344 /** | 344 /** |
345 * @return Whether or not the tab has something valid to render. | 345 * @return Whether or not the tab has something valid to render. |
346 */ | 346 */ |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
492 /** | 492 /** |
493 * @return The {@link NativePage} associated with the current page, or {@cod
e null} if there is | 493 * @return The {@link NativePage} associated with the current page, or {@cod
e null} if there is |
494 * no current page or the current page is displayed using something
besides | 494 * no current page or the current page is displayed using something
besides |
495 * {@link NativePage}. | 495 * {@link NativePage}. |
496 */ | 496 */ |
497 public NativePage getNativePage() { | 497 public NativePage getNativePage() { |
498 return mNativePage; | 498 return mNativePage; |
499 } | 499 } |
500 | 500 |
501 /** | 501 /** |
502 * @return Whether or not the {@link TabBase} represents a {@link NativePage
}. | 502 * @return Whether or not the {@link Tab} represents a {@link NativePage}. |
503 */ | 503 */ |
504 public boolean isNativePage() { | 504 public boolean isNativePage() { |
505 return mNativePage != null; | 505 return mNativePage != null; |
506 } | 506 } |
507 | 507 |
508 /** | 508 /** |
509 * Set whether or not the {@link ContentViewCore} should be using a desktop
user agent for the | 509 * Set whether or not the {@link ContentViewCore} should be using a desktop
user agent for the |
510 * currently loaded page. | 510 * currently loaded page. |
511 * @param useDesktop If {@code true}, use a desktop user agent. Otherwi
se use a mobile one. | 511 * @param useDesktop If {@code true}, use a desktop user agent. Otherwi
se use a mobile one. |
512 * @param reloadOnChange Reload the page if the user agent has changed. | 512 * @param reloadOnChange Reload the page if the user agent has changed. |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
562 * @return The {@link ContentViewClient} currently bound to any {@link Conte
ntViewCore} | 562 * @return The {@link ContentViewClient} currently bound to any {@link Conte
ntViewCore} |
563 * associated with the current page. There can still be a {@link Co
ntentViewClient} | 563 * associated with the current page. There can still be a {@link Co
ntentViewClient} |
564 * even when there is no {@link ContentViewCore}. | 564 * even when there is no {@link ContentViewCore}. |
565 */ | 565 */ |
566 protected ContentViewClient getContentViewClient() { | 566 protected ContentViewClient getContentViewClient() { |
567 return mContentViewClient; | 567 return mContentViewClient; |
568 } | 568 } |
569 | 569 |
570 /** | 570 /** |
571 * @param client The {@link ContentViewClient} to be bound to any current or
new | 571 * @param client The {@link ContentViewClient} to be bound to any current or
new |
572 * {@link ContentViewCore}s associated with this {@link TabBas
e}. | 572 * {@link ContentViewCore}s associated with this {@link Tab}. |
573 */ | 573 */ |
574 protected void setContentViewClient(ContentViewClient client) { | 574 protected void setContentViewClient(ContentViewClient client) { |
575 if (mContentViewClient == client) return; | 575 if (mContentViewClient == client) return; |
576 | 576 |
577 ContentViewClient oldClient = mContentViewClient; | 577 ContentViewClient oldClient = mContentViewClient; |
578 mContentViewClient = client; | 578 mContentViewClient = client; |
579 | 579 |
580 if (mContentViewCore == null) return; | 580 if (mContentViewCore == null) return; |
581 | 581 |
582 if (mContentViewClient != null) { | 582 if (mContentViewClient != null) { |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
619 */ | 619 */ |
620 protected void showRenderedPage() { | 620 protected void showRenderedPage() { |
621 if (mNativePage == null) return; | 621 if (mNativePage == null) return; |
622 NativePage previousNativePage = mNativePage; | 622 NativePage previousNativePage = mNativePage; |
623 mNativePage = null; | 623 mNativePage = null; |
624 for (TabObserver observer : mObservers) observer.onContentChanged(this); | 624 for (TabObserver observer : mObservers) observer.onContentChanged(this); |
625 destroyNativePageInternal(previousNativePage); | 625 destroyNativePageInternal(previousNativePage); |
626 } | 626 } |
627 | 627 |
628 /** | 628 /** |
629 * Initializes this {@link TabBase}. | 629 * Initializes this {@link Tab}. |
630 */ | 630 */ |
631 public void initialize() { | 631 public void initialize() { |
632 initializeNative(); | 632 initializeNative(); |
633 } | 633 } |
634 | 634 |
635 /** | 635 /** |
636 * Builds the native counterpart to this class. Meant to be overridden by s
ubclasses to build | 636 * Builds the native counterpart to this class. Meant to be overridden by s
ubclasses to build |
637 * subclass native counterparts instead. Subclasses should not call this vi
a super and instead | 637 * subclass native counterparts instead. Subclasses should not call this vi
a super and instead |
638 * rely on the native class to create the JNI association. | 638 * rely on the native class to create the JNI association. |
639 */ | 639 */ |
(...skipping 21 matching lines...) Expand all Loading... |
661 */ | 661 */ |
662 protected void initContentView(long nativeWebContents) { | 662 protected void initContentView(long nativeWebContents) { |
663 NativePage previousNativePage = mNativePage; | 663 NativePage previousNativePage = mNativePage; |
664 mNativePage = null; | 664 mNativePage = null; |
665 destroyNativePageInternal(previousNativePage); | 665 destroyNativePageInternal(previousNativePage); |
666 | 666 |
667 mContentView = ContentView.newInstance(mContext, nativeWebContents, getW
indowAndroid()); | 667 mContentView = ContentView.newInstance(mContext, nativeWebContents, getW
indowAndroid()); |
668 | 668 |
669 mContentViewCore = mContentView.getContentViewCore(); | 669 mContentViewCore = mContentView.getContentViewCore(); |
670 mWebContentsDelegate = createWebContentsDelegate(); | 670 mWebContentsDelegate = createWebContentsDelegate(); |
671 mWebContentsObserver = new TabBaseWebContentsObserverAndroid(mContentVie
wCore); | 671 mWebContentsObserver = new TabWebContentsObserverAndroid(mContentViewCor
e); |
672 mVoiceSearchTabHelper = new VoiceSearchTabHelper(mContentViewCore); | 672 mVoiceSearchTabHelper = new VoiceSearchTabHelper(mContentViewCore); |
673 | 673 |
674 if (mContentViewClient != null) mContentViewCore.setContentViewClient(mC
ontentViewClient); | 674 if (mContentViewClient != null) mContentViewCore.setContentViewClient(mC
ontentViewClient); |
675 | 675 |
676 assert mNativeTabAndroid != 0; | 676 assert mNativeTabAndroid != 0; |
677 nativeInitWebContents( | 677 nativeInitWebContents( |
678 mNativeTabAndroid, mIncognito, mContentViewCore, mWebContentsDel
egate, | 678 mNativeTabAndroid, mIncognito, mContentViewCore, mWebContentsDel
egate, |
679 new TabBaseContextMenuPopulator(createContextMenuPopulator())); | 679 new TabContextMenuPopulator(createContextMenuPopulator())); |
680 | 680 |
681 // In the case where restoring a Tab or showing a prerendered one we alr
eady have a | 681 // In the case where restoring a Tab or showing a prerendered one we alr
eady have a |
682 // valid infobar container, no need to recreate one. | 682 // valid infobar container, no need to recreate one. |
683 if (mInfoBarContainer == null) { | 683 if (mInfoBarContainer == null) { |
684 // The InfoBarContainer needs to be created after the ContentView ha
s been natively | 684 // The InfoBarContainer needs to be created after the ContentView ha
s been natively |
685 // initialized. | 685 // initialized. |
686 mInfoBarContainer = new InfoBarContainer( | 686 mInfoBarContainer = new InfoBarContainer( |
687 (Activity) mContext, createAutoLoginProcessor(), getId(), ge
tContentView(), | 687 (Activity) mContext, createAutoLoginProcessor(), getId(), ge
tContentView(), |
688 nativeWebContents); | 688 nativeWebContents); |
689 } else { | 689 } else { |
690 mInfoBarContainer.onParentViewChanged(getId(), getContentView()); | 690 mInfoBarContainer.onParentViewChanged(getId(), getContentView()); |
691 } | 691 } |
692 | 692 |
693 if (AppBannerManager.isEnabled() && mAppBannerManager == null) { | 693 if (AppBannerManager.isEnabled() && mAppBannerManager == null) { |
694 mAppBannerManager = new AppBannerManager(this); | 694 mAppBannerManager = new AppBannerManager(this); |
695 } | 695 } |
696 | 696 |
697 for (TabObserver observer : mObservers) observer.onContentChanged(this); | 697 for (TabObserver observer : mObservers) observer.onContentChanged(this); |
698 } | 698 } |
699 | 699 |
700 /** | 700 /** |
701 * Cleans up all internal state, destroying any {@link NativePage} or {@link
ContentView} | 701 * Cleans up all internal state, destroying any {@link NativePage} or {@link
ContentView} |
702 * currently associated with this {@link TabBase}. This also destroys the n
ative counterpart | 702 * currently associated with this {@link Tab}. This also destroys the nativ
e counterpart |
703 * to this class, which means that all subclasses should erase their native
pointers after | 703 * to this class, which means that all subclasses should erase their native
pointers after |
704 * this method is called. Once this call is made this {@link TabBase} shoul
d no longer be used. | 704 * this method is called. Once this call is made this {@link Tab} should no
longer be used. |
705 */ | 705 */ |
706 public void destroy() { | 706 public void destroy() { |
707 for (TabObserver observer : mObservers) observer.onDestroyed(this); | 707 for (TabObserver observer : mObservers) observer.onDestroyed(this); |
708 | 708 |
709 NativePage currentNativePage = mNativePage; | 709 NativePage currentNativePage = mNativePage; |
710 mNativePage = null; | 710 mNativePage = null; |
711 destroyNativePageInternal(currentNativePage); | 711 destroyNativePageInternal(currentNativePage); |
712 destroyContentView(true); | 712 destroyContentView(true); |
713 | 713 |
714 // Destroys the native tab after destroying the ContentView but before d
estroying the | 714 // Destroys the native tab after destroying the ContentView but before d
estroying the |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
801 * Gives subclasses the chance to clean up some state associated with this {
@link ContentView}. | 801 * Gives subclasses the chance to clean up some state associated with this {
@link ContentView}. |
802 * This is because {@link #getContentView()} can return {@code null} if a {@
link NativePage} | 802 * This is because {@link #getContentView()} can return {@code null} if a {@
link NativePage} |
803 * is showing. | 803 * is showing. |
804 * @param contentView The {@link ContentView} that should have associated st
ate cleaned up. | 804 * @param contentView The {@link ContentView} that should have associated st
ate cleaned up. |
805 */ | 805 */ |
806 protected void destroyContentViewInternal(ContentView contentView) { | 806 protected void destroyContentViewInternal(ContentView contentView) { |
807 } | 807 } |
808 | 808 |
809 /** | 809 /** |
810 * A helper method to allow subclasses to build their own delegate. | 810 * A helper method to allow subclasses to build their own delegate. |
811 * @return An instance of a {@link TabBaseChromeWebContentsDelegateAndroid}. | 811 * @return An instance of a {@link TabChromeWebContentsDelegateAndroid}. |
812 */ | 812 */ |
813 protected TabBaseChromeWebContentsDelegateAndroid createWebContentsDelegate(
) { | 813 protected TabChromeWebContentsDelegateAndroid createWebContentsDelegate() { |
814 return new TabBaseChromeWebContentsDelegateAndroid(); | 814 return new TabChromeWebContentsDelegateAndroid(); |
815 } | 815 } |
816 | 816 |
817 /** | 817 /** |
818 * A helper method to allow subclasses to build their own menu populator. | 818 * A helper method to allow subclasses to build their own menu populator. |
819 * @return An instance of a {@link ContextMenuPopulator}. | 819 * @return An instance of a {@link ContextMenuPopulator}. |
820 */ | 820 */ |
821 protected ContextMenuPopulator createContextMenuPopulator() { | 821 protected ContextMenuPopulator createContextMenuPopulator() { |
822 return new ChromeContextMenuPopulator(new TabBaseChromeContextMenuItemDe
legate()); | 822 return new ChromeContextMenuPopulator(new TabChromeContextMenuItemDelega
te()); |
823 } | 823 } |
824 | 824 |
825 /** | 825 /** |
826 * @return The {@link WindowAndroid} associated with this {@link TabBase}. | 826 * @return The {@link WindowAndroid} associated with this {@link Tab}. |
827 */ | 827 */ |
828 public WindowAndroid getWindowAndroid() { | 828 public WindowAndroid getWindowAndroid() { |
829 return mWindowAndroid; | 829 return mWindowAndroid; |
830 } | 830 } |
831 | 831 |
832 /** | 832 /** |
833 * @return The current {@link TabBaseChromeWebContentsDelegateAndroid} insta
nce. | 833 * @return The current {@link TabChromeWebContentsDelegateAndroid} instance. |
834 */ | 834 */ |
835 protected TabBaseChromeWebContentsDelegateAndroid getChromeWebContentsDelega
teAndroid() { | 835 protected TabChromeWebContentsDelegateAndroid getChromeWebContentsDelegateAn
droid() { |
836 return mWebContentsDelegate; | 836 return mWebContentsDelegate; |
837 } | 837 } |
838 | 838 |
839 /** | 839 /** |
840 * Called when the favicon of the content this tab represents changes. | 840 * Called when the favicon of the content this tab represents changes. |
841 */ | 841 */ |
842 @CalledByNative | 842 @CalledByNative |
843 protected void onFaviconUpdated() { | 843 protected void onFaviconUpdated() { |
844 for (TabObserver observer : mObservers) observer.onFaviconUpdated(this); | 844 for (TabObserver observer : mObservers) observer.onFaviconUpdated(this); |
845 } | 845 } |
846 | 846 |
847 /** | 847 /** |
848 * Called when the navigation entry containing the historyitem changed, | 848 * Called when the navigation entry containing the historyitem changed, |
849 * for example because of a scroll offset or form field change. | 849 * for example because of a scroll offset or form field change. |
850 */ | 850 */ |
851 @CalledByNative | 851 @CalledByNative |
852 protected void onNavEntryChanged() { | 852 protected void onNavEntryChanged() { |
853 } | 853 } |
854 | 854 |
855 /** | 855 /** |
856 * @return The native pointer representing the native side of this {@link Ta
bBase} object. | 856 * @return The native pointer representing the native side of this {@link Ta
b} object. |
857 */ | 857 */ |
858 @CalledByNative | 858 @CalledByNative |
859 protected long getNativePtr() { | 859 protected long getNativePtr() { |
860 return mNativeTabAndroid; | 860 return mNativeTabAndroid; |
861 } | 861 } |
862 | 862 |
863 /** This is currently called when committing a pre-rendered page. */ | 863 /** This is currently called when committing a pre-rendered page. */ |
864 @CalledByNative | 864 @CalledByNative |
865 private void swapWebContents( | 865 private void swapWebContents( |
866 final long newWebContents, boolean didStartLoad, boolean didFinishLo
ad) { | 866 final long newWebContents, boolean didStartLoad, boolean didFinishLo
ad) { |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
955 ContentViewCore contentViewCore, ChromeWebContentsDelegateAndroid de
legate, | 955 ContentViewCore contentViewCore, ChromeWebContentsDelegateAndroid de
legate, |
956 ContextMenuPopulator contextMenuPopulator); | 956 ContextMenuPopulator contextMenuPopulator); |
957 private native void nativeDestroyWebContents(long nativeTabAndroid, boolean
deleteNative); | 957 private native void nativeDestroyWebContents(long nativeTabAndroid, boolean
deleteNative); |
958 private native WebContents nativeGetWebContents(long nativeTabAndroid); | 958 private native WebContents nativeGetWebContents(long nativeTabAndroid); |
959 private native Profile nativeGetProfileAndroid(long nativeTabAndroid); | 959 private native Profile nativeGetProfileAndroid(long nativeTabAndroid); |
960 private native int nativeGetSecurityLevel(long nativeTabAndroid); | 960 private native int nativeGetSecurityLevel(long nativeTabAndroid); |
961 private native void nativeSetActiveNavigationEntryTitleForUrl(long nativeTab
Android, String url, | 961 private native void nativeSetActiveNavigationEntryTitleForUrl(long nativeTab
Android, String url, |
962 String title); | 962 String title); |
963 private native boolean nativePrint(long nativeTabAndroid); | 963 private native boolean nativePrint(long nativeTabAndroid); |
964 } | 964 } |
OLD | NEW |