chromium/chrome/browser/resources/downloads/search_service.ts

// Copyright 2015 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import {loadTimeData} from 'chrome://resources/js/load_time_data.js';

import {BrowserProxy} from './browser_proxy.js';
import type {PageHandlerInterface} from './downloads.mojom-webui.js';

export class SearchService {
  private searchTerms_: string[] = [];
  private mojoHandler_: PageHandlerInterface =
      BrowserProxy.getInstance().handler;

  /**
   * @param searchText Input typed by the user into a search box.
   * @return A list of terms extracted from |searchText|.
   */
  static splitTerms(searchText: string): string[] {
    // Split quoted terms (e.g., 'The "lazy" dog' => ['The', 'lazy', 'dog']).
    return searchText.split(/"([^"]*)"/).map(s => s.trim()).filter(s => !!s);
  }

  /** Instructs the browser to clear all finished downloads. */
  clearAll() {
    if (loadTimeData.getBoolean('allowDeletingHistory')) {
      this.mojoHandler_.clearAll();
      this.search('');
    }
  }

  /** Loads more downloads with the current search terms. */
  loadMore() {
    this.mojoHandler_.getDownloads(this.searchTerms_);
  }

  /**
   * @return Whether the user is currently searching for downloads
   *     (i.e. has a non-empty search term).
   */
  isSearching(): boolean {
    return this.searchTerms_.length > 0;
  }

  /**
   * @param searchText What to search for.
   * @return Whether |searchText| resulted in new search terms.
   */
  search(searchText: string): boolean {
    const searchTerms = SearchService.splitTerms(searchText);
    let sameTerms = searchTerms.length === this.searchTerms_.length;

    for (let i = 0; sameTerms && i < searchTerms.length; ++i) {
      if (searchTerms[i] !== this.searchTerms_[i]) {
        sameTerms = false;
      }
    }

    if (sameTerms) {
      return false;
    }

    this.searchTerms_ = searchTerms;
    this.loadMore();
    return true;
  }

  static getInstance(): SearchService {
    return instance || (instance = new SearchService());
  }

  static setInstance(obj: SearchService) {
    instance = obj;
  }
}

let instance: SearchService|null = null;