File: background.js

package info (click to toggle)
chromium 139.0.7258.127-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 6,122,068 kB
  • sloc: cpp: 35,100,771; ansic: 7,163,530; javascript: 4,103,002; python: 1,436,920; asm: 946,517; xml: 746,709; pascal: 187,653; perl: 88,691; sh: 88,436; objc: 79,953; sql: 51,488; cs: 44,583; fortran: 24,137; makefile: 22,147; tcl: 15,277; php: 13,980; yacc: 8,984; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (116 lines) | stat: -rw-r--r-- 3,857 bytes parent folder | download | duplicates (11)
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
111
112
113
114
115
116
// Copyright 2017 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// lineNumber defaults to 1 if it doesn't parse as an int or is zero.
function openFile(filepath, lineNumber) {
  lineNumber = parseInt(lineNumber);
  if (!lineNumber)
    lineNumber = 1;
  fetch('http://127.0.0.1:8989/file?f=' + filepath + '&l=' + lineNumber);
}

function openFiles(filepaths) {
  fetch('http://127.0.0.1:8989/files?f=' + filepaths.join(',,'));
}

function openByLink(info, tabId) {
  let pageHostname = new URL(info.pageUrl).hostname;
  let linkUrl = new URL(info.linkUrl);

  if (pageHostname == 'chromium-review.googlesource.com') {
    chrome.tabs.sendMessage(tabId, 'getFile', (res) => {
      return res && res.file && openFile(res.file);
    });
  } else if (pageHostname == 'cs.chromium.org') {
    let match = linkUrl.pathname.match(/^\/chromium\/src\/(.*)/);
    let line = linkUrl.searchParams.get('l');
    if (match)
      openFile(match[1], line);
  } else if (pageHostname == 'codereview.chromium.org') {
    // 'patch' links don't contain the filename so we query the page.
    if (linkUrl.pathname.match(/^\/\d+\/patch\//)) {
      chrome.tabs.sendMessage(tabId, 'getFile', (res) => {
        if (res.file)
          openFile(res.file);
      });
      return;
    }

    // See if it's a 'diff' link with the filename in the pathname.
    let match = linkUrl.pathname.match(/^\/\d+\/diff\/\d+\/(.*)/);
    if (!match)
      return;
    filepath = match[1];

    // Comment links may have the line number in the hash component.
    let line = linkUrl.hash.replace(/#newcode/, '')
    openFile(filepath, line);
  }
}

function csOpenCurrentFile(tabId, pageUrl) {
  chrome.tabs.sendMessage(tabId, 'getLine', (res) => {
    let filepath = pageUrl.pathname.replace(/\/chromium\/src\//, '');
    // If we couldn't get the line number by inspecting the clicked element,
    // try to get it from the query params.
    let line = res.line ? res.line : pageUrl.searchParams.get('l');
    openFile(filepath, line);
  });
}

function crOpenAllInPatchset(tabId) {
  chrome.tabs.sendMessage(tabId, 'getFiles', (res) => {
    return res && res.files && openFiles(res.files);
  });
}

chrome.contextMenus.onClicked.addListener((info, tab) => {
  if (info.menuItemId == 'ome-selection') {
    openFile(info.selectionText.replace(/\s*/g, ''));
  } else if (info.menuItemId == 'ome-link') {
    openByLink(info, tab.id);
  } else if (info.menuItemId == 'ome') {
    let pageUrl = new URL(info.pageUrl);
    if (pageUrl.hostname == 'cs.chromium.org') {
      csOpenCurrentFile(tab.id, pageUrl);
    } else if (pageUrl.hostname == 'codereview.chromium.org') {
      crOpenAllInPatchset(tab.id);
    } else if (pageUrl.hostname == 'chromium-review.googlesource.com') {
      crOpenAllInPatchset(tab.id);
    }
  }
});

chrome.runtime.onInstalled.addListener(() => {
  chrome.contextMenus.create({
    'title': 'Open My Editor',
    'id': 'ome',
    'contexts': ['page'],
    'documentUrlPatterns': [
      'https://cs.chromium.org/chromium/src/*',
      'https://codereview.chromium.org/*',
      'https://chromium-review.googlesource.com/*'
    ]
  });
  chrome.contextMenus.create({
    'title': 'Open My Editor by Link',
    'id': 'ome-link',
    'contexts': ['link'],
    'documentUrlPatterns': [
      'https://cs.chromium.org/*',
      'https://codereview.chromium.org/*',
      'https://chromium-review.googlesource.com/*'
    ]
  });
  chrome.contextMenus.create({
    'title': 'Open My Editor for "%s"',
    'id': 'ome-selection',
    'contexts': ['selection'],
    'documentUrlPatterns': [
      // TODO(chaopeng) Should be only except CS and CR, But I dont know how to.
      // So only list the sites here.
      'https://build.chromium.org/*', 'https://chromium.org/*'
    ]
  });
});