From c30f458d4fb17655a86a8177d78b84c33dc6aa32 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Tue, 15 Sep 2015 11:04:46 +0800 Subject: [PATCH] Add IsDevToolsViewFocused method --- .../browser/inspectable_web_contents_view.h | 1 + .../inspectable_web_contents_view_mac.h | 1 + .../inspectable_web_contents_view_mac.mm | 4 ++ .../mac/bry_inspectable_web_contents_view.h | 2 + .../mac/bry_inspectable_web_contents_view.mm | 38 +++++++++++++++++++ .../inspectable_web_contents_view_views.cc | 7 ++++ .../inspectable_web_contents_view_views.h | 1 + 7 files changed, 54 insertions(+) diff --git a/brightray/browser/inspectable_web_contents_view.h b/brightray/browser/inspectable_web_contents_view.h index 469677a1ae..2fabf5d2ba 100644 --- a/brightray/browser/inspectable_web_contents_view.h +++ b/brightray/browser/inspectable_web_contents_view.h @@ -44,6 +44,7 @@ class InspectableWebContentsView { // Hide the DevTools view. virtual void CloseDevTools() = 0; virtual bool IsDevToolsViewShowing() = 0; + virtual bool IsDevToolsViewFocused() = 0; virtual void SetIsDocked(bool docked) = 0; virtual void SetContentsResizingStrategy( const DevToolsContentsResizingStrategy& strategy) = 0; diff --git a/brightray/browser/inspectable_web_contents_view_mac.h b/brightray/browser/inspectable_web_contents_view_mac.h index 0dbb7beb82..e7ad57fbee 100644 --- a/brightray/browser/inspectable_web_contents_view_mac.h +++ b/brightray/browser/inspectable_web_contents_view_mac.h @@ -21,6 +21,7 @@ class InspectableWebContentsViewMac : public InspectableWebContentsView { void ShowDevTools() override; void CloseDevTools() override; bool IsDevToolsViewShowing() override; + bool IsDevToolsViewFocused() override; void SetIsDocked(bool docked) override; void SetContentsResizingStrategy( const DevToolsContentsResizingStrategy& strategy) override; diff --git a/brightray/browser/inspectable_web_contents_view_mac.mm b/brightray/browser/inspectable_web_contents_view_mac.mm index 42ca3c6f3a..7d61fb0b7a 100644 --- a/brightray/browser/inspectable_web_contents_view_mac.mm +++ b/brightray/browser/inspectable_web_contents_view_mac.mm @@ -42,6 +42,10 @@ bool InspectableWebContentsViewMac::IsDevToolsViewShowing() { return [view_ isDevToolsVisible]; } +bool InspectableWebContentsViewMac::IsDevToolsViewFocused() { + return [view_ isDevToolsFocused]; +} + void InspectableWebContentsViewMac::SetIsDocked(bool docked) { [view_ setIsDocked:docked]; } diff --git a/brightray/browser/mac/bry_inspectable_web_contents_view.h b/brightray/browser/mac/bry_inspectable_web_contents_view.h index 3b72aba08c..7d8556973a 100644 --- a/brightray/browser/mac/bry_inspectable_web_contents_view.h +++ b/brightray/browser/mac/bry_inspectable_web_contents_view.h @@ -18,6 +18,7 @@ using brightray::InspectableWebContentsViewMac; base::scoped_nsobject devtools_window_; BOOL devtools_visible_; BOOL devtools_docked_; + BOOL devtools_is_first_responder_; DevToolsContentsResizingStrategy strategy_; } @@ -25,6 +26,7 @@ using brightray::InspectableWebContentsViewMac; - (instancetype)initWithInspectableWebContentsViewMac:(InspectableWebContentsViewMac*)view; - (void)setDevToolsVisible:(BOOL)visible; - (BOOL)isDevToolsVisible; +- (BOOL)isDevToolsFocused; - (void)setIsDocked:(BOOL)docked; - (void)setContentsResizingStrategy:(const DevToolsContentsResizingStrategy&)strategy; - (void)setTitle:(NSString*)title; diff --git a/brightray/browser/mac/bry_inspectable_web_contents_view.mm b/brightray/browser/mac/bry_inspectable_web_contents_view.mm index 1bb84e5abb..dd40f1e259 100644 --- a/brightray/browser/mac/bry_inspectable_web_contents_view.mm +++ b/brightray/browser/mac/bry_inspectable_web_contents_view.mm @@ -19,6 +19,13 @@ using namespace brightray; inspectableWebContentsView_ = view; devtools_visible_ = NO; devtools_docked_ = NO; + devtools_is_first_responder_ = NO; + + [[NSNotificationCenter defaultCenter] + addObserver:self + selector:@selector(viewDidBecomeFirstResponder:) + name:kViewDidBecomeFirstResponder + object:nil]; auto contents = inspectableWebContentsView_->inspectable_web_contents()->GetWebContents(); auto contentsView = contents->GetNativeView(); @@ -86,6 +93,14 @@ using namespace brightray; return devtools_visible_; } +- (BOOL)isDevToolsFocused { + if (devtools_docked_) { + return [[self window] isKeyWindow] && devtools_is_first_responder_; + } else { + return [devtools_window_ isKeyWindow]; + } +} + - (void)setIsDocked:(BOOL)docked { // Revert to no-devtools state. [self setDevToolsVisible:NO]; @@ -156,6 +171,29 @@ using namespace brightray; [devtools_window_ setTitle:title]; } +- (void)viewDidBecomeFirstResponder:(NSNotification*)notification { + auto inspectable_web_contents = inspectableWebContentsView_->inspectable_web_contents(); + if (!inspectable_web_contents) + return; + auto webContents = inspectable_web_contents->GetWebContents(); + auto webContentsView = webContents->GetNativeView(); + + NSView* view = [notification object]; + if ([[webContentsView subviews] containsObject:view]) { + devtools_is_first_responder_ = NO; + return; + } + + auto devToolsWebContents = inspectable_web_contents->GetDevToolsWebContents(); + if (!devToolsWebContents) + return; + auto devToolsView = devToolsWebContents->GetNativeView(); + + if ([[devToolsView subviews] containsObject:view]) { + devtools_is_first_responder_ = YES; + } +} + #pragma mark - NSWindowDelegate - (void)windowWillClose:(NSNotification*)notification { diff --git a/brightray/browser/views/inspectable_web_contents_view_views.cc b/brightray/browser/views/inspectable_web_contents_view_views.cc index 6a7dd75aa6..79fcc10379 100644 --- a/brightray/browser/views/inspectable_web_contents_view_views.cc +++ b/brightray/browser/views/inspectable_web_contents_view_views.cc @@ -145,6 +145,13 @@ bool InspectableWebContentsViewViews::IsDevToolsViewShowing() { return devtools_visible_; } +bool InspectableWebContentsViewViews::IsDevToolsViewFocused() { + if (devtools_web_view_) + return devtools_web_view_->HasFocus(); + else + return false; +} + void InspectableWebContentsViewViews::SetIsDocked(bool docked) { CloseDevTools(); diff --git a/brightray/browser/views/inspectable_web_contents_view_views.h b/brightray/browser/views/inspectable_web_contents_view_views.h index a6c3ae62f8..bcdbdb9518 100644 --- a/brightray/browser/views/inspectable_web_contents_view_views.h +++ b/brightray/browser/views/inspectable_web_contents_view_views.h @@ -37,6 +37,7 @@ class InspectableWebContentsViewViews : public InspectableWebContentsView, void ShowDevTools() override; void CloseDevTools() override; bool IsDevToolsViewShowing() override; + bool IsDevToolsViewFocused() override; void SetIsDocked(bool docked) override; void SetContentsResizingStrategy( const DevToolsContentsResizingStrategy& strategy) override;