Commit d928ba63 authored by rsesek's avatar rsesek Committed by Commit bot

[Mac] Delete the unused AvatarMenuBubbleController and its associated XIB.

BUG=none
R=anthonyvd@chromium.org

Review-Url: https://codereview.chromium.org/2561163004
Cr-Commit-Position: refs/heads/master@{#437629}
parent e9bc6779
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="5056" systemVersion="13F1077" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none">
<dependencies>
<deployment version="1090" identifier="macosx"/>
<development version="5100" identifier="xcode"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="5056"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="AvatarMenuItemController">
<connections>
<outlet property="activeView" destination="8" id="11"/>
<outlet property="editButton" destination="25" id="39"/>
<outlet property="emailField" destination="23" id="40"/>
<outlet property="iconView" destination="2" id="15"/>
<outlet property="nameField" destination="4" id="13"/>
<outlet property="view" destination="1" id="10"/>
</connections>
</customObject>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application"/>
<customView id="1" customClass="AvatarMenuItemView">
<rect key="frame" x="0.0" y="0.0" width="175" height="48"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
<subviews>
<imageView id="2">
<rect key="frame" x="6" y="5" width="38" height="38"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="NSUser" id="3" customClass="AccessibilityIgnoredImageCell"/>
</imageView>
<textField verticalHuggingPriority="750" id="4">
<rect key="frame" x="49" y="25" width="120" height="17"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="Username" id="5">
<font key="font" metaFont="system"/>
<color key="textColor" white="0.12" alpha="1" colorSpace="calibratedWhite"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<imageView id="8">
<rect key="frame" x="28" y="5" width="16" height="16"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="NSLockLockedTemplate" id="9" customClass="AccessibilityIgnoredImageCell"/>
</imageView>
<textField verticalHuggingPriority="750" id="23">
<rect key="frame" x="49" y="8" width="120" height="16"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="email@example.com" id="24" customClass="AccessibilityIgnoredTextFieldCell">
<font key="font" metaFont="cellTitle"/>
<color key="textColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<button id="25">
<rect key="frame" x="49" y="8" width="120" height="16"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="square" title="^IDS_PROFILES_EDIT_PROFILE_LINK" bezelStyle="shadowlessSquare" alignment="left" imageScaling="proportionallyDown" inset="2" id="26" customClass="HyperlinkButtonCell">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="cellTitle"/>
</buttonCell>
<connections>
<action selector="editProfile:" target="-2" id="41"/>
</connections>
</button>
</subviews>
<connections>
<outlet property="viewController" destination="-2" id="22"/>
</connections>
</customView>
<customObject id="42" customClass="ChromeUILocalizer">
<connections>
<outlet property="owner_" destination="-2" id="48"/>
</connections>
</customObject>
</objects>
<resources>
<image name="NSLockLockedTemplate" width="9" height="12"/>
<image name="NSUser" width="32" height="32"/>
</resources>
</document>
...@@ -8,7 +8,6 @@ assert(is_mac) ...@@ -8,7 +8,6 @@ assert(is_mac)
translated_xibs = [ translated_xibs = [
"AppMenu.xib", "AppMenu.xib",
"AvatarMenuItem.xib",
"BookmarkAllTabs.xib", "BookmarkAllTabs.xib",
"BookmarkBar.xib", "BookmarkBar.xib",
"BookmarkBubble.xib", "BookmarkBubble.xib",
......
...@@ -2844,8 +2844,6 @@ split_static_library("ui") { ...@@ -2844,8 +2844,6 @@ split_static_library("ui") {
"cocoa/profiles/avatar_button_controller.mm", "cocoa/profiles/avatar_button_controller.mm",
"cocoa/profiles/avatar_icon_controller.h", "cocoa/profiles/avatar_icon_controller.h",
"cocoa/profiles/avatar_icon_controller.mm", "cocoa/profiles/avatar_icon_controller.mm",
"cocoa/profiles/avatar_menu_bubble_controller.h",
"cocoa/profiles/avatar_menu_bubble_controller.mm",
"cocoa/profiles/profile_chooser_controller.h", "cocoa/profiles/profile_chooser_controller.h",
"cocoa/profiles/profile_chooser_controller.mm", "cocoa/profiles/profile_chooser_controller.mm",
"cocoa/profiles/profile_signin_confirmation_dialog_cocoa.h", "cocoa/profiles/profile_signin_confirmation_dialog_cocoa.h",
......
...@@ -40,7 +40,6 @@ ...@@ -40,7 +40,6 @@
#import "chrome/browser/ui/cocoa/location_bar/location_bar_view_mac.h" #import "chrome/browser/ui/cocoa/location_bar/location_bar_view_mac.h"
#import "chrome/browser/ui/cocoa/nsmenuitem_additions.h" #import "chrome/browser/ui/cocoa/nsmenuitem_additions.h"
#import "chrome/browser/ui/cocoa/profiles/avatar_base_controller.h" #import "chrome/browser/ui/cocoa/profiles/avatar_base_controller.h"
#import "chrome/browser/ui/cocoa/profiles/avatar_menu_bubble_controller.h"
#include "chrome/browser/ui/cocoa/restart_browser.h" #include "chrome/browser/ui/cocoa/restart_browser.h"
#include "chrome/browser/ui/cocoa/status_bubble_mac.h" #include "chrome/browser/ui/cocoa/status_bubble_mac.h"
#include "chrome/browser/ui/cocoa/task_manager_mac.h" #include "chrome/browser/ui/cocoa/task_manager_mac.h"
......
...@@ -20,7 +20,6 @@ ...@@ -20,7 +20,6 @@
#import "chrome/browser/ui/cocoa/base_bubble_controller.h" #import "chrome/browser/ui/cocoa/base_bubble_controller.h"
#import "chrome/browser/ui/cocoa/browser_window_controller.h" #import "chrome/browser/ui/cocoa/browser_window_controller.h"
#include "chrome/browser/ui/cocoa/l10n_util.h" #include "chrome/browser/ui/cocoa/l10n_util.h"
#import "chrome/browser/ui/cocoa/profiles/avatar_menu_bubble_controller.h"
#import "chrome/browser/ui/cocoa/profiles/profile_chooser_controller.h" #import "chrome/browser/ui/cocoa/profiles/profile_chooser_controller.h"
#include "components/signin/core/common/profile_management_switches.h" #include "components/signin/core/common/profile_management_switches.h"
#include "ui/base/cocoa/cocoa_base_utils.h" #include "ui/base/cocoa/cocoa_base_utils.h"
......
...@@ -21,7 +21,6 @@ ...@@ -21,7 +21,6 @@
#include "chrome/browser/ui/cocoa/cocoa_profile_test.h" #include "chrome/browser/ui/cocoa/cocoa_profile_test.h"
#include "chrome/browser/ui/cocoa/info_bubble_window.h" #include "chrome/browser/ui/cocoa/info_bubble_window.h"
#import "chrome/browser/ui/cocoa/profiles/avatar_button_controller.h" #import "chrome/browser/ui/cocoa/profiles/avatar_button_controller.h"
#import "chrome/browser/ui/cocoa/profiles/avatar_menu_bubble_controller.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/test/base/testing_profile.h" #include "chrome/test/base/testing_profile.h"
#include "components/bookmarks/test/bookmark_test_helpers.h" #include "components/bookmarks/test/bookmark_test_helpers.h"
......
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_UI_COCOA_PROFILES_AVATAR_MENU_BUBBLE_CONTROLLER_H_
#define CHROME_BROWSER_UI_COCOA_PROFILES_AVATAR_MENU_BUBBLE_CONTROLLER_H_
#import <Cocoa/Cocoa.h>
#include <stddef.h>
#include <memory>
#include "base/mac/objc_property_releaser.h"
#include "base/mac/scoped_nsobject.h"
#import "chrome/browser/ui/cocoa/base_bubble_controller.h"
#import "ui/base/cocoa/tracking_area.h"
class AvatarMenu;
class Browser;
// This window controller manages the bubble that displays a "menu" of profiles.
// It is brought open by clicking on the avatar icon in the window frame.
@interface AvatarMenuBubbleController : BaseBubbleController {
@private
// The menu that contains the data from the backend.
std::unique_ptr<AvatarMenu> menu_;
// Array of the below view controllers.
base::scoped_nsobject<NSMutableArray> items_;
// Is set to true if the supervised user has clicked on Switch Users.
BOOL expanded_;
}
// Designated initializer. The browser is passed to the menu for profile
// information.
- (id)initWithBrowser:(Browser*)parentBrowser
anchoredAt:(NSPoint)point;
// Creates a new profile.
- (IBAction)newProfile:(id)sender;
// Switches to a given profile. |sender| is an AvatarMenuItemController.
- (IBAction)switchToProfile:(id)sender;
// Edits a given profile. |sender| is an AvatarMenuItemController.
- (IBAction)editProfile:(id)sender;
// Switches from the supervised user avatar menu to the normal avatar menu which
// allows to switch profiles.
- (IBAction)switchProfile:(id)sender;
@end
////////////////////////////////////////////////////////////////////////////////
// This view controller manages the menu item XIB.
@interface AvatarMenuItemController : NSViewController<NSAnimationDelegate> {
@private
// The parent menu controller; owns this.
AvatarMenuBubbleController* controller_; // weak
// The index of the item in the AvatarMenu.
size_t menuIndex_;
// Tracks whether this item is currently highlighted.
BOOL isHighlighted_;
// The animation showing the edit link, which is run after the user has
// dwelled over the item for a short delay.
base::scoped_nsobject<NSAnimation> linkAnimation_;
// Instance variables that back the outlets.
NSImageView* iconView_;
NSImageView* activeView_;
NSTextField* nameField_;
// These two views sit on top of each other, and only one is visible at a
// time. The editButton_ is visible when the mouse is over the item and the
// emailField_ is visible otherwise.
NSTextField* emailField_;
NSButton* editButton_;
base::mac::ObjCPropertyReleaser propertyReleaser_;
}
@property(readonly, nonatomic) size_t menuIndex;
@property(assign, nonatomic) BOOL isHighlighted;
@property(retain, nonatomic) IBOutlet NSImageView* iconView;
@property(retain, nonatomic) IBOutlet NSImageView* activeView;
@property(retain, nonatomic) IBOutlet NSTextField* nameField;
@property(retain, nonatomic) IBOutlet NSTextField* emailField;
@property(retain, nonatomic) IBOutlet NSButton* editButton;
// Designated initializer.
- (id)initWithMenuIndex:(size_t)menuIndex
menuController:(AvatarMenuBubbleController*)controller;
// Actions that are forwarded to the |controller_|.
- (IBAction)switchToProfile:(id)sender;
- (IBAction)editProfile:(id)sender;
// Highlights the subviews appropriately for a given event type from the switch
// profile button.
- (void)highlightForEventType:(NSEventType)type;
@end
////////////////////////////////////////////////////////////////////////////////
// Simple button cell to get tracking and mouse events forwarded back to the
// view controller for changing highlight style of the item subviews. This is
// an invisible button that underlays most of the menu item and is responsible
// for performing the switch profile action.
@interface AvatarMenuItemView : NSView {
@private
// The controller that manages this.
// weak to not form a reference cycle with the controller.
__unsafe_unretained AvatarMenuItemController* viewController_;
// Used to highlight the background on hover.
ui::ScopedCrTrackingArea trackingArea_;
}
@property(assign, nonatomic) IBOutlet AvatarMenuItemController* viewController;
@end
////////////////////////////////////////////////////////////////////////////////
@interface AccessibilityIgnoredImageCell : NSImageCell
@end
@interface AccessibilityIgnoredTextFieldCell : NSTextFieldCell
@end
// Testing API /////////////////////////////////////////////////////////////////
@interface AvatarMenuBubbleController (ExposedForTesting)
- (id)initWithMenu:(AvatarMenu*)menu
parentWindow:(NSWindow*)parent
anchoredAt:(NSPoint)point;
- (void)performLayout;
- (NSMutableArray*)items;
@end
@interface AvatarMenuItemController (ExposedForTesting)
- (void)willStartAnimation:(NSAnimation*)animation;
@end
#endif // CHROME_BROWSER_UI_COCOA_PROFILES_AVATAR_MENU_BUBBLE_CONTROLLER_H_
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import "chrome/browser/ui/cocoa/profiles/avatar_menu_bubble_controller.h"
#include <memory>
#include "base/command_line.h"
#include "base/mac/scoped_nsobject.h"
#include "base/message_loop/message_pump_mac.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/profiles/avatar_menu.h"
#include "chrome/browser/profiles/avatar_menu_observer.h"
#import "chrome/browser/ui/cocoa/cocoa_test_helper.h"
#include "chrome/test/base/testing_browser_process.h"
#include "chrome/test/base/testing_profile_manager.h"
#include "components/signin/core/common/profile_management_switches.h"
#include "components/sync_preferences/pref_service_syncable.h"
#include "content/public/test/test_browser_thread_bundle.h"
#include "testing/gtest_mac.h"
#import "ui/base/cocoa/controls/hyperlink_button_cell.h"
#include "ui/events/test/cocoa_test_event_utils.h"
class AvatarMenuBubbleControllerTest : public CocoaTest {
public:
AvatarMenuBubbleControllerTest()
: manager_(TestingBrowserProcess::GetGlobal()) {
}
void SetUp() override {
CocoaTest::SetUp();
ASSERT_TRUE(manager_.SetUp());
manager_.CreateTestingProfile(
"test1", std::unique_ptr<sync_preferences::PrefServiceSyncable>(),
base::ASCIIToUTF16("Test 1"), 1, std::string(),
TestingProfile::TestingFactories());
manager_.CreateTestingProfile(
"test2", std::unique_ptr<sync_preferences::PrefServiceSyncable>(),
base::ASCIIToUTF16("Test 2"), 0, std::string(),
TestingProfile::TestingFactories());
menu_ = new AvatarMenu(manager_.profile_attributes_storage(), NULL, NULL);
menu_->RebuildMenu();
NSRect frame = [test_window() frame];
NSPoint point = NSMakePoint(NSMidX(frame), NSMidY(frame));
controller_ =
[[AvatarMenuBubbleController alloc] initWithMenu:menu()
parentWindow:test_window()
anchoredAt:point];
}
TestingProfileManager* manager() { return &manager_; }
AvatarMenuBubbleController* controller() { return controller_; }
AvatarMenu* menu() { return menu_; }
AvatarMenuItemController* GetHighlightedItem() {
for (AvatarMenuItemController* item in [controller() items]) {
if ([item isHighlighted])
return item;
}
return nil;
}
private:
content::TestBrowserThreadBundle thread_bundle_;
TestingProfileManager manager_;
// Weak; releases self.
AvatarMenuBubbleController* controller_;
// Weak; owned by |controller_|.
AvatarMenu* menu_;
};
TEST_F(AvatarMenuBubbleControllerTest, InitialLayout) {
[controller() showWindow:nil];
// Two profiles means two item views and the new button with separator.
NSView* contents = [[controller() window] contentView];
EXPECT_EQ(4U, [[contents subviews] count]);
// Loop over the items and match the viewController views to subviews.
NSMutableArray* subviews =
[NSMutableArray arrayWithArray:[contents subviews]];
for (AvatarMenuItemController* viewController in [controller() items]) {
for (NSView* subview in subviews) {
if ([viewController view] == subview) {
[subviews removeObject:subview];
break;
}
}
}
// The one remaining subview should be the new user button.
EXPECT_EQ(2U, [subviews count]);
BOOL hasButton = NO;
BOOL hasSeparator = NO;
for (NSView* subview in subviews) {
if ([subview isKindOfClass:[NSButton class]]) {
EXPECT_FALSE(hasButton);
hasButton = YES;
NSButton* button = static_cast<NSButton*>(subview);
EXPECT_EQ(@selector(newProfile:), [button action]);
EXPECT_EQ(controller(), [button target]);
EXPECT_TRUE([[button cell] isKindOfClass:[HyperlinkButtonCell class]]);
} else if ([subview isKindOfClass:[NSBox class]]) {
EXPECT_FALSE(hasSeparator);
hasSeparator = YES;
} else {
EXPECT_FALSE(subview) << "Unexpected subview: "
<< [[subview description] UTF8String];
}
}
[controller() close];
}
TEST_F(AvatarMenuBubbleControllerTest, PerformLayout) {
[controller() showWindow:nil];
NSView* contents = [[controller() window] contentView];
EXPECT_EQ(4U, [[contents subviews] count]);
base::scoped_nsobject<NSMutableArray> oldItems([[controller() items] copy]);
// Now create a new profile and notify the delegate.
manager()->CreateTestingProfile(
"test3", std::unique_ptr<sync_preferences::PrefServiceSyncable>(),
base::ASCIIToUTF16("Test 3"), 0, std::string(),
TestingProfile::TestingFactories());
// Testing the bridge is not worth the effort...
[controller() performLayout];
EXPECT_EQ(5U, [[contents subviews] count]);
// Make sure that none of the old items exit.
NSArray* newItems = [controller() items];
for (AvatarMenuItemController* oldVC in oldItems.get()) {
EXPECT_FALSE([newItems containsObject:oldVC]);
EXPECT_FALSE([[contents subviews] containsObject:[oldVC view]]);
}
[controller() close];
}
// This subclass is used to inject a delegate into the hide/show edit link
// animation.
@interface TestingAvatarMenuItemController : AvatarMenuItemController
<NSAnimationDelegate> {
@private
std::unique_ptr<base::MessagePumpNSRunLoop> pump_;
}
// After calling |-highlightForEventType:| an animation will possibly be
// started. Since the animation is non-blocking, the run loop will need to be
// spun (via the MessagePump) until the animation has finished.
- (void)runMessagePump;
@end
@implementation TestingAvatarMenuItemController
- (void)runMessagePump {
if (!pump_)
pump_.reset(new base::MessagePumpNSRunLoop);
pump_->Run(NULL);
}
- (void)willStartAnimation:(NSAnimation*)anim {
[anim setDelegate:self];
}
- (void)animationDidEnd:(NSAnimation*)anim {
[super animationDidEnd:anim];
pump_->Quit();
}
- (void)animationDidStop:(NSAnimation*)anim {
[super animationDidStop:anim];
FAIL() << "Animation stopped before it completed its run";
pump_->Quit();
}
- (void)sendHighlightMessageForMouseExited {
[self highlightForEventType:NSMouseExited];
// Quit the pump because the animation was cancelled before it even ran.
pump_->Quit();
}
@end
TEST_F(AvatarMenuBubbleControllerTest, HighlightForEventType) {
base::scoped_nsobject<TestingAvatarMenuItemController> item(
[[TestingAvatarMenuItemController alloc] initWithMenuIndex:0
menuController:nil]);
// Test non-active states first.
[[item activeView] setHidden:YES];
NSView* editButton = [item editButton];
NSView* emailField = [item emailField];
// The edit link remains hidden.
[item setIsHighlighted:YES];
EXPECT_TRUE(editButton.isHidden);
EXPECT_FALSE(emailField.isHidden);
[item setIsHighlighted:NO];
EXPECT_TRUE(editButton.isHidden);
EXPECT_FALSE(emailField.isHidden);
// Make the item "active" and re-test.
[[item activeView] setHidden:NO];
[item setIsHighlighted:YES];
[item runMessagePump];
EXPECT_FALSE(editButton.isHidden);
EXPECT_TRUE(emailField.isHidden);
[item setIsHighlighted:NO];
[item runMessagePump];
EXPECT_TRUE(editButton.isHidden);
EXPECT_FALSE(emailField.isHidden);
// Now mouse over and out quickly, as if scrubbing through the menu, to test
// the hover dwell delay.
[item highlightForEventType:NSMouseEntered];
[item performSelector:@selector(sendHighlightMessageForMouseExited)
withObject:nil
afterDelay:0];
[item runMessagePump];
EXPECT_TRUE(editButton.isHidden);
EXPECT_FALSE(emailField.isHidden);
}
TEST_F(AvatarMenuBubbleControllerTest, DownArrow) {
EXPECT_NSEQ(nil, GetHighlightedItem());
NSEvent* event =
cocoa_test_event_utils::KeyEventWithCharacter(NSDownArrowFunctionKey);
// Going down with no item selected should start the selection at the first
// item.
[controller() keyDown:event];
EXPECT_EQ([[controller() items] objectAtIndex:1], GetHighlightedItem());
[controller() keyDown:event];
EXPECT_EQ([[controller() items] objectAtIndex:0], GetHighlightedItem());
// There are no more items now so going down should stay at the last item.
[controller() keyDown:event];
EXPECT_EQ([[controller() items] objectAtIndex:0], GetHighlightedItem());
}
TEST_F(AvatarMenuBubbleControllerTest, UpArrow) {
EXPECT_NSEQ(nil, GetHighlightedItem());
NSEvent* event =
cocoa_test_event_utils::KeyEventWithCharacter(NSUpArrowFunctionKey);
// Going up with no item selected should start the selection at the last
// item.
[controller() keyDown:event];
EXPECT_EQ([[controller() items] objectAtIndex:0], GetHighlightedItem());
[controller() keyDown:event];
EXPECT_EQ([[controller() items] objectAtIndex:1], GetHighlightedItem());
// There are no more items now so going up should stay at the first item.
[controller() keyDown:event];
EXPECT_EQ([[controller() items] objectAtIndex:1], GetHighlightedItem());
}
...@@ -4605,7 +4605,6 @@ test("unit_tests") { ...@@ -4605,7 +4605,6 @@ test("unit_tests") {
"../browser/ui/cocoa/profiles/avatar_button_controller_unittest.mm", "../browser/ui/cocoa/profiles/avatar_button_controller_unittest.mm",
"../browser/ui/cocoa/profiles/avatar_button_unittest.mm", "../browser/ui/cocoa/profiles/avatar_button_unittest.mm",
"../browser/ui/cocoa/profiles/avatar_icon_controller_unittest.mm", "../browser/ui/cocoa/profiles/avatar_icon_controller_unittest.mm",
"../browser/ui/cocoa/profiles/avatar_menu_bubble_controller_unittest.mm",
"../browser/ui/cocoa/profiles/profile_chooser_controller_unittest.mm", "../browser/ui/cocoa/profiles/profile_chooser_controller_unittest.mm",
"../browser/ui/cocoa/profiles/profile_menu_controller_unittest.mm", "../browser/ui/cocoa/profiles/profile_menu_controller_unittest.mm",
"../browser/ui/cocoa/profiles/user_manager_mac_unittest.mm", "../browser/ui/cocoa/profiles/user_manager_mac_unittest.mm",
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment