chrome.omnibox在一段时间后停止工作。重新启动扩展后开始工作

时间:2014-03-05 00:49:53

标签: google-chrome google-chrome-extension

我在我的扩展程序中利用了Google Chrome的omnibox API

当前的用户,包括我自己,已经注意到多功能框在完成一个未确定状态或一段时间后完全停止响应。键入单词以触发进入" omnibox"停止有任何效果,URL栏不会转换为多功能框模式。

重新启动Google Chrome并不能解决问题,但通过取消选中然后重新检查已启用的'来重新启动我的插件。 chrome://扩展程序上的复选框确实解决了问题。

有人对调查内容有任何建议吗?以下是使用的代码。它只通过我永久保留的背景页面加载一次:

//  Displays streamus search suggestions and allows instant playing in the stream
define([
    'background/collection/streamItems',
    'background/model/video',
    'common/model/youTubeV2API',
    'common/model/utility'
], function (StreamItems, Video, YouTubeV2API, Utility) {
    'use strict';

    console.log("Omnibox LOADED", chrome.omnibox);

    var Omnibox = Backbone.Model.extend({

        defaults: function () {
            return {
                suggestedVideos: [],
                searchJqXhr: null
            };
        },

        initialize: function () {
            console.log("Omnibox INITIALIZED");
            var self = this;

            chrome.omnibox.setDefaultSuggestion({
                //  TODO: i18n
                description: 'Press enter to play.'
            });

            //  User has started a keyword input session by typing the extension's keyword. This is guaranteed to be sent exactly once per input session, and before any onInputChanged events.
            chrome.omnibox.onInputChanged.addListener(function (text, suggest) {

                //  Clear suggested videos
                self.get('suggestedVideos').length = 0;

                var trimmedSearchText = $.trim(text);

                //  Clear suggestions if there is no text.
                if (trimmedSearchText === '') {
                    suggest();
                } else {

                    //  Do not display results if searchText was modified while searching, abort old request.
                    var previousSearchJqXhr = self.get('searchJqXhr');

                    if (previousSearchJqXhr) {
                        previousSearchJqXhr.abort();
                        self.set('searchJqXhr', null);
                    }

                    var searchJqXhr = YouTubeV2API.search({
                        text: trimmedSearchText,
                        //  Omnibox can only show 6 results
                        maxResults: 6,
                        success: function(videoInformationList) {
                            self.set('searchJqXhr', null);

                            var suggestions = self.buildSuggestions(videoInformationList, trimmedSearchText);

                            suggest(suggestions);

                        }
                    });

                    self.set('searchJqXhr', searchJqXhr);
                }

            });

            chrome.omnibox.onInputEntered.addListener(function (text) {

                //  Find the cached video data by url
                var pickedVideo = _.find(self.get('suggestedVideos'), function(suggestedVideo) {
                    return suggestedVideo.get('url') === text;
                });

                //  If the user doesn't make a selection (commonly when typing and then just hitting enter on their query)
                //  take the best suggestion related to their text.
                if (pickedVideo === undefined) {
                    pickedVideo = self.get('suggestedVideos')[0];
                }

                StreamItems.addByVideo(pickedVideo, true);

            });

        },

        buildSuggestions: function(videoInformationList, text) {
            var self = this;

            var suggestions = _.map(videoInformationList, function (videoInformation) {

                var video = new Video({
                    videoInformation: videoInformation
                });
                self.get('suggestedVideos').push(video);

                var safeTitle = _.escape(video.get('title'));
                var textStyleRegExp = new RegExp(Utility.escapeRegExp(text), "i");
                var styledTitle = safeTitle.replace(textStyleRegExp, '<match>$&</match>');

                var description = '<dim>' + video.get('prettyDuration') + "</dim>  " + styledTitle;

                return {
                    content: video.get('url'),
                    description: description
                };
            });

            return suggestions;
        }
    });

    return new Omnibox();
});

据我所知,代码本身很好,对我是否看到多功能框不会有任何影响。

您可以在此处找到完整的源代码:https://github.com/MeoMix/StreamusChromeExtension/blob/master/src/js/background/model/omnibox.js

0 个答案:

没有答案