mirror of
				https://bitbucket.org/chromiumembedded/cef
				synced 2025-06-05 21:39:12 +02:00 
			
		
		
		
	
		
			
				
	
	
		
			381 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			381 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| diff --git chrome/browser/ui/browser_command_controller.cc chrome/browser/ui/browser_command_controller.cc
 | |
| index cfefe1f22728..402d84836826 100644
 | |
| --- chrome/browser/ui/browser_command_controller.cc
 | |
| +++ chrome/browser/ui/browser_command_controller.cc
 | |
| @@ -351,8 +351,10 @@ bool BrowserCommandController::ExecuteCommandWithDisposition(
 | |
|    // CommandUpdaterDelegate and CommandUpdater declare this function so we
 | |
|    // choose to not implement CommandUpdaterDelegate inside this class and
 | |
|    // therefore command_updater_ doesn't have the delegate set).
 | |
| -  if (!SupportsCommand(id) || !IsCommandEnabled(id))
 | |
| +  if (!SupportsCommand(id) || !IsCommandEnabled(id)) {
 | |
| +    LOG(WARNING) << "Invalid/disabled command " << id;
 | |
|      return false;
 | |
| +  }
 | |
|  
 | |
|    // No commands are enabled if there is not yet any selected tab.
 | |
|    // TODO(pkasting): It seems like we should not need this, because either
 | |
| @@ -942,11 +944,13 @@ void BrowserCommandController::TabRestoreServiceLoaded(
 | |
|  // BrowserCommandController, private:
 | |
|  
 | |
|  bool BrowserCommandController::IsShowingMainUI() {
 | |
| -  return browser_->SupportsWindowFeature(Browser::FEATURE_TABSTRIP);
 | |
| +  return browser_->SupportsWindowFeature(Browser::FEATURE_TABSTRIP) ||
 | |
| +         browser_->toolbar_overridden();
 | |
|  }
 | |
|  
 | |
|  bool BrowserCommandController::IsShowingLocationBar() {
 | |
| -  return browser_->SupportsWindowFeature(Browser::FEATURE_LOCATIONBAR);
 | |
| +  return browser_->SupportsWindowFeature(Browser::FEATURE_LOCATIONBAR) ||
 | |
| +         browser_->toolbar_overridden();
 | |
|  }
 | |
|  
 | |
|  void BrowserCommandController::InitCommandState() {
 | |
| diff --git chrome/browser/ui/views/frame/browser_frame.cc chrome/browser/ui/views/frame/browser_frame.cc
 | |
| index 3fca382fde67..6adddf506bb1 100644
 | |
| --- chrome/browser/ui/views/frame/browser_frame.cc
 | |
| +++ chrome/browser/ui/views/frame/browser_frame.cc
 | |
| @@ -69,15 +69,23 @@ bool IsUsingGtkTheme(Profile* profile) {
 | |
|  ////////////////////////////////////////////////////////////////////////////////
 | |
|  // BrowserFrame, public:
 | |
|  
 | |
| +BrowserFrame::BrowserFrame() : BrowserFrame(nullptr) {}
 | |
| +
 | |
|  BrowserFrame::BrowserFrame(BrowserView* browser_view)
 | |
|      : native_browser_frame_(nullptr),
 | |
|        root_view_(nullptr),
 | |
|        browser_frame_view_(nullptr),
 | |
| -      browser_view_(browser_view) {
 | |
| -  browser_view_->set_frame(this);
 | |
| +      browser_view_(nullptr) {
 | |
|    set_is_secondary_widget(false);
 | |
|    // Don't focus anything on creation, selecting a tab will set the focus.
 | |
|    set_focus_on_creation(false);
 | |
| +  if (browser_view)
 | |
| +    InitBrowserView(browser_view);
 | |
| +}
 | |
| +
 | |
| +void BrowserFrame::InitBrowserView(BrowserView* browser_view) {
 | |
| +  browser_view_ = browser_view;
 | |
| +  browser_view_->set_frame(this);
 | |
|  }
 | |
|  
 | |
|  BrowserFrame::~BrowserFrame() {}
 | |
| @@ -137,6 +145,12 @@ gfx::Rect BrowserFrame::GetBoundsForTabStripRegion(
 | |
|  }
 | |
|  
 | |
|  int BrowserFrame::GetTopInset() const {
 | |
| +  if (!browser_frame_view_) {
 | |
| +    // With CEF the browser may already be part of a larger Views layout. Zero
 | |
| +    // out the adjustment in BrowserView::GetTopInsetInBrowserView() so that
 | |
| +    // the browser isn't shifted to the top of the window.
 | |
| +    return browser_view_->y();
 | |
| +  }
 | |
|    return browser_frame_view_->GetTopInset(false);
 | |
|  }
 | |
|  
 | |
| @@ -171,15 +185,21 @@ void BrowserFrame::GetWindowPlacement(gfx::Rect* bounds,
 | |
|  
 | |
|  content::KeyboardEventProcessingResult BrowserFrame::PreHandleKeyboardEvent(
 | |
|      const content::NativeWebKeyboardEvent& event) {
 | |
| +  if (!native_browser_frame_)
 | |
| +    return content::KeyboardEventProcessingResult::NOT_HANDLED;
 | |
|    return native_browser_frame_->PreHandleKeyboardEvent(event);
 | |
|  }
 | |
|  
 | |
|  bool BrowserFrame::HandleKeyboardEvent(
 | |
|      const content::NativeWebKeyboardEvent& event) {
 | |
| +  if (!native_browser_frame_)
 | |
| +    return false;
 | |
|    return native_browser_frame_->HandleKeyboardEvent(event);
 | |
|  }
 | |
|  
 | |
|  void BrowserFrame::OnBrowserViewInitViewsComplete() {
 | |
| +  if (!browser_frame_view_)
 | |
| +    return;
 | |
|    browser_frame_view_->OnBrowserViewInitViewsComplete();
 | |
|  }
 | |
|  
 | |
| @@ -341,7 +361,8 @@ void BrowserFrame::SelectNativeTheme() {
 | |
|    // Select between regular, dark and GTK theme.
 | |
|    ui::NativeTheme* native_theme = ui::NativeTheme::GetInstanceForNativeUi();
 | |
|  
 | |
| -  if (browser_view_->browser()->profile()->IsIncognitoProfile()) {
 | |
| +  if (browser_view_ &&
 | |
| +      browser_view_->browser()->profile()->IsIncognitoProfile()) {
 | |
|      // If the flag is enabled, then no matter if we are using the default theme
 | |
|      // or not we always use the dark ui instance.
 | |
|      if (base::FeatureList::IsEnabled(
 | |
| diff --git chrome/browser/ui/views/frame/browser_frame.h chrome/browser/ui/views/frame/browser_frame.h
 | |
| index 0ce7abdeb7d9..8197a6bb7da9 100644
 | |
| --- chrome/browser/ui/views/frame/browser_frame.h
 | |
| +++ chrome/browser/ui/views/frame/browser_frame.h
 | |
| @@ -54,7 +54,9 @@ enum class TabDragKind {
 | |
|  // This is a virtual interface that allows system specific browser frames.
 | |
|  class BrowserFrame : public views::Widget, public views::ContextMenuController {
 | |
|   public:
 | |
| +  BrowserFrame();
 | |
|    explicit BrowserFrame(BrowserView* browser_view);
 | |
| +  void InitBrowserView(BrowserView* browser_view);
 | |
|    ~BrowserFrame() override;
 | |
|  
 | |
|    // Initialize the frame (creates the underlying native window).
 | |
| diff --git chrome/browser/ui/views/frame/browser_view.cc chrome/browser/ui/views/frame/browser_view.cc
 | |
| index e852eb7d20ed..bb73d3055936 100644
 | |
| --- chrome/browser/ui/views/frame/browser_view.cc
 | |
| +++ chrome/browser/ui/views/frame/browser_view.cc
 | |
| @@ -586,11 +586,22 @@ class BrowserView::AccessibilityModeObserver : public ui::AXModeObserver {
 | |
|  ///////////////////////////////////////////////////////////////////////////////
 | |
|  // BrowserView, public:
 | |
|  
 | |
| +BrowserView::BrowserView() : BrowserView(nullptr) {}
 | |
| +
 | |
|  BrowserView::BrowserView(std::unique_ptr<Browser> browser)
 | |
|      : views::ClientView(nullptr, nullptr),
 | |
| -      browser_(std::move(browser)),
 | |
|        accessibility_mode_observer_(
 | |
|            std::make_unique<AccessibilityModeObserver>(this)) {
 | |
| +  if (browser)
 | |
| +    InitBrowser(std::move(browser));
 | |
| +}
 | |
| +
 | |
| +void BrowserView::InitBrowser(std::unique_ptr<Browser> browser) {
 | |
| +  DCHECK(!browser_);
 | |
| +  browser_ = std::move(browser);
 | |
| +
 | |
| +  immersive_mode_controller_ = chrome::CreateImmersiveModeController();
 | |
| +
 | |
|    SetShowIcon(::ShouldShowWindowIcon(browser_.get()));
 | |
|  
 | |
|    // In forced app mode, all size controls are always disabled. Otherwise, use
 | |
| @@ -604,7 +615,6 @@ BrowserView::BrowserView(std::unique_ptr<Browser> browser)
 | |
|    }
 | |
|  
 | |
|    browser_->tab_strip_model()->AddObserver(this);
 | |
| -  immersive_mode_controller_ = chrome::CreateImmersiveModeController();
 | |
|  
 | |
|    // Top container holds tab strip region and toolbar and lives at the front of
 | |
|    // the view hierarchy.
 | |
| @@ -648,8 +658,15 @@ BrowserView::BrowserView(std::unique_ptr<Browser> browser)
 | |
|    contents_container->SetLayoutManager(std::make_unique<ContentsLayoutManager>(
 | |
|        devtools_web_view_, contents_web_view_));
 | |
|  
 | |
| -  toolbar_ = top_container_->AddChildView(
 | |
| -      std::make_unique<ToolbarView>(browser_.get(), this));
 | |
| +  toolbar_ = OverrideCreateToolbar(browser_.get(), this);
 | |
| +  if (!toolbar_) {
 | |
| +    toolbar_ = new ToolbarView(browser_.get(), this, base::nullopt);
 | |
| +  } else {
 | |
| +    browser_->set_toolbar_overridden(true);
 | |
| +    // Update state that depends on the above flag.
 | |
| +    browser_->command_controller()->FullscreenStateChanged();
 | |
| +  }
 | |
| +  top_container_->AddChildView(base::WrapUnique(toolbar_));
 | |
|  
 | |
|    contents_separator_ =
 | |
|        top_container_->AddChildView(std::make_unique<ContentsSeparator>());
 | |
| @@ -1430,6 +1447,8 @@ bool BrowserView::ShouldHideUIForFullscreen() const {
 | |
|    if (immersive_mode_controller_->IsEnabled())
 | |
|      return false;
 | |
|  
 | |
| +  if (!frame_->GetFrameView())
 | |
| +    return false;
 | |
|    return frame_->GetFrameView()->ShouldHideTopUIForFullscreen();
 | |
|  }
 | |
|  
 | |
| @@ -2423,7 +2442,8 @@ BrowserView::GetNativeViewHostsForTopControlsSlide() const {
 | |
|  }
 | |
|  
 | |
|  void BrowserView::ReparentTopContainerForEndOfImmersive() {
 | |
| -  overlay_view_->SetVisible(false);
 | |
| +  if (overlay_view_)
 | |
| +    overlay_view_->SetVisible(false);
 | |
|    top_container()->DestroyLayer();
 | |
|    AddChildViewAt(top_container(), 0);
 | |
|    EnsureFocusOrder();
 | |
| @@ -2878,8 +2898,10 @@ void BrowserView::Layout() {
 | |
|  
 | |
|    // TODO(jamescook): Why was this in the middle of layout code?
 | |
|    toolbar_->location_bar()->omnibox_view()->SetFocusBehavior(
 | |
| -      IsToolbarVisible() ? FocusBehavior::ALWAYS : FocusBehavior::NEVER);
 | |
| -  frame()->GetFrameView()->UpdateMinimumSize();
 | |
| +      (IsToolbarVisible() || browser_->toolbar_overridden()) ?
 | |
| +          FocusBehavior::ALWAYS : FocusBehavior::NEVER);
 | |
| +  if (frame()->GetFrameView())
 | |
| +    frame()->GetFrameView()->UpdateMinimumSize();
 | |
|  
 | |
|    // Some of the situations when the BrowserView is laid out are:
 | |
|    // - Enter/exit immersive fullscreen mode.
 | |
| @@ -2942,6 +2964,11 @@ void BrowserView::AddedToWidget() {
 | |
|    SetThemeProfileForWindow(GetNativeWindow(), browser_->profile());
 | |
|  #endif
 | |
|  
 | |
| +  // This browser view may already have a custom button provider set (e.g the
 | |
| +  // hosted app frame).
 | |
| +  if (!toolbar_button_provider_)
 | |
| +    SetToolbarButtonProvider(toolbar_);
 | |
| +
 | |
|    toolbar_->Init();
 | |
|  
 | |
|  #if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS)
 | |
| @@ -2977,13 +3004,9 @@ void BrowserView::AddedToWidget() {
 | |
|  
 | |
|    EnsureFocusOrder();
 | |
|  
 | |
| -  // This browser view may already have a custom button provider set (e.g the
 | |
| -  // hosted app frame).
 | |
| -  if (!toolbar_button_provider_)
 | |
| -    SetToolbarButtonProvider(toolbar_);
 | |
| -
 | |
|    frame_->OnBrowserViewInitViewsComplete();
 | |
| -  frame_->GetFrameView()->UpdateMinimumSize();
 | |
| +  if (frame_->GetFrameView())
 | |
| +    frame_->GetFrameView()->UpdateMinimumSize();
 | |
|    using_native_frame_ = frame_->ShouldUseNativeFrame();
 | |
|  
 | |
|    MaybeInitializeWebUITabStrip();
 | |
| diff --git chrome/browser/ui/views/frame/browser_view.h chrome/browser/ui/views/frame/browser_view.h
 | |
| index f6db8a692883..a5302d7f73ba 100644
 | |
| --- chrome/browser/ui/views/frame/browser_view.h
 | |
| +++ chrome/browser/ui/views/frame/browser_view.h
 | |
| @@ -114,7 +114,9 @@ class BrowserView : public BrowserWindow,
 | |
|                      public webapps::AppBannerManager::Observer {
 | |
|   public:
 | |
|    METADATA_HEADER(BrowserView);
 | |
| +  BrowserView();
 | |
|    explicit BrowserView(std::unique_ptr<Browser> browser);
 | |
| +  void InitBrowser(std::unique_ptr<Browser> browser);
 | |
|    BrowserView(const BrowserView&) = delete;
 | |
|    BrowserView& operator=(const BrowserView&) = delete;
 | |
|    ~BrowserView() override;
 | |
| @@ -642,6 +644,12 @@ class BrowserView : public BrowserWindow,
 | |
|      return accessibility_focus_highlight_.get();
 | |
|    }
 | |
|  
 | |
| + protected:
 | |
| +  virtual ToolbarView* OverrideCreateToolbar(Browser* browser,
 | |
| +                                             BrowserView* browser_view) {
 | |
| +    return nullptr;
 | |
| +  }
 | |
| +
 | |
|   private:
 | |
|    // Do not friend BrowserViewLayout. Use the BrowserViewLayoutDelegate
 | |
|    // interface to keep these two classes decoupled and testable.
 | |
| diff --git chrome/browser/ui/views/frame/browser_view_layout.cc chrome/browser/ui/views/frame/browser_view_layout.cc
 | |
| index 0e810789a99d..14d69bd755fa 100644
 | |
| --- chrome/browser/ui/views/frame/browser_view_layout.cc
 | |
| +++ chrome/browser/ui/views/frame/browser_view_layout.cc
 | |
| @@ -420,6 +420,12 @@ int BrowserViewLayout::LayoutWebUITabStrip(int top) {
 | |
|  
 | |
|  int BrowserViewLayout::LayoutToolbar(int top) {
 | |
|    TRACE_EVENT0("ui", "BrowserViewLayout::LayoutToolbar");
 | |
| +  if (toolbar_->parent() && toolbar_->parent()->GetLayoutManager() != this &&
 | |
| +      toolbar_->parent()->GetLayoutManager() != nullptr) {
 | |
| +    // CEF may take ownership of the toolbar. Early exit to avoid the DCHECK
 | |
| +    // in LayoutManager::SetViewVisibility().
 | |
| +    return top;
 | |
| +  }
 | |
|    int browser_view_width = vertical_layout_rect_.width();
 | |
|    bool toolbar_visible = delegate_->IsToolbarVisible();
 | |
|    int height = toolbar_visible ? toolbar_->GetPreferredSize().height() : 0;
 | |
| diff --git chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc
 | |
| index 50c10d73b910..46f375b11d82 100644
 | |
| --- chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc
 | |
| +++ chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc
 | |
| @@ -582,37 +582,53 @@ gfx::Range BrowserTabStripController::ListTabsInGroup(
 | |
|  }
 | |
|  
 | |
|  bool BrowserTabStripController::IsFrameCondensed() const {
 | |
| +  if (!GetFrameView())
 | |
| +    return false;
 | |
|    return GetFrameView()->IsFrameCondensed();
 | |
|  }
 | |
|  
 | |
|  bool BrowserTabStripController::HasVisibleBackgroundTabShapes() const {
 | |
| +  if (!GetFrameView())
 | |
| +    return false;
 | |
|    return GetFrameView()->HasVisibleBackgroundTabShapes(
 | |
|        BrowserFrameActiveState::kUseCurrent);
 | |
|  }
 | |
|  
 | |
|  bool BrowserTabStripController::EverHasVisibleBackgroundTabShapes() const {
 | |
| +  if (!GetFrameView())
 | |
| +    return false;
 | |
|    return GetFrameView()->EverHasVisibleBackgroundTabShapes();
 | |
|  }
 | |
|  
 | |
|  bool BrowserTabStripController::ShouldPaintAsActiveFrame() const {
 | |
| +  if (!GetFrameView())
 | |
| +    return false;
 | |
|    return GetFrameView()->ShouldPaintAsActive();
 | |
|  }
 | |
|  
 | |
|  bool BrowserTabStripController::CanDrawStrokes() const {
 | |
| +  if (!GetFrameView())
 | |
| +    return false;
 | |
|    return GetFrameView()->CanDrawStrokes();
 | |
|  }
 | |
|  
 | |
|  SkColor BrowserTabStripController::GetFrameColor(
 | |
|      BrowserFrameActiveState active_state) const {
 | |
| +  if (!GetFrameView())
 | |
| +    return SK_ColorWHITE;
 | |
|    return GetFrameView()->GetFrameColor(active_state);
 | |
|  }
 | |
|  
 | |
|  SkColor BrowserTabStripController::GetToolbarTopSeparatorColor() const {
 | |
| +  if (!GetFrameView())
 | |
| +    return SK_ColorWHITE;
 | |
|    return GetFrameView()->GetToolbarTopSeparatorColor();
 | |
|  }
 | |
|  
 | |
|  absl::optional<int> BrowserTabStripController::GetCustomBackgroundId(
 | |
|      BrowserFrameActiveState active_state) const {
 | |
| +  if (!GetFrameView())
 | |
| +    return absl::nullopt;
 | |
|    return GetFrameView()->GetCustomBackgroundId(active_state);
 | |
|  }
 | |
|  
 | |
| diff --git chrome/browser/ui/views/toolbar/toolbar_view.cc chrome/browser/ui/views/toolbar/toolbar_view.cc
 | |
| index 650fb98f63b0..fd3d28bd70aa 100644
 | |
| --- chrome/browser/ui/views/toolbar/toolbar_view.cc
 | |
| +++ chrome/browser/ui/views/toolbar/toolbar_view.cc
 | |
| @@ -160,12 +160,13 @@ auto& GetViewCommandMap() {
 | |
|  ////////////////////////////////////////////////////////////////////////////////
 | |
|  // ToolbarView, public:
 | |
|  
 | |
| -ToolbarView::ToolbarView(Browser* browser, BrowserView* browser_view)
 | |
| +ToolbarView::ToolbarView(Browser* browser, BrowserView* browser_view,
 | |
| +                         base::Optional<DisplayMode> display_mode)
 | |
|      : AnimationDelegateViews(this),
 | |
|        browser_(browser),
 | |
|        browser_view_(browser_view),
 | |
|        app_menu_icon_controller_(browser->profile(), this),
 | |
| -      display_mode_(GetDisplayMode(browser)) {
 | |
| +      display_mode_(display_mode ? *display_mode : GetDisplayMode(browser)) {
 | |
|    SetID(VIEW_ID_TOOLBAR);
 | |
|  
 | |
|    UpgradeDetector::GetInstance()->AddObserver(this);
 | |
| @@ -198,7 +199,7 @@ void ToolbarView::Init() {
 | |
|  #endif
 | |
|    auto location_bar = std::make_unique<LocationBarView>(
 | |
|        browser_, browser_->profile(), browser_->command_controller(), this,
 | |
| -      display_mode_ != DisplayMode::NORMAL);
 | |
| +      display_mode_ != DisplayMode::NORMAL && !browser_->toolbar_overridden());
 | |
|    // Make sure the toolbar shows by default.
 | |
|    size_animation_.Reset(1);
 | |
|  
 | |
| diff --git chrome/browser/ui/views/toolbar/toolbar_view.h chrome/browser/ui/views/toolbar/toolbar_view.h
 | |
| index c232c1c70350..d3b1593be549 100644
 | |
| --- chrome/browser/ui/views/toolbar/toolbar_view.h
 | |
| +++ chrome/browser/ui/views/toolbar/toolbar_view.h
 | |
| @@ -91,7 +91,8 @@ class ToolbarView : public views::AccessiblePaneView,
 | |
|                  // needs to be displayed.
 | |
|    };
 | |
|  
 | |
| -  ToolbarView(Browser* browser, BrowserView* browser_view);
 | |
| +  ToolbarView(Browser* browser, BrowserView* browser_view,
 | |
| +              base::Optional<DisplayMode> display_mode);
 | |
|    ToolbarView(const ToolbarView&) = delete;
 | |
|    ToolbarView& operator=(const ToolbarView&) = delete;
 | |
|    ~ToolbarView() override;
 |