Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(522)

Side by Side Diff: chrome/browser/ui/autofill/popup_controller_common.cc

Issue 2762233004: Fix autofill popup controller key press callback registration (Closed)
Patch Set: Address comments Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/ui/autofill/popup_controller_common.h" 5 #include "chrome/browser/ui/autofill/popup_controller_common.h"
6 6
7 #include "content/public/browser/render_view_host.h" 7 #include "content/public/browser/render_frame_host.h"
8 #include "content/public/browser/render_widget_host_view.h"
8 #include "content/public/browser/web_contents.h" 9 #include "content/public/browser/web_contents.h"
9 10
10 namespace autofill { 11 namespace autofill {
11 12
13 namespace {
14
15 // Returns the RenderWidgetHost which should be currently consuming keyboard
16 // events in |web_contents|. Can return null if there is no such
17 // RenderWidgetHost.
18 content::RenderWidgetHost* KeyPressHandlingTarget(
19 content::WebContents* web_contents) {
20 content::RenderFrameHost* frame = web_contents->GetFocusedFrame();
21 if (!frame)
22 frame = web_contents->GetMainFrame();
23 content::RenderWidgetHostView* view = frame->GetView();
24 if (!view)
25 return nullptr;
26 return view->GetRenderWidgetHost();
27 }
28
29 } // namespace
30
12 PopupControllerCommon::PopupControllerCommon( 31 PopupControllerCommon::PopupControllerCommon(
13 const gfx::RectF& element_bounds, 32 const gfx::RectF& element_bounds,
14 base::i18n::TextDirection text_direction, 33 base::i18n::TextDirection text_direction,
15 const gfx::NativeView container_view, 34 const gfx::NativeView container_view,
16 content::WebContents* web_contents) 35 content::WebContents* web_contents)
17 : element_bounds_(element_bounds), 36 : element_bounds_(element_bounds),
18 text_direction_(text_direction), 37 text_direction_(text_direction),
19 container_view_(container_view), 38 container_view_(container_view),
20 web_contents_(web_contents), 39 web_contents_(web_contents),
21 key_press_event_target_(NULL) { 40 key_press_event_target_(NULL) {
22 } 41 }
23 PopupControllerCommon::~PopupControllerCommon() {} 42 PopupControllerCommon::~PopupControllerCommon() {}
24 43
25 void PopupControllerCommon::SetKeyPressCallback( 44 void PopupControllerCommon::SetKeyPressCallback(
26 content::RenderWidgetHost::KeyPressEventCallback callback) { 45 content::RenderWidgetHost::KeyPressEventCallback callback) {
27 DCHECK(key_press_event_callback_.is_null()); 46 DCHECK(key_press_event_callback_.is_null());
28 key_press_event_callback_ = callback; 47 key_press_event_callback_ = callback;
29 } 48 }
30 49
31 void PopupControllerCommon::RegisterKeyPressCallback() { 50 void PopupControllerCommon::RegisterKeyPressCallback() {
32 if (web_contents_ && !key_press_event_target_) { 51 if (web_contents_ && !key_press_event_target_) {
33 key_press_event_target_ = web_contents_->GetRenderViewHost(); 52 key_press_event_target_ = KeyPressHandlingTarget(web_contents_);
EhsanK 2017/03/27 19:35:09 I think both here and below for RemoveKeyPressCall
34 key_press_event_target_->GetWidget()->AddKeyPressEventCallback( 53 key_press_event_target_->AddKeyPressEventCallback(
35 key_press_event_callback_); 54 key_press_event_callback_);
36 } 55 }
37 } 56 }
38 57
39 void PopupControllerCommon::RemoveKeyPressCallback() { 58 void PopupControllerCommon::RemoveKeyPressCallback() {
40 if (web_contents_ && (!web_contents_->IsBeingDestroyed()) && 59 if (web_contents_ && (!web_contents_->IsBeingDestroyed()) &&
41 key_press_event_target_ == web_contents_->GetRenderViewHost()) { 60 key_press_event_target_ == KeyPressHandlingTarget(web_contents_)) {
42 web_contents_->GetRenderViewHost() 61 key_press_event_target_->RemoveKeyPressEventCallback(
EhsanK 2017/03/27 19:35:09 There seems to be a memory leak, i.e., callbacks w
vabr (Chromium) 2017/03/27 20:28:53 The idea to use |key_press_event_target_| seems in
43 ->GetWidget() 62 key_press_event_callback_);
44 ->RemoveKeyPressEventCallback(key_press_event_callback_);
45 } 63 }
46 key_press_event_target_ = NULL; 64 key_press_event_target_ = NULL;
47 } 65 }
48 66
49 } // namespace autofill 67 } // namespace autofill
OLDNEW
« no previous file with comments | « chrome/browser/ui/autofill/popup_controller_common.h ('k') | chrome/test/data/autofill/cross_origin_iframe.html » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698