monitor_finder_mac.mm revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
1// Copyright 2014 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/renderer_host/pepper/monitor_finder_mac.h"
6
7#import <Cocoa/Cocoa.h>
8
9#include "content/public/browser/browser_thread.h"
10#include "content/public/browser/render_frame_host.h"
11
12namespace chrome {
13
14MonitorFinder::MonitorFinder(int process_id, int render_frame_id)
15    : process_id_(process_id),
16      render_frame_id_(render_frame_id),
17      request_sent_(false),
18      display_id_(kCGNullDirectDisplay) {
19}
20
21MonitorFinder::~MonitorFinder() {
22}
23
24int64_t MonitorFinder::GetMonitor() {
25  {
26    // The plugin may call this method several times, so avoid spamming the UI
27    // thread with requests by only allowing one outstanding request at a time.
28    base::AutoLock lock(mutex_);
29    if (request_sent_)
30      return display_id_;
31    request_sent_ = true;
32  }
33
34  content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE,
35       base::Bind(&MonitorFinder::FetchMonitorFromWidget, this));
36  return display_id_;
37}
38
39// static
40bool MonitorFinder::IsMonitorBuiltIn(int64_t display_id) {
41  return CGDisplayIsBuiltin(display_id);
42}
43
44void MonitorFinder::FetchMonitorFromWidget() {
45  DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
46  content::RenderFrameHost* rfh =
47      content::RenderFrameHost::FromID(process_id_, render_frame_id_);
48  if (!rfh)
49    return;
50
51  gfx::NativeView native_view = rfh->GetNativeView();
52  NSWindow* window = [native_view window];
53  NSScreen* screen = [window screen];
54  CGDirectDisplayID display_id =
55      [[[screen deviceDescription] objectForKey:@"NSScreenNumber"] intValue];
56
57  base::AutoLock lock(mutex_);
58  request_sent_ = false;
59  display_id_ = display_id;
60}
61
62}  // namespace chrome
63