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

Side by Side Diff: chrome/browser/devtools/devtools_window.cc

Issue 371363005: [DevTools] Add explicit closing state in DevToolsWindow life time. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 5 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 | Annotate | Revision Log
« no previous file with comments | « chrome/browser/devtools/devtools_window.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/devtools/devtools_window.h" 5 #include "chrome/browser/devtools/devtools_window.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/json/json_reader.h" 9 #include "base/json/json_reader.h"
10 #include "base/metrics/histogram.h" 10 #include "base/metrics/histogram.h"
(...skipping 345 matching lines...) Expand 10 before | Expand all | Expand 10 after
356 prefs::kDevToolsPortForwardingConfig, 356 prefs::kDevToolsPortForwardingConfig,
357 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 357 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
358 } 358 }
359 359
360 // static 360 // static
361 content::WebContents* DevToolsWindow::GetInTabWebContents( 361 content::WebContents* DevToolsWindow::GetInTabWebContents(
362 WebContents* inspected_web_contents, 362 WebContents* inspected_web_contents,
363 DevToolsContentsResizingStrategy* out_strategy) { 363 DevToolsContentsResizingStrategy* out_strategy) {
364 DevToolsWindow* window = GetInstanceForInspectedWebContents( 364 DevToolsWindow* window = GetInstanceForInspectedWebContents(
365 inspected_web_contents); 365 inspected_web_contents);
366 if (!window) 366 if (!window || window->life_stage_ == kClosing)
367 return NULL; 367 return NULL;
368 368
369 // Not yet loaded window is treated as docked, but we should not present it 369 // Not yet loaded window is treated as docked, but we should not present it
370 // until we decided on docking. 370 // until we decided on docking.
371 bool is_docked_set = window->load_state_ == kLoadCompleted || 371 bool is_docked_set = window->life_stage_ == kLoadCompleted ||
372 window->load_state_ == kIsDockedSet; 372 window->life_stage_ == kIsDockedSet;
373 if (!is_docked_set) 373 if (!is_docked_set)
374 return NULL; 374 return NULL;
375 375
376 // Undocked window should have toolbox web contents. 376 // Undocked window should have toolbox web contents.
377 if (!window->is_docked_ && !window->toolbox_web_contents_) 377 if (!window->is_docked_ && !window->toolbox_web_contents_)
378 return NULL; 378 return NULL;
379 379
380 if (out_strategy) 380 if (out_strategy)
381 out_strategy->CopyFrom(window->contents_resizing_strategy_); 381 out_strategy->CopyFrom(window->contents_resizing_strategy_);
382 382
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
532 bool should_measure_time = FindDevToolsWindow(agent.get()) == NULL; 532 bool should_measure_time = FindDevToolsWindow(agent.get()) == NULL;
533 base::TimeTicks start_time = base::TimeTicks::Now(); 533 base::TimeTicks start_time = base::TimeTicks::Now();
534 // TODO(loislo): we should initiate DevTools window opening from within 534 // TODO(loislo): we should initiate DevTools window opening from within
535 // renderer. Otherwise, we still can hit a race condition here. 535 // renderer. Otherwise, we still can hit a race condition here.
536 DevToolsWindow* window = OpenDevToolsWindow(inspected_rvh); 536 DevToolsWindow* window = OpenDevToolsWindow(inspected_rvh);
537 if (should_measure_time) 537 if (should_measure_time)
538 window->inspect_element_start_time_ = start_time; 538 window->inspect_element_start_time_ = start_time;
539 } 539 }
540 540
541 void DevToolsWindow::ScheduleShow(const DevToolsToggleAction& action) { 541 void DevToolsWindow::ScheduleShow(const DevToolsToggleAction& action) {
542 if (load_state_ == kLoadCompleted) { 542 if (life_stage_ == kLoadCompleted) {
543 Show(action); 543 Show(action);
544 return; 544 return;
545 } 545 }
546 546
547 // Action will be done only after load completed. 547 // Action will be done only after load completed.
548 action_on_load_ = action; 548 action_on_load_ = action;
549 549
550 if (!can_dock_) { 550 if (!can_dock_) {
551 // No harm to show always-undocked window right away. 551 // No harm to show always-undocked window right away.
552 is_docked_ = false; 552 is_docked_ = false;
553 Show(DevToolsToggleAction::Show()); 553 Show(DevToolsToggleAction::Show());
554 } 554 }
555 } 555 }
556 556
557 void DevToolsWindow::Show(const DevToolsToggleAction& action) { 557 void DevToolsWindow::Show(const DevToolsToggleAction& action) {
558 if (life_stage_ == kClosing)
559 return;
560
558 if (action.type() == DevToolsToggleAction::kNoOp) 561 if (action.type() == DevToolsToggleAction::kNoOp)
559 return; 562 return;
560 563
561 if (is_docked_) { 564 if (is_docked_) {
562 DCHECK(can_dock_); 565 DCHECK(can_dock_);
563 Browser* inspected_browser = NULL; 566 Browser* inspected_browser = NULL;
564 int inspected_tab_index = -1; 567 int inspected_tab_index = -1;
565 FindInspectedBrowserAndTabIndex(GetInspectedWebContents(), 568 FindInspectedBrowserAndTabIndex(GetInspectedWebContents(),
566 &inspected_browser, 569 &inspected_browser,
567 &inspected_tab_index); 570 &inspected_tab_index);
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
622 } 625 }
623 626
624 // static 627 // static
625 bool DevToolsWindow::InterceptPageBeforeUnload(WebContents* contents) { 628 bool DevToolsWindow::InterceptPageBeforeUnload(WebContents* contents) {
626 DevToolsWindow* window = 629 DevToolsWindow* window =
627 DevToolsWindow::GetInstanceForInspectedWebContents(contents); 630 DevToolsWindow::GetInstanceForInspectedWebContents(contents);
628 if (!window || window->intercepted_page_beforeunload_) 631 if (!window || window->intercepted_page_beforeunload_)
629 return false; 632 return false;
630 633
631 // Not yet loaded frontend will not handle beforeunload. 634 // Not yet loaded frontend will not handle beforeunload.
632 if (window->load_state_ != kLoadCompleted) 635 if (window->life_stage_ != kLoadCompleted)
633 return false; 636 return false;
634 637
635 window->intercepted_page_beforeunload_ = true; 638 window->intercepted_page_beforeunload_ = true;
636 // Handle case of devtools inspecting another devtools instance by passing 639 // Handle case of devtools inspecting another devtools instance by passing
637 // the call up to the inspecting devtools instance. 640 // the call up to the inspecting devtools instance.
638 if (!DevToolsWindow::InterceptPageBeforeUnload(window->main_web_contents_)) { 641 if (!DevToolsWindow::InterceptPageBeforeUnload(window->main_web_contents_)) {
639 window->main_web_contents_->DispatchBeforeUnload(false); 642 window->main_web_contents_->DispatchBeforeUnload(false);
640 } 643 }
641 return true; 644 return true;
642 } 645 }
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
685 main_web_contents_( 688 main_web_contents_(
686 WebContents::Create(WebContents::CreateParams(profile))), 689 WebContents::Create(WebContents::CreateParams(profile))),
687 toolbox_web_contents_(NULL), 690 toolbox_web_contents_(NULL),
688 bindings_(NULL), 691 bindings_(NULL),
689 browser_(NULL), 692 browser_(NULL),
690 is_docked_(true), 693 is_docked_(true),
691 can_dock_(can_dock), 694 can_dock_(can_dock),
692 // This initialization allows external front-end to work without changes. 695 // This initialization allows external front-end to work without changes.
693 // We don't wait for docking call, but instead immediately show undocked. 696 // We don't wait for docking call, but instead immediately show undocked.
694 // Passing "dockSide=undocked" parameter ensures proper UI. 697 // Passing "dockSide=undocked" parameter ensures proper UI.
695 load_state_(can_dock ? kNotLoaded : kIsDockedSet), 698 life_stage_(can_dock ? kNotLoaded : kIsDockedSet),
696 action_on_load_(DevToolsToggleAction::NoOp()), 699 action_on_load_(DevToolsToggleAction::NoOp()),
697 ignore_set_is_docked_(false), 700 ignore_set_is_docked_(false),
698 intercepted_page_beforeunload_(false) { 701 intercepted_page_beforeunload_(false) {
699 // Set up delegate, so we get fully-functional window immediately. 702 // Set up delegate, so we get fully-functional window immediately.
700 // It will not appear in UI though until |load_state_ == kLoadCompleted|. 703 // It will not appear in UI though until |life_stage_ == kLoadCompleted|.
701 main_web_contents_->SetDelegate(this); 704 main_web_contents_->SetDelegate(this);
702 bindings_ = new DevToolsUIBindings( 705 bindings_ = new DevToolsUIBindings(
703 main_web_contents_, 706 main_web_contents_,
704 DevToolsUIBindings::ApplyThemeToURL(profile, url)); 707 DevToolsUIBindings::ApplyThemeToURL(profile, url));
705 // Bindings take ownership over devtools as its delegate. 708 // Bindings take ownership over devtools as its delegate.
706 bindings_->SetDelegate(this); 709 bindings_->SetDelegate(this);
707 710
708 g_instances.Get().push_back(this); 711 g_instances.Get().push_back(this);
709 712
710 // There is no inspected_rvh in case of shared workers. 713 // There is no inspected_rvh in case of shared workers.
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
864 WebContents* new_contents) { 867 WebContents* new_contents) {
865 if (target_url.SchemeIs(content::kChromeDevToolsScheme) && 868 if (target_url.SchemeIs(content::kChromeDevToolsScheme) &&
866 target_url.query().find("toolbox=true") != std::string::npos) { 869 target_url.query().find("toolbox=true") != std::string::npos) {
867 CHECK(can_dock_); 870 CHECK(can_dock_);
868 toolbox_web_contents_ = new_contents; 871 toolbox_web_contents_ = new_contents;
869 } 872 }
870 } 873 }
871 874
872 void DevToolsWindow::CloseContents(WebContents* source) { 875 void DevToolsWindow::CloseContents(WebContents* source) {
873 CHECK(is_docked_); 876 CHECK(is_docked_);
874 // Do this first so that when GetDockedInstanceForInspectedTab is called 877 life_stage_ = kClosing;
875 // from UpdateDevTools it won't return this instance
876 // see crbug.com/372504
877 content::DevToolsManager::GetInstance()->ClientHostClosing(
878 bindings_->frontend_host());
879 // This will prevent any activity after frontend is loaded.
880 action_on_load_ = DevToolsToggleAction::NoOp();
881 ignore_set_is_docked_ = true;
882 UpdateBrowserWindow(); 878 UpdateBrowserWindow();
883 // In case of docked main_web_contents_, we own it so delete here. 879 // In case of docked main_web_contents_, we own it so delete here.
884 // Embedding DevTools window will be deleted as a result of 880 // Embedding DevTools window will be deleted as a result of
885 // DevToolsUIBindings destruction. 881 // DevToolsUIBindings destruction.
886 delete main_web_contents_; 882 delete main_web_contents_;
887 } 883 }
888 884
889 void DevToolsWindow::ContentsZoomChange(bool zoom_in) { 885 void DevToolsWindow::ContentsZoomChange(bool zoom_in) {
890 DCHECK(is_docked_); 886 DCHECK(is_docked_);
891 chrome_page_zoom::Zoom(main_web_contents_, 887 chrome_page_zoom::Zoom(main_web_contents_,
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
980 976
981 void DevToolsWindow::ActivateWindow() { 977 void DevToolsWindow::ActivateWindow() {
982 if (is_docked_ && GetInspectedBrowserWindow()) 978 if (is_docked_ && GetInspectedBrowserWindow())
983 main_web_contents_->Focus(); 979 main_web_contents_->Focus();
984 else if (!is_docked_ && !browser_->window()->IsActive()) 980 else if (!is_docked_ && !browser_->window()->IsActive())
985 browser_->window()->Activate(); 981 browser_->window()->Activate();
986 } 982 }
987 983
988 void DevToolsWindow::CloseWindow() { 984 void DevToolsWindow::CloseWindow() {
989 DCHECK(is_docked_); 985 DCHECK(is_docked_);
990 // This will prevent any activity after frontend is loaded. 986 life_stage_ = kClosing;
991 action_on_load_ = DevToolsToggleAction::NoOp();
992 ignore_set_is_docked_ = true;
993 main_web_contents_->DispatchBeforeUnload(false); 987 main_web_contents_->DispatchBeforeUnload(false);
994 } 988 }
995 989
996 void DevToolsWindow::SetInspectedPageBounds(const gfx::Rect& rect) { 990 void DevToolsWindow::SetInspectedPageBounds(const gfx::Rect& rect) {
997 DevToolsContentsResizingStrategy strategy(rect); 991 DevToolsContentsResizingStrategy strategy(rect);
998 if (contents_resizing_strategy_.Equals(strategy)) 992 if (contents_resizing_strategy_.Equals(strategy))
999 return; 993 return;
1000 994
1001 contents_resizing_strategy_.CopyFrom(strategy); 995 contents_resizing_strategy_.CopyFrom(strategy);
1002 UpdateBrowserWindow(); 996 UpdateBrowserWindow();
(...skipping 20 matching lines...) Expand all
1023 void DevToolsWindow::MoveWindow(int x, int y) { 1017 void DevToolsWindow::MoveWindow(int x, int y) {
1024 if (!is_docked_) { 1018 if (!is_docked_) {
1025 gfx::Rect bounds = browser_->window()->GetBounds(); 1019 gfx::Rect bounds = browser_->window()->GetBounds();
1026 bounds.Offset(x, y); 1020 bounds.Offset(x, y);
1027 browser_->window()->SetBounds(bounds); 1021 browser_->window()->SetBounds(bounds);
1028 } 1022 }
1029 } 1023 }
1030 1024
1031 void DevToolsWindow::SetIsDockedAndShowImmediatelyForTest(bool is_docked) { 1025 void DevToolsWindow::SetIsDockedAndShowImmediatelyForTest(bool is_docked) {
1032 DCHECK(!is_docked || can_dock_); 1026 DCHECK(!is_docked || can_dock_);
1033 if (load_state_ == kLoadCompleted) { 1027 DCHECK(life_stage_ != kClosing);
1028 if (life_stage_ == kLoadCompleted) {
1034 SetIsDocked(is_docked); 1029 SetIsDocked(is_docked);
1035 } else { 1030 } else {
1036 is_docked_ = is_docked; 1031 is_docked_ = is_docked;
1037 // Load is completed when both kIsDockedSet and kOnLoadFired happened. 1032 // Load is completed when both kIsDockedSet and kOnLoadFired happened.
1038 // Note that kIsDockedSet may be already set when can_dock_ is false. 1033 // Note that kIsDockedSet may be already set when can_dock_ is false.
1039 load_state_ = load_state_ == kOnLoadFired ? kLoadCompleted : kIsDockedSet; 1034 life_stage_ = life_stage_ == kOnLoadFired ? kLoadCompleted : kIsDockedSet;
1040 // Note that action_on_load_ will be performed after the load is actually 1035 // Note that action_on_load_ will be performed after the load is actually
1041 // completed. For now, just show the window. 1036 // completed. For now, just show the window.
1042 Show(DevToolsToggleAction::Show()); 1037 Show(DevToolsToggleAction::Show());
1043 if (load_state_ == kLoadCompleted) 1038 if (life_stage_ == kLoadCompleted)
1044 LoadCompleted(); 1039 LoadCompleted();
1045 } 1040 }
1046 ignore_set_is_docked_ = true; 1041 ignore_set_is_docked_ = true;
1047 } 1042 }
1048 1043
1049 void DevToolsWindow::SetIsDocked(bool dock_requested) { 1044 void DevToolsWindow::SetIsDocked(bool dock_requested) {
1050 if (ignore_set_is_docked_) 1045 if (ignore_set_is_docked_ || life_stage_ == kClosing)
1051 return; 1046 return;
1052 1047
1053 DCHECK(can_dock_ || !dock_requested); 1048 DCHECK(can_dock_ || !dock_requested);
1054 if (!can_dock_) 1049 if (!can_dock_)
1055 dock_requested = false; 1050 dock_requested = false;
1056 1051
1057 bool was_docked = is_docked_; 1052 bool was_docked = is_docked_;
1058 is_docked_ = dock_requested; 1053 is_docked_ = dock_requested;
1059 1054
1060 if (load_state_ != kLoadCompleted) { 1055 if (life_stage_ != kLoadCompleted) {
1061 // This is a first time call we waited for to initialize. 1056 // This is a first time call we waited for to initialize.
1062 load_state_ = load_state_ == kOnLoadFired ? kLoadCompleted : kIsDockedSet; 1057 life_stage_ = life_stage_ == kOnLoadFired ? kLoadCompleted : kIsDockedSet;
1063 if (load_state_ == kLoadCompleted) 1058 if (life_stage_ == kLoadCompleted)
1064 LoadCompleted(); 1059 LoadCompleted();
1065 return; 1060 return;
1066 } 1061 }
1067 1062
1068 if (dock_requested == was_docked) 1063 if (dock_requested == was_docked)
1069 return; 1064 return;
1070 1065
1071 if (dock_requested && !was_docked) { 1066 if (dock_requested && !was_docked) {
1072 // Detach window from the external devtools browser. It will lead to 1067 // Detach window from the external devtools browser. It will lead to
1073 // the browser object's close and delete. Remove observer first. 1068 // the browser object's close and delete. Remove observer first.
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
1112 } 1107 }
1113 } 1108 }
1114 1109
1115 void DevToolsWindow::SetWhitelistedShortcuts( 1110 void DevToolsWindow::SetWhitelistedShortcuts(
1116 const std::string& message) { 1111 const std::string& message) {
1117 event_forwarder_->SetWhitelistedShortcuts(message); 1112 event_forwarder_->SetWhitelistedShortcuts(message);
1118 } 1113 }
1119 1114
1120 void DevToolsWindow::InspectedContentsClosing() { 1115 void DevToolsWindow::InspectedContentsClosing() {
1121 intercepted_page_beforeunload_ = false; 1116 intercepted_page_beforeunload_ = false;
1122 // This will prevent any activity after frontend is loaded. 1117 life_stage_ = kClosing;
1123 action_on_load_ = DevToolsToggleAction::NoOp();
1124 ignore_set_is_docked_ = true;
1125 main_web_contents_->GetRenderViewHost()->ClosePage(); 1118 main_web_contents_->GetRenderViewHost()->ClosePage();
1126 } 1119 }
1127 1120
1128 InfoBarService* DevToolsWindow::GetInfoBarService() { 1121 InfoBarService* DevToolsWindow::GetInfoBarService() {
1129 return is_docked_ ? 1122 return is_docked_ ?
1130 InfoBarService::FromWebContents(GetInspectedWebContents()) : 1123 InfoBarService::FromWebContents(GetInspectedWebContents()) :
1131 InfoBarService::FromWebContents(main_web_contents_); 1124 InfoBarService::FromWebContents(main_web_contents_);
1132 } 1125 }
1133 1126
1134 void DevToolsWindow::RenderProcessGone() { 1127 void DevToolsWindow::RenderProcessGone() {
(...skipping 10 matching lines...) Expand all
1145 if (inspected_web_contents) { 1138 if (inspected_web_contents) {
1146 SessionTabHelper* session_tab_helper = 1139 SessionTabHelper* session_tab_helper =
1147 SessionTabHelper::FromWebContents(inspected_web_contents); 1140 SessionTabHelper::FromWebContents(inspected_web_contents);
1148 if (session_tab_helper) { 1141 if (session_tab_helper) {
1149 base::FundamentalValue tabId(session_tab_helper->session_id().id()); 1142 base::FundamentalValue tabId(session_tab_helper->session_id().id());
1150 bindings_->CallClientFunction("WebInspector.setInspectedTabId", 1143 bindings_->CallClientFunction("WebInspector.setInspectedTabId",
1151 &tabId, NULL, NULL); 1144 &tabId, NULL, NULL);
1152 } 1145 }
1153 } 1146 }
1154 1147
1148 if (life_stage_ == kClosing)
1149 return;
1150
1155 // We could be in kLoadCompleted state already if frontend reloads itself. 1151 // We could be in kLoadCompleted state already if frontend reloads itself.
1156 if (load_state_ != kLoadCompleted) { 1152 if (life_stage_ != kLoadCompleted) {
1157 // Load is completed when both kIsDockedSet and kOnLoadFired happened. 1153 // Load is completed when both kIsDockedSet and kOnLoadFired happened.
1158 // Here we set kOnLoadFired. 1154 // Here we set kOnLoadFired.
1159 load_state_ = load_state_ == kIsDockedSet ? kLoadCompleted : kOnLoadFired; 1155 life_stage_ = life_stage_ == kIsDockedSet ? kLoadCompleted : kOnLoadFired;
1160 } 1156 }
1161 if (load_state_ == kLoadCompleted) 1157 if (life_stage_ == kLoadCompleted)
1162 LoadCompleted(); 1158 LoadCompleted();
1163 } 1159 }
1164 1160
1165 void DevToolsWindow::CreateDevToolsBrowser() { 1161 void DevToolsWindow::CreateDevToolsBrowser() {
1166 std::string wp_key = GetDevToolsWindowPlacementPrefKey(); 1162 std::string wp_key = GetDevToolsWindowPlacementPrefKey();
1167 PrefService* prefs = profile_->GetPrefs(); 1163 PrefService* prefs = profile_->GetPrefs();
1168 const base::DictionaryValue* wp_pref = prefs->GetDictionary(wp_key.c_str()); 1164 const base::DictionaryValue* wp_pref = prefs->GetDictionary(wp_key.c_str());
1169 if (!wp_pref || wp_pref->empty()) { 1165 if (!wp_pref || wp_pref->empty()) {
1170 DictionaryPrefUpdate update(prefs, wp_key.c_str()); 1166 DictionaryPrefUpdate update(prefs, wp_key.c_str());
1171 base::DictionaryValue* defaults = update.Get(); 1167 base::DictionaryValue* defaults = update.Get();
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
1250 void DevToolsWindow::LoadCompleted() { 1246 void DevToolsWindow::LoadCompleted() {
1251 Show(action_on_load_); 1247 Show(action_on_load_);
1252 action_on_load_ = DevToolsToggleAction::NoOp(); 1248 action_on_load_ = DevToolsToggleAction::NoOp();
1253 if (!load_completed_callback_.is_null()) { 1249 if (!load_completed_callback_.is_null()) {
1254 load_completed_callback_.Run(); 1250 load_completed_callback_.Run();
1255 load_completed_callback_ = base::Closure(); 1251 load_completed_callback_ = base::Closure();
1256 } 1252 }
1257 } 1253 }
1258 1254
1259 void DevToolsWindow::SetLoadCompletedCallback(const base::Closure& closure) { 1255 void DevToolsWindow::SetLoadCompletedCallback(const base::Closure& closure) {
1260 if (load_state_ == kLoadCompleted) { 1256 if (life_stage_ == kLoadCompleted) {
1261 if (!closure.is_null()) 1257 if (!closure.is_null())
1262 closure.Run(); 1258 closure.Run();
1263 return; 1259 return;
1264 } 1260 }
1265 load_completed_callback_ = closure; 1261 load_completed_callback_ = closure;
1266 } 1262 }
1267 1263
1268 bool DevToolsWindow::ForwardKeyboardEvent( 1264 bool DevToolsWindow::ForwardKeyboardEvent(
1269 const content::NativeWebKeyboardEvent& event) { 1265 const content::NativeWebKeyboardEvent& event) {
1270 return event_forwarder_->ForwardEvent(event); 1266 return event_forwarder_->ForwardEvent(event);
1271 } 1267 }
OLDNEW
« no previous file with comments | « chrome/browser/devtools/devtools_window.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698