') > -1) {
+ content = match;
+ break;
+ }
+ }
+
+ // Replace any extraneous whitespace to make it look nicer.
+ content = content.replace(/[\n\t]/g, ' ');
+ content = content.replace(/ {2,}/g, ' ');
+
+ // Codesearch wraps the result in tags. Remove those if they're
+ // still there.
+ content = content.replace(/<\/?pre>/g, '');
+
+ // Codesearch highlights the matches with 'b' tags. Replaces those
+ // with 'match'.
+ content = content.replace(/<(\/)?b>/g, '<$1match>');
+
+ description += ' ' + content;
+ }
+
+ results.push({
+ content: path + '@' + line,
+ description: description
+ });
+ }
+
+ suggest(results);
+ });
+ }
+);
+
+/**
+ * 更新下拉框中提示
+ * @param String text 用户输入文本
+ */
+function updateDefaultSuggestion(text) {
+
+ var description = [
+ '搜索方式',
+ ' [ ',
+ '' /* 文字搜索 显示文字占位 */
+ ];
+
+ // 如果用户输入不为空,先假设为文字搜索,如果后面匹配上了其他搜索方式,则更新
+ let isPlaintext = !!text.trim().length;
+ currentSearchModeIndex = 0; // 初始化搜索方式下标s
+
+ // 默认第 0 个为文字搜索,除此之外的搜索方式如果都没有匹配到,则显示文字搜索
+ for (var i = 1, keyword; i < omniboxSearchModes.length && (keyword = omniboxSearchModes[i]); i++) {
+ // 分隔符
+ description.push(' \| ');
+
+ // 通过用户输入文本匹配搜索方式
+ if (keyword.match(text)) {
+ // 是当前这种搜索模式
+ isPlaintext = false; // 说明不是文字搜索
+ currentSearchModeIndex = i; // 记录当前搜索模式的下标
+ description.push('' + keyword.showText + ':' + keyword.getInputText(text) + '');
+ } else {
+ // 不是当前这种搜索模式
+ description.push('' + keyword.key + ": " + keyword.showText + '');
+ }
+ }
+ description.push(' ] ');
+
+ description[2] = isPlaintext ? ('' + text.trim() + '') : ('' + omniboxSearchModes[0].showText + '');
+
+ chrome.omnibox.setDefaultSuggestion({
+ description: description.join('')
+ });
+
+ // var isRegex = /^re:/.test(text);
+ // var isFile = /^file:/.test(text);
+ // var isHalp = (text == 'halp');
+ // var isPlaintext = text.length && !isRegex && !isFile && !isHalp;
+
+ // var description = '搜索方式 [ ';
+ // description += isPlaintext ? ('' + text + '') : '文字';
+ // description += ' | ';
+ // description += isRegex ? ('' + text + '') : 're: 正则';
+ // description += ' | ';
+ // description += isFile ? ('' + text + '') : 'file:文件';
+ // description += ' | ';
+ // description += isHalp ? 'halp' : 'halp';
+ // description += ' ]';
+
+ // chrome.omnibox.setDefaultSuggestion({
+ // description: description
+ // });
+}
+
+/**
+ * 用户开始输入文本
+ */
+chrome.omnibox.onInputStarted.addListener(function () {
+ updateDefaultSuggestion('');
+});
+
+/**
+ * 搜索框失去焦点
+ */
+chrome.omnibox.onInputCancelled.addListener(function () {
+ updateDefaultSuggestion('');
+});
+
+/**
+ * 执行搜索
+ * @param {*} query
+ * @param {*} callback
+ * @returns
+ */
+function search(query, callback) {
+ if (/^re:/.test(query))
+ query = query.substring('re:'.length);
+ else if (/^file:/.test(query))
+ query = 'file:"' + query.substring('file:'.length) + '"';
+ else
+ query = '"' + query + '"';
+
+ var url = "https://code.google.com/p/chromium/codesearch#search/&type=cs&q=" + query +
+ "&exact_package=chromium&type=cs";
+ var req = new XMLHttpRequest();
+ req.open("GET", url, true);
+ req.setRequestHeader("GData-Version", "2");
+ req.onreadystatechange = function () {
+ if (req.readyState == 4) {
+ callback(req.responseXML);
+ }
+ }
+ req.send(null);
+ return req;
+}
+
+/**
+ * 将当前标签页导航到指定Url / 或者新建标签页
+ *
+ * @param String url 要导航到的url
+ * @param bool newTab 是否打开新标签页
+ */
+function navigate(url, newTab = false) {
+ chrome.tabs.query({ active: true, currentWindow: true }, function (tabs) {
+ if (!newTab) {
+ chrome.tabs.update(tabs[0].id, { url: url });
+ } else {
+ chrome.tabs.create({ url: url });
+ }
+ });
+}
+
+/**
+ * 用户输入完成,按下回车键
+ */
+chrome.omnibox.onInputEntered.addListener(function (text) {
+ alert(text)
+ navigate("https://www.baidu.com/s?wd=" + text)
+ return
+ if (/@\d+\b/.test(text)) {
+ var chunks = text.split('@');
+ var path = chunks[0];
+ var line = chunks[1];
+ navigate(getUrl(path, line));
+ } else if (text == 'halp') {
+ // TODO(aa)
+ } else {
+ navigate("https://code.google.com/p/chromium/codesearch#search/&type=cs" +
+ "&q=" + text +
+ "&exact_package=chromium&type=cs");
+ }
+});