• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/automation/testing_automation_provider.h"
6
7#import <Cocoa/Cocoa.h>
8
9#include "ui/base/l10n/l10n_util.h"
10#include "base/logging.h"
11#include "base/sys_string_conversions.h"
12#include "chrome/browser/automation/automation_browser_tracker.h"
13#include "chrome/browser/automation/automation_window_tracker.h"
14#import "chrome/browser/ui/cocoa/browser_window_controller.h"
15#include "chrome/browser/ui/cocoa/tabs/tab_window_controller.h"
16#include "chrome/browser/ui/view_ids.h"
17#include "grit/generated_resources.h"
18#include "ui/base/l10n/l10n_util_mac.h"
19
20void TestingAutomationProvider::ActivateWindow(int handle) {
21  NOTIMPLEMENTED();
22}
23
24void TestingAutomationProvider::IsWindowMaximized(int handle,
25                                                  bool* is_maximized,
26                                                  bool* success) {
27  *success = false;
28  NSWindow* window = window_tracker_->GetResource(handle);
29  if (!window)
30    return;
31  *is_maximized = [window isZoomed];
32  *success = true;
33}
34
35void TestingAutomationProvider::TerminateSession(int handle, bool* success) {
36  *success = false;
37  NOTIMPLEMENTED();
38}
39
40void TestingAutomationProvider::WindowGetViewBounds(int handle,
41                                                    int view_id,
42                                                    bool screen_coordinates,
43                                                    bool* success,
44                                                    gfx::Rect* bounds) {
45  *success = false;
46
47  // At the moment we hard code the view ID used by WebDriver and do
48  // not support arbitrary view IDs.  suzhe is working on general view
49  // ID support for the Mac.
50  if (view_id != VIEW_ID_TAB_CONTAINER) {
51    NOTIMPLEMENTED();
52    return;
53  }
54
55  NSWindow* window = window_tracker_->GetResource(handle);
56  if (!window)
57    return;
58
59  BrowserWindowController* controller = [window windowController];
60  DCHECK([controller isKindOfClass:[BrowserWindowController class]]);
61  if (![controller isKindOfClass:[BrowserWindowController class]])
62    return;
63  NSView* tab =
64      [[[controller tabStripController] activeTabContentsController] view];
65  if (!tab)
66    return;
67
68  NSRect rect = [tab convertRectToBase:[tab bounds]];
69  // The origin of the bounding box should be the top left of the tab contents,
70  // not bottom left, to match other platforms.
71  rect.origin.y += rect.size.height;
72  CGFloat coord_sys_height;
73  if (screen_coordinates && [[NSScreen screens] count] > 0) {
74    rect.origin = [window convertBaseToScreen:rect.origin];
75    coord_sys_height =
76        [[[NSScreen screens] objectAtIndex:0] frame].size.height;
77  } else {
78    coord_sys_height = [window frame].size.height;
79  }
80  // Flip coordinate system.
81  rect.origin.y = coord_sys_height - rect.origin.y;
82  *bounds = gfx::Rect(NSRectToCGRect(rect));
83  *success = true;
84}
85
86void TestingAutomationProvider::GetWindowBounds(int handle,
87                                                gfx::Rect* bounds,
88                                                bool* success) {
89  *success = false;
90  NSWindow* window = window_tracker_->GetResource(handle);
91  if (window) {
92    // Move rect to reflect flipped coordinate system.
93    if ([[NSScreen screens] count] > 0) {
94      NSRect rect = [window frame];
95      rect.origin.y =
96          [[[NSScreen screens] objectAtIndex:0] frame].size.height -
97              rect.origin.y - rect.size.height;
98      *bounds = gfx::Rect(NSRectToCGRect(rect));
99      *success = true;
100    }
101  }
102}
103
104void TestingAutomationProvider::SetWindowBounds(int handle,
105                                                const gfx::Rect& bounds,
106                                                bool* success) {
107  *success = false;
108  NSWindow* window = window_tracker_->GetResource(handle);
109  if (window) {
110    NSRect new_bounds = NSRectFromCGRect(bounds.ToCGRect());
111
112    if ([[NSScreen screens] count] > 0) {
113      new_bounds.origin.y =
114          [[[NSScreen screens] objectAtIndex:0] frame].size.height -
115          new_bounds.origin.y - new_bounds.size.height;
116    }
117
118    [window setFrame:new_bounds display:NO];
119    *success = true;
120  }
121}
122
123void TestingAutomationProvider::SetWindowVisible(int handle,
124                                                 bool visible,
125                                                 bool* result) {
126  *result = false;
127  NSWindow* window = window_tracker_->GetResource(handle);
128  if (window) {
129    if (visible) {
130      [window orderFront:nil];
131    } else {
132      [window orderOut:nil];
133    }
134    *result = true;
135  }
136}
137
138void TestingAutomationProvider::GetWindowTitle(int handle, string16* text) {
139  gfx::NativeWindow window = window_tracker_->GetResource(handle);
140  NSString* title = nil;
141  if ([[window delegate] isKindOfClass:[TabWindowController class]]) {
142    TabWindowController* delegate =
143        reinterpret_cast<TabWindowController*>([window delegate]);
144    title = [delegate selectedTabTitle];
145  } else {
146    title = [window title];
147  }
148  // If we don't yet have a title, use "Untitled".
149  if (![title length]) {
150    text->assign(l10n_util::GetStringUTF16(
151        IDS_BROWSER_WINDOW_MAC_TAB_UNTITLED));
152    return;
153  }
154
155  text->assign(base::SysNSStringToUTF16(title));
156}
157