Index: chrome/browser/ui/cocoa/media_picker/desktop_media_picker_controller_unittest.mm |
diff --git a/chrome/browser/ui/cocoa/media_picker/desktop_media_picker_controller_unittest.mm b/chrome/browser/ui/cocoa/media_picker/desktop_media_picker_controller_unittest.mm |
index 663d5d9cf1b3efea550be3bc8e51a5b11a121fcc..7b268ed06764960d5ac7c9b5791e91f0d30ac835 100644 |
--- a/chrome/browser/ui/cocoa/media_picker/desktop_media_picker_controller_unittest.mm |
+++ b/chrome/browser/ui/cocoa/media_picker/desktop_media_picker_controller_unittest.mm |
@@ -10,19 +10,39 @@ |
#include "chrome/browser/media/desktop_media_list_observer.h" |
#include "chrome/browser/media/fake_desktop_media_list.h" |
#import "chrome/browser/ui/cocoa/cocoa_test_helper.h" |
+#import "chrome/browser/ui/cocoa/media_picker/desktop_media_picker_item.h" |
#include "content/public/test/test_browser_thread_bundle.h" |
#include "testing/gtest_mac.h" |
+using content::DesktopMediaID; |
+ |
@interface DesktopMediaPickerController (ExposedForTesting) |
-- (IKImageBrowserView*)sourceBrowser; |
+- (IKImageBrowserView*)screenBrowser; |
+- (IKImageBrowserView*)windowBrowser; |
+- (NSTableView*)tabBrowser; |
+- (NSSegmentedControl*)sourceTypeControl; |
- (NSButton*)shareButton; |
- (NSButton*)audioShareCheckbox; |
-- (NSArray*)items; |
+- (NSArray*)screenItems; |
+- (NSArray*)windowItems; |
+- (NSArray*)tabItems; |
@end |
@implementation DesktopMediaPickerController (ExposedForTesting) |
-- (IKImageBrowserView*)sourceBrowser { |
- return sourceBrowser_; |
+- (IKImageBrowserView*)screenBrowser { |
+ return screenBrowser_; |
+} |
+ |
+- (IKImageBrowserView*)windowBrowser { |
+ return windowBrowser_; |
+} |
+ |
+- (NSTableView*)tabBrowser { |
+ return tabBrowser_; |
+} |
+ |
+- (NSSegmentedControl*)sourceTypeControl { |
+ return sourceTypeControl_; |
} |
- (NSButton*)shareButton { |
@@ -37,9 +57,18 @@ |
return audioShareCheckbox_; |
} |
-- (NSArray*)items { |
- return items_; |
+- (NSArray*)screenItems { |
+ return screenItems_; |
+} |
+ |
+- (NSArray*)windowItems { |
+ return windowItems_; |
} |
+ |
+- (NSArray*)tabItems { |
+ return tabItems_; |
+} |
+ |
@end |
class DesktopMediaPickerControllerTest : public CocoaTest { |
@@ -80,8 +109,31 @@ class DesktopMediaPickerControllerTest : public CocoaTest { |
return callback_called_; |
} |
+ void ChangeType(DesktopMediaID::Type sourceType) { |
+ NSSegmentedControl* control = [controller_ sourceTypeControl]; |
+ [control selectSegmentWithTag:sourceType]; |
+ // [control selectSegmentWithTag] does not trigger handler, so we need to |
+ // trigger it manually. |
+ [[control target] performSelector:[control action] withObject:control]; |
+ } |
+ |
+ void AddWindow(int id) { |
+ window_list_->AddSourceByFullMediaID( |
+ DesktopMediaID(DesktopMediaID::TYPE_WINDOW, id)); |
+ } |
+ |
+ void AddScreen(int id) { |
+ screen_list_->AddSourceByFullMediaID( |
+ DesktopMediaID(DesktopMediaID::TYPE_SCREEN, id)); |
+ } |
+ |
+ void AddTab(int id) { |
+ tab_list_->AddSourceByFullMediaID( |
+ DesktopMediaID(DesktopMediaID::TYPE_WEB_CONTENTS, id)); |
+ } |
+ |
protected: |
- void OnResult(content::DesktopMediaID source) { |
+ void OnResult(DesktopMediaID source) { |
EXPECT_FALSE(callback_called_); |
callback_called_ = true; |
source_reported_ = source; |
@@ -89,7 +141,7 @@ class DesktopMediaPickerControllerTest : public CocoaTest { |
content::TestBrowserThreadBundle thread_bundle_; |
bool callback_called_ = false; |
- content::DesktopMediaID source_reported_; |
+ DesktopMediaID source_reported_; |
FakeDesktopMediaList* screen_list_ = nullptr; |
FakeDesktopMediaList* window_list_ = nullptr; |
FakeDesktopMediaList* tab_list_ = nullptr; |
@@ -98,12 +150,13 @@ class DesktopMediaPickerControllerTest : public CocoaTest { |
TEST_F(DesktopMediaPickerControllerTest, ShowAndDismiss) { |
[controller_ showWindow:nil]; |
+ ChangeType(DesktopMediaID::TYPE_SCREEN); |
- window_list_->AddSource(0); |
- window_list_->AddSource(1); |
- window_list_->SetSourceThumbnail(1); |
+ AddScreen(0); |
+ AddScreen(1); |
+ screen_list_->SetSourceThumbnail(1); |
- NSArray* items = [controller_ items]; |
+ NSArray* items = [controller_ screenItems]; |
EXPECT_EQ(2U, [items count]); |
EXPECT_NSEQ(@"0", [[items objectAtIndex:0] imageTitle]); |
EXPECT_EQ(nil, [[items objectAtIndex:0] imageRepresentation]); |
@@ -111,19 +164,40 @@ TEST_F(DesktopMediaPickerControllerTest, ShowAndDismiss) { |
EXPECT_TRUE([[items objectAtIndex:1] imageRepresentation] != nil); |
} |
-TEST_F(DesktopMediaPickerControllerTest, ClickShare) { |
+TEST_F(DesktopMediaPickerControllerTest, ClickShareScreen) { |
[controller_ showWindow:nil]; |
+ ChangeType(DesktopMediaID::TYPE_SCREEN); |
+ AddScreen(0); |
+ screen_list_->SetSourceThumbnail(0); |
+ AddScreen(1); |
+ screen_list_->SetSourceThumbnail(1); |
+ |
+ EXPECT_EQ(2U, [[controller_ screenItems] count]); |
+ EXPECT_FALSE([[controller_ shareButton] isEnabled]); |
+ |
+ NSIndexSet* index_set = [NSIndexSet indexSetWithIndex:1]; |
+ [[controller_ screenBrowser] setSelectionIndexes:index_set |
+ byExtendingSelection:NO]; |
+ EXPECT_TRUE([[controller_ shareButton] isEnabled]); |
+ |
+ [[controller_ shareButton] performClick:nil]; |
+ EXPECT_TRUE(WaitForCallback()); |
+ EXPECT_EQ(screen_list_->GetSource(1).id, source_reported_); |
+} |
- window_list_->AddSource(0); |
+TEST_F(DesktopMediaPickerControllerTest, ClickShareWindow) { |
+ [controller_ showWindow:nil]; |
+ ChangeType(DesktopMediaID::TYPE_WINDOW); |
+ AddWindow(0); |
window_list_->SetSourceThumbnail(0); |
- window_list_->AddSource(1); |
+ AddWindow(1); |
window_list_->SetSourceThumbnail(1); |
- EXPECT_EQ(2U, [[controller_ items] count]); |
+ EXPECT_EQ(2U, [[controller_ windowItems] count]); |
EXPECT_FALSE([[controller_ shareButton] isEnabled]); |
- NSIndexSet* indexSet = [NSIndexSet indexSetWithIndex:1]; |
- [[controller_ sourceBrowser] setSelectionIndexes:indexSet |
+ NSIndexSet* index_set = [NSIndexSet indexSetWithIndex:1]; |
+ [[controller_ windowBrowser] setSelectionIndexes:index_set |
byExtendingSelection:NO]; |
EXPECT_TRUE([[controller_ shareButton] isEnabled]); |
@@ -132,57 +206,87 @@ TEST_F(DesktopMediaPickerControllerTest, ClickShare) { |
EXPECT_EQ(window_list_->GetSource(1).id, source_reported_); |
} |
+TEST_F(DesktopMediaPickerControllerTest, ClickShareTab) { |
+ [controller_ showWindow:nil]; |
+ ChangeType(DesktopMediaID::TYPE_WEB_CONTENTS); |
+ AddTab(0); |
+ tab_list_->SetSourceThumbnail(0); |
+ AddTab(1); |
+ tab_list_->SetSourceThumbnail(1); |
+ |
+ EXPECT_EQ(2U, [[controller_ tabItems] count]); |
+ EXPECT_FALSE([[controller_ shareButton] isEnabled]); |
+ |
+ NSIndexSet* index_set = [NSIndexSet indexSetWithIndex:1]; |
+ [[controller_ tabBrowser] selectRowIndexes:index_set byExtendingSelection:NO]; |
+ EXPECT_TRUE([[controller_ shareButton] isEnabled]); |
+ |
+ // Disable audio share here, otherwise the |source_reported_| will be |
+ // different from original Id, because audio share is by default on. |
+ [[controller_ audioShareCheckbox] setState:NSOffState]; |
+ [[controller_ shareButton] performClick:nil]; |
+ EXPECT_TRUE(WaitForCallback()); |
+ EXPECT_EQ(tab_list_->GetSource(1).id, source_reported_); |
+} |
+ |
TEST_F(DesktopMediaPickerControllerTest, ClickCancel) { |
[controller_ showWindow:nil]; |
+ ChangeType(DesktopMediaID::TYPE_WINDOW); |
- window_list_->AddSource(0); |
+ AddWindow(0); |
window_list_->SetSourceThumbnail(0); |
- window_list_->AddSource(1); |
+ AddWindow(1); |
window_list_->SetSourceThumbnail(1); |
+ NSIndexSet* index_set = [NSIndexSet indexSetWithIndex:1]; |
+ [[controller_ windowBrowser] setSelectionIndexes:index_set |
+ byExtendingSelection:NO]; |
[[controller_ cancelButton] performClick:nil]; |
EXPECT_TRUE(WaitForCallback()); |
- EXPECT_EQ(content::DesktopMediaID(), source_reported_); |
+ EXPECT_EQ(DesktopMediaID(), source_reported_); |
} |
TEST_F(DesktopMediaPickerControllerTest, CloseWindow) { |
[controller_ showWindow:nil]; |
+ ChangeType(DesktopMediaID::TYPE_SCREEN); |
- window_list_->AddSource(0); |
- window_list_->SetSourceThumbnail(0); |
- window_list_->AddSource(1); |
- window_list_->SetSourceThumbnail(1); |
+ AddScreen(0); |
+ screen_list_->SetSourceThumbnail(0); |
+ AddScreen(1); |
+ screen_list_->SetSourceThumbnail(1); |
[controller_ close]; |
EXPECT_TRUE(WaitForCallback()); |
- EXPECT_EQ(content::DesktopMediaID(), source_reported_); |
+ EXPECT_EQ(DesktopMediaID(), source_reported_); |
} |
TEST_F(DesktopMediaPickerControllerTest, UpdateThumbnail) { |
[controller_ showWindow:nil]; |
+ ChangeType(DesktopMediaID::TYPE_WEB_CONTENTS); |
- window_list_->AddSource(0); |
- window_list_->SetSourceThumbnail(0); |
- window_list_->AddSource(1); |
- window_list_->SetSourceThumbnail(1); |
+ AddTab(0); |
+ tab_list_->SetSourceThumbnail(0); |
+ AddTab(1); |
+ tab_list_->SetSourceThumbnail(1); |
- NSArray* items = [controller_ items]; |
+ NSArray* items = [controller_ tabItems]; |
EXPECT_EQ(2U, [items count]); |
NSUInteger version = [[items objectAtIndex:0] imageVersion]; |
- window_list_->SetSourceThumbnail(0); |
+ tab_list_->SetSourceThumbnail(0); |
EXPECT_NE(version, [[items objectAtIndex:0] imageVersion]); |
} |
TEST_F(DesktopMediaPickerControllerTest, UpdateName) { |
[controller_ showWindow:nil]; |
+ ChangeType(DesktopMediaID::TYPE_WINDOW); |
- window_list_->AddSource(0); |
+ AddWindow(0); |
window_list_->SetSourceThumbnail(0); |
- window_list_->AddSource(1); |
+ AddWindow(1); |
window_list_->SetSourceThumbnail(1); |
- NSArray* items = [controller_ items]; |
+ NSArray* items = [controller_ windowItems]; |
EXPECT_EQ(2U, [items count]); |
NSUInteger version = [[items objectAtIndex:0] imageVersion]; |
@@ -192,24 +296,26 @@ TEST_F(DesktopMediaPickerControllerTest, UpdateName) { |
TEST_F(DesktopMediaPickerControllerTest, RemoveSource) { |
[controller_ showWindow:nil]; |
+ ChangeType(DesktopMediaID::TYPE_SCREEN); |
- window_list_->AddSource(0); |
- window_list_->AddSource(1); |
- window_list_->AddSource(2); |
- window_list_->SetSourceName(1, base::ASCIIToUTF16("foo")); |
+ AddScreen(0); |
+ AddScreen(1); |
+ AddScreen(2); |
+ screen_list_->SetSourceName(1, base::ASCIIToUTF16("foo")); |
- NSArray* items = [controller_ items]; |
+ NSArray* items = [controller_ screenItems]; |
EXPECT_EQ(3U, [items count]); |
EXPECT_NSEQ(@"foo", [[items objectAtIndex:1] imageTitle]); |
} |
TEST_F(DesktopMediaPickerControllerTest, MoveSource) { |
[controller_ showWindow:nil]; |
+ ChangeType(DesktopMediaID::TYPE_WINDOW); |
- window_list_->AddSource(0); |
- window_list_->AddSource(1); |
+ AddWindow(0); |
+ AddWindow(1); |
window_list_->SetSourceName(1, base::ASCIIToUTF16("foo")); |
- NSArray* items = [controller_ items]; |
+ NSArray* items = [controller_ windowItems]; |
EXPECT_NSEQ(@"foo", [[items objectAtIndex:1] imageTitle]); |
window_list_->MoveSource(1, 0); |
@@ -225,35 +331,79 @@ TEST_F(DesktopMediaPickerControllerTest, MoveSource) { |
TEST_F(DesktopMediaPickerControllerTest, AudioShareCheckboxState) { |
[controller_ showWindow:nil]; |
- screen_list_->AddSourceByFullMediaID( |
- content::DesktopMediaID(content::DesktopMediaID::TYPE_SCREEN, 0)); |
- window_list_->AddSourceByFullMediaID( |
- content::DesktopMediaID(content::DesktopMediaID::TYPE_WINDOW, 1)); |
- tab_list_->AddSourceByFullMediaID( |
- content::DesktopMediaID(content::DesktopMediaID::TYPE_WEB_CONTENTS, 2)); |
+ AddScreen(0); |
+ AddWindow(1); |
+ AddTab(2); |
NSButton* checkbox = [controller_ audioShareCheckbox]; |
- EXPECT_EQ(NO, [checkbox isEnabled]); |
+ EXPECT_EQ(YES, [checkbox isHidden]); |
+ |
+ [checkbox setHidden:NO]; |
+ ChangeType(DesktopMediaID::TYPE_WINDOW); |
+ EXPECT_EQ(YES, [checkbox isHidden]); |
+ |
+ [checkbox setHidden:YES]; |
+ ChangeType(DesktopMediaID::TYPE_WEB_CONTENTS); |
+ EXPECT_EQ(NO, [checkbox isHidden]); |
+ |
+ [checkbox setHidden:NO]; |
+ ChangeType(DesktopMediaID::TYPE_SCREEN); |
+ EXPECT_EQ(YES, [checkbox isHidden]); |
+} |
+ |
+TEST_F(DesktopMediaPickerControllerTest, TabShareWithAudio) { |
+ [controller_ showWindow:nil]; |
+ ChangeType(DesktopMediaID::TYPE_WEB_CONTENTS); |
+ |
+ DesktopMediaID origin_id = |
+ DesktopMediaID(DesktopMediaID::TYPE_WEB_CONTENTS, 123); |
+ DesktopMediaID id_with_audio = origin_id; |
+ id_with_audio.audio_share = true; |
+ |
+ tab_list_->AddSourceByFullMediaID(origin_id); |
NSIndexSet* index_set = [NSIndexSet indexSetWithIndex:0]; |
- [checkbox setEnabled:YES]; |
- [[controller_ sourceBrowser] setSelectionIndexes:index_set |
- byExtendingSelection:NO]; |
- EXPECT_EQ(NO, [checkbox isEnabled]); |
+ [[controller_ tabBrowser] selectRowIndexes:index_set byExtendingSelection:NO]; |
+ EXPECT_TRUE([[controller_ shareButton] isEnabled]); |
- index_set = [NSIndexSet indexSetWithIndex:1]; |
- [checkbox setEnabled:YES]; |
- [[controller_ sourceBrowser] setSelectionIndexes:index_set |
- byExtendingSelection:NO]; |
- EXPECT_EQ(NO, [checkbox isEnabled]); |
+ [[controller_ shareButton] performClick:nil]; |
- index_set = [NSIndexSet indexSetWithIndex:2]; |
- [[controller_ sourceBrowser] setSelectionIndexes:index_set |
- byExtendingSelection:NO]; |
- EXPECT_EQ(YES, [checkbox isEnabled]); |
+ EXPECT_TRUE(WaitForCallback()); |
+ EXPECT_EQ(id_with_audio, source_reported_); |
+} |
- index_set = [NSIndexSet indexSet]; |
- [[controller_ sourceBrowser] setSelectionIndexes:index_set |
- byExtendingSelection:NO]; |
- EXPECT_EQ(NO, [checkbox isEnabled]); |
+TEST_F(DesktopMediaPickerControllerTest, TabBrowserFocusAlgorithm) { |
+ [controller_ showWindow:nil]; |
+ ChangeType(DesktopMediaID::TYPE_WEB_CONTENTS); |
+ AddTab(0); |
+ AddTab(1); |
+ AddTab(2); |
+ AddTab(3); |
+ |
+ NSArray* items = [controller_ tabItems]; |
+ NSTableView* browser = [controller_ tabBrowser]; |
+ |
+ NSIndexSet* index_set = [NSIndexSet indexSetWithIndex:1]; |
+ [browser selectRowIndexes:index_set byExtendingSelection:NO]; |
+ |
+ // Move source [0, 1, 2, 3]-->[1, 2, 3, 0] |
+ tab_list_->MoveSource(0, 3); |
+ NSUInteger selected_index = [[browser selectedRowIndexes] firstIndex]; |
+ EXPECT_EQ(1, [[items objectAtIndex:selected_index] sourceID].id); |
+ |
+ // Move source [1, 2, 3, 0]-->[3, 1, 2, 0] |
+ tab_list_->MoveSource(2, 0); |
+ selected_index = [[browser selectedRowIndexes] firstIndex]; |
+ EXPECT_EQ(1, [[items objectAtIndex:selected_index] sourceID].id); |
+ |
+ // Remove a source [3, 1, 2, 0]-->[1, 2, 0] |
+ tab_list_->RemoveSource(0); |
+ selected_index = [[browser selectedRowIndexes] firstIndex]; |
+ EXPECT_EQ(1, [[items objectAtIndex:selected_index] sourceID].id); |
+ |
+ // Change source type back and forth, browser should memorize the selection. |
+ ChangeType(DesktopMediaID::TYPE_SCREEN); |
+ ChangeType(DesktopMediaID::TYPE_WEB_CONTENTS); |
+ selected_index = [[browser selectedRowIndexes] firstIndex]; |
+ EXPECT_EQ(1, [[items objectAtIndex:selected_index] sourceID].id); |
} |