| 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 |