OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 This file provides a class that can be used to open URLs based | 6 * @fileoverview This file provides a class that can be used to open URLs based |
7 * on user interactions. It ensures a consistent behavior when it comes to | 7 * on user interactions. It ensures a consistent behavior when it comes to |
8 * holding down Ctrl and Shift while clicking or activating the a link. | 8 * holding down Ctrl and Shift while clicking or activating the a link. |
9 * | 9 * |
10 * This depends on the {@code chrome.windows} and {@code chrome.tabs} | 10 * This depends on the {@code chrome.windows} and {@code chrome.tabs} |
(...skipping 28 matching lines...) Expand all Loading... |
39 * Opens the link in a new window. | 39 * Opens the link in a new window. |
40 * | 40 * |
41 * On Mac, uses Command instead of Ctrl. | 41 * On Mac, uses Command instead of Ctrl. |
42 * For keyboard support you need to use keydown. | 42 * For keyboard support you need to use keydown. |
43 * | 43 * |
44 * @param {!LoadTimeData} localStrings The local strings object which is used | 44 * @param {!LoadTimeData} localStrings The local strings object which is used |
45 * to localize the warning prompt in case the user tries to open a lot of | 45 * to localize the warning prompt in case the user tries to open a lot of |
46 * links. | 46 * links. |
47 * @constructor | 47 * @constructor |
48 */ | 48 */ |
49 function LinkController(localStrings) { | 49 function LinkController(localStrings) { this.localStrings_ = localStrings; } |
50 this.localStrings_ = localStrings; | |
51 } | |
52 | 50 |
53 LinkController.prototype = { | 51 LinkController.prototype = { |
54 /** | 52 /** |
55 * The number of links that can be opened before showing a warning confirm | 53 * The number of links that can be opened before showing a warning confirm |
56 * message. | 54 * message. |
57 */ | 55 */ |
58 warningLimit: 15, | 56 warningLimit: 15, |
59 | 57 |
60 /** | 58 /** |
61 * The DOM window that we want to open links into in case we are opening | 59 * The DOM window that we want to open links into in case we are opening |
(...skipping 16 matching lines...) Expand all Loading... |
78 * Open an URL from a mouse or keyboard event. | 76 * Open an URL from a mouse or keyboard event. |
79 * @param {string} url The URL to open. | 77 * @param {string} url The URL to open. |
80 * @param {!Event} e The event triggering the opening of the URL. | 78 * @param {!Event} e The event triggering the opening of the URL. |
81 */ | 79 */ |
82 openUrlFromEvent: function(url, e) { | 80 openUrlFromEvent: function(url, e) { |
83 // We only support keydown Enter and non right click events. | 81 // We only support keydown Enter and non right click events. |
84 if (e.type == 'keydown' && e.key == 'Enter' || e.button != 2) { | 82 if (e.type == 'keydown' && e.key == 'Enter' || e.button != 2) { |
85 var kind; | 83 var kind; |
86 var ctrl = cr.isMac && e.metaKey || !cr.isMac && e.ctrlKey; | 84 var ctrl = cr.isMac && e.metaKey || !cr.isMac && e.ctrlKey; |
87 | 85 |
88 if (e.button == 1 || ctrl) // middle, ctrl or keyboard | 86 if (e.button == 1 || ctrl) // middle, ctrl or keyboard |
89 kind = e.shiftKey ? cr.LinkKind.FOREGROUND_TAB : | 87 kind = e.shiftKey ? cr.LinkKind.FOREGROUND_TAB : |
90 cr.LinkKind.BACKGROUND_TAB; | 88 cr.LinkKind.BACKGROUND_TAB; |
91 else // left or keyboard | 89 else // left or keyboard |
92 kind = e.shiftKey ? cr.LinkKind.WINDOW : cr.LinkKind.SELF; | 90 kind = e.shiftKey ? cr.LinkKind.WINDOW : cr.LinkKind.SELF; |
93 | 91 |
94 this.openUrls([url], kind); | 92 this.openUrls([url], kind); |
95 } | 93 } |
96 }, | 94 }, |
97 | 95 |
98 | 96 |
99 /** | 97 /** |
100 * Opens a URL in a new tab, window or incognito window. | 98 * Opens a URL in a new tab, window or incognito window. |
101 * @param {string} url The URL to open. | 99 * @param {string} url The URL to open. |
102 * @param {cr.LinkKind} kind The kind of open we want to do. | 100 * @param {cr.LinkKind} kind The kind of open we want to do. |
103 */ | 101 */ |
104 openUrl: function(url, kind) { | 102 openUrl: function(url, kind) { this.openUrls([url], kind); }, |
105 this.openUrls([url], kind); | |
106 }, | |
107 | 103 |
108 /** | 104 /** |
109 * Opens URLs in new tab, window or incognito mode. | 105 * Opens URLs in new tab, window or incognito mode. |
110 * @param {!Array<string>} urls The URLs to open. | 106 * @param {!Array<string>} urls The URLs to open. |
111 * @param {cr.LinkKind} kind The kind of open we want to do. | 107 * @param {cr.LinkKind} kind The kind of open we want to do. |
112 */ | 108 */ |
113 openUrls: function(urls, kind) { | 109 openUrls: function(urls, kind) { |
114 if (urls.length < 1) | 110 if (urls.length < 1) |
115 return; | 111 return; |
116 | 112 |
117 if (urls.length > this.warningLimit) { | 113 if (urls.length > this.warningLimit) { |
118 if (!this.window.confirm(this.getWarningMessage(urls.length))) | 114 if (!this.window.confirm(this.getWarningMessage(urls.length))) |
119 return; | 115 return; |
120 } | 116 } |
121 | 117 |
122 // Fix '#124' URLs since opening those in a new window does not work. We | 118 // Fix '#124' URLs since opening those in a new window does not work. We |
123 // prepend the base URL when we encounter those. | 119 // prepend the base URL when we encounter those. |
124 var base = this.window.location.href.split('#')[0]; | 120 var base = this.window.location.href.split('#')[0]; |
125 urls = urls.map(function(url) { | 121 urls = |
126 return url[0] == '#' ? base + url : url; | 122 urls.map(function(url) { return url[0] == '#' ? base + url : url; }); |
127 }); | |
128 | 123 |
129 var incognito = kind == cr.LinkKind.INCOGNITO; | 124 var incognito = kind == cr.LinkKind.INCOGNITO; |
130 if (kind == cr.LinkKind.WINDOW || incognito) { | 125 if (kind == cr.LinkKind.WINDOW || incognito) { |
131 chrome.windows.create({ | 126 chrome.windows.create({url: urls, incognito: incognito}); |
132 url: urls, | 127 } else if ( |
133 incognito: incognito | 128 kind == cr.LinkKind.FOREGROUND_TAB || |
134 }); | 129 kind == cr.LinkKind.BACKGROUND_TAB) { |
135 } else if (kind == cr.LinkKind.FOREGROUND_TAB || | |
136 kind == cr.LinkKind.BACKGROUND_TAB) { | |
137 urls.forEach(function(url, i) { | 130 urls.forEach(function(url, i) { |
138 chrome.tabs.create({ | 131 chrome.tabs.create( |
139 url: url, | 132 {url: url, selected: kind == cr.LinkKind.FOREGROUND_TAB && !i}); |
140 selected: kind == cr.LinkKind.FOREGROUND_TAB && !i | |
141 }); | |
142 }); | 133 }); |
143 } else { | 134 } else { |
144 this.window.location.href = urls[0]; | 135 this.window.location.href = urls[0]; |
145 } | 136 } |
146 } | 137 } |
147 }; | 138 }; |
148 | 139 |
149 // Export | 140 // Export |
150 return { | 141 return { |
151 LinkController: LinkController, | 142 LinkController: LinkController, |
152 }; | 143 }; |
153 }); | 144 }); |
OLD | NEW |