private void onNativeLibraryReady() {
    mNativeLibraryReady = true;
    mToolbar.onNativeLibraryReady();

    final TemplateUrlService templateUrlService = TemplateUrlService.getInstance();
    TemplateUrlService.LoadListener mTemplateServiceLoadListener =
        new TemplateUrlService.LoadListener() {
          @Override
          public void onTemplateUrlServiceLoaded() {
            registerTemplateUrlObserver();
            templateUrlService.unregisterLoadListener(this);
          }
        };
    templateUrlService.registerLoadListener(mTemplateServiceLoadListener);
    if (templateUrlService.isLoaded()) {
      mTemplateServiceLoadListener.onTemplateUrlServiceLoaded();
    } else {
      templateUrlService.load();
    }

    mTabModelSelector.addObserver(mTabModelSelectorObserver);
    for (TabModel model : mTabModelSelector.getModels()) model.addObserver(mTabModelObserver);

    refreshSelectedTab();
    if (mTabModelSelector.isTabStateInitialized()) mTabRestoreCompleted = true;
    handleTabRestoreCompleted();
  }
  /**
   * Sets the appropriate objects this class should represent.
   *
   * @param tabModelSelector The {@link TabModelSelector} this View should hold and represent.
   * @param tabCreatorManager The {@link TabCreatorManager} for this view.
   * @param tabContentManager The {@link TabContentManager} for the tabs.
   * @param androidContentContainer The {@link ViewGroup} the {@link LayoutManager} should bind
   *     Android content to.
   * @param contextualSearchManager A {@link ContextualSearchManagementDelegate} instance.
   */
  public void onFinishNativeInitialization(
      TabModelSelector tabModelSelector,
      TabCreatorManager tabCreatorManager,
      TabContentManager tabContentManager,
      ViewGroup androidContentContainer,
      ContextualSearchManagementDelegate contextualSearchManager) {
    assert mLayoutManager != null;
    mLayoutManager.init(
        tabModelSelector,
        tabCreatorManager,
        tabContentManager,
        androidContentContainer,
        contextualSearchManager,
        mCompositorView.getResourceManager().getDynamicResourceLoader());
    mTabModelSelector = tabModelSelector;
    tabModelSelector.addObserver(
        new EmptyTabModelSelectorObserver() {
          @Override
          public void onChange() {
            onContentChanged();
          }

          @Override
          public void onNewTabCreated(Tab tab) {
            initializeTab(tab);
          }
        });

    onContentChanged();
  }
  /** Triggered when the selected tab has changed. */
  private void refreshSelectedTab() {
    ChromeTab tab = null;
    if (mPreselectedTabId != Tab.INVALID_TAB_ID) {
      tab = ChromeTab.fromTab(mTabModelSelector.getTabById(mPreselectedTabId));
    }
    if (tab == null) tab = ChromeTab.fromTab(mTabModelSelector.getCurrentTab());

    boolean wasIncognito = mToolbarModel.isIncognito();
    ChromeTab previousTab = ChromeTab.fromTab(mToolbarModel.getTab());

    boolean isIncognito = tab != null ? tab.isIncognito() : mTabModelSelector.isIncognitoSelected();
    mToolbarModel.setTab(tab, isIncognito);

    updateCurrentTabDisplayStatus();
    if (previousTab != tab || wasIncognito != isIncognito) {
      if (previousTab != tab) {
        if (previousTab != null) previousTab.removeObserver(mTabObserver);
        if (tab != null) tab.addObserver(mTabObserver);
      }
      int defaultPrimaryColor =
          isIncognito
              ? mToolbar.getResources().getColor(R.color.incognito_primary_color)
              : mToolbar.getResources().getColor(R.color.default_primary_color);
      int primaryColor =
          (tab != null && tab.getWebContents() != null)
              ? tab.getWebContents().getThemeColor(defaultPrimaryColor)
              : defaultPrimaryColor;
      updatePrimaryColor(primaryColor);

      mToolbar.onTabOrModelChanged();

      if (tab != null
          && tab.getWebContents() != null
          && tab.getWebContents().isLoadingToDifferentDocument()) {
        mToolbar.onNavigatedToDifferentPage();
      }
    }

    Profile profile = mTabModelSelector.getModel(isIncognito).getProfile();
    if (mCurrentProfile != profile) {
      if (mBookmarksBridge != null) mBookmarksBridge.destroy();
      mBookmarksBridge = new BookmarksBridge(profile);
      mBookmarksBridge.addObserver(mBookmarksObserver);
      mLocationBar.setAutocompleteProfile(profile);
      mCurrentProfile = profile;
    }
  }
 /** Close a blank tab just opened for the download purpose. */
 private void closeBlankTab() {
   WebContents contents = mTab.getWebContents();
   boolean isInitialNavigation =
       contents == null || contents.getNavigationController().isInitialNavigation();
   if (isInitialNavigation) {
     // Tab is created just for download, close it.
     mTabModelSelector.closeTab(mTab);
   }
 }
 @Override
 public void onContentChanged() {
   if (mTabModelSelector == null) {
     // Not yet initialized, onContentChanged() will eventually get called by
     // setTabModelSelector.
     return;
   }
   Tab tab = mTabModelSelector.getCurrentTab();
   setTab(tab);
 }
 /**
  * Close a blank tab just opened for the download purpose.
  *
  * @return true iff the tab was (already) closed.
  */
 private boolean closeBlankTab() {
   if (mTab == null) {
     // We do not want caller to dismiss infobar.
     return true;
   }
   WebContents contents = mTab.getWebContents();
   boolean isInitialNavigation =
       contents == null || contents.getNavigationController().isInitialNavigation();
   if (isInitialNavigation) {
     // Tab is created just for download, close it.
     return mTabModelSelector.closeTab(mTab);
   }
   return false;
 }
 /** Updates the current number of Tabs based on the TabModel this Toolbar contains. */
 private void updateTabCount() {
   if (!mTabRestoreCompleted) return;
   mToolbar.updateTabCountVisuals(mTabModelSelector.getCurrentModel().getCount());
 }