OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 /** | 5 /** |
6 * @fileoverview Provides a representation of a web request sender, and | 6 * @fileoverview Provides a representation of a web request sender, and |
7 * utility functions for creating them. | 7 * utility functions for creating them. |
8 */ | 8 */ |
9 'use strict'; | 9 'use strict'; |
10 | 10 |
(...skipping 11 matching lines...) Expand all Loading... |
22 * tab. | 22 * tab. |
23 * @param {MessageSender} messageSender The message sender. | 23 * @param {MessageSender} messageSender The message sender. |
24 * @return {?WebRequestSender} The sender's origin and tab, or null if the | 24 * @return {?WebRequestSender} The sender's origin and tab, or null if the |
25 * sender is invalid. | 25 * sender is invalid. |
26 */ | 26 */ |
27 function createSenderFromMessageSender(messageSender) { | 27 function createSenderFromMessageSender(messageSender) { |
28 var origin = getOriginFromUrl(/** @type {string} */ (messageSender.url)); | 28 var origin = getOriginFromUrl(/** @type {string} */ (messageSender.url)); |
29 if (!origin) { | 29 if (!origin) { |
30 return null; | 30 return null; |
31 } | 31 } |
32 var sender = { | 32 var sender = {origin: origin}; |
33 origin: origin | |
34 }; | |
35 if (messageSender.tlsChannelId) { | 33 if (messageSender.tlsChannelId) { |
36 sender.tlsChannelId = messageSender.tlsChannelId; | 34 sender.tlsChannelId = messageSender.tlsChannelId; |
37 } | 35 } |
38 if (messageSender.tab) { | 36 if (messageSender.tab) { |
39 sender.tabId = messageSender.tab.id; | 37 sender.tabId = messageSender.tab.id; |
40 } | 38 } |
41 return sender; | 39 return sender; |
42 } | 40 } |
43 | 41 |
44 /** | 42 /** |
(...skipping 23 matching lines...) Expand all Loading... |
68 function getTabIdWhenPossible(sender) { | 66 function getTabIdWhenPossible(sender) { |
69 if (sender.tabId) { | 67 if (sender.tabId) { |
70 // Already got it? Done. | 68 // Already got it? Done. |
71 return Promise.resolve(true); | 69 return Promise.resolve(true); |
72 } else if (!chrome.tabs) { | 70 } else if (!chrome.tabs) { |
73 // Can't get it? Done. (This happens to packaged apps, which can't access | 71 // Can't get it? Done. (This happens to packaged apps, which can't access |
74 // chrome.tabs.) | 72 // chrome.tabs.) |
75 return Promise.resolve(true); | 73 return Promise.resolve(true); |
76 } else { | 74 } else { |
77 return new Promise(function(resolve, reject) { | 75 return new Promise(function(resolve, reject) { |
78 chrome.tabs.query({active: true, lastFocusedWindow: true}, | 76 chrome.tabs.query( |
79 function(tabs) { | 77 {active: true, lastFocusedWindow: true}, function(tabs) { |
80 if (!tabs.length) { | 78 if (!tabs.length) { |
81 // Safety check. | 79 // Safety check. |
82 reject(false); | 80 reject(false); |
83 return; | 81 return; |
84 } | 82 } |
85 var tab = tabs[0]; | 83 var tab = tabs[0]; |
86 tabMatchesOrigin(tab, sender.origin).then(function(tabId) { | 84 tabMatchesOrigin(tab, sender.origin) |
87 sender.tabId = tabId; | 85 .then( |
88 resolve(true); | 86 function(tabId) { |
89 }, function() { | 87 sender.tabId = tabId; |
90 // Didn't match? Check if the debugger is open. | 88 resolve(true); |
91 if (tab.url.indexOf('chrome-devtools://') != 0) { | 89 }, |
92 reject(false); | 90 function() { |
93 return; | 91 // Didn't match? Check if the debugger is open. |
94 } | 92 if (tab.url.indexOf('chrome-devtools://') != 0) { |
95 // Debugger active: find first tab with the sender's origin. | 93 reject(false); |
96 chrome.tabs.query({active: true}, function(tabs) { | 94 return; |
97 if (!tabs.length) { | 95 } |
98 // Safety check. | 96 // Debugger active: find first tab with the sender's |
99 reject(false); | 97 // origin. |
100 return; | 98 chrome.tabs.query({active: true}, function(tabs) { |
101 } | 99 if (!tabs.length) { |
102 var numRejected = 0; | 100 // Safety check. |
103 for (var i = 0; i < tabs.length; i++) { | 101 reject(false); |
104 tab = tabs[i]; | 102 return; |
105 tabMatchesOrigin(tab, sender.origin).then(function(tabId) { | 103 } |
106 sender.tabId = tabId; | 104 var numRejected = 0; |
107 resolve(true); | 105 for (var i = 0; i < tabs.length; i++) { |
108 }, function() { | 106 tab = tabs[i]; |
109 if (++numRejected >= tabs.length) { | 107 tabMatchesOrigin(tab, sender.origin) |
110 // None matches: reject. | 108 .then( |
111 reject(false); | 109 function(tabId) { |
112 } | 110 sender.tabId = tabId; |
113 }); | 111 resolve(true); |
114 } | 112 }, |
115 }); | 113 function() { |
116 }); | 114 if (++numRejected >= tabs.length) { |
| 115 // None matches: reject. |
| 116 reject(false); |
| 117 } |
| 118 }); |
| 119 } |
| 120 }); |
| 121 }); |
117 }); | 122 }); |
118 }); | 123 }); |
119 } | 124 } |
120 } | 125 } |
121 | 126 |
122 /** | 127 /** |
123 * Checks whether the given tab is in the foreground, i.e. is the active tab | 128 * Checks whether the given tab is in the foreground, i.e. is the active tab |
124 * of the focused window. | 129 * of the focused window. |
125 * @param {number} tabId The tab id to check. | 130 * @param {number} tabId The tab id to check. |
126 * @return {Promise<boolean>} A promise for the result of the check. | 131 * @return {Promise<boolean>} A promise for the result of the check. |
127 */ | 132 */ |
128 function tabInForeground(tabId) { | 133 function tabInForeground(tabId) { |
129 return new Promise(function(resolve, reject) { | 134 return new Promise(function(resolve, reject) { |
130 if (!chrome.tabs || !chrome.tabs.get) { | 135 if (!chrome.tabs || !chrome.tabs.get) { |
131 reject(); | 136 reject(); |
| 137 return; |
| 138 } |
| 139 if (!chrome.windows || !chrome.windows.get) { |
| 140 reject(); |
| 141 return; |
| 142 } |
| 143 chrome.tabs.get(tabId, function(tab) { |
| 144 if (chrome.runtime.lastError) { |
| 145 resolve(false); |
132 return; | 146 return; |
133 } | 147 } |
134 if (!chrome.windows || !chrome.windows.get) { | 148 if (!tab.active) { |
135 reject(); | 149 resolve(false); |
136 return; | 150 return; |
137 } | 151 } |
138 chrome.tabs.get(tabId, function(tab) { | 152 chrome.windows.get(tab.windowId, function(aWindow) { |
139 if (chrome.runtime.lastError) { | 153 resolve(aWindow && aWindow.focused); |
140 resolve(false); | 154 }); |
141 return; | 155 }); |
142 } | |
143 if (!tab.active) { | |
144 resolve(false); | |
145 return; | |
146 } | |
147 chrome.windows.get(tab.windowId, function(aWindow) { | |
148 resolve(aWindow && aWindow.focused); | |
149 }); | |
150 }); | |
151 }); | 156 }); |
152 } | 157 } |
OLD | NEW |