赞
踩
在chromium中输入url时, 想看看在哪处理的键盘输入。
还想看看, 输入内建url时,从键盘处理到url页面数据准备的全过程。
在chromium工程中可以看到内建url索引页面的url内容
Z:\chromium\src\chrome\common\webui_url_constants.cc
const char kChromeUIChromeURLsURL[] = "chrome://chrome-urls/";
所有可用的chromium buildin url list
在chromium的url输入框,输入以下url, 会显示出chromium所有的内建url chrome://chrome-urls/ List of Chrome URLs chrome://about chrome://accessibility chrome://appcache-internals chrome://apps chrome://blob-internals chrome://bluetooth-internals chrome://bookmarks chrome://chrome chrome://chrome-urls chrome://components chrome://conflicts chrome://crashes chrome://credits chrome://device-log chrome://devices chrome://dino chrome://discards chrome://dns chrome://download-internals chrome://downloads chrome://extensions chrome://flags chrome://flash chrome://gcm-internals chrome://gpu chrome://help chrome://histograms chrome://history chrome://indexeddb-internals chrome://inspect chrome://interventions-internals chrome://invalidations chrome://local-state chrome://media-engagement chrome://media-internals chrome://nacl chrome://net-export chrome://net-internals chrome://network-error chrome://network-errors chrome://newtab chrome://ntp-tiles-internals chrome://omnibox chrome://password-manager-internals chrome://policy chrome://predictors chrome://print chrome://quota-internals chrome://safe-browsing chrome://serviceworker-internals chrome://settings chrome://signin-internals chrome://site-engagement chrome://suggestions chrome://supervised-user-internals chrome://sync-internals chrome://system chrome://taskscheduler-internals chrome://terms chrome://thumbnails chrome://tracing chrome://translate-internals chrome://usb-internals chrome://user-actions chrome://version chrome://webrtc-internals chrome://webrtc-logs For Debug The following pages are for debugging purposes only. Because they crash or hang the renderer, they're not linked directly; you can type them into the address bar if you need them. chrome://badcastcrash/ chrome://inducebrowsercrashforrealz/ chrome://crash/ chrome://crashdump/ chrome://kill/ chrome://hang/ chrome://shorthang/ chrome://gpuclean/ chrome://gpucrash/ chrome://gpuhang/ chrome://memory-exhaust/ chrome://ppapiflashcrash/ chrome://ppapiflashhang/ chrome://quit/ chrome://restart/
// Z:\chromium\src\ui\views\win\hwnd_message_handler.cc // @note ls 在chromiumUI中输入按下任意键的处理函数 LRESULT HWNDMessageHandler::OnKeyEvent(UINT message, WPARAM w_param, LPARAM l_param) { MSG msg = { hwnd(), message, w_param, l_param, static_cast<DWORD>(GetMessageTime())}; ui::KeyEvent key(msg); base::WeakPtr<HWNDMessageHandler> ref(msg_handler_weak_factory_.GetWeakPtr()); delegate_->HandleKeyEvent(&key); if (!ref) return 0; if (!key.handled()) SetMsgHandled(FALSE); return 0; }
// Z:\chromium\src\ui\views\widget\desktop_aura\desktop_window_tree_host_win.cc
// 在chromiumUI中按下任意键, 来到这
void DesktopWindowTreeHostWin::HandleKeyEvent(ui::KeyEvent* event) {
SendEventToSink(event);
}
// Z:\chromium\src\chrome\browser\ui\exclusive_access\exclusive_access_manager.cc bool ExclusiveAccessManager::HandleUserKeyEvent( const content::NativeWebKeyboardEvent& event) { if (event.windows_key_code != ui::VKEY_ESCAPE) { OnUserInput(); // this return false; } // Give the |keyboard_lock_controller_| first chance at handling the ESC event // as there are specific UX behaviors that occur when that mode is active // which are coordinated by that class. Return false as we don't want to // prevent the event from propagating to the webpage. if (keyboard_lock_controller_.HandleKeyEvent(event)) return false; bool handled = false; handled = fullscreen_controller_.HandleUserPressedEscape(); handled |= mouse_lock_controller_.HandleUserPressedEscape(); handled |= keyboard_lock_controller_.HandleUserPressedEscape(); return handled; }
// Z:\chromium\src\ui\views\controls\textfield\textfield.cc bool Textfield::OnKeyPressed(const ui::KeyEvent& event) { ui::TextEditCommand edit_command = scheduled_text_edit_command_; scheduled_text_edit_command_ = ui::TextEditCommand::INVALID_COMMAND; // Since HandleKeyEvent() might destroy |this|, get a weak pointer and verify // it isn't null before proceeding. base::WeakPtr<Textfield> textfield(weak_ptr_factory_.GetWeakPtr()); bool handled = controller_ && controller_->HandleKeyEvent(this, event); if (!textfield) return handled; #if defined(OS_LINUX) && !defined(OS_CHROMEOS) ui::TextEditKeyBindingsDelegateAuraLinux* delegate = ui::GetTextEditKeyBindingsDelegate(); std::vector<ui::TextEditCommandAuraLinux> commands; if (!handled && delegate && delegate->MatchEvent(event, &commands)) { for (size_t i = 0; i < commands.size(); ++i) { if (IsTextEditCommandEnabled(commands[i].command())) { ExecuteTextEditCommand(commands[i].command()); handled = true; } } return handled; } #endif if (edit_command == ui::TextEditCommand::INVALID_COMMAND) edit_command = GetCommandForKeyEvent(event); if (!handled && IsTextEditCommandEnabled(edit_command)) { ExecuteTextEditCommand(edit_command); handled = true; } return handled; }
// Z:\chromium\src\chrome\browser\ui\views\omnibox\omnibox_view_views.cc bool OmniboxViewViews::HandleKeyEvent(views::Textfield* textfield, const ui::KeyEvent& event) { if (event.type() == ui::ET_KEY_RELEASED) { // The omnibox contents may change while the control key is pressed. if (event.key_code() == ui::VKEY_CONTROL) model()->OnControlKeyChanged(false); else if (event.key_code() == ui::VKEY_SHIFT) OnShiftKeyChanged(false); return false; } // Skip processing of [Alt]+<num-pad digit> Unicode alt key codes. // Otherwise, if num-lock is off, the events are handled as [Up], [Down], etc. if (event.IsUnicodeKeyCode()) return false; const bool shift = event.IsShiftDown(); const bool control = event.IsControlDown(); const bool alt = event.IsAltDown() || event.IsAltGrDown(); #if defined(OS_MACOSX) const bool command = event.IsCommandDown(); #else const bool command = false; #endif switch (event.key_code()) { case ui::VKEY_RETURN: // url输入栏回车,会在这最终处理 if (model()->popup_model()->SelectedLineHasTabMatch() && model()->popup_model()->selected_line_state() == OmniboxPopupModel::TAB_SWITCH) { popup_view_->OpenMatch(WindowOpenDisposition::SWITCH_TO_TAB); } else { if (alt) { model()->AcceptInput(WindowOpenDisposition::NEW_FOREGROUND_TAB, false); } else if (command) { model()->AcceptInput(WindowOpenDisposition::NEW_BACKGROUND_TAB, false); } else { // 开始处理url栏回车 model()->AcceptInput(WindowOpenDisposition::CURRENT_TAB, false); } } return true; case ui::VKEY_ESCAPE: return model()->OnEscapeKeyPressed(); case ui::VKEY_CONTROL: model()->OnControlKeyChanged(true); break; case ui::VKEY_SHIFT: OnShiftKeyChanged(true); break; case ui::VKEY_DELETE: if (shift && model()->popup_model()->IsOpen()) model()->popup_model()->TryDeletingCurrentItem(); break; case ui::VKEY_UP: if (IsTextEditCommandEnabled(ui::TextEditCommand::MOVE_UP)) { ExecuteTextEditCommand(ui::TextEditCommand::MOVE_UP); return true; } break; case ui::VKEY_DOWN: if (IsTextEditCommandEnabled(ui::TextEditCommand::MOVE_DOWN)) { ExecuteTextEditCommand(ui::TextEditCommand::MOVE_DOWN); return true; } break; case ui::VKEY_PRIOR: if (control || alt || shift) return false; model()->OnUpOrDownKeyPressed(-1 * model()->result().size()); return true; case ui::VKEY_NEXT: if (control || alt || shift) return false; model()->OnUpOrDownKeyPressed(model()->result().size()); return true; case ui::VKEY_V: if (control && !alt && IsTextEditCommandEnabled(ui::TextEditCommand::PASTE)) { ExecuteTextEditCommand(ui::TextEditCommand::PASTE); return true; } break; case ui::VKEY_INSERT: if (shift && !control && IsTextEditCommandEnabled(ui::TextEditCommand::PASTE)) { ExecuteTextEditCommand(ui::TextEditCommand::PASTE); return true; } break; case ui::VKEY_BACK: // No extra handling is needed in keyword search mode, if there is a // non-empty selection, or if the cursor is not leading the text. if (model()->is_keyword_hint() || model()->keyword().empty() || HasSelection() || GetCursorPosition() != 0) return false; model()->ClearKeyword(); return true; case ui::VKEY_HOME: // The Home key indicates that the user wants to move the cursor to the // beginning of the full URL, so it should always trigger an unelide. if (UnapplySteadyStateElisions(UnelisionGesture::HOME_KEY_PRESSED)) { if (shift) { // After uneliding, we need to move the end of the selection range // to the beginning of the full unelided URL. size_t start, end; GetSelectionBounds(&start, &end); SelectRange(gfx::Range(start, 0)); } else { // After uneliding, move the caret to the beginning of the full // unelided URL. SetCaretPos(0); } TextChanged(); return true; } break; default: break; } return HandleEarlyTabActions(event); }
// Z:\chromium\src\chrome\browser\autocomplete\chrome_autocomplete_provider_client.cc // 在url输入栏键入字符后,会有自动完成的预备操作 std::vector<base::string16> ChromeAutocompleteProviderClient::GetBuiltinsToProvideAsUserTypes() { std::vector<base::string16> builtins_to_provide; builtins_to_provide.push_back( base::ASCIIToUTF16(chrome::kChromeUIChromeURLsURL)); #if !defined(OS_ANDROID) builtins_to_provide.push_back( base::ASCIIToUTF16(chrome::kChromeUISettingsURL)); #endif builtins_to_provide.push_back( base::ASCIIToUTF16(chrome::kChromeUIVersionURL)); return builtins_to_provide; }
// url输入框的接收输入的处理 void OmniboxEditModel::AcceptInput(WindowOpenDisposition disposition, bool for_drop) { // Get the URL and transition type for the selected entry. GURL alternate_nav_url; AutocompleteMatch match = CurrentMatch(&alternate_nav_url); // If CTRL is down it means the user wants to append ".com" to the text they // typed. If we can successfully generate a URL_WHAT_YOU_TYPED match doing // that, then we use this. These matches are marked as generated by the // HistoryURLProvider so we only generate them if this provider is present. if (control_key_state_ == DOWN_WITHOUT_CHANGE && !is_keyword_selected() && autocomplete_controller()->history_url_provider()) { // Generate a new AutocompleteInput, copying the latest one but using "com" // as the desired TLD. Then use this autocomplete input to generate a // URL_WHAT_YOU_TYPED AutocompleteMatch. Note that using the most recent // input instead of the currently visible text means we'll ignore any // visible inline autocompletion: if a user types "foo" and is autocompleted // to "foodnetwork.com", ctrl-enter will navigate to "foo.com", not // "foodnetwork.com". At the time of writing, this behavior matches // Internet Explorer, but not Firefox. AutocompleteInput input( has_temporary_text_ ? view_->GetText() : input_.text(), input_.cursor_position(), "com", input_.current_page_classification(), client_->GetSchemeClassifier()); input.set_prevent_inline_autocomplete(input_.prevent_inline_autocomplete()); input.set_prefer_keyword(input_.prefer_keyword()); input.set_allow_exact_keyword_match(input_.allow_exact_keyword_match()); input.set_want_asynchronous_matches(input_.want_asynchronous_matches()); input.set_from_omnibox_focus(input_.from_omnibox_focus()); input_ = input; AutocompleteMatch url_match( autocomplete_controller()->history_url_provider()->SuggestExactInput( input_, input_.canonicalized_url(), false)); if (url_match.destination_url.is_valid()) { // We have a valid URL, we use this newly generated AutocompleteMatch. match = url_match; alternate_nav_url = GURL(); } } if (!match.destination_url.is_valid()) return; if (ui::PageTransitionCoreTypeIs(match.transition, ui::PAGE_TRANSITION_TYPED) && (match.destination_url == PermanentURL())) { // When the user hit enter on the existing permanent URL, treat it like a // reload for scoring purposes. We could detect this by just checking // user_input_in_progress_, but it seems better to treat "edits" that end // up leaving the URL unchanged (e.g. deleting the last character and then // retyping it) as reloads too. We exclude non-TYPED transitions because if // the transition is GENERATED, the user input something that looked // different from the current URL, even if it wound up at the same place // (e.g. manually retyping the same search query), and it seems wrong to // treat this as a reload. match.transition = ui::PAGE_TRANSITION_RELOAD; } else if (for_drop || ((paste_state_ != NONE) && (match.type == AutocompleteMatchType::URL_WHAT_YOU_TYPED))) { // When the user pasted in a URL and hit enter, score it like a link click // rather than a normal typed URL, so it doesn't get inline autocompleted // as aggressively later. match.transition = ui::PAGE_TRANSITION_LINK; } client_->OnInputAccepted(match); DCHECK(popup_model()); // 打开内建url view_->OpenMatch(match, disposition, alternate_nav_url, base::string16(), popup_model()->selected_line()); }
void OmniboxView::OpenMatch(const AutocompleteMatch& match,
WindowOpenDisposition disposition,
const GURL& alternate_nav_url,
const base::string16& pasted_text,
size_t selected_line) {
// Invalid URLs such as chrome://history can end up here.
if (!match.destination_url.is_valid() || !model_)
return;
// open buildin url
model_->OpenMatch(
match, disposition, alternate_nav_url, pasted_text, selected_line);
void OmniboxEditModel::OpenMatch(AutocompleteMatch match, WindowOpenDisposition disposition, const GURL& alternate_nav_url, const base::string16& pasted_text, size_t index) { const base::TimeTicks& now(base::TimeTicks::Now()); base::TimeDelta elapsed_time_since_user_first_modified_omnibox( now - time_user_first_modified_omnibox_); autocomplete_controller()->UpdateMatchDestinationURLWithQueryFormulationTime( elapsed_time_since_user_first_modified_omnibox, &match); base::string16 input_text(pasted_text); if (input_text.empty()) input_text = user_input_in_progress_ ? user_text_ : url_for_editing_; // Create a dummy AutocompleteInput for use in calling SuggestExactInput() // to create an alternate navigational match. AutocompleteInput alternate_input(input_text, ClassifyPage(), client_->GetSchemeClassifier()); // Somehow we can occasionally get here with no active tab. It's not // clear why this happens. alternate_input.set_current_url(client_->GetURL()); alternate_input.set_current_title(client_->GetTitle()); std::unique_ptr<OmniboxNavigationObserver> observer( client_->CreateOmniboxNavigationObserver( input_text, match, autocomplete_controller()->history_url_provider()->SuggestExactInput( alternate_input, alternate_nav_url, false))); base::TimeDelta elapsed_time_since_last_change_to_default_match( now - autocomplete_controller()->last_time_default_match_changed()); DCHECK(match.provider); // These elapsed times don't really make sense for matches that come from // omnibox focus (because the user did not modify the omnibox), so for those // we set the elapsed times to something that will be ignored by // metrics_log.cc. They also don't necessarily make sense if the omnibox // dropdown is closed or the user used a paste-and-go action. (In most // cases when this happens, the user never modified the omnibox.) const bool popup_open = PopupIsOpen(); if (input_.from_omnibox_focus() || !popup_open || !pasted_text.empty()) { const base::TimeDelta default_time_delta = base::TimeDelta::FromMilliseconds(-1); elapsed_time_since_user_first_modified_omnibox = default_time_delta; elapsed_time_since_last_change_to_default_match = default_time_delta; } // If the popup is closed or this is a paste-and-go action (meaning the // contents of the dropdown are ignored regardless), we record for logging // purposes a selected_index of 0 and a suggestion list as having a single // entry of the match used. const bool dropdown_ignored = !popup_open || !pasted_text.empty(); ACMatches fake_single_entry_matches; fake_single_entry_matches.push_back(match); AutocompleteResult fake_single_entry_result; fake_single_entry_result.AppendMatches(input_, fake_single_entry_matches); OmniboxLog log( input_.from_omnibox_focus() ? base::string16() : input_text, just_deleted_text_, input_.type(), popup_open, dropdown_ignored ? 0 : index, disposition, !pasted_text.empty(), SessionID::InvalidValue(), // don't know tab ID; set later if appropriate ClassifyPage(), elapsed_time_since_user_first_modified_omnibox, match.allowed_to_be_default_match ? match.inline_autocompletion.length() : base::string16::npos, elapsed_time_since_last_change_to_default_match, dropdown_ignored ? fake_single_entry_result : result()); DCHECK(dropdown_ignored || (log.elapsed_time_since_user_first_modified_omnibox >= log.elapsed_time_since_last_change_to_default_match)) << "We should've got the notification that the user modified the " << "omnibox text at same time or before the most recent time the " << "default match changed."; if ((disposition == WindowOpenDisposition::CURRENT_TAB) && client_->CurrentPageExists()) { // If we know the destination is being opened in the current tab, // we can easily get the tab ID. (If it's being opened in a new // tab, we don't know the tab ID yet.) log.tab_id = client_->GetSessionID(); } autocomplete_controller()->AddProvidersInfo(&log.providers_info); client_->OnURLOpenedFromOmnibox(&log); OmniboxEventGlobalTracker::GetInstance()->OnURLOpened(&log); LOCAL_HISTOGRAM_BOOLEAN("Omnibox.EventCount", true); if (!last_omnibox_focus_.is_null()) { // Only record focus to open time when a focus actually happened (as // opposed to, say, dragging a link onto the omnibox). UMA_HISTOGRAM_MEDIUM_TIMES(kFocusToOpenTimeHistogram, now - last_omnibox_focus_); } TemplateURLService* service = client_->GetTemplateURLService(); TemplateURL* template_url = match.GetTemplateURL(service, false); if (template_url) { if (ui::PageTransitionTypeIncludingQualifiersIs( match.transition, ui::PAGE_TRANSITION_KEYWORD)) { // The user is using a non-substituting keyword or is explicitly in // keyword mode. // Don't increment usage count for extension keywords. if (client_->ProcessExtensionKeyword(template_url, match, disposition, observer.get())) { if (disposition != WindowOpenDisposition::NEW_BACKGROUND_TAB) view_->RevertAll(); return; } base::RecordAction(base::UserMetricsAction("AcceptedKeyword")); client_->GetTemplateURLService()->IncrementUsageCount(template_url); } else { DCHECK(ui::PageTransitionTypeIncludingQualifiersIs( match.transition, ui::PAGE_TRANSITION_GENERATED)); // NOTE: We purposefully don't increment the usage count of the default // search engine here like we do for explicit keywords above; see comments // in template_url.h. } SearchEngineType search_engine_type = match.destination_url.is_valid() ? TemplateURLPrepopulateData::GetEngineType(match.destination_url) : SEARCH_ENGINE_OTHER; UMA_HISTOGRAM_ENUMERATION("Omnibox.SearchEngineType", search_engine_type, SEARCH_ENGINE_MAX); } else { // |match| is a URL navigation, not a search. // For logging the below histogram, only record uses that depend on the // omnibox suggestion system, i.e., TYPED navigations. That is, exclude // omnibox URL interactions that are treated as reloads or link-following // (i.e., cut-and-paste of URLs). if (ui::PageTransitionTypeIncludingQualifiersIs(match.transition, ui::PAGE_TRANSITION_TYPED)) navigation_metrics::RecordOmniboxURLNavigation(match.destination_url); } if (disposition != WindowOpenDisposition::NEW_BACKGROUND_TAB) { base::AutoReset<bool> tmp(&in_revert_, true); view_->RevertAll(); // Revert the box to its unedited state. } // Track whether the destination URL sends us to a search results page // using the default search provider. TemplateURLService* template_url_service = client_->GetTemplateURLService(); if (template_url_service && template_url_service->IsSearchResultsPageFromDefaultSearchProvider( match.destination_url)) { base::RecordAction( base::UserMetricsAction("OmniboxDestinationURLIsSearchOnDSP")); } if (match.destination_url.is_valid()) { // This calls RevertAll again. base::AutoReset<bool> tmp(&in_revert_, true); controller_->OnAutocompleteAccept( match.destination_url, disposition, ui::PageTransitionFromInt( match.transition | ui::PAGE_TRANSITION_FROM_ADDRESS_BAR), match.type); // The observer should have been synchronously notified of a pending load. if (observer && observer->HasSeenPendingLoad()) ignore_result(observer.release()); // The observer will delete itself. } BookmarkModel* bookmark_model = client_->GetBookmarkModel(); if (bookmark_model && bookmark_model->IsBookmarked(match.destination_url)) client_->OnBookmarkLaunched(); }
// if input is buildin url, process here void ChromeOmniboxEditController::OnAutocompleteAccept( const GURL& destination_url, WindowOpenDisposition disposition, ui::PageTransition transition, AutocompleteMatchType::Type match_type) { OmniboxEditController::OnAutocompleteAccept(destination_url, disposition, transition, match_type); if (command_updater_) command_updater_->ExecuteCommand(IDC_OPEN_CURRENT_URL); // 打开url #if BUILDFLAG(ENABLE_EXTENSIONS) extensions::MaybeShowExtensionControlledSearchNotification( GetWebContents(), match_type); #endif }
// only save Autocomplete parameter
void OmniboxEditController::OnAutocompleteAccept(
const GURL& destination_url,
WindowOpenDisposition disposition,
ui::PageTransition transition,
AutocompleteMatchType::Type type) {
destination_url_ = destination_url; // chrome://version/
disposition_ = disposition; // CURRENT_TAB
transition_ = transition; // 0x02000001
}
bool BrowserCommandController::ExecuteCommand(int id) {
return ExecuteCommandWithDisposition(id, WindowOpenDisposition::CURRENT_TAB);
}
所有浏览器命令都在这处理了
// Z:\chromium\src\chrome\browser\ui\browser_command_controller.cc bool BrowserCommandController::ExecuteCommandWithDisposition( int id, WindowOpenDisposition disposition) { // Doesn't go through the command_updater_ to avoid dealing with having a // naming collision for ExecuteCommandWithDisposition (both // CommandUpdaterDelegate and CommandUpdater declare this function so we // choose to not implement CommandUpdaterDelegate inside this class and // therefore command_updater_ doesn't have the delegate set). if (!SupportsCommand(id) || !IsCommandEnabled(id)) return false; // No commands are enabled if there is not yet any selected tab. // TODO(pkasting): It seems like we should not need this, because either // most/all commands should not have been enabled yet anyway or the ones that // are enabled should be global, or safe themselves against having no selected // tab. However, Ben says he tried removing this before and got lots of // crashes, e.g. from Windows sending WM_COMMANDs at random times during // window construction. This probably could use closer examination someday. if (browser_->tab_strip_model()->active_index() == TabStripModel::kNoTab) return true; DCHECK(command_updater_.IsCommandEnabled(id)) << "Invalid/disabled command " << id; // The order of commands in this switch statement must match the function // declaration order in browser.h! switch (id) { // Navigation commands case IDC_BACK: GoBack(browser_, disposition); break; case IDC_FORWARD: GoForward(browser_, disposition); break; case IDC_RELOAD: Reload(browser_, disposition); break; case IDC_RELOAD_CLEARING_CACHE: ClearCache(browser_); FALLTHROUGH; case IDC_RELOAD_BYPASSING_CACHE: ReloadBypassingCache(browser_, disposition); break; case IDC_HOME: Home(browser_, disposition); break; case IDC_OPEN_CURRENT_URL: OpenCurrentURL(browser_); // open url break; case IDC_STOP: Stop(browser_); break; // Window management commands case IDC_NEW_WINDOW: NewWindow(browser_); break; case IDC_NEW_INCOGNITO_WINDOW: NewIncognitoWindow(browser_); break; case IDC_CLOSE_WINDOW: base::RecordAction(base::UserMetricsAction("CloseWindowByKey")); CloseWindow(browser_); break; case IDC_NEW_TAB: { NewTab(browser_); #if BUILDFLAG(ENABLE_DESKTOP_IN_PRODUCT_HELP) // This is not in NewTab() to avoid tracking programmatic creation of new // tabs by extensions. auto* new_tab_tracker = feature_engagement::NewTabTrackerFactory::GetInstance() ->GetForProfile(profile()); new_tab_tracker->OnNewTabOpened(); new_tab_tracker->CloseBubble(); #endif break; } case IDC_CLOSE_TAB: base::RecordAction(base::UserMetricsAction("CloseTabByKey")); CloseTab(browser_); break; case IDC_SELECT_NEXT_TAB: base::RecordAction(base::UserMetricsAction("Accel_SelectNextTab")); SelectNextTab(browser_); break; case IDC_SELECT_PREVIOUS_TAB: base::RecordAction(base::UserMetricsAction("Accel_SelectPreviousTab")); SelectPreviousTab(browser_); break; case IDC_MOVE_TAB_NEXT: MoveTabNext(browser_); break; case IDC_MOVE_TAB_PREVIOUS: MoveTabPrevious(browser_); break; case IDC_SELECT_TAB_0: case IDC_SELECT_TAB_1: case IDC_SELECT_TAB_2: case IDC_SELECT_TAB_3: case IDC_SELECT_TAB_4: case IDC_SELECT_TAB_5: case IDC_SELECT_TAB_6: case IDC_SELECT_TAB_7: base::RecordAction(base::UserMetricsAction("Accel_SelectNumberedTab")); SelectNumberedTab(browser_, id - IDC_SELECT_TAB_0); break; case IDC_SELECT_LAST_TAB: base::RecordAction(base::UserMetricsAction("Accel_SelectNumberedTab")); SelectLastTab(browser_); break; case IDC_DUPLICATE_TAB: DuplicateTab(browser_); break; case IDC_RESTORE_TAB: RestoreTab(browser_); break; case IDC_SHOW_AS_TAB: ConvertPopupToTabbedBrowser(browser_); break; case IDC_FULLSCREEN: chrome::ToggleFullscreenMode(browser_); break; case IDC_OPEN_IN_PWA_WINDOW: base::RecordAction(base::UserMetricsAction("OpenActiveTabInPwaWindow")); ReparentSecureActiveTabIntoPwaWindow(browser_); break; #if defined(OS_CHROMEOS) case IDC_VISIT_DESKTOP_OF_LRU_USER_2: case IDC_VISIT_DESKTOP_OF_LRU_USER_3: ExecuteVisitDesktopCommand(id, window()->GetNativeWindow()); break; #endif #if defined(OS_LINUX) && !defined(OS_CHROMEOS) case IDC_MINIMIZE_WINDOW: browser_->window()->Minimize(); break; case IDC_MAXIMIZE_WINDOW: browser_->window()->Maximize(); break; case IDC_RESTORE_WINDOW: browser_->window()->Restore(); break; case IDC_USE_SYSTEM_TITLE_BAR: { PrefService* prefs = profile()->GetPrefs(); prefs->SetBoolean(prefs::kUseCustomChromeFrame, !prefs->GetBoolean(prefs::kUseCustomChromeFrame)); break; } #endif #if defined(OS_MACOSX) case IDC_TOGGLE_FULLSCREEN_TOOLBAR: chrome::ToggleFullscreenToolbar(browser_); break; case IDC_TOGGLE_JAVASCRIPT_APPLE_EVENTS: { PrefService* prefs = profile()->GetPrefs(); prefs->SetBoolean(prefs::kAllowJavascriptAppleEvents, !prefs->GetBoolean(prefs::kAllowJavascriptAppleEvents)); break; } #endif case IDC_EXIT: Exit(); break; // Page-related commands case IDC_SAVE_PAGE: SavePage(browser_); break; case IDC_BOOKMARK_PAGE: #if BUILDFLAG(ENABLE_DESKTOP_IN_PRODUCT_HELP) feature_engagement::BookmarkTrackerFactory::GetInstance() ->GetForProfile(profile()) ->OnBookmarkAdded(); #endif BookmarkCurrentPageAllowingExtensionOverrides(browser_); break; case IDC_BOOKMARK_ALL_TABS: #if BUILDFLAG(ENABLE_DESKTOP_IN_PRODUCT_HELP) feature_engagement::BookmarkTrackerFactory::GetInstance() ->GetForProfile(profile()) ->OnBookmarkAdded(); #endif BookmarkAllTabs(browser_); break; case IDC_VIEW_SOURCE: browser_->tab_strip_model() ->GetActiveWebContents() ->GetMainFrame() ->ViewSource(); break; case IDC_EMAIL_PAGE_LOCATION: EmailPageLocation(browser_); break; case IDC_PRINT: Print(browser_); break; #if BUILDFLAG(ENABLE_PRINTING) case IDC_BASIC_PRINT: base::RecordAction(base::UserMetricsAction("Accel_Advanced_Print")); BasicPrint(browser_); break; #endif // ENABLE_PRINTING case IDC_SAVE_CREDIT_CARD_FOR_PAGE: SaveCreditCard(browser_); break; case IDC_TRANSLATE_PAGE: Translate(browser_); break; case IDC_MANAGE_PASSWORDS_FOR_PAGE: ManagePasswordsForPage(browser_); break; // Clipboard commands case IDC_CUT: case IDC_COPY: case IDC_PASTE: CutCopyPaste(browser_, id); break; // Find-in-page case IDC_FIND: Find(browser_); break; case IDC_FIND_NEXT: FindNext(browser_); break; case IDC_FIND_PREVIOUS: FindPrevious(browser_); break; // Zoom case IDC_ZOOM_PLUS: Zoom(browser_, content::PAGE_ZOOM_IN); break; case IDC_ZOOM_NORMAL: Zoom(browser_, content::PAGE_ZOOM_RESET); break; case IDC_ZOOM_MINUS: Zoom(browser_, content::PAGE_ZOOM_OUT); break; // Focus various bits of UI case IDC_FOCUS_TOOLBAR: base::RecordAction(base::UserMetricsAction("Accel_Focus_Toolbar")); FocusToolbar(browser_); break; case IDC_FOCUS_LOCATION: base::RecordAction(base::UserMetricsAction("Accel_Focus_Location")); FocusLocationBar(browser_); break; case IDC_FOCUS_SEARCH: base::RecordAction(base::UserMetricsAction("Accel_Focus_Search")); FocusSearch(browser_); break; case IDC_FOCUS_MENU_BAR: FocusAppMenu(browser_); break; case IDC_FOCUS_BOOKMARKS: base::RecordAction(base::UserMetricsAction("Accel_Focus_Bookmarks")); FocusBookmarksToolbar(browser_); break; case IDC_FOCUS_INACTIVE_POPUP_FOR_ACCESSIBILITY: FocusInactivePopupForAccessibility(browser_); break; case IDC_FOCUS_NEXT_PANE: FocusNextPane(browser_); break; case IDC_FOCUS_PREVIOUS_PANE: FocusPreviousPane(browser_); break; // Show various bits of UI case IDC_OPEN_FILE: browser_->OpenFile(); break; case IDC_CREATE_HOSTED_APP: CreateBookmarkAppFromCurrentWebContents(browser_); break; case IDC_DEV_TOOLS: ToggleDevToolsWindow(browser_, DevToolsToggleAction::Show()); break; case IDC_DEV_TOOLS_CONSOLE: ToggleDevToolsWindow(browser_, DevToolsToggleAction::ShowConsolePanel()); break; case IDC_DEV_TOOLS_DEVICES: InspectUI::InspectDevices(browser_); break; case IDC_DEV_TOOLS_INSPECT: ToggleDevToolsWindow(browser_, DevToolsToggleAction::Inspect()); break; case IDC_DEV_TOOLS_TOGGLE: ToggleDevToolsWindow(browser_, DevToolsToggleAction::Toggle()); break; case IDC_TASK_MANAGER: OpenTaskManager(browser_); break; #if defined(OS_CHROMEOS) case IDC_TAKE_SCREENSHOT: TakeScreenshot(); break; #endif #if defined(GOOGLE_CHROME_BUILD) case IDC_FEEDBACK: OpenFeedbackDialog(browser_, kFeedbackSourceBrowserCommand); break; #endif case IDC_SHOW_BOOKMARK_BAR: ToggleBookmarkBar(browser_); break; case IDC_PROFILING_ENABLED: Profiling::Toggle(); break; case IDC_SHOW_BOOKMARK_MANAGER: ShowBookmarkManager(browser_); break; case IDC_SHOW_APP_MENU: base::RecordAction(base::UserMetricsAction("Accel_Show_App_Menu")); ShowAppMenu(browser_); break; case IDC_SHOW_AVATAR_MENU: ShowAvatarMenu(browser_); break; case IDC_SHOW_HISTORY: ShowHistory(browser_); break; case IDC_SHOW_DOWNLOADS: ShowDownloads(browser_); break; case IDC_MANAGE_EXTENSIONS: ShowExtensions(browser_, std::string()); break; case IDC_OPTIONS: ShowSettings(browser_); break; case IDC_EDIT_SEARCH_ENGINES: ShowSearchEngineSettings(browser_); break; case IDC_VIEW_PASSWORDS: ShowPasswordManager(browser_); break; case IDC_CLEAR_BROWSING_DATA: ShowClearBrowsingDataDialog(browser_); break; case IDC_IMPORT_SETTINGS: ShowImportDialog(browser_); break; case IDC_TOGGLE_REQUEST_TABLET_SITE: ToggleRequestTabletSite(browser_); break; case IDC_ABOUT: ShowAboutChrome(browser_); break; case IDC_UPGRADE_DIALOG: OpenUpdateChromeDialog(browser_); break; case IDC_VIEW_INCOMPATIBILITIES: ShowConflicts(browser_); break; case IDC_HELP_PAGE_VIA_KEYBOARD: ShowHelp(browser_, HELP_SOURCE_KEYBOARD); break; case IDC_HELP_PAGE_VIA_MENU: ShowHelp(browser_, HELP_SOURCE_MENU); break; case IDC_SHOW_BETA_FORUM: ShowBetaForum(browser_); break; case IDC_SHOW_SIGNIN: ShowBrowserSigninOrSettings( browser_, signin_metrics::AccessPoint::ACCESS_POINT_MENU); break; case IDC_DISTILL_PAGE: DistillCurrentPage(browser_); break; case IDC_ROUTE_MEDIA: RouteMedia(browser_); break; case IDC_WINDOW_MUTE_SITE: MuteSite(browser_); break; case IDC_WINDOW_PIN_TAB: PinTab(browser_); break; // Hosted App commands case IDC_COPY_URL: CopyURL(browser_); break; case IDC_OPEN_IN_CHROME: OpenInChrome(browser_); break; case IDC_SITE_SETTINGS: ShowSiteSettings( browser_, browser_->tab_strip_model()->GetActiveWebContents()->GetVisibleURL()); break; case IDC_HOSTED_APP_MENU_APP_INFO: ShowPageInfoDialog(browser_->tab_strip_model()->GetActiveWebContents(), bubble_anchor_util::kAppMenuButton); break; default: LOG(WARNING) << "Received Unimplemented Command: " << id; break; } return true; }
// Z:\chromium\src\chrome\browser\ui\browser_commands.cc void OpenCurrentURL(Browser* browser) { base::RecordAction(UserMetricsAction("LoadURL")); LocationBar* location_bar = browser->window()->GetLocationBar(); if (!location_bar) return; GURL url(location_bar->GetDestinationURL()); // 构造要导航的url参数 NavigateParams params(browser, url, location_bar->GetPageTransition()); params.disposition = location_bar->GetWindowOpenDisposition(); // Use ADD_INHERIT_OPENER so that all pages opened by the omnibox at least // inherit the opener. In some cases the tabstrip will determine the group // should be inherited, in which case the group is inherited instead of the // opener. params.tabstrip_add_types = TabStripModel::ADD_FORCE_INDEX | TabStripModel::ADD_INHERIT_OPENER; Navigate(¶ms); // 导航到目标url #if BUILDFLAG(ENABLE_EXTENSIONS) DCHECK(extensions::ExtensionSystem::Get( browser->profile())->extension_service()); const extensions::Extension* extension = extensions::ExtensionRegistry::Get(browser->profile()) ->enabled_extensions().GetAppByURL(url); if (extension) { extensions::RecordAppLaunchType(extension_misc::APP_LAUNCH_OMNIBOX_LOCATION, extension->GetType()); } #endif }
// Z:\chromium\src\chrome\browser\ui\browser_navigator.cc void Navigate(NavigateParams* params) { Browser* source_browser = params->browser; if (source_browser) params->initiating_profile = source_browser->profile(); DCHECK(params->initiating_profile); if (!AdjustNavigateParamsForURL(params)) return; #if BUILDFLAG(ENABLE_EXTENSIONS) const extensions::Extension* extension = extensions::ExtensionRegistry::Get(params->initiating_profile)-> enabled_extensions().GetExtensionOrAppByURL(params->url); // Platform apps cannot navigate. Block the request. if (extension && extension->is_platform_app()) params->url = GURL(chrome::kExtensionInvalidRequestURL); #endif // The browser window may want to adjust the disposition. if (params->disposition == WindowOpenDisposition::NEW_POPUP && source_browser && source_browser->window()) { params->disposition = source_browser->window()->GetDispositionForPopupBounds( params->window_bounds); } // Trying to open a background tab when in an app browser results in // focusing a regular browser window an opening a tab in the background // of that window. Change the disposition to NEW_FOREGROUND_TAB so that // the new tab is focused. if (source_browser && source_browser->is_app() && params->disposition == WindowOpenDisposition::NEW_BACKGROUND_TAB) { params->disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB; } // If no source WebContents was specified, we use the selected one from // the target browser. This must happen first, before // GetBrowserForDisposition() has a chance to replace |params->browser| with // another one. if (!params->source_contents && params->browser) { params->source_contents = params->browser->tab_strip_model()->GetActiveWebContents(); } WebContents* contents_to_navigate_or_insert = params->contents_to_insert.get(); if (params->switch_to_singleton_tab) { DCHECK_EQ(params->disposition, WindowOpenDisposition::SINGLETON_TAB); contents_to_navigate_or_insert = params->switch_to_singleton_tab; } int singleton_index; std::tie(params->browser, singleton_index) = GetBrowserAndTabForDisposition(*params); if (!params->browser) return; if (singleton_index != -1) { contents_to_navigate_or_insert = params->browser->tab_strip_model()->GetWebContentsAt(singleton_index); } #if defined(OS_CHROMEOS) if (source_browser && source_browser != params->browser) { // When the newly created browser was spawned by a browser which visits // another user's desktop, it should be shown on the same desktop as the // originating one. (This is part of the desktop separation per profile). MultiUserWindowManager* manager = MultiUserWindowManager::GetInstance(); // Some unit tests have no manager instantiated. if (manager) { aura::Window* src_window = source_browser->window()->GetNativeWindow(); aura::Window* new_window = params->browser->window()->GetNativeWindow(); const AccountId& src_account_id = manager->GetUserPresentingWindow(src_window); if (src_account_id != manager->GetUserPresentingWindow(new_window)) { // Once the window gets presented, it should be shown on the same // desktop as the desktop of the creating browser. Note that this // command will not show the window if it wasn't shown yet by the // browser creation. manager->ShowWindowForUser(new_window, src_account_id); } } } #endif // Navigate() must not return early after this point. if (GetSourceProfile(params) != params->browser->profile()) { // A tab is being opened from a link from a different profile, we must reset // source information that may cause state to be shared. params->opener = nullptr; params->source_contents = nullptr; params->source_site_instance = nullptr; params->referrer = content::Referrer(); } // Make sure the Browser is shown if params call for it. ScopedBrowserShower shower(params, &contents_to_navigate_or_insert); // Makes sure any WebContents created by this function is destroyed if // not properly added to a tab strip. std::unique_ptr<WebContents> contents_to_insert = std::move(params->contents_to_insert); // Some dispositions need coercion to base types. NormalizeDisposition(params); // If a new window has been created, it needs to be shown. if (params->window_action == NavigateParams::NO_ACTION && source_browser != params->browser && params->browser->tab_strip_model()->empty()) { params->window_action = NavigateParams::SHOW_WINDOW; } // If we create a popup window from a non user-gesture, don't activate it. if (params->window_action == NavigateParams::SHOW_WINDOW && params->disposition == WindowOpenDisposition::NEW_POPUP && params->user_gesture == false) { params->window_action = NavigateParams::SHOW_WINDOW_INACTIVE; } // Determine if the navigation was user initiated. If it was, we need to // inform the target WebContents, and we may need to update the UI. bool user_initiated = params->transition & ui::PAGE_TRANSITION_FROM_ADDRESS_BAR || ui::PageTransitionCoreTypeIs(params->transition, ui::PAGE_TRANSITION_TYPED) || ui::PageTransitionCoreTypeIs(params->transition, ui::PAGE_TRANSITION_AUTO_BOOKMARK) || ui::PageTransitionCoreTypeIs(params->transition, ui::PAGE_TRANSITION_GENERATED) || ui::PageTransitionCoreTypeIs(params->transition, ui::PAGE_TRANSITION_AUTO_TOPLEVEL) || ui::PageTransitionCoreTypeIs(params->transition, ui::PAGE_TRANSITION_RELOAD) || ui::PageTransitionCoreTypeIs(params->transition, ui::PAGE_TRANSITION_KEYWORD); // Did we use a prerender? bool swapped_in_prerender = false; // If no target WebContents was specified (and we didn't seek and find a // singleton), we need to construct one if we are supposed to target a new // tab. if (!contents_to_navigate_or_insert) { DCHECK(!params->url.is_empty()); if (params->disposition != WindowOpenDisposition::CURRENT_TAB) { contents_to_insert = CreateTargetContents(*params, params->url); contents_to_navigate_or_insert = contents_to_insert.get(); } else { // ... otherwise if we're loading in the current tab, the target is the // same as the source. DCHECK(params->source_contents); contents_to_navigate_or_insert = params->source_contents; prerender::PrerenderManager::Params prerender_params( params, params->source_contents); // Prerender can only swap in CURRENT_TAB navigations; others have // different sessionStorage namespaces. swapped_in_prerender = SwapInPrerender(params->url, &prerender_params); if (swapped_in_prerender) contents_to_navigate_or_insert = prerender_params.replaced_contents; } if (user_initiated) contents_to_navigate_or_insert->NavigatedByUser(); if (!swapped_in_prerender) { // Try to handle non-navigational URLs that popup dialogs and such, these // should not actually navigate. if (!HandleNonNavigationAboutURL(params->url)) { // Perform the actual navigation, tracking whether it came from the // renderer. LoadURLInContents(contents_to_navigate_or_insert, params->url, params); } } } else { // |contents_to_navigate_or_insert| was specified non-NULL, and so we assume // it has already been navigated appropriately. We need to do nothing more // other than add it to the appropriate tabstrip. } // If the user navigated from the omnibox, and the selected tab is going to // lose focus, then make sure the focus for the source tab goes away from the // omnibox. if (params->source_contents && (params->disposition == WindowOpenDisposition::NEW_FOREGROUND_TAB || params->disposition == WindowOpenDisposition::NEW_WINDOW) && (params->tabstrip_add_types & TabStripModel::ADD_INHERIT_OPENER)) params->source_contents->Focus(); if (params->source_contents == contents_to_navigate_or_insert || (swapped_in_prerender && params->disposition == WindowOpenDisposition::CURRENT_TAB)) { // The navigation occurred in the source tab. params->browser->UpdateUIForNavigationInTab( contents_to_navigate_or_insert, params->transition, params->window_action, user_initiated); } else if (singleton_index == -1) { // If some non-default value is set for the index, we should tell the // TabStripModel to respect it. if (params->tabstrip_index != -1) params->tabstrip_add_types |= TabStripModel::ADD_FORCE_INDEX; DCHECK(contents_to_insert); // The navigation should insert a new tab into the target Browser. params->browser->tab_strip_model()->AddWebContents( std::move(contents_to_insert), params->tabstrip_index, params->transition, params->tabstrip_add_types); } if (singleton_index >= 0) { // If switching browsers, make sure it is shown. if (params->disposition == WindowOpenDisposition::SWITCH_TO_TAB && params->browser != source_browser) params->window_action = NavigateParams::SHOW_WINDOW; if (contents_to_navigate_or_insert->IsCrashed()) { contents_to_navigate_or_insert->GetController().Reload( content::ReloadType::NORMAL, true); } else if (params->path_behavior == NavigateParams::IGNORE_AND_NAVIGATE && contents_to_navigate_or_insert->GetURL() != params->url) { LoadURLInContents(contents_to_navigate_or_insert, params->url, params); } // If the singleton tab isn't already selected, select it. if (params->source_contents != contents_to_navigate_or_insert) { // Use the index before the potential close below, because it could // make the index refer to a different tab. params->browser->tab_strip_model()->ActivateTabAt(singleton_index, user_initiated); if (params->disposition == WindowOpenDisposition::SWITCH_TO_TAB) { // Close orphaned NTP (and the like) with no history when the user // switches away from them. if (params->source_contents->GetController().CanGoBack() || (params->source_contents->GetLastCommittedURL().spec() != chrome::kChromeUINewTabURL && params->source_contents->GetLastCommittedURL().spec() != chrome::kChromeSearchLocalNtpUrl && params->source_contents->GetLastCommittedURL().spec() != url::kAboutBlankURL)) params->source_contents->Focus(); else params->source_contents->Close(); } } } if (params->disposition != WindowOpenDisposition::CURRENT_TAB) { content::NotificationService::current()->Notify( chrome::NOTIFICATION_TAB_ADDED, content::Source<content::WebContentsDelegate>(params->browser), content::Details<WebContents>(contents_to_navigate_or_insert)); } params->navigated_or_inserted_contents = contents_to_navigate_or_insert; }
输入chrome://version时,已经在Z:\chromium\src\chrome\browser\ui\webui\version_ui.cc中下断点,命中后WebUIDataSource* CreateVersionUIDataSource(),看调用链。
> chrome.dll!`anonymous namespace'::CreateVersionUIDataSource() 行 80 C++ chrome.dll!VersionUI::VersionUI(content::WebUI * web_ui) 行 184 C++ chrome.dll!`anonymous namespace'::NewWebUI<VersionUI>(content::WebUI * web_ui, const GURL & url) 行 230 C++ chrome.dll!ChromeWebUIControllerFactory::CreateWebUIControllerForURL(content::WebUI * web_ui, const GURL & url) 行 689 C++ content.dll!content::WebUIControllerFactoryRegistry::CreateWebUIControllerForURL(content::WebUI * web_ui, const GURL & url) 行 47 C++ content.dll!content::WebContentsImpl::CreateWebUI(const GURL & url) 行 6060 C++ content.dll!content::WebContentsImpl::CreateWebUIForRenderFrameHost(const GURL & url) 行 5779 C++ content.dll!content::RenderFrameHostImpl::UpdatePendingWebUI(const GURL & dest_url, int entry_bindings) 行 4167 C++ content.dll!content::RenderFrameHostManager::GetFrameHostForNavigation(const content::NavigationRequest & request) 行 585 C++ content.dll!content::RenderFrameHostManager::DidCreateNavigationRequest(content::NavigationRequest * request) 行 483 C++ content.dll!content::FrameTreeNode::CreatedNavigationRequest(std::unique_ptr<content::NavigationRequest,std::default_delete<content::NavigationRequest> > navigation_request) 行 452 C++ content.dll!content::NavigatorImpl::RequestNavigation(content::FrameTreeNode * frame_tree_node, const GURL & dest_url, const content::Referrer & dest_referrer, const content::FrameNavigationEntry & frame_entry, const content::NavigationEntryImpl & entry, content::ReloadType reload_type, int previews_state, bool is_same_document_history_load, bool is_history_navigation_in_new_child, const scoped_refptr<network::ResourceRequestBody> & post_body, base::TimeTicks navigation_start, std::unique_ptr<content::NavigationUIData,std::default_delete<content::NavigationUIData> > navigation_ui_data) 行 998 C++ content.dll!content::NavigatorImpl::NavigateToEntry(content::FrameTreeNode * frame_tree_node, const content::FrameNavigationEntry & frame_entry, const content::NavigationEntryImpl & entry, content::ReloadType reload_type, bool is_same_document_history_load, bool is_history_navigation_in_new_child, bool is_pending_entry, const scoped_refptr<network::ResourceRequestBody> & post_body, std::unique_ptr<content::NavigationUIData,std::default_delete<content::NavigationUIData> > navigation_ui_data) 行 344 C++ content.dll!content::NavigatorImpl::NavigateToPendingEntry(content::FrameTreeNode * frame_tree_node, const content::FrameNavigationEntry & frame_entry, content::ReloadType reload_type, bool is_same_document_history_load, std::unique_ptr<content::NavigationUIData,std::default_delete<content::NavigationUIData> > navigation_ui_data) 行 388 C++ content.dll!content::NavigationControllerImpl::NavigateToPendingEntryInternal(content::ReloadType reload_type, std::unique_ptr<content::NavigationUIData,std::default_delete<content::NavigationUIData> > navigation_ui_data) 行 2311 C++ content.dll!content::NavigationControllerImpl::NavigateToPendingEntry(content::ReloadType reload_type, std::unique_ptr<content::NavigationUIData,std::default_delete<content::NavigationUIData> > navigation_ui_data) 行 2265 C++ content.dll!content::NavigationControllerImpl::LoadEntry(std::unique_ptr<content::NavigationEntryImpl,std::default_delete<content::NavigationEntryImpl> > entry, std::unique_ptr<content::NavigationUIData,std::default_delete<content::NavigationUIData> > navigation_ui_data) 行 517 C++ content.dll!content::NavigationControllerImpl::LoadURLWithParams(const content::NavigationController::LoadURLParams & params) 行 877 C++ chrome.dll!`anonymous namespace'::LoadURLInContents(content::WebContents * target_contents, const GURL & url, NavigateParams * params) 行 342 C++ chrome.dll!Navigate(NavigateParams * params) 行 621 C++ chrome.dll!chrome::OpenCurrentURL(Browser * browser) 行 536 C++ chrome.dll!chrome::BrowserCommandController::ExecuteCommandWithDisposition(int id, WindowOpenDisposition disposition) 行 331 C++ chrome.dll!chrome::BrowserCommandController::ExecuteCommand(int id) 行 281 C++ chrome.dll!ChromeOmniboxEditController::OnAutocompleteAccept(const GURL & destination_url, WindowOpenDisposition disposition, ui::PageTransition transition, AutocompleteMatchType::Type match_type) 行 29 C++ chrome.dll!OmniboxEditModel::OpenMatch(AutocompleteMatch match, WindowOpenDisposition disposition, const GURL & alternate_nav_url, const std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> > & pasted_text, unsigned __int64 index) 行 729 C++ chrome.dll!OmniboxView::OpenMatch(const AutocompleteMatch & match, WindowOpenDisposition disposition, const GURL & alternate_nav_url, const std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> > & pasted_text, unsigned __int64 selected_line) 行 97 C++ chrome.dll!OmniboxEditModel::AcceptInput(WindowOpenDisposition disposition, bool for_drop) 行 539 C++ chrome.dll!OmniboxViewViews::HandleKeyEvent(views::Textfield * textfield, const ui::KeyEvent & event) 行 1170 C++ views.dll!views::Textfield::OnKeyPressed(const ui::KeyEvent & event) 行 711 C++ views.dll!views::View::OnKeyEvent(ui::KeyEvent * event) 行 1081 C++ events.dll!ui::EventHandler::OnEvent(ui::Event * event) 行 25 C++ events.dll!ui::EventDispatcher::DispatchEvent(ui::EventHandler * handler, ui::Event * event) 行 192 C++ events.dll!ui::EventDispatcher::ProcessEvent(ui::EventTarget * target, ui::Event * event) 行 140 C++ events.dll!ui::EventDispatcherDelegate::DispatchEventToTarget(ui::EventTarget * target, ui::Event * event) 行 87 C++ events.dll!ui::EventDispatcherDelegate::DispatchEvent(ui::EventTarget * target, ui::Event * event) 行 58 C++ events.dll!ui::EventProcessor::OnEventFromSource(ui::Event * event) 行 57 C++ events.dll!ui::EventSource::DeliverEventToSink(ui::Event * event) 行 107 C++ events.dll!ui::EventSource::SendEventToSinkFromRewriter(ui::Event * event, const ui::EventRewriter * rewriter) 行 86 C++ events.dll!ui::EventSource::SendEventToSink(ui::Event * event) 行 44 C++ views.dll!views::Widget::OnKeyEvent(ui::KeyEvent * event) 行 1169 C++ views.dll!views::DesktopNativeWidgetAura::OnKeyEvent(ui::KeyEvent * event) 行 1061 C++ events.dll!ui::EventHandler::OnEvent(ui::Event * event) 行 25 C++ events.dll!ui::EventDispatcher::DispatchEvent(ui::EventHandler * handler, ui::Event * event) 行 192 C++ events.dll!ui::EventDispatcher::ProcessEvent(ui::EventTarget * target, ui::Event * event) 行 140 C++ events.dll!ui::EventDispatcherDelegate::DispatchEventToTarget(ui::EventTarget * target, ui::Event * event) 行 87 C++ events.dll!ui::EventDispatcherDelegate::DispatchEvent(ui::EventTarget * target, ui::Event * event) 行 58 C++ events.dll!ui::EventProcessor::OnEventFromSource(ui::Event * event) 行 57 C++ aura.dll!aura::WindowTreeHost::DispatchKeyEventPostIME(ui::KeyEvent * event) 行 254 C++ ui_base_ime.dll!ui::InputMethodBase::DispatchKeyEventPostIME(ui::KeyEvent * event) 行 169 C++ ui_base_ime.dll!ui::InputMethodWin::ProcessUnhandledKeyEvent(ui::KeyEvent * event, const std::vector<tagMSG,std::allocator<tagMSG> > * char_msgs) 行 195 C++ ui_base_ime.dll!ui::InputMethodWin::DispatchKeyEvent(ui::KeyEvent * event) 行 179 C++ aura.dll!aura::WindowEventDispatcher::PreDispatchKeyEvent(ui::KeyEvent * event) 行 1076 C++ aura.dll!aura::WindowEventDispatcher::PreDispatchEvent(ui::EventTarget * target, ui::Event * event) 行 604 C++ events.dll!ui::EventDispatcherDelegate::DispatchEvent(ui::EventTarget * target, ui::Event * event) 行 55 C++ events.dll!ui::EventProcessor::OnEventFromSource(ui::Event * event) 行 57 C++ events.dll!ui::EventSource::DeliverEventToSink(ui::Event * event) 行 107 C++ events.dll!ui::EventSource::SendEventToSinkFromRewriter(ui::Event * event, const ui::EventRewriter * rewriter) 行 86 C++ events.dll!ui::EventSource::SendEventToSink(ui::Event * event) 行 44 C++ views.dll!views::DesktopWindowTreeHostWin::HandleKeyEvent(ui::KeyEvent * event) 行 888 C++ views.dll!views::HWNDMessageHandler::OnKeyEvent(unsigned int message, unsigned __int64 w_param, __int64 l_param) 行 1759 C++ views.dll!views::HWNDMessageHandler::_ProcessWindowMessage(HWND__ * hWnd, unsigned int uMsg, unsigned __int64 wParam, __int64 lParam, __int64 & lResult, unsigned long dwMsgMapID) 行 350 C++ views.dll!views::HWNDMessageHandler::OnWndProc(unsigned int message, unsigned __int64 w_param, __int64 l_param) 行 934 C++ gfx.dll!gfx::WindowImpl::WndProc(HWND__ * hwnd, unsigned int message, unsigned __int64 w_param, __int64 l_param) 行 303 C++ gfx.dll!base::win::WrappedWindowProc<&gfx::WindowImpl::WndProc>(HWND__ * hwnd, unsigned int message, unsigned __int64 wparam, __int64 lparam) 行 76 C++ [外部代码] base.dll!base::MessagePumpForUI::ProcessMessageHelper(const tagMSG & msg) 行 380 C++ base.dll!base::MessagePumpForUI::ProcessNextWindowsMessage() 行 348 C++ base.dll!base::MessagePumpForUI::DoRunLoop() 行 173 C++ base.dll!base::MessagePumpWin::Run(base::MessagePump::Delegate * delegate) 行 58 C++ base.dll!base::MessageLoop::Run(bool application_tasks_allowed) 行 273 C++ base.dll!base::RunLoop::Run() 行 105 C++ chrome.dll!ChromeBrowserMainParts::MainMessageLoopRun(int * result_code) 行 2155 C++ content.dll!content::BrowserMainLoop::RunMainMessageLoopParts() 行 978 C++ content.dll!content::BrowserMainRunnerImpl::Run() 行 170 C++ content.dll!content::BrowserMain(const content::MainFunctionParams & parameters, std::unique_ptr<content::BrowserProcessSubThread,std::default_delete<content::BrowserProcessSubThread> > service_manager_thread) 行 51 C++ content.dll!content::RunBrowserProcessMain(const content::MainFunctionParams & main_function_params, content::ContentMainDelegate * delegate, std::unique_ptr<content::BrowserProcessSubThread,std::default_delete<content::BrowserProcessSubThread> > service_manager_thread) 行 620 C++ content.dll!content::ContentMainRunnerImpl::Run() 行 964 C++ content.dll!content::ContentServiceManagerMainDelegate::RunEmbedderProcess() 行 53 C++ embedder.dll!service_manager::Main(const service_manager::MainParams & params) 行 459 C++ content.dll!content::ContentMain(const content::ContentMainParams & params) 行 20 C++ chrome.dll!ChromeMain(HINSTANCE__ * instance, sandbox::SandboxInterfaceInfo * sandbox_info, __int64 exe_entry_point_ticks) 行 101 C++ chrome.exe!MainDllLoader::Launch(HINSTANCE__ * instance, base::TimeTicks exe_entry_point_ticks) 行 201 C++ chrome.exe!wWinMain(HINSTANCE__ * instance, HINSTANCE__ * prev, wchar_t *, int) 行 277 C++ [外部代码]
不往下追了,通过单步,断点,调用链相结合,知道了从chromium浏览器的url输入栏输入url +回车,到建立buildin url 页面的过程。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。