OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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.tab; | 5 package org.chromium.chrome.browser.tab; |
6 | 6 |
7 import android.annotation.TargetApi; | 7 import android.annotation.TargetApi; |
8 import android.app.Activity; | 8 import android.app.Activity; |
9 import android.app.ActivityManager; | 9 import android.app.ActivityManager; |
10 import android.content.Context; | 10 import android.content.Context; |
11 import android.content.Intent; | 11 import android.content.Intent; |
12 import android.content.res.Resources; | 12 import android.content.res.Resources; |
13 import android.graphics.Bitmap; | 13 import android.graphics.Bitmap; |
14 import android.graphics.Color; | 14 import android.graphics.Color; |
15 import android.graphics.Rect; | 15 import android.graphics.Rect; |
16 import android.media.AudioManager; | 16 import android.media.AudioManager; |
17 import android.os.Build; | 17 import android.os.Build; |
18 import android.os.Handler; | 18 import android.os.Handler; |
19 import android.os.Message; | 19 import android.os.Message; |
20 import android.provider.Browser; | 20 import android.provider.Browser; |
21 import android.text.TextUtils; | 21 import android.text.TextUtils; |
22 import android.util.Log; | 22 import android.util.Log; |
23 import android.util.Pair; | 23 import android.util.Pair; |
24 import android.view.ContextMenu; | 24 import android.view.ContextMenu; |
| 25 import android.view.ContextThemeWrapper; |
25 import android.view.KeyEvent; | 26 import android.view.KeyEvent; |
26 import android.view.View; | 27 import android.view.View; |
27 import android.view.View.OnClickListener; | 28 import android.view.View.OnClickListener; |
28 import android.view.ViewGroup; | 29 import android.view.ViewGroup; |
29 import android.view.ViewGroup.LayoutParams; | 30 import android.view.ViewGroup.LayoutParams; |
30 import android.widget.FrameLayout; | 31 import android.widget.FrameLayout; |
31 | 32 |
32 import org.chromium.base.ActivityState; | 33 import org.chromium.base.ActivityState; |
33 import org.chromium.base.ApiCompatibilityUtils; | 34 import org.chromium.base.ApiCompatibilityUtils; |
34 import org.chromium.base.ApplicationState; | 35 import org.chromium.base.ApplicationState; |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
156 | 157 |
157 /** | 158 /** |
158 * The required page load percentage for the page to be considered ready ass
uming the | 159 * The required page load percentage for the page to be considered ready ass
uming the |
159 * TextureView is also ready. | 160 * TextureView is also ready. |
160 */ | 161 */ |
161 private static final int CONSIDERED_READY_LOAD_PERCENTAGE = 100; | 162 private static final int CONSIDERED_READY_LOAD_PERCENTAGE = 100; |
162 | 163 |
163 /** Used for logging. */ | 164 /** Used for logging. */ |
164 private static final String TAG = "Tab"; | 165 private static final String TAG = "Tab"; |
165 | 166 |
166 /** | |
167 * The {@link Activity} used to create {@link View}s and other Android compo
nents. Unlike | |
168 * {@link #mApplicationContext}, this is not publicly exposed to help preven
t leaking the | |
169 * {@link Activity}. | |
170 */ | |
171 protected final ChromeActivity mActivity; | |
172 | |
173 private long mNativeTabAndroid; | 167 private long mNativeTabAndroid; |
174 | 168 |
175 /** Unique id of this tab (within its container). */ | 169 /** Unique id of this tab (within its container). */ |
176 private final int mId; | 170 private final int mId; |
177 | 171 |
178 /** Whether or not this tab is an incognito tab. */ | 172 /** Whether or not this tab is an incognito tab. */ |
179 private final boolean mIncognito; | 173 private final boolean mIncognito; |
180 | 174 |
181 /** | 175 /** |
182 * An Application {@link Context}. Unlike {@link #mActivity}, this is the o
nly one that is | 176 * An Application {@link Context}. Unlike {@link #mActivity}, this is the o
nly one that is |
183 * publicly exposed to help prevent leaking the {@link Activity}. | 177 * publicly exposed to help prevent leaking the {@link Activity}. |
184 */ | 178 */ |
185 private final Context mApplicationContext; | 179 private final Context mApplicationContext; |
186 | 180 |
| 181 private final ContextThemeWrapper mThemedContext; |
| 182 |
187 /** Gives {@link Tab} a way to interact with the Android window. */ | 183 /** Gives {@link Tab} a way to interact with the Android window. */ |
188 private final WindowAndroid mWindowAndroid; | 184 private final WindowAndroid mWindowAndroid; |
189 | 185 |
190 /** Whether or not this {@link Tab} is initialized and should be interacted
with. */ | 186 /** Whether or not this {@link Tab} is initialized and should be interacted
with. */ |
191 private boolean mIsInitialized; | 187 private boolean mIsInitialized; |
192 | 188 |
193 /** The current native page (e.g. chrome-native://newtab), or {@code null} i
f there is none. */ | 189 /** The current native page (e.g. chrome-native://newtab), or {@code null} i
f there is none. */ |
194 private NativePage mNativePage; | 190 private NativePage mNativePage; |
195 | 191 |
196 /** InfoBar container to show InfoBars for this tab. */ | 192 /** InfoBar container to show InfoBars for this tab. */ |
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
381 */ | 377 */ |
382 protected boolean mLastPageLoadHasSpdyProxyPassthroughHeaders; | 378 protected boolean mLastPageLoadHasSpdyProxyPassthroughHeaders; |
383 | 379 |
384 private ChromeDownloadDelegate mDownloadDelegate; | 380 private ChromeDownloadDelegate mDownloadDelegate; |
385 | 381 |
386 protected Handler mHandler; | 382 protected Handler mHandler; |
387 | 383 |
388 private final Runnable mCloseContentsRunnable = new Runnable() { | 384 private final Runnable mCloseContentsRunnable = new Runnable() { |
389 @Override | 385 @Override |
390 public void run() { | 386 public void run() { |
391 boolean isSelected = mActivity.getTabModelSelector().getCurrentTab()
== Tab.this; | 387 TabModelSelector selector = getTabModelSelector(); |
392 mActivity.getTabModelSelector().closeTab(Tab.this); | 388 if (selector == null) return; |
| 389 boolean isSelected = selector.getCurrentTab() == Tab.this; |
| 390 selector.closeTab(Tab.this); |
393 | 391 |
394 // If the parent Tab belongs to another Activity, fire the Intent to
bring it back. | 392 // If the parent Tab belongs to another Activity, fire the Intent to
bring it back. |
395 if (isSelected && getParentIntent() != null | 393 if (isSelected && getParentIntent() != null |
396 && mActivity.getIntent() != getParentIntent()) { | 394 && getActivity().getIntent() != getParentIntent()) { |
397 boolean mayLaunch = FeatureUtilities.isDocumentMode(mActivity) | 395 boolean mayLaunch = FeatureUtilities.isDocumentMode(mApplication
Context) |
398 ? isParentInAndroidOverview() : true; | 396 ? isParentInAndroidOverview() : true; |
399 if (mayLaunch) mActivity.startActivity(getParentIntent()); | 397 if (mayLaunch) getActivity().startActivity(getParentIntent()); |
400 } | 398 } |
401 } | 399 } |
402 | 400 |
403 /** If the API allows it, returns whether a Task still exists for the pa
rent Activity. */ | 401 /** If the API allows it, returns whether a Task still exists for the pa
rent Activity. */ |
404 @TargetApi(Build.VERSION_CODES.LOLLIPOP) | 402 @TargetApi(Build.VERSION_CODES.LOLLIPOP) |
405 private boolean isParentInAndroidOverview() { | 403 private boolean isParentInAndroidOverview() { |
406 ActivityManager activityManager = | 404 ActivityManager activityManager = (ActivityManager) mApplicationCont
ext. |
407 (ActivityManager) mActivity.getSystemService(Context.ACTIVIT
Y_SERVICE); | 405 getSystemService(Context.ACTIVITY_SERVICE); |
408 for (ActivityManager.AppTask task : activityManager.getAppTasks()) { | 406 for (ActivityManager.AppTask task : activityManager.getAppTasks()) { |
409 Intent taskIntent = DocumentUtils.getBaseIntentFromTask(task); | 407 Intent taskIntent = DocumentUtils.getBaseIntentFromTask(task); |
410 if (taskIntent != null && taskIntent.filterEquals(getParentInten
t())) return true; | 408 if (taskIntent != null && taskIntent.filterEquals(getParentInten
t())) return true; |
411 } | 409 } |
412 return false; | 410 return false; |
413 } | 411 } |
414 }; | 412 }; |
415 | 413 |
416 /** | 414 /** |
417 * A default {@link ChromeContextMenuItemDelegate} that supports some of the
context menu | 415 * A default {@link ChromeContextMenuItemDelegate} that supports some of the
context menu |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
460 mClipboard.setText(text, text); | 458 mClipboard.setText(text, text); |
461 } | 459 } |
462 | 460 |
463 @Override | 461 @Override |
464 public void onSaveImageToClipboard(String url) { | 462 public void onSaveImageToClipboard(String url) { |
465 mClipboard.setHTMLText("<img src=\"" + url + "\">", url, url); | 463 mClipboard.setHTMLText("<img src=\"" + url + "\">", url, url); |
466 } | 464 } |
467 | 465 |
468 @Override | 466 @Override |
469 public void onOpenInNewTab(String url, Referrer referrer) { | 467 public void onOpenInNewTab(String url, Referrer referrer) { |
| 468 if (getTabModelSelector() == null) return; |
470 RecordUserAction.record("MobileNewTabOpened"); | 469 RecordUserAction.record("MobileNewTabOpened"); |
471 LoadUrlParams loadUrlParams = new LoadUrlParams(url); | 470 LoadUrlParams loadUrlParams = new LoadUrlParams(url); |
472 loadUrlParams.setReferrer(referrer); | 471 loadUrlParams.setReferrer(referrer); |
473 mActivity.getTabModelSelector().openNewTab(loadUrlParams, | 472 getTabModelSelector().openNewTab(loadUrlParams, |
474 TabLaunchType.FROM_LONGPRESS_BACKGROUND, Tab.this, isIncogni
to()); | 473 TabLaunchType.FROM_LONGPRESS_BACKGROUND, Tab.this, isIncogni
to()); |
475 } | 474 } |
476 | 475 |
477 @Override | 476 @Override |
478 public void onReloadIgnoringCache() { | 477 public void onReloadIgnoringCache() { |
479 reloadIgnoringCache(); | 478 reloadIgnoringCache(); |
480 } | 479 } |
481 | 480 |
482 @Override | 481 @Override |
483 public void onLoadOriginalImage() { | 482 public void onLoadOriginalImage() { |
484 if (mNativeTabAndroid != 0) nativeLoadOriginalImage(mNativeTabAndroi
d); | 483 if (mNativeTabAndroid != 0) nativeLoadOriginalImage(mNativeTabAndroi
d); |
485 } | 484 } |
486 | 485 |
487 @Override | 486 @Override |
488 public void onOpenInNewIncognitoTab(String url) { | 487 public void onOpenInNewIncognitoTab(String url) { |
| 488 if (getTabModelSelector() == null) return; |
489 RecordUserAction.record("MobileNewTabOpened"); | 489 RecordUserAction.record("MobileNewTabOpened"); |
490 mActivity.getTabModelSelector().openNewTab(new LoadUrlParams(url), | 490 getTabModelSelector().openNewTab(new LoadUrlParams(url), |
491 TabLaunchType.FROM_LONGPRESS_FOREGROUND, Tab.this, true); | 491 TabLaunchType.FROM_LONGPRESS_FOREGROUND, Tab.this, true); |
492 } | 492 } |
493 | 493 |
494 @Override | 494 @Override |
495 public String getPageUrl() { | 495 public String getPageUrl() { |
496 return getUrl(); | 496 return getUrl(); |
497 } | 497 } |
498 | 498 |
499 @Override | 499 @Override |
500 public void onOpenImageUrl(String url, Referrer referrer) { | 500 public void onOpenImageUrl(String url, Referrer referrer) { |
501 LoadUrlParams loadUrlParams = new LoadUrlParams(url); | 501 LoadUrlParams loadUrlParams = new LoadUrlParams(url); |
502 loadUrlParams.setTransitionType(PageTransition.LINK); | 502 loadUrlParams.setTransitionType(PageTransition.LINK); |
503 loadUrlParams.setReferrer(referrer); | 503 loadUrlParams.setReferrer(referrer); |
504 loadUrl(loadUrlParams); | 504 loadUrl(loadUrlParams); |
505 } | 505 } |
506 | 506 |
507 @Override | 507 @Override |
508 public void onOpenImageInNewTab(String url, Referrer referrer) { | 508 public void onOpenImageInNewTab(String url, Referrer referrer) { |
| 509 if (getTabModelSelector() == null) return; |
509 boolean useOriginal = isSpdyProxyEnabledForUrl(url); | 510 boolean useOriginal = isSpdyProxyEnabledForUrl(url); |
510 LoadUrlParams loadUrlParams = new LoadUrlParams(url); | 511 LoadUrlParams loadUrlParams = new LoadUrlParams(url); |
511 loadUrlParams.setVerbatimHeaders(useOriginal ? PAGESPEED_PASSTHROUGH
_HEADERS : null); | 512 loadUrlParams.setVerbatimHeaders(useOriginal ? PAGESPEED_PASSTHROUGH
_HEADERS : null); |
512 loadUrlParams.setReferrer(referrer); | 513 loadUrlParams.setReferrer(referrer); |
513 mActivity.getTabModelSelector().openNewTab(loadUrlParams, | 514 getTabModelSelector().openNewTab(loadUrlParams, |
514 TabLaunchType.FROM_LONGPRESS_BACKGROUND, Tab.this, isIncogni
to()); | 515 TabLaunchType.FROM_LONGPRESS_BACKGROUND, Tab.this, isIncogni
to()); |
515 } | 516 } |
516 | 517 |
517 @Override | 518 @Override |
518 public void onSearchByImageInNewTab() { | 519 public void onSearchByImageInNewTab() { |
519 triggerSearchByImage(); | 520 triggerSearchByImage(); |
520 } | 521 } |
521 } | 522 } |
522 | 523 |
523 /** | 524 /** |
(...skipping 21 matching lines...) Expand all Loading... |
545 @Override | 546 @Override |
546 public void onUpdateUrl(String url) { | 547 public void onUpdateUrl(String url) { |
547 for (TabObserver observer : mObservers) observer.onUpdateUrl(Tab.thi
s, url); | 548 for (TabObserver observer : mObservers) observer.onUpdateUrl(Tab.thi
s, url); |
548 } | 549 } |
549 | 550 |
550 @Override | 551 @Override |
551 public void showRepostFormWarningDialog() { | 552 public void showRepostFormWarningDialog() { |
552 // When the dialog is visible, keeping the refresh animation active | 553 // When the dialog is visible, keeping the refresh animation active |
553 // in the background is distracting and unnecessary (and likely to | 554 // in the background is distracting and unnecessary (and likely to |
554 // jank when the dialog is shown). | 555 // jank when the dialog is shown). |
555 if (mSwipeRefreshHandler != null) { | 556 if (mSwipeRefreshHandler != null) mSwipeRefreshHandler.reset(); |
556 mSwipeRefreshHandler.reset(); | 557 if (getActivity() == null) return; |
557 } | |
558 RepostFormWarningDialog warningDialog = new RepostFormWarningDialog( | 558 RepostFormWarningDialog warningDialog = new RepostFormWarningDialog( |
559 new Runnable() { | 559 new Runnable() { |
560 @Override | 560 @Override |
561 public void run() { | 561 public void run() { |
562 getWebContents().getNavigationController().cancelPen
dingReload(); | 562 getWebContents().getNavigationController().cancelPen
dingReload(); |
563 } | 563 } |
564 }, new Runnable() { | 564 }, new Runnable() { |
565 @Override | 565 @Override |
566 public void run() { | 566 public void run() { |
567 getWebContents().getNavigationController().continueP
endingReload(); | 567 getWebContents().getNavigationController().continueP
endingReload(); |
568 } | 568 } |
569 }); | 569 }); |
570 warningDialog.show(mActivity.getFragmentManager(), null); | 570 warningDialog.show(getActivity().getFragmentManager(), null); |
571 } | 571 } |
572 | 572 |
573 @Override | 573 @Override |
574 public void toggleFullscreenModeForTab(boolean enableFullscreen) { | 574 public void toggleFullscreenModeForTab(boolean enableFullscreen) { |
575 if (mFullscreenManager != null) { | 575 if (mFullscreenManager != null) { |
576 mFullscreenManager.setPersistentFullscreenMode(enableFullscreen)
; | 576 mFullscreenManager.setPersistentFullscreenMode(enableFullscreen)
; |
577 } | 577 } |
578 | 578 |
579 for (TabObserver observer : mObservers) { | 579 for (TabObserver observer : mObservers) { |
580 observer.onToggleFullscreenMode(Tab.this, enableFullscreen); | 580 observer.onToggleFullscreenMode(Tab.this, enableFullscreen); |
(...skipping 21 matching lines...) Expand all Loading... |
602 for (TabObserver observer : mObservers) observer.onSSLStateUpdated(T
ab.this); | 602 for (TabObserver observer : mObservers) observer.onSSLStateUpdated(T
ab.this); |
603 } | 603 } |
604 | 604 |
605 @Override | 605 @Override |
606 public void webContentsCreated(WebContents sourceWebContents, long opene
rRenderFrameId, | 606 public void webContentsCreated(WebContents sourceWebContents, long opene
rRenderFrameId, |
607 String frameName, String targetUrl, WebContents newWebContents)
{ | 607 String frameName, String targetUrl, WebContents newWebContents)
{ |
608 for (TabObserver observer : mObservers) { | 608 for (TabObserver observer : mObservers) { |
609 observer.webContentsCreated(Tab.this, sourceWebContents, openerR
enderFrameId, | 609 observer.webContentsCreated(Tab.this, sourceWebContents, openerR
enderFrameId, |
610 frameName, targetUrl, newWebContents); | 610 frameName, targetUrl, newWebContents); |
611 } | 611 } |
| 612 if (getActivity() == null) return; |
612 // The URL can't be taken from the WebContents if it's paused. Save
it for later. | 613 // The URL can't be taken from the WebContents if it's paused. Save
it for later. |
613 assert mWebContentsUrlMapping == null; | 614 assert mWebContentsUrlMapping == null; |
614 mWebContentsUrlMapping = Pair.create(newWebContents, targetUrl); | 615 mWebContentsUrlMapping = Pair.create(newWebContents, targetUrl); |
615 | 616 |
616 // TODO(dfalcantara): Re-remove this once crbug.com/508366 is fixed. | 617 // TODO(dfalcantara): Re-remove this once crbug.com/508366 is fixed. |
617 TabCreator tabCreator = mActivity.getTabCreator(isIncognito()); | 618 TabCreator tabCreator = getActivity().getTabCreator(isIncognito()); |
618 | 619 |
619 if (tabCreator != null && tabCreator.createsTabsAsynchronously()) { | 620 if (tabCreator != null && tabCreator.createsTabsAsynchronously()) { |
620 DocumentWebContentsDelegate.getInstance().attachDelegate(newWebC
ontents); | 621 DocumentWebContentsDelegate.getInstance().attachDelegate(newWebC
ontents); |
621 } | 622 } |
622 } | 623 } |
623 | 624 |
624 @Override | 625 @Override |
625 public void rendererUnresponsive() { | 626 public void rendererUnresponsive() { |
626 super.rendererUnresponsive(); | 627 super.rendererUnresponsive(); |
627 if (mNativeTabAndroid != 0) nativeOnRendererUnresponsive(mNativeTabA
ndroid); | 628 if (mNativeTabAndroid != 0) nativeOnRendererUnresponsive(mNativeTabA
ndroid); |
(...skipping 21 matching lines...) Expand all Loading... |
649 @Override | 650 @Override |
650 public void openNewTab(String url, String extraHeaders, byte[] postData,
int disposition, | 651 public void openNewTab(String url, String extraHeaders, byte[] postData,
int disposition, |
651 boolean isRendererInitiated) { | 652 boolean isRendererInitiated) { |
652 Tab.this.openNewTab( | 653 Tab.this.openNewTab( |
653 url, extraHeaders, postData, disposition, true, isRendererIn
itiated); | 654 url, extraHeaders, postData, disposition, true, isRendererIn
itiated); |
654 } | 655 } |
655 | 656 |
656 private Pair<WebContents, String> mWebContentsUrlMapping; | 657 private Pair<WebContents, String> mWebContentsUrlMapping; |
657 | 658 |
658 protected TabModel getTabModel() { | 659 protected TabModel getTabModel() { |
| 660 if (getTabModelSelector() == null) return null; |
659 // TODO(dfalcantara): Remove this when DocumentActivity.getTabModelS
elector() | 661 // TODO(dfalcantara): Remove this when DocumentActivity.getTabModelS
elector() |
660 // can return a TabModelSelector that activateCon
tents() can use. | 662 // can return a TabModelSelector that activateCon
tents() can use. |
661 return mActivity.getTabModelSelector().getModel(isIncognito()); | 663 return getTabModelSelector().getModel(isIncognito()); |
662 } | 664 } |
663 | 665 |
664 @Override | 666 @Override |
665 public boolean shouldResumeRequestsForCreatedWindow() { | 667 public boolean shouldResumeRequestsForCreatedWindow() { |
| 668 if (getActivity() == null) return false; |
666 // Pause the WebContents if an Activity has to be created for it fir
st. | 669 // Pause the WebContents if an Activity has to be created for it fir
st. |
667 TabCreator tabCreator = mActivity.getTabCreator(isIncognito()); | 670 TabCreator tabCreator = getActivity().getTabCreator(isIncognito()); |
668 assert tabCreator != null; | 671 assert tabCreator != null; |
669 return !tabCreator.createsTabsAsynchronously(); | 672 return !tabCreator.createsTabsAsynchronously(); |
670 } | 673 } |
671 | 674 |
672 @Override | 675 @Override |
673 public boolean addNewContents(WebContents sourceWebContents, WebContents
webContents, | 676 public boolean addNewContents(WebContents sourceWebContents, WebContents
webContents, |
674 int disposition, Rect initialPosition, boolean userGesture) { | 677 int disposition, Rect initialPosition, boolean userGesture) { |
675 assert mWebContentsUrlMapping.first == webContents; | 678 assert mWebContentsUrlMapping.first == webContents; |
676 | 679 if (getActivity() == null) return false; |
677 TabCreator tabCreator = mActivity.getTabCreator(isIncognito()); | 680 TabCreator tabCreator = getActivity().getTabCreator(isIncognito()); |
678 assert tabCreator != null; | 681 assert tabCreator != null; |
679 | 682 |
680 // Grab the URL, which might not be available via the Tab. | 683 // Grab the URL, which might not be available via the Tab. |
681 String url = mWebContentsUrlMapping.second; | 684 String url = mWebContentsUrlMapping.second; |
682 mWebContentsUrlMapping = null; | 685 mWebContentsUrlMapping = null; |
683 | 686 |
684 // Skip opening a new Tab if it doesn't make sense. | 687 // Skip opening a new Tab if it doesn't make sense. |
685 if (isClosing()) return false; | 688 if (isClosing()) return false; |
686 | 689 |
687 // Creating new Tabs asynchronously requires starting a new Activity
to create the Tab, | 690 // Creating new Tabs asynchronously requires starting a new Activity
to create the Tab, |
688 // so the Tab returned will always be null. There's no way to know
synchronously | 691 // so the Tab returned will always be null. There's no way to know
synchronously |
689 // whether the Tab is created, so assume it's always successful. | 692 // whether the Tab is created, so assume it's always successful. |
690 boolean createdSuccessfully = tabCreator.createTabWithWebContents( | 693 boolean createdSuccessfully = tabCreator.createTabWithWebContents( |
691 webContents, getId(), TabLaunchType.FROM_LONGPRESS_FOREGROUN
D, url); | 694 webContents, getId(), TabLaunchType.FROM_LONGPRESS_FOREGROUN
D, url); |
692 boolean success = tabCreator.createsTabsAsynchronously() || createdS
uccessfully; | 695 boolean success = tabCreator.createsTabsAsynchronously() || createdS
uccessfully; |
693 if (success && disposition == WindowOpenDisposition.NEW_POPUP) { | 696 if (success && disposition == WindowOpenDisposition.NEW_POPUP) { |
694 PolicyAuditor auditor = | 697 PolicyAuditor auditor = |
695 ((ChromeApplication) getApplicationContext()).getPolicyA
uditor(); | 698 ((ChromeApplication) getApplicationContext()).getPolicyA
uditor(); |
696 auditor.notifyAuditEvent(getApplicationContext(), AuditEvent.OPE
N_POPUP_URL_SUCCESS, | 699 auditor.notifyAuditEvent(getApplicationContext(), AuditEvent.OPE
N_POPUP_URL_SUCCESS, |
697 url, ""); | 700 url, ""); |
698 } | 701 } |
699 | 702 |
700 return success; | 703 return success; |
701 } | 704 } |
702 | 705 |
703 @Override | 706 @Override |
704 public void activateContents() { | 707 public void activateContents() { |
705 boolean activityIsDestroyed = false; | 708 boolean activityIsDestroyed = false; |
706 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { | 709 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 |
707 activityIsDestroyed = mActivity.isDestroyed(); | 710 && getActivity() != null) { |
| 711 activityIsDestroyed = getActivity().isDestroyed(); |
708 } | 712 } |
709 if (activityIsDestroyed || !isInitialized()) { | 713 if (activityIsDestroyed || !isInitialized()) { |
710 Log.e(TAG, "Activity destroyed before calling activateContents()
. Bailing out."); | 714 Log.e(TAG, "Activity destroyed before calling activateContents()
. Bailing out."); |
711 return; | 715 return; |
712 } | 716 } |
713 | 717 |
714 TabModel model = getTabModel(); | 718 TabModel model = getTabModel(); |
715 int index = model.indexOf(Tab.this); | 719 int index = model.indexOf(Tab.this); |
716 if (index == TabModel.INVALID_TAB_INDEX) return; | 720 if (index == TabModel.INVALID_TAB_INDEX) return; |
717 TabModelUtils.setIndex(model, index); | 721 TabModelUtils.setIndex(model, index); |
(...skipping 23 matching lines...) Expand all Loading... |
741 @Override | 745 @Override |
742 public void closeContents() { | 746 public void closeContents() { |
743 // Execute outside of callback, otherwise we end up deleting the nat
ive | 747 // Execute outside of callback, otherwise we end up deleting the nat
ive |
744 // objects in the middle of executing methods on them. | 748 // objects in the middle of executing methods on them. |
745 mHandler.removeCallbacks(mCloseContentsRunnable); | 749 mHandler.removeCallbacks(mCloseContentsRunnable); |
746 mHandler.post(mCloseContentsRunnable); | 750 mHandler.post(mCloseContentsRunnable); |
747 } | 751 } |
748 | 752 |
749 @Override | 753 @Override |
750 public boolean takeFocus(boolean reverse) { | 754 public boolean takeFocus(boolean reverse) { |
| 755 if (getActivity() == null) return false; |
| 756 Activity activity = getActivity(); |
751 if (reverse) { | 757 if (reverse) { |
752 View menuButton = mActivity.findViewById(R.id.menu_button); | 758 View menuButton = activity.findViewById(R.id.menu_button); |
753 if (menuButton == null || !menuButton.isShown()) { | 759 if (menuButton == null || !menuButton.isShown()) { |
754 menuButton = mActivity.findViewById(R.id.document_menu_butto
n); | 760 menuButton = activity.findViewById(R.id.document_menu_button
); |
755 } | 761 } |
756 if (menuButton != null && menuButton.isShown()) { | 762 if (menuButton != null && menuButton.isShown()) { |
757 return menuButton.requestFocus(); | 763 return menuButton.requestFocus(); |
758 } | 764 } |
759 | 765 |
760 View tabSwitcherButton = mActivity.findViewById(R.id.tab_switche
r_button); | 766 View tabSwitcherButton = activity.findViewById(R.id.tab_switcher
_button); |
761 if (tabSwitcherButton != null && tabSwitcherButton.isShown()) { | 767 if (tabSwitcherButton != null && tabSwitcherButton.isShown()) { |
762 return tabSwitcherButton.requestFocus(); | 768 return tabSwitcherButton.requestFocus(); |
763 } | 769 } |
764 } else { | 770 } else { |
765 View urlBar = mActivity.findViewById(R.id.url_bar); | 771 View urlBar = activity.findViewById(R.id.url_bar); |
766 if (urlBar != null) return urlBar.requestFocus(); | 772 if (urlBar != null) return urlBar.requestFocus(); |
767 } | 773 } |
768 return false; | 774 return false; |
769 } | 775 } |
770 | 776 |
771 @Override | 777 @Override |
772 public void handleKeyboardEvent(KeyEvent event) { | 778 public void handleKeyboardEvent(KeyEvent event) { |
| 779 if (getActivity() == null) return; |
773 if (event.getAction() == KeyEvent.ACTION_DOWN) { | 780 if (event.getAction() == KeyEvent.ACTION_DOWN) { |
774 if (mActivity.onKeyDown(event.getKeyCode(), event)) return; | 781 if (getActivity().onKeyDown(event.getKeyCode(), event)) return; |
775 | 782 |
776 // Handle the Escape key here (instead of in KeyboardShortcuts.j
ava), so it doesn't | 783 // Handle the Escape key here (instead of in KeyboardShortcuts.j
ava), so it doesn't |
777 // interfere with other parts of the activity (e.g. the URL bar)
. | 784 // interfere with other parts of the activity (e.g. the URL bar)
. |
778 if (event.getKeyCode() == KeyEvent.KEYCODE_ESCAPE && event.hasNo
Modifiers()) { | 785 if (event.getKeyCode() == KeyEvent.KEYCODE_ESCAPE && event.hasNo
Modifiers()) { |
779 WebContents wc = getWebContents(); | 786 WebContents wc = getWebContents(); |
780 if (wc != null) wc.stop(); | 787 if (wc != null) wc.stop(); |
781 return; | 788 return; |
782 } | 789 } |
783 } | 790 } |
784 handleMediaKey(event); | 791 handleMediaKey(event); |
(...skipping 14 matching lines...) Expand all Loading... |
799 case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE: | 806 case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE: |
800 case KeyEvent.KEYCODE_MEDIA_STOP: | 807 case KeyEvent.KEYCODE_MEDIA_STOP: |
801 case KeyEvent.KEYCODE_MEDIA_NEXT: | 808 case KeyEvent.KEYCODE_MEDIA_NEXT: |
802 case KeyEvent.KEYCODE_MEDIA_PREVIOUS: | 809 case KeyEvent.KEYCODE_MEDIA_PREVIOUS: |
803 case KeyEvent.KEYCODE_MEDIA_REWIND: | 810 case KeyEvent.KEYCODE_MEDIA_REWIND: |
804 case KeyEvent.KEYCODE_MEDIA_RECORD: | 811 case KeyEvent.KEYCODE_MEDIA_RECORD: |
805 case KeyEvent.KEYCODE_MEDIA_FAST_FORWARD: | 812 case KeyEvent.KEYCODE_MEDIA_FAST_FORWARD: |
806 case KeyEvent.KEYCODE_MEDIA_CLOSE: | 813 case KeyEvent.KEYCODE_MEDIA_CLOSE: |
807 case KeyEvent.KEYCODE_MEDIA_EJECT: | 814 case KeyEvent.KEYCODE_MEDIA_EJECT: |
808 case KeyEvent.KEYCODE_MEDIA_AUDIO_TRACK: | 815 case KeyEvent.KEYCODE_MEDIA_AUDIO_TRACK: |
809 AudioManager am = (AudioManager) mActivity.getSystemService( | 816 AudioManager am = (AudioManager) mApplicationContext.getSyst
emService( |
810 Context.AUDIO_SERVICE); | 817 Context.AUDIO_SERVICE); |
811 am.dispatchMediaKeyEvent(e); | 818 am.dispatchMediaKeyEvent(e); |
812 break; | 819 break; |
813 default: | 820 default: |
814 break; | 821 break; |
815 } | 822 } |
816 } | 823 } |
817 | 824 |
818 /** | 825 /** |
819 * @return Whether audio is being captured. | 826 * @return Whether audio is being captured. |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
878 updateFullscreenEnabledState(); | 885 updateFullscreenEnabledState(); |
879 } | 886 } |
880 | 887 |
881 @Override | 888 @Override |
882 public boolean doesPerformWebSearch() { | 889 public boolean doesPerformWebSearch() { |
883 return true; | 890 return true; |
884 } | 891 } |
885 | 892 |
886 @Override | 893 @Override |
887 public void performWebSearch(String searchQuery) { | 894 public void performWebSearch(String searchQuery) { |
888 if (TextUtils.isEmpty(searchQuery)) return; | 895 if (TextUtils.isEmpty(searchQuery) || getTabModelSelector() == null)
return; |
889 String url = TemplateUrlService.getInstance().getUrlForSearchQuery(s
earchQuery); | 896 String url = TemplateUrlService.getInstance().getUrlForSearchQuery(s
earchQuery); |
890 String headers = GeolocationHeader.getGeoHeader(getApplicationContex
t(), url, | 897 String headers = GeolocationHeader.getGeoHeader(getApplicationContex
t(), url, |
891 isIncognito()); | 898 isIncognito()); |
892 | 899 |
893 LoadUrlParams loadUrlParams = new LoadUrlParams(url); | 900 LoadUrlParams loadUrlParams = new LoadUrlParams(url); |
894 loadUrlParams.setVerbatimHeaders(headers); | 901 loadUrlParams.setVerbatimHeaders(headers); |
895 loadUrlParams.setTransitionType(PageTransition.GENERATED); | 902 loadUrlParams.setTransitionType(PageTransition.GENERATED); |
896 mActivity.getTabModelSelector().openNewTab(loadUrlParams, | 903 getTabModelSelector().openNewTab(loadUrlParams, |
897 TabLaunchType.FROM_LONGPRESS_FOREGROUND, Tab.this, isIncogni
to()); | 904 TabLaunchType.FROM_LONGPRESS_FOREGROUND, Tab.this, isIncogni
to()); |
898 } | 905 } |
899 | 906 |
900 @Override | 907 @Override |
901 public ContentVideoViewClient getContentVideoViewClient() { | 908 public ContentVideoViewClient getContentVideoViewClient() { |
902 return new ActivityContentVideoViewClient(mActivity) { | 909 assert getActivity() != null; |
| 910 return new ActivityContentVideoViewClient(getActivity()) { |
903 @Override | 911 @Override |
904 public void enterFullscreenVideo(View view) { | 912 public void enterFullscreenVideo(View view) { |
905 super.enterFullscreenVideo(view); | 913 super.enterFullscreenVideo(view); |
906 FullscreenManager fullscreenManager = getFullscreenManager()
; | 914 FullscreenManager fullscreenManager = getFullscreenManager()
; |
907 if (fullscreenManager != null) { | 915 if (fullscreenManager != null) { |
908 fullscreenManager.setOverlayVideoMode(true); | 916 fullscreenManager.setOverlayVideoMode(true); |
909 // Disable double tap for video. | 917 // Disable double tap for video. |
910 if (getContentViewCore() != null) { | 918 if (getContentViewCore() != null) { |
911 getContentViewCore().updateDoubleTapSupport(false); | 919 getContentViewCore().updateDoubleTapSupport(false); |
912 } | 920 } |
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1147 | 1155 |
1148 /** | 1156 /** |
1149 * Creates an instance of a {@link Tab}. | 1157 * Creates an instance of a {@link Tab}. |
1150 * @param id The id this tab should be identified with. | 1158 * @param id The id this tab should be identified with. |
1151 * @param parentId The id id of the tab that caused this tab to be opened
. | 1159 * @param parentId The id id of the tab that caused this tab to be opened
. |
1152 * @param incognito Whether or not this tab is incognito. | 1160 * @param incognito Whether or not this tab is incognito. |
1153 * @param activity An instance of a {@link Context}. | 1161 * @param activity An instance of a {@link Context}. |
1154 * @param window An instance of a {@link WindowAndroid}. | 1162 * @param window An instance of a {@link WindowAndroid}. |
1155 * @param frozenState State containing information about this Tab, if it was
persisted. | 1163 * @param frozenState State containing information about this Tab, if it was
persisted. |
1156 */ | 1164 */ |
1157 public Tab(int id, int parentId, boolean incognito, ChromeActivity activity, | 1165 public Tab(int id, int parentId, boolean incognito, Context context, |
1158 WindowAndroid window, TabLaunchType type, TabState frozenState) { | 1166 WindowAndroid window, TabLaunchType type, TabState frozenState) { |
1159 mId = TabIdManager.getInstance().generateValidId(id); | 1167 mId = TabIdManager.getInstance().generateValidId(id); |
1160 mParentId = parentId; | 1168 mParentId = parentId; |
1161 mIncognito = incognito; | 1169 mIncognito = incognito; |
1162 mActivity = activity; | 1170 mApplicationContext = context != null ? context.getApplicationContext()
: null; |
1163 mApplicationContext = activity != null ? activity.getApplicationContext(
) : null; | 1171 mThemedContext = new ContextThemeWrapper(mApplicationContext, R.style.Ma
inTheme); |
1164 mWindowAndroid = window; | 1172 mWindowAndroid = window; |
1165 mLaunchType = type; | 1173 mLaunchType = type; |
1166 if (mActivity != null) { | 1174 if (mApplicationContext != null) { |
1167 Resources resources = mActivity.getResources(); | 1175 Resources resources = mApplicationContext.getResources(); |
1168 mIdealFaviconSize = resources.getDimensionPixelSize(R.dimen.default_
favicon_size); | 1176 mIdealFaviconSize = resources.getDimensionPixelSize(R.dimen.default_
favicon_size); |
1169 mDefaultThemeColor = mIncognito | 1177 mDefaultThemeColor = mIncognito |
1170 ? ApiCompatibilityUtils.getColor(resources, R.color.incognit
o_primary_color) | 1178 ? ApiCompatibilityUtils.getColor(resources, R.color.incognit
o_primary_color) |
1171 : ApiCompatibilityUtils.getColor(resources, R.color.default_
primary_color); | 1179 : ApiCompatibilityUtils.getColor(resources, R.color.default_
primary_color); |
1172 mThemeColor = mDefaultThemeColor; | 1180 mThemeColor = mDefaultThemeColor; |
1173 } else { | 1181 } else { |
1174 mIdealFaviconSize = 16; | 1182 mIdealFaviconSize = 16; |
1175 mDefaultThemeColor = 0; | 1183 mDefaultThemeColor = 0; |
1176 } | 1184 } |
1177 | 1185 |
(...skipping 11 matching lines...) Expand all Loading... |
1189 @Override | 1197 @Override |
1190 public void handleMessage(Message msg) { | 1198 public void handleMessage(Message msg) { |
1191 if (msg == null) return; | 1199 if (msg == null) return; |
1192 if (msg.what == MSG_ID_ENABLE_FULLSCREEN_AFTER_LOAD) { | 1200 if (msg.what == MSG_ID_ENABLE_FULLSCREEN_AFTER_LOAD) { |
1193 enableFullscreenAfterLoad(); | 1201 enableFullscreenAfterLoad(); |
1194 } | 1202 } |
1195 } | 1203 } |
1196 }; | 1204 }; |
1197 } | 1205 } |
1198 | 1206 |
| 1207 protected ChromeActivity getActivity() { |
| 1208 if (getWindowAndroid() == null) return null; |
| 1209 Activity activity = getWindowAndroid().getActivity().get(); |
| 1210 if (!(activity instanceof ChromeActivity)) return null; |
| 1211 return (ChromeActivity) activity; |
| 1212 } |
| 1213 |
| 1214 protected TabModelSelector getTabModelSelector() { |
| 1215 if (getActivity() == null) return null; |
| 1216 return getActivity().getTabModelSelector(); |
| 1217 } |
| 1218 |
1199 /** | 1219 /** |
1200 * TODO(aurimas): remove this method once Tab and ChromeTab are merged. | 1220 * TODO(aurimas): remove this method once Tab and ChromeTab are merged. |
1201 */ | 1221 */ |
1202 protected void enableFullscreenAfterLoad() {} | 1222 protected void enableFullscreenAfterLoad() {} |
1203 | 1223 |
1204 /** | 1224 /** |
1205 * Sets the mTabUma object for stats reporting. | 1225 * Sets the mTabUma object for stats reporting. |
1206 * @param tabUma TabUma object to use to report UMA stats. | 1226 * @param tabUma TabUma object to use to report UMA stats. |
1207 */ | 1227 */ |
1208 protected void setTabUma(TabUma tabUma) { | 1228 protected void setTabUma(TabUma tabUma) { |
(...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1444 assert mNativeTabAndroid != 0; | 1464 assert mNativeTabAndroid != 0; |
1445 return nativePrint(mNativeTabAndroid); | 1465 return nativePrint(mNativeTabAndroid); |
1446 } | 1466 } |
1447 | 1467 |
1448 @CalledByNative | 1468 @CalledByNative |
1449 public void setPendingPrint() { | 1469 public void setPendingPrint() { |
1450 PrintingController printingController = PrintingControllerImpl.getInstan
ce(); | 1470 PrintingController printingController = PrintingControllerImpl.getInstan
ce(); |
1451 if (printingController == null) return; | 1471 if (printingController == null) return; |
1452 | 1472 |
1453 printingController.setPendingPrint(new TabPrinter(this), | 1473 printingController.setPendingPrint(new TabPrinter(this), |
1454 new PrintManagerDelegateImpl(mActivity)); | 1474 new PrintManagerDelegateImpl(mApplicationContext)); |
1455 } | 1475 } |
1456 | 1476 |
1457 /** | 1477 /** |
1458 * Reloads the current page content. | 1478 * Reloads the current page content. |
1459 */ | 1479 */ |
1460 public void reload() { | 1480 public void reload() { |
1461 // TODO(dtrainor): Should we try to rebuild the ContentView if it's froz
en? | 1481 // TODO(dtrainor): Should we try to rebuild the ContentView if it's froz
en? |
1462 if (getWebContents() != null) getWebContents().getNavigationController()
.reload(true); | 1482 if (getWebContents() != null) getWebContents().getNavigationController()
.reload(true); |
1463 } | 1483 } |
1464 | 1484 |
(...skipping 385 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1850 if (AppBannerManager.isEnabled()) { | 1870 if (AppBannerManager.isEnabled()) { |
1851 mAppBannerManager = createAppBannerManager(); | 1871 mAppBannerManager = createAppBannerManager(); |
1852 if (mAppBannerManager != null) addObserver(mAppBannerManager); | 1872 if (mAppBannerManager != null) addObserver(mAppBannerManager); |
1853 } | 1873 } |
1854 } | 1874 } |
1855 | 1875 |
1856 /** | 1876 /** |
1857 * @return {@link AppBannerManager} to be used for this tab. May be null. | 1877 * @return {@link AppBannerManager} to be used for this tab. May be null. |
1858 */ | 1878 */ |
1859 protected AppBannerManager createAppBannerManager() { | 1879 protected AppBannerManager createAppBannerManager() { |
1860 return new AppBannerManager(this, mActivity); | 1880 return new AppBannerManager(this); |
1861 } | 1881 } |
1862 | 1882 |
1863 /** | 1883 /** |
1864 * Used to get a list of Android {@link View}s that represent both the norma
l content as well as | 1884 * Used to get a list of Android {@link View}s that represent both the norma
l content as well as |
1865 * overlays. This does not return {@link View}s for {@link NativePage}s. | 1885 * overlays. This does not return {@link View}s for {@link NativePage}s. |
1866 * @param content A {@link List} that will be populated with {@link View}s t
hat represent all of | 1886 * @param content A {@link List} that will be populated with {@link View}s t
hat represent all of |
1867 * the content in this {@link Tab}. | 1887 * the content in this {@link Tab}. |
1868 */ | 1888 */ |
1869 public void getAllContentViews(List<View> content) { | 1889 public void getAllContentViews(List<View> content) { |
1870 if (!isNativePage()) { | 1890 if (!isNativePage()) { |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2002 mIsInitialized = true; | 2022 mIsInitialized = true; |
2003 } | 2023 } |
2004 | 2024 |
2005 /** | 2025 /** |
2006 * Creates and initializes the {@link ContentViewCore}. | 2026 * Creates and initializes the {@link ContentViewCore}. |
2007 * | 2027 * |
2008 * @param webContents The WebContents object that will be used to build the | 2028 * @param webContents The WebContents object that will be used to build the |
2009 * {@link ContentViewCore}. | 2029 * {@link ContentViewCore}. |
2010 */ | 2030 */ |
2011 protected void initContentViewCore(WebContents webContents) { | 2031 protected void initContentViewCore(WebContents webContents) { |
2012 ContentViewCore cvc = new ContentViewCore(mActivity); | 2032 ContentViewCore cvc = new ContentViewCore(mThemedContext); |
2013 ContentView cv = ContentView.createContentView(mActivity, cvc); | 2033 ContentView cv = ContentView.createContentView(mThemedContext, cvc); |
2014 cv.setContentDescription(mActivity.getResources().getString( | 2034 cv.setContentDescription(mApplicationContext.getResources().getString( |
2015 R.string.accessibility_content_view)); | 2035 R.string.accessibility_content_view)); |
2016 cvc.initialize(cv, cv, webContents, getWindowAndroid()); | 2036 cvc.initialize(cv, cv, webContents, getWindowAndroid()); |
2017 setContentViewCore(cvc); | 2037 setContentViewCore(cvc); |
2018 } | 2038 } |
2019 | 2039 |
2020 /** | 2040 /** |
2021 * Completes the {@link ContentViewCore} specific initialization around a na
tive WebContents | 2041 * Completes the {@link ContentViewCore} specific initialization around a na
tive WebContents |
2022 * pointer. {@link #getNativePage()} will still return the {@link NativePage
} if there is one. | 2042 * pointer. {@link #getNativePage()} will still return the {@link NativePage
} if there is one. |
2023 * All initialization that needs to reoccur after a web contents swap should
be added here. | 2043 * All initialization that needs to reoccur after a web contents swap should
be added here. |
2024 * <p /> | 2044 * <p /> |
(...skipping 13 matching lines...) Expand all Loading... |
2038 | 2058 |
2039 // Wrap the ContentView in a FrameLayout, which will contain both the Co
ntentView and the | 2059 // Wrap the ContentView in a FrameLayout, which will contain both the Co
ntentView and the |
2040 // InfoBarContainer. The alternative -- placing the InfoBarContainer ins
ide the ContentView | 2060 // InfoBarContainer. The alternative -- placing the InfoBarContainer ins
ide the ContentView |
2041 // -- causes problems since then the ContentView would contain both real
views (the | 2061 // -- causes problems since then the ContentView would contain both real
views (the |
2042 // infobars) and virtual views (the web page elements), which breaks And
roid accessibility. | 2062 // infobars) and virtual views (the web page elements), which breaks And
roid accessibility. |
2043 // http://crbug.com/416663 | 2063 // http://crbug.com/416663 |
2044 if (mContentViewParent != null) { | 2064 if (mContentViewParent != null) { |
2045 assert false; | 2065 assert false; |
2046 mContentViewParent.removeAllViews(); | 2066 mContentViewParent.removeAllViews(); |
2047 } | 2067 } |
2048 mContentViewParent = new FrameLayout(mActivity); | 2068 mContentViewParent = new FrameLayout(mThemedContext); |
2049 mContentViewParent.addView(cvc.getContainerView(), | 2069 mContentViewParent.addView(cvc.getContainerView(), |
2050 new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutPa
rams.MATCH_PARENT)); | 2070 new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutPa
rams.MATCH_PARENT)); |
2051 | 2071 |
2052 mWebContentsDelegate = createWebContentsDelegate(); | 2072 mWebContentsDelegate = createWebContentsDelegate(); |
2053 mWebContentsObserver = new TabWebContentsObserver(mContentViewCore.getWe
bContents()); | 2073 mWebContentsObserver = new TabWebContentsObserver(mContentViewCore.getWe
bContents()); |
2054 | 2074 |
2055 if (mContentViewClient != null) mContentViewCore.setContentViewClient(mC
ontentViewClient); | 2075 if (mContentViewClient != null) mContentViewCore.setContentViewClient(mC
ontentViewClient); |
2056 | 2076 |
2057 assert mNativeTabAndroid != 0; | 2077 assert mNativeTabAndroid != 0; |
2058 nativeInitWebContents( | 2078 nativeInitWebContents( |
2059 mNativeTabAndroid, mIncognito, mContentViewCore, mWebContentsDel
egate, | 2079 mNativeTabAndroid, mIncognito, mContentViewCore, mWebContentsDel
egate, |
2060 new TabContextMenuPopulator(createContextMenuPopulator())); | 2080 new TabContextMenuPopulator(createContextMenuPopulator())); |
2061 | 2081 |
2062 // In the case where restoring a Tab or showing a prerendered one we alr
eady have a | 2082 // In the case where restoring a Tab or showing a prerendered one we alr
eady have a |
2063 // valid infobar container, no need to recreate one. | 2083 // valid infobar container, no need to recreate one. |
2064 if (mInfoBarContainer == null) { | 2084 if (mInfoBarContainer == null) { |
2065 // The InfoBarContainer needs to be created after the ContentView ha
s been natively | 2085 // The InfoBarContainer needs to be created after the ContentView ha
s been natively |
2066 // initialized. | 2086 // initialized. |
2067 mInfoBarContainer = new InfoBarContainer(mActivity, getId(), mConten
tViewParent, this); | 2087 mInfoBarContainer = new InfoBarContainer( |
| 2088 mThemedContext, getId(), mContentViewParent, this); |
2068 } else { | 2089 } else { |
2069 mInfoBarContainer.onParentViewChanged(getId(), mContentViewParent); | 2090 mInfoBarContainer.onParentViewChanged(getId(), mContentViewParent); |
2070 } | 2091 } |
2071 mInfoBarContainer.setContentViewCore(mContentViewCore); | 2092 mInfoBarContainer.setContentViewCore(mContentViewCore); |
2072 | 2093 |
2073 mSwipeRefreshHandler = new SwipeRefreshHandler(mActivity); | 2094 mSwipeRefreshHandler = new SwipeRefreshHandler(mThemedContext); |
2074 mSwipeRefreshHandler.setContentViewCore(mContentViewCore); | 2095 mSwipeRefreshHandler.setContentViewCore(mContentViewCore); |
2075 | 2096 |
2076 for (TabObserver observer : mObservers) observer.onContentChanged(this); | 2097 for (TabObserver observer : mObservers) observer.onContentChanged(this); |
2077 | 2098 |
2078 // For browser tabs, we want to set accessibility focus to the page | 2099 // For browser tabs, we want to set accessibility focus to the page |
2079 // when it loads. This is not the default behavior for embedded | 2100 // when it loads. This is not the default behavior for embedded |
2080 // web views. | 2101 // web views. |
2081 mContentViewCore.setShouldSetAccessibilityFocusOnPageLoad(true); | 2102 mContentViewCore.setShouldSetAccessibilityFocusOnPageLoad(true); |
2082 | 2103 |
2083 mDownloadDelegate = new ChromeDownloadDelegate(mActivity, | 2104 mDownloadDelegate = new ChromeDownloadDelegate(mThemedContext, this); |
2084 mActivity.getTabModelSelector(), this); | |
2085 cvc.setDownloadDelegate(mDownloadDelegate); | 2105 cvc.setDownloadDelegate(mDownloadDelegate); |
2086 } | 2106 } |
2087 | 2107 |
| 2108 public boolean closeTab() { |
| 2109 if (getTabModelSelector() == null) return false; |
| 2110 return getTabModelSelector().closeTab(this); |
| 2111 } |
| 2112 |
2088 /** | 2113 /** |
2089 * Constructs and shows a sad tab (Aw, Snap!). | 2114 * Constructs and shows a sad tab (Aw, Snap!). |
2090 */ | 2115 */ |
2091 protected void showSadTab() { | 2116 protected void showSadTab() { |
2092 if (getContentViewCore() != null) { | 2117 if (getContentViewCore() != null) { |
2093 OnClickListener suggestionAction = new OnClickListener() { | 2118 OnClickListener suggestionAction = new OnClickListener() { |
2094 @Override | 2119 @Override |
2095 public void onClick(View view) { | 2120 public void onClick(View view) { |
2096 Activity activity = mWindowAndroid.getActivity().get(); | 2121 Activity activity = mWindowAndroid.getActivity().get(); |
2097 assert activity != null; | 2122 assert activity != null; |
2098 HelpAndFeedback.getInstance(activity).show(activity, | 2123 HelpAndFeedback.getInstance(activity).show(activity, |
2099 activity.getString(R.string.help_context_sad_tab), | 2124 activity.getString(R.string.help_context_sad_tab), |
2100 Profile.getLastUsedProfile(), null); | 2125 Profile.getLastUsedProfile(), null); |
2101 } | 2126 } |
2102 }; | 2127 }; |
2103 OnClickListener reloadButtonAction = new OnClickListener() { | 2128 OnClickListener reloadButtonAction = new OnClickListener() { |
2104 @Override | 2129 @Override |
2105 public void onClick(View view) { | 2130 public void onClick(View view) { |
2106 reload(); | 2131 reload(); |
2107 } | 2132 } |
2108 }; | 2133 }; |
2109 | 2134 |
2110 // Make sure we are not adding the "Aw, snap" view over an existing
one. | 2135 // Make sure we are not adding the "Aw, snap" view over an existing
one. |
2111 assert mSadTabView == null; | 2136 assert mSadTabView == null; |
2112 mSadTabView = SadTabViewFactory.createSadTabView( | 2137 mSadTabView = SadTabViewFactory.createSadTabView( |
2113 mActivity, suggestionAction, reloadButtonAction); | 2138 mThemedContext, suggestionAction, reloadButtonAction); |
2114 | 2139 |
2115 // Show the sad tab inside ContentView. | 2140 // Show the sad tab inside ContentView. |
2116 getContentViewCore().getContainerView().addView( | 2141 getContentViewCore().getContainerView().addView( |
2117 mSadTabView, new FrameLayout.LayoutParams( | 2142 mSadTabView, new FrameLayout.LayoutParams( |
2118 LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT
)); | 2143 LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT
)); |
2119 for (TabObserver observer : mObservers) observer.onContentChanged(th
is); | 2144 for (TabObserver observer : mObservers) observer.onContentChanged(th
is); |
2120 } | 2145 } |
2121 FullscreenManager fullscreenManager = getFullscreenManager(); | 2146 FullscreenManager fullscreenManager = getFullscreenManager(); |
2122 if (fullscreenManager != null) { | 2147 if (fullscreenManager != null) { |
2123 fullscreenManager.setPositionsForTabToNonFullscreen(); | 2148 fullscreenManager.setPositionsForTabToNonFullscreen(); |
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2309 } | 2334 } |
2310 | 2335 |
2311 /** | 2336 /** |
2312 * Loads the tab if it's not loaded (e.g. because it was killed in backgroun
d). | 2337 * Loads the tab if it's not loaded (e.g. because it was killed in backgroun
d). |
2313 * This will trigger a regular load for tabs with pending lazy first load (t
abs opened in | 2338 * This will trigger a regular load for tabs with pending lazy first load (t
abs opened in |
2314 * background on low-memory devices). | 2339 * background on low-memory devices). |
2315 * @return true iff the Tab handled the request. | 2340 * @return true iff the Tab handled the request. |
2316 */ | 2341 */ |
2317 @CalledByNative | 2342 @CalledByNative |
2318 public boolean loadIfNeeded() { | 2343 public boolean loadIfNeeded() { |
2319 if (mActivity == null) { | 2344 if (getActivity() == null) { |
2320 Log.e(TAG, "Tab couldn't be loaded because Context was null."); | 2345 Log.e(TAG, "Tab couldn't be loaded because Context was null."); |
2321 return false; | 2346 return false; |
2322 } | 2347 } |
2323 | 2348 |
2324 if (mPendingLoadParams != null) { | 2349 if (mPendingLoadParams != null) { |
2325 assert isFrozen(); | 2350 assert isFrozen(); |
2326 initContentViewCore(WebContentsFactory.createWebContents(isIncognito
(), isHidden())); | 2351 initContentViewCore(WebContentsFactory.createWebContents(isIncognito
(), isHidden())); |
2327 loadUrl(mPendingLoadParams); | 2352 loadUrl(mPendingLoadParams); |
2328 mPendingLoadParams = null; | 2353 mPendingLoadParams = null; |
2329 return true; | 2354 return true; |
(...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2623 @CalledByNative | 2648 @CalledByNative |
2624 protected void onNavEntryChanged() { | 2649 protected void onNavEntryChanged() { |
2625 mIsTabStateDirty = true; | 2650 mIsTabStateDirty = true; |
2626 } | 2651 } |
2627 | 2652 |
2628 /** | 2653 /** |
2629 * Returns the SnackbarManager for the activity that owns this Tab, if any.
May | 2654 * Returns the SnackbarManager for the activity that owns this Tab, if any.
May |
2630 * return null. | 2655 * return null. |
2631 */ | 2656 */ |
2632 public SnackbarManager getSnackbarManager() { | 2657 public SnackbarManager getSnackbarManager() { |
2633 return mActivity.getSnackbarManager(); | 2658 return getActivity() != null ? getActivity().getSnackbarManager() : null
; |
2634 } | 2659 } |
2635 | 2660 |
2636 /** | 2661 /** |
2637 * @return The native pointer representing the native side of this {@link Ta
b} object. | 2662 * @return The native pointer representing the native side of this {@link Ta
b} object. |
2638 */ | 2663 */ |
2639 @CalledByNative | 2664 @CalledByNative |
2640 private long getNativePtr() { | 2665 private long getNativePtr() { |
2641 return mNativeTabAndroid; | 2666 return mNativeTabAndroid; |
2642 } | 2667 } |
2643 | 2668 |
2644 /** This is currently called when committing a pre-rendered page. */ | 2669 /** This is currently called when committing a pre-rendered page. */ |
2645 @VisibleForTesting | 2670 @VisibleForTesting |
2646 @CalledByNative | 2671 @CalledByNative |
2647 public void swapWebContents( | 2672 public void swapWebContents( |
2648 WebContents webContents, boolean didStartLoad, boolean didFinishLoad
) { | 2673 WebContents webContents, boolean didStartLoad, boolean didFinishLoad
) { |
2649 ContentViewCore cvc = new ContentViewCore(mActivity); | 2674 ContentViewCore cvc = new ContentViewCore(mThemedContext); |
2650 ContentView cv = ContentView.createContentView(mActivity, cvc); | 2675 ContentView cv = ContentView.createContentView(mThemedContext, cvc); |
2651 cv.setContentDescription(mActivity.getResources().getString( | 2676 cv.setContentDescription(mApplicationContext.getResources().getString( |
2652 R.string.accessibility_content_view)); | 2677 R.string.accessibility_content_view)); |
2653 cvc.initialize(cv, cv, webContents, getWindowAndroid()); | 2678 cvc.initialize(cv, cv, webContents, getWindowAndroid()); |
2654 swapContentViewCore(cvc, false, didStartLoad, didFinishLoad); | 2679 swapContentViewCore(cvc, false, didStartLoad, didFinishLoad); |
2655 } | 2680 } |
2656 | 2681 |
2657 /** | 2682 /** |
2658 * Called to swap out the current view with the one passed in. | 2683 * Called to swap out the current view with the one passed in. |
2659 * | 2684 * |
2660 * @param newContentViewCore The content view that should be swapped into th
e tab. | 2685 * @param newContentViewCore The content view that should be swapped into th
e tab. |
2661 * @param deleteOldNativeWebContents Whether to delete the native web | 2686 * @param deleteOldNativeWebContents Whether to delete the native web |
(...skipping 438 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3100 case WindowOpenDisposition.OFF_THE_RECORD: | 3125 case WindowOpenDisposition.OFF_THE_RECORD: |
3101 assert incognito; | 3126 assert incognito; |
3102 incognito = true; | 3127 incognito = true; |
3103 break; | 3128 break; |
3104 default: | 3129 default: |
3105 assert false; | 3130 assert false; |
3106 } | 3131 } |
3107 | 3132 |
3108 // If shouldIgnoreNewTab returns true, the intent is handled by another | 3133 // If shouldIgnoreNewTab returns true, the intent is handled by another |
3109 // activity. As a result, don't launch a new tab to open the URL. | 3134 // activity. As a result, don't launch a new tab to open the URL. |
3110 if (shouldIgnoreNewTab(url, incognito)) return; | 3135 if (shouldIgnoreNewTab(url, incognito) || getTabModelSelector() == null)
return; |
3111 | 3136 |
3112 LoadUrlParams loadUrlParams = new LoadUrlParams(url); | 3137 LoadUrlParams loadUrlParams = new LoadUrlParams(url); |
3113 loadUrlParams.setVerbatimHeaders(extraHeaders); | 3138 loadUrlParams.setVerbatimHeaders(extraHeaders); |
3114 loadUrlParams.setPostData(postData); | 3139 loadUrlParams.setPostData(postData); |
3115 loadUrlParams.setIsRendererInitiated(isRendererInitiated); | 3140 loadUrlParams.setIsRendererInitiated(isRendererInitiated); |
3116 mActivity.getTabModelSelector().openNewTab( | 3141 getTabModelSelector().openNewTab( |
3117 loadUrlParams, tabLaunchType, parentTab, incognito); | 3142 loadUrlParams, tabLaunchType, parentTab, incognito); |
3118 } | 3143 } |
3119 | 3144 |
3120 /** | 3145 /** |
3121 * @return True if the Tab should block the creation of new tabs via {@link
#openNewTab}. | 3146 * @return True if the Tab should block the creation of new tabs via {@link
#openNewTab}. |
3122 */ | 3147 */ |
3123 protected boolean shouldIgnoreNewTab(String url, boolean incognito) { | 3148 protected boolean shouldIgnoreNewTab(String url, boolean incognito) { |
3124 return false; | 3149 return false; |
3125 } | 3150 } |
3126 | 3151 |
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3318 private native void nativeAttachOverlayContentViewCore(long nativeTabAndroid
, | 3343 private native void nativeAttachOverlayContentViewCore(long nativeTabAndroid
, |
3319 ContentViewCore content, boolean visible); | 3344 ContentViewCore content, boolean visible); |
3320 private native void nativeDetachOverlayContentViewCore(long nativeTabAndroid
, | 3345 private native void nativeDetachOverlayContentViewCore(long nativeTabAndroid
, |
3321 ContentViewCore content); | 3346 ContentViewCore content); |
3322 private native boolean nativeHasPrerenderedUrl(long nativeTabAndroid, String
url); | 3347 private native boolean nativeHasPrerenderedUrl(long nativeTabAndroid, String
url); |
3323 private native void nativeOnRendererUnresponsive(long nativeTabAndroid); | 3348 private native void nativeOnRendererUnresponsive(long nativeTabAndroid); |
3324 private native void nativeOnRendererResponsive(long nativeTabAndroid); | 3349 private native void nativeOnRendererResponsive(long nativeTabAndroid); |
3325 | 3350 |
3326 private static native void nativeRecordStartupToCommitUma(); | 3351 private static native void nativeRecordStartupToCommitUma(); |
3327 } | 3352 } |
OLD | NEW |