aboutsummaryrefslogtreecommitdiffstats
path: root/js/utils.js
blob: 0b534dee00fa38a51092305f446748c536bd7b9a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
/*******************************************************************************

    µBlock - a Chromium browser extension to block requests.
    Copyright (C) 2014 Raymond Hill

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see {http://www.gnu.org/licenses/}.

    Home: https://github.com/gorhill/uBlock
*/

/* global chrome, µBlock */

/******************************************************************************/

// This will inserted as a module in the µBlock object.

µBlock.utils = (function() {

/******************************************************************************/

var gotoURL = function(details) {
    if ( details.tabId ) {
        chrome.tabs.update(details.tabId, { url: details.url });
    } else {
        chrome.tabs.create({ url: details.url });
    }
};

/******************************************************************************/

var gotoExtensionURL = function(url) {

    var hasQuery = function(url) {
        return url.indexOf('?') >= 0;
    };

    var removeQuery = function(url) {
        var pos = url.indexOf('?');
        if ( pos < 0 ) {
            return url;
        }
        return url.slice(0, pos);
    };
    var removeFragment = function(url) {
        var pos = url.indexOf('#');
        if ( pos < 0 ) {
            return url;
        }
        return url.slice(0, pos);
    };

    var tabIndex = 9999;
    var targetUrl = chrome.extension.getURL(url);

    var currentWindow = function(tabs) {
        var updateProperties = { active: true };
        var i = tabs.length;
        while ( i-- ) {
            if ( removeQuery(tabs[i].url) !== removeQuery(targetUrl) ) {
                continue;
            }
            // If current tab in dashboard is different, force the new one, if
            // there is one, to be activated.
            if ( tabs[i].url !== targetUrl ) {
                updateProperties.url = targetUrl;
            }
            chrome.tabs.update(tabs[i].id, updateProperties);
            return;
        }
        chrome.tabs.create({ 'url': targetUrl, index: tabIndex + 1 });
    };

    var currentTab = function(tabs) {
        if ( tabs.length ) {
            tabIndex = tabs[0].index;
        }
        chrome.tabs.query({ currentWindow: true }, currentWindow);
    };

    // https://github.com/gorhill/httpswitchboard/issues/150
    // Logic:
    // - If URL is already opened in a tab, just activate tab
    // - Otherwise find the current active tab and open in a tab immediately
    //   to the right of the active tab
    chrome.tabs.query({ active: true }, currentTab);
};

/******************************************************************************/

return {
    gotoURL: gotoURL,
    gotoExtensionURL: gotoExtensionURL
};

/******************************************************************************/

})();

/******************************************************************************/