// Copyright 2012 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef COMPONENTS_OMNIBOX_BROWSER_HISTORY_URL_PROVIDER_H_ #define COMPONENTS_OMNIBOX_BROWSER_HISTORY_URL_PROVIDER_H_ #include <stddef.h> #include <memory> #include <string> #include <vector> #include "base/compiler_specific.h" #include "base/gtest_prod_util.h" #include "base/memory/raw_ptr.h" #include "base/memory/ref_counted.h" #include "base/synchronization/atomic_flag.h" #include "base/threading/thread_checker.h" #include "components/omnibox/browser/autocomplete_input.h" #include "components/omnibox/browser/history_match.h" #include "components/omnibox/browser/history_provider.h" #include "components/omnibox/browser/omnibox_field_trial.h" #include "components/search_engines/template_url.h" class AutocompleteProviderListener; class SearchTermsData; namespace base { class SequencedTaskRunner; } namespace history { class HistoryBackend; class URLDatabase; } // namespace history // How history autocomplete works // ============================== // // Read down this diagram for temporal ordering. // // Main thread History thread // ----------- -------------- // AutocompleteController::Start // -> HistoryURLProvider::Start // -> VerbatimMatchForInput // [params_ allocated] // -> DoAutocomplete (for inline autocomplete) // -> URLDatabase::AutocompleteForPrefix (on in-memory DB) // -> HistoryService::ScheduleAutocomplete // (return to controller) ---- // / // HistoryBackend::ScheduleAutocomplete // -> HistoryURLProvider::ExecuteWithDB // -> DoAutocomplete // -> URLDatabase::AutocompleteForPrefix // / // HistoryService::QueryComplete // [params_ destroyed] // -> AutocompleteProviderListener::OnProviderUpdate // // The autocomplete controller calls us, and must be called back, on the main // thread. When called, we run two autocomplete passes. The first pass runs // synchronously on the main thread and queries the in-memory URL database. // This pass promotes matches for inline autocomplete if applicable. We do // this synchronously so that users get consistent behavior when they type // quickly and hit enter, no matter how loaded the main history database is. // Doing this synchronously also prevents inline autocomplete from being // "flickery" in the AutocompleteEdit. Because the in-memory DB does not have // redirect data, results other than the top match might change between the // two passes, so we can't just decide to use this pass' matches as the final // results. // // The second autocomplete pass uses the full history database, which must be // queried on the history thread. Start() asks the history service schedule to // callback on the history thread with a pointer to the main database. When we // are done doing queries, we schedule a task on the main thread that notifies // the AutocompleteController that we're done. // // The communication between these threads is done using a // HistoryURLProviderParams object. This is allocated in the main thread, and // normally deleted in QueryComplete(). So that both autocomplete passes can // use the same code, we also use this to hold results during the first // autocomplete pass. // // While the second pass is running, the AutocompleteController may cancel the // request. This can happen frequently when the user is typing quickly. In // this case, the main thread sets params_->cancel, which the background thread // checks periodically. If it finds the flag set, it stops what it's doing // immediately and calls back to the main thread. (We don't delete the params // on the history thread, because we should only do that when we can safely // NULL out params_, and that must be done on the main thread.) // Used to communicate autocomplete parameters between threads via the history // service. struct HistoryURLProviderParams { … }; // This class is an autocomplete provider and is also a pseudo-internal // component of the history system. See comments above. class HistoryURLProvider : public HistoryProvider { … }; #endif // COMPONENTS_OMNIBOX_BROWSER_HISTORY_URL_PROVIDER_H_