Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(213)

Side by Side Diff: chrome/browser/extensions/api/tabs/tabs_api.cc

Issue 2263863002: Remove implementation of Panels on OSes other than ChromeOS. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: cleanup after test removal Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 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 #include "chrome/browser/extensions/api/tabs/tabs_api.h" 5 #include "chrome/browser/extensions/api/tabs/tabs_api.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <algorithm> 8 #include <algorithm>
9 #include <limits> 9 #include <limits>
10 #include <memory> 10 #include <memory>
(...skipping 30 matching lines...) Expand all
41 #include "chrome/browser/sessions/session_tab_helper.h" 41 #include "chrome/browser/sessions/session_tab_helper.h"
42 #include "chrome/browser/translate/chrome_translate_client.h" 42 #include "chrome/browser/translate/chrome_translate_client.h"
43 #include "chrome/browser/ui/apps/chrome_app_delegate.h" 43 #include "chrome/browser/ui/apps/chrome_app_delegate.h"
44 #include "chrome/browser/ui/browser.h" 44 #include "chrome/browser/ui/browser.h"
45 #include "chrome/browser/ui/browser_commands.h" 45 #include "chrome/browser/ui/browser_commands.h"
46 #include "chrome/browser/ui/browser_finder.h" 46 #include "chrome/browser/ui/browser_finder.h"
47 #include "chrome/browser/ui/browser_list.h" 47 #include "chrome/browser/ui/browser_list.h"
48 #include "chrome/browser/ui/browser_navigator.h" 48 #include "chrome/browser/ui/browser_navigator.h"
49 #include "chrome/browser/ui/browser_navigator_params.h" 49 #include "chrome/browser/ui/browser_navigator_params.h"
50 #include "chrome/browser/ui/browser_window.h" 50 #include "chrome/browser/ui/browser_window.h"
51 #include "chrome/browser/ui/panels/panel_manager.h"
52 #include "chrome/browser/ui/tabs/tab_strip_model.h" 51 #include "chrome/browser/ui/tabs/tab_strip_model.h"
53 #include "chrome/browser/ui/tabs/tab_utils.h" 52 #include "chrome/browser/ui/tabs/tab_utils.h"
54 #include "chrome/browser/ui/window_sizer/window_sizer.h" 53 #include "chrome/browser/ui/window_sizer/window_sizer.h"
55 #include "chrome/browser/web_applications/web_app.h" 54 #include "chrome/browser/web_applications/web_app.h"
56 #include "chrome/common/chrome_switches.h" 55 #include "chrome/common/chrome_switches.h"
57 #include "chrome/common/extensions/api/tabs.h" 56 #include "chrome/common/extensions/api/tabs.h"
58 #include "chrome/common/extensions/api/windows.h" 57 #include "chrome/common/extensions/api/windows.h"
59 #include "chrome/common/extensions/extension_constants.h" 58 #include "chrome/common/extensions/extension_constants.h"
60 #include "chrome/common/pref_names.h" 59 #include "chrome/common/pref_names.h"
61 #include "chrome/common/url_constants.h" 60 #include "chrome/common/url_constants.h"
(...skipping 437 matching lines...) Expand 10 before | Expand all | Expand 10 after
499 return false; 498 return false;
500 } 499 }
501 } 500 }
502 501
503 if (!IsValidStateForWindowsCreateFunction(create_data)) { 502 if (!IsValidStateForWindowsCreateFunction(create_data)) {
504 error_ = keys::kInvalidWindowStateError; 503 error_ = keys::kInvalidWindowStateError;
505 return false; 504 return false;
506 } 505 }
507 506
508 Browser::Type window_type = Browser::TYPE_TABBED; 507 Browser::Type window_type = Browser::TYPE_TABBED;
509 bool create_panel = false; 508 bool create_chromeOS_panel = false;
sky 2016/08/22 15:05:55 Style guide says all lower case, e.g. chrome_os_pa
stevenjb 2016/08/22 15:45:02 create_ash_panel would be best (see below). Also t
Dmitry Titov 2016/08/22 23:45:53 Done.
Dmitry Titov 2016/08/22 23:45:53 Done.
510
511 // panel_create_mode only applies if create_panel = true
512 PanelManager::CreateMode panel_create_mode = PanelManager::CREATE_AS_DOCKED;
513 509
514 gfx::Rect window_bounds; 510 gfx::Rect window_bounds;
515 bool focused = true; 511 bool focused = true;
516 bool saw_focus_key = false; 512 bool saw_focus_key = false;
517 std::string extension_id; 513 std::string extension_id;
518 514
519 if (create_data) { 515 if (create_data) {
520 // Figure out window type before figuring out bounds so that default 516 // Figure out window type before figuring out bounds so that default
521 // bounds can be set according to the window type. 517 // bounds can be set according to the window type.
522 switch (create_data->type) { 518 switch (create_data->type) {
523 case windows::CREATE_TYPE_POPUP: 519 case windows::CREATE_TYPE_POPUP:
524 window_type = Browser::TYPE_POPUP; 520 window_type = Browser::TYPE_POPUP;
525 extension_id = extension()->id(); 521 extension_id = extension()->id();
526 break; 522 break;
523
527 case windows::CREATE_TYPE_PANEL: 524 case windows::CREATE_TYPE_PANEL:
528 case windows::CREATE_TYPE_DETACHED_PANEL: { 525 case windows::CREATE_TYPE_DETACHED_PANEL: {
526 #if defined(OS_CHROMEOS)
527 // Only ChromeOS' version of chrome.windows.create would create a panel
528 // window. It is whitelisted to Hangouts extension for limited time until
529 // it transitioned to other types of windows.
529 extension_id = extension()->id(); 530 extension_id = extension()->id();
530 bool use_panels = PanelManager::ShouldUsePanels(extension_id); 531 for (const char* id : extension_misc::kHangoutsExtensionIds) {
531 if (use_panels) { 532 if (extension_id == id) {
532 create_panel = true; 533 create_chromeOS_panel = true;
533 #if !defined(USE_ASH) 534 break;
534 // Non-ash supports both docked and detached panel types.
535 if (create_data->type == windows::CREATE_TYPE_DETACHED_PANEL) {
536 panel_create_mode = PanelManager::CREATE_AS_DETACHED;
537 } 535 }
538 #endif // USE_ASH 536 }
539 } else { 537 #endif // defined(OS_CHROMEOS)
538 // Everything else gets POPUP instead of PANEL.
539 // TODO(dimich): Eventually, remove the 'panel' values form valid
540 // window.create parameters. However, this is a more breaking change, so
541 // for now simply treat it as a POPUP.
542 if (!create_chromeOS_panel)
540 window_type = Browser::TYPE_POPUP; 543 window_type = Browser::TYPE_POPUP;
stevenjb 2016/08/22 15:45:02 Don't we need to set extension_id for non chrome o
Dmitry Titov 2016/08/22 23:45:54 Done.
541 }
542 break; 544 break;
543 } 545 }
546
544 case windows::CREATE_TYPE_NONE: 547 case windows::CREATE_TYPE_NONE:
545 case windows::CREATE_TYPE_NORMAL: 548 case windows::CREATE_TYPE_NORMAL:
546 break; 549 break;
547 default: 550 default:
548 error_ = keys::kInvalidWindowTypeError; 551 error_ = keys::kInvalidWindowTypeError;
549 return false; 552 return false;
550 } 553 }
551 554
552 // Initialize default window bounds according to window type. 555 // Initialize default window bounds according to window type.
553 if (window_type == Browser::TYPE_TABBED || 556 if (window_type == Browser::TYPE_TABBED ||
554 window_type == Browser::TYPE_POPUP || 557 window_type == Browser::TYPE_POPUP ||
555 create_panel) { 558 create_chromeOS_panel) {
556 // Try to position the new browser relative to its originating 559 // Try to position the new browser relative to its originating
557 // browser window. The call offsets the bounds by kWindowTilePixels 560 // browser window. The call offsets the bounds by kWindowTilePixels
558 // (defined in WindowSizer to be 10). 561 // (defined in WindowSizer to be 10).
559 // 562 //
560 // NOTE(rafaelw): It's ok if GetCurrentBrowser() returns NULL here. 563 // NOTE(rafaelw): It's ok if GetCurrentBrowser() returns NULL here.
561 // GetBrowserWindowBounds will default to saved "default" values for 564 // GetBrowserWindowBounds will default to saved "default" values for
562 // the app. 565 // the app.
563 ui::WindowShowState show_state = ui::SHOW_STATE_DEFAULT; 566 ui::WindowShowState show_state = ui::SHOW_STATE_DEFAULT;
564 WindowSizer::GetBrowserWindowBoundsAndShowState(std::string(), 567 WindowSizer::GetBrowserWindowBoundsAndShowState(std::string(),
565 gfx::Rect(), 568 gfx::Rect(),
566 GetCurrentBrowser(), 569 GetCurrentBrowser(),
567 &window_bounds, 570 &window_bounds,
568 &show_state); 571 &show_state);
569 } 572 }
570 573
571 if (create_panel && PanelManager::CREATE_AS_DETACHED == panel_create_mode) {
572 window_bounds.set_origin(
573 PanelManager::GetInstance()->GetDefaultDetachedPanelOrigin());
574 }
575
576 // Any part of the bounds can optionally be set by the caller. 574 // Any part of the bounds can optionally be set by the caller.
577 if (create_data->left) 575 if (create_data->left)
578 window_bounds.set_x(*create_data->left); 576 window_bounds.set_x(*create_data->left);
579 577
580 if (create_data->top) 578 if (create_data->top)
581 window_bounds.set_y(*create_data->top); 579 window_bounds.set_y(*create_data->top);
582 580
583 if (create_data->width) 581 if (create_data->width)
584 window_bounds.set_width(*create_data->width); 582 window_bounds.set_width(*create_data->width);
585 583
586 if (create_data->height) 584 if (create_data->height)
587 window_bounds.set_height(*create_data->height); 585 window_bounds.set_height(*create_data->height);
588 586
589 if (create_data->focused) { 587 if (create_data->focused) {
590 focused = *create_data->focused; 588 focused = *create_data->focused;
591 saw_focus_key = true; 589 saw_focus_key = true;
592 } 590 }
593 } 591 }
594 592
595 if (create_panel) { 593 if (create_chromeOS_panel) {
596 if (urls.empty()) 594 if (urls.empty())
597 urls.push_back(GURL(chrome::kChromeUINewTabURL)); 595 urls.push_back(GURL(chrome::kChromeUINewTabURL));
598 596
599 #if defined(USE_ASH) 597 #if defined(USE_ASH)
sky 2016/08/22 15:05:55 If you're setting chrome_os_panel to true based on
stevenjb 2016/08/22 15:45:02 Agreed, we should be consistent. I think USE_ASH i
Dmitry Titov 2016/08/22 23:45:53 Done.
Dmitry Titov 2016/08/22 23:45:54 Done.
600 AppWindow::CreateParams create_params; 598 AppWindow::CreateParams create_params;
601 create_params.window_type = AppWindow::WINDOW_TYPE_V1_PANEL; 599 create_params.window_type = AppWindow::WINDOW_TYPE_V1_PANEL;
602 create_params.window_key = extension_id; 600 create_params.window_key = extension_id;
603 create_params.window_spec.bounds = window_bounds; 601 create_params.window_spec.bounds = window_bounds;
604 create_params.focused = saw_focus_key && focused; 602 create_params.focused = saw_focus_key && focused;
605 AppWindow* app_window = 603 AppWindow* app_window =
606 new AppWindow(window_profile, new ChromeAppDelegate(true), extension()); 604 new AppWindow(window_profile, new ChromeAppDelegate(true), extension());
607 AshPanelContents* ash_panel_contents = new AshPanelContents(app_window); 605 AshPanelContents* ash_panel_contents = new AshPanelContents(app_window);
608 app_window->Init(urls[0], ash_panel_contents, render_frame_host(), 606 app_window->Init(urls[0], ash_panel_contents, render_frame_host(),
609 create_params); 607 create_params);
610 WindowController* window_controller = 608 WindowController* window_controller =
611 WindowControllerList::GetInstance()->FindWindowById( 609 WindowControllerList::GetInstance()->FindWindowById(
612 app_window->session_id().id()); 610 app_window->session_id().id());
613 if (!window_controller) 611 if (!window_controller)
614 return false; 612 return false;
615 SetResult(window_controller->CreateWindowValueWithTabs(extension())); 613 SetResult(window_controller->CreateWindowValueWithTabs(extension()));
616 return true; 614 return true;
617 #else 615 #else
618 std::string title = 616 return false;
619 web_app::GenerateApplicationNameFromExtensionId(extension_id);
620 content::SiteInstance* source_site_instance =
621 render_frame_host()->GetSiteInstance();
622 // Note: Panels ignore all but the first url provided.
623 Panel* panel = PanelManager::GetInstance()->CreatePanel(
624 title, window_profile, urls[0], source_site_instance, window_bounds,
625 panel_create_mode);
626
627 // Unlike other window types, Panels do not take focus by default.
628 if (!saw_focus_key || !focused)
629 panel->ShowInactive();
630 else
631 panel->Show();
632
633 SetResult(panel->extension_window_controller()->CreateWindowValueWithTabs(
634 extension()));
635 return true;
636 #endif 617 #endif
637 } 618 }
638 619
639 // Create a new BrowserWindow. 620 // Create a new BrowserWindow.
640 if (create_panel)
641 window_type = Browser::TYPE_POPUP;
642 Browser::CreateParams create_params(window_type, window_profile); 621 Browser::CreateParams create_params(window_type, window_profile);
643 if (extension_id.empty()) { 622 if (extension_id.empty()) {
644 create_params.initial_bounds = window_bounds; 623 create_params.initial_bounds = window_bounds;
645 } else { 624 } else {
646 create_params = Browser::CreateParams::CreateForApp( 625 create_params = Browser::CreateParams::CreateForApp(
647 web_app::GenerateApplicationNameFromExtensionId(extension_id), 626 web_app::GenerateApplicationNameFromExtensionId(extension_id),
648 false /* trusted_source */, window_bounds, window_profile); 627 false /* trusted_source */, window_bounds, window_profile);
649 } 628 }
650 create_params.initial_show_state = ui::SHOW_STATE_NORMAL; 629 create_params.initial_show_state = ui::SHOW_STATE_NORMAL;
651 if (create_data && create_data->state) { 630 if (create_data && create_data->state) {
652 create_params.initial_show_state = 631 create_params.initial_show_state =
653 ConvertToWindowShowState(create_data->state); 632 ConvertToWindowShowState(create_data->state);
654 } 633 }
655 634
656 Browser* new_window = new Browser(create_params); 635 Browser* new_window = new Browser(create_params);
657 636
658 for (const GURL& url : urls) { 637 for (const GURL& url : urls) {
659 chrome::NavigateParams navigate_params(new_window, url, 638 chrome::NavigateParams navigate_params(new_window, url,
660 ui::PAGE_TRANSITION_LINK); 639 ui::PAGE_TRANSITION_LINK);
661 navigate_params.disposition = NEW_FOREGROUND_TAB; 640 navigate_params.disposition = NEW_FOREGROUND_TAB;
662 navigate_params.source_site_instance = 641 navigate_params.source_site_instance =
663 render_frame_host()->GetSiteInstance(); 642 render_frame_host()->GetSiteInstance();
664 chrome::Navigate(&navigate_params); 643 chrome::Navigate(&navigate_params);
665 if (create_panel) {
666 TabHelper::FromWebContents(navigate_params.target_contents)
667 ->SetExtensionAppIconById(extension_id);
668 }
669 } 644 }
670 645
671 WebContents* contents = NULL; 646 WebContents* contents = NULL;
672 // Move the tab into the created window only if it's an empty popup or it's 647 // Move the tab into the created window only if it's an empty popup or it's
673 // a tabbed window. 648 // a tabbed window.
674 if ((window_type == Browser::TYPE_POPUP && urls.empty()) || 649 if ((window_type == Browser::TYPE_POPUP && urls.empty()) ||
675 window_type == Browser::TYPE_TABBED) { 650 window_type == Browser::TYPE_TABBED) {
676 if (source_tab_strip) 651 if (source_tab_strip)
677 contents = source_tab_strip->DetachWebContentsAt(tab_index); 652 contents = source_tab_strip->DetachWebContentsAt(tab_index);
678 if (contents) { 653 if (contents) {
679 TabStripModel* target_tab_strip = new_window->tab_strip_model(); 654 TabStripModel* target_tab_strip = new_window->tab_strip_model();
680 target_tab_strip->InsertWebContentsAt(urls.size(), contents, 655 target_tab_strip->InsertWebContentsAt(urls.size(), contents,
681 TabStripModel::ADD_NONE); 656 TabStripModel::ADD_NONE);
682 } 657 }
683 } 658 }
684 // Create a new tab if the created window is still empty. Don't create a new 659 // Create a new tab if the created window is still empty. Don't create a new
685 // tab when it is intended to create an empty popup. 660 // tab when it is intended to create an empty popup.
686 if (!contents && urls.empty() && window_type != Browser::TYPE_POPUP) { 661 if (!contents && urls.empty() && window_type != Browser::TYPE_POPUP) {
687 chrome::NewTab(new_window); 662 chrome::NewTab(new_window);
688 } 663 }
689 chrome::SelectNumberedTab(new_window, 0); 664 chrome::SelectNumberedTab(new_window, 0);
690 665
691 // Unlike other window types, Panels do not take focus by default.
692 if (!saw_focus_key && create_panel)
693 focused = false;
694
695 if (focused) 666 if (focused)
696 new_window->window()->Show(); 667 new_window->window()->Show();
697 else 668 else
698 new_window->window()->ShowInactive(); 669 new_window->window()->ShowInactive();
699 670
700 WindowController* controller = new_window->extension_window_controller(); 671 WindowController* controller = new_window->extension_window_controller();
701 672
702 if (new_window->profile()->IsOffTheRecord() && 673 if (new_window->profile()->IsOffTheRecord() &&
703 !GetProfile()->IsOffTheRecord() && !include_incognito()) { 674 !GetProfile()->IsOffTheRecord() && !include_incognito()) {
704 // Don't expose incognito windows if extension itself works in non-incognito 675 // Don't expose incognito windows if extension itself works in non-incognito
(...skipping 1506 matching lines...) Expand 10 before | Expand all | Expand 10 after
2211 params->tab_id 2182 params->tab_id
2212 ? ErrorUtils::FormatErrorMessage(keys::kCannotDiscardTab, 2183 ? ErrorUtils::FormatErrorMessage(keys::kCannotDiscardTab,
2213 base::IntToString(*params->tab_id)) 2184 base::IntToString(*params->tab_id))
2214 : keys::kCannotFindTabToDiscard)); 2185 : keys::kCannotFindTabToDiscard));
2215 } 2186 }
2216 2187
2217 TabsDiscardFunction::TabsDiscardFunction() {} 2188 TabsDiscardFunction::TabsDiscardFunction() {}
2218 TabsDiscardFunction::~TabsDiscardFunction() {} 2189 TabsDiscardFunction::~TabsDiscardFunction() {}
2219 2190
2220 } // namespace extensions 2191 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698