Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (C) 2000 Harri Porten (porten@kde.org) | 2 * Copyright (C) 2000 Harri Porten (porten@kde.org) |
| 3 * Copyright (C) 2006 Jon Shier (jshier@iastate.edu) | 3 * Copyright (C) 2006 Jon Shier (jshier@iastate.edu) |
| 4 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2010 Apple Inc. All rights resev ed. | 4 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2010 Apple Inc. All rights resev ed. |
| 5 * Copyright (C) 2006 Alexey Proskuryakov (ap@webkit.org) | 5 * Copyright (C) 2006 Alexey Proskuryakov (ap@webkit.org) |
| 6 * | 6 * |
| 7 * This library is free software; you can redistribute it and/or | 7 * This library is free software; you can redistribute it and/or |
| 8 * modify it under the terms of the GNU Lesser General Public | 8 * modify it under the terms of the GNU Lesser General Public |
| 9 * License as published by the Free Software Foundation; either | 9 * License as published by the Free Software Foundation; either |
| 10 * version 2 of the License, or (at your option) any later version. | 10 * version 2 of the License, or (at your option) any later version. |
| 11 * | 11 * |
| 12 * This library is distributed in the hope that it will be useful, | 12 * This library is distributed in the hope that it will be useful, |
| 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 15 * Lesser General Public License for more details. | 15 * Lesser General Public License for more details. |
| 16 * | 16 * |
| 17 * You should have received a copy of the GNU Lesser General Public | 17 * You should have received a copy of the GNU Lesser General Public |
| 18 * License along with this library; if not, write to the Free Software | 18 * License along with this library; if not, write to the Free Software |
| 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 | 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 |
| 20 * USA | 20 * USA |
| 21 */ | 21 */ |
| 22 | 22 |
| 23 #include "config.h" | 23 #include "config.h" |
| 24 #include "core/page/WindowFeatures.h" | 24 #include "core/page/WindowFeatures.h" |
| 25 | 25 |
| 26 #include "platform/geometry/FloatRect.h" | 26 #include "platform/geometry/IntRect.h" |
| 27 #include "wtf/Assertions.h" | 27 #include "wtf/Assertions.h" |
| 28 #include "wtf/MathExtras.h" | 28 #include "wtf/MathExtras.h" |
| 29 #include "wtf/text/StringHash.h" | 29 #include "wtf/text/StringHash.h" |
| 30 | 30 |
| 31 namespace blink { | 31 namespace blink { |
| 32 | 32 |
| 33 // Though isspace() considers \t and \v to be whitespace, Win IE doesn't when pa rsing window features. | 33 // Though isspace() considers \t and \v to be whitespace, Win IE doesn't when pa rsing window features. |
| 34 static bool isWindowFeaturesSeparator(UChar c) | 34 static bool isWindowFeaturesSeparator(UChar c) |
| 35 { | 35 { |
| 36 return c == ' ' || c == '\t' || c == '\n' || c == '\r' || c == '=' || c == ' ,' || c == '\0'; | 36 return c == ' ' || c == '\t' || c == '\n' || c == '\r' || c == '=' || c == ' ,' || c == '\0'; |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 158 else if (keyString == "status") | 158 else if (keyString == "status") |
| 159 statusBarVisible = value; | 159 statusBarVisible = value; |
| 160 else if (keyString == "fullscreen") | 160 else if (keyString == "fullscreen") |
| 161 fullscreen = value; | 161 fullscreen = value; |
| 162 else if (keyString == "scrollbars") | 162 else if (keyString == "scrollbars") |
| 163 scrollbarsVisible = value; | 163 scrollbarsVisible = value; |
| 164 else if (value == 1) | 164 else if (value == 1) |
| 165 additionalFeatures.append(keyString); | 165 additionalFeatures.append(keyString); |
| 166 } | 166 } |
| 167 | 167 |
| 168 WindowFeatures::WindowFeatures(const String& dialogFeaturesString, const FloatRe ct& screenAvailableRect) | 168 WindowFeatures::WindowFeatures(const String& dialogFeaturesString, const IntRect & screenAvailableRect) |
| 169 : widthSet(true) | 169 : widthSet(true) |
| 170 , heightSet(true) | 170 , heightSet(true) |
| 171 , menuBarVisible(false) | 171 , menuBarVisible(false) |
| 172 , toolBarVisible(false) | 172 , toolBarVisible(false) |
| 173 , locationBarVisible(false) | 173 , locationBarVisible(false) |
| 174 , fullscreen(false) | 174 , fullscreen(false) |
| 175 , dialog(true) | 175 , dialog(true) |
| 176 { | 176 { |
| 177 DialogFeaturesMap features; | 177 DialogFeaturesMap features; |
| 178 parseDialogFeatures(dialogFeaturesString, features); | 178 parseDialogFeatures(dialogFeaturesString, features); |
| 179 | 179 |
| 180 const bool trusted = false; | 180 const bool trusted = false; |
| 181 | 181 |
| 182 // The following features from Microsoft's documentation are not implemented : | 182 // The following features from Microsoft's documentation are not implemented : |
| 183 // - default font settings | 183 // - default font settings |
| 184 // - width, height, left, and top specified in units other than "px" | 184 // - width, height, left, and top specified in units other than "px" |
| 185 // - edge (sunken or raised, default is raised) | 185 // - edge (sunken or raised, default is raised) |
| 186 // - dialogHide: trusted && boolFeature(features, "dialoghide"), makes dialo g hide when you print | 186 // - dialogHide: trusted && boolFeature(features, "dialoghide"), makes dialo g hide when you print |
| 187 // - help: boolFeature(features, "help", true), makes help icon appear in di alog (what does it do on Windows?) | 187 // - help: boolFeature(features, "help", true), makes help icon appear in di alog (what does it do on Windows?) |
| 188 // - unadorned: trusted && boolFeature(features, "unadorned"); | 188 // - unadorned: trusted && boolFeature(features, "unadorned"); |
| 189 | 189 |
| 190 width = floatFeature(features, "dialogwidth", 100, screenAvailableRect.width (), 620); // default here came from frame size of dialog in MacIE | 190 width = intFeature(features, "dialogwidth", 100, screenAvailableRect.width() , 620); // default here came from frame size of dialog in MacIE |
| 191 height = floatFeature(features, "dialogheight", 100, screenAvailableRect.hei ght(), 450); // default here came from frame size of dialog in MacIE | 191 height = intFeature(features, "dialogheight", 100, screenAvailableRect.heigh t(), 450); // default here came from frame size of dialog in MacIE |
| 192 | 192 |
| 193 x = floatFeature(features, "dialogleft", screenAvailableRect.x(), screenAvai lableRect.maxX() - width, -1); | 193 x = intFeature(features, "dialogleft", screenAvailableRect.x(), screenAvaila bleRect.maxX() - width, -1); |
| 194 xSet = x > 0; | 194 xSet = x > 0; |
| 195 y = floatFeature(features, "dialogtop", screenAvailableRect.y(), screenAvail ableRect.maxY() - height, -1); | 195 y = intFeature(features, "dialogtop", screenAvailableRect.y(), screenAvailab leRect.maxY() - height, -1); |
| 196 ySet = y > 0; | 196 ySet = y > 0; |
| 197 | 197 |
| 198 if (boolFeature(features, "center", true)) { | 198 if (boolFeature(features, "center", true)) { |
| 199 if (!xSet) { | 199 if (!xSet) { |
| 200 x = screenAvailableRect.x() + (screenAvailableRect.width() - width) / 2; | 200 x = screenAvailableRect.x() + (screenAvailableRect.width() - width) / 2; |
| 201 xSet = true; | 201 xSet = true; |
| 202 } | 202 } |
| 203 if (!ySet) { | 203 if (!ySet) { |
| 204 y = screenAvailableRect.y() + (screenAvailableRect.height() - height ) / 2; | 204 y = screenAvailableRect.y() + (screenAvailableRect.height() - height ) / 2; |
| 205 ySet = true; | 205 ySet = true; |
| 206 } | 206 } |
| 207 } | 207 } |
| 208 | 208 |
| 209 resizable = boolFeature(features, "resizable"); | 209 resizable = boolFeature(features, "resizable"); |
| 210 scrollbarsVisible = boolFeature(features, "scroll", true); | 210 scrollbarsVisible = boolFeature(features, "scroll", true); |
| 211 statusBarVisible = boolFeature(features, "status", !trusted); | 211 statusBarVisible = boolFeature(features, "status", !trusted); |
| 212 } | 212 } |
| 213 | 213 |
| 214 bool WindowFeatures::boolFeature(const DialogFeaturesMap& features, const char* key, bool defaultValue) | 214 bool WindowFeatures::boolFeature(const DialogFeaturesMap& features, const char* key, bool defaultValue) |
| 215 { | 215 { |
| 216 DialogFeaturesMap::const_iterator it = features.find(key); | 216 DialogFeaturesMap::const_iterator it = features.find(key); |
| 217 if (it == features.end()) | 217 if (it == features.end()) |
| 218 return defaultValue; | 218 return defaultValue; |
| 219 const String& value = it->value; | 219 const String& value = it->value; |
| 220 return value.isNull() || value == "1" || value == "yes" || value == "on"; | 220 return value.isNull() || value == "1" || value == "yes" || value == "on"; |
| 221 } | 221 } |
| 222 | 222 |
| 223 float WindowFeatures::floatFeature(const DialogFeaturesMap& features, const char * key, float min, float max, float defaultValue) | 223 int WindowFeatures::intFeature(const DialogFeaturesMap& features, const char* ke y, int min, int max, int defaultValue) |
| 224 { | 224 { |
| 225 DialogFeaturesMap::const_iterator it = features.find(key); | 225 DialogFeaturesMap::const_iterator it = features.find(key); |
| 226 if (it == features.end()) | 226 if (it == features.end()) |
| 227 return defaultValue; | 227 return defaultValue; |
| 228 // FIXME: The toDouble function does not offer a way to tell "0q" from strin g with no digits in it: Both | |
| 229 // return the number 0 and false for ok. But "0q" should yield the minimum r ather than the default. | |
| 230 bool ok; | 228 bool ok; |
| 231 double parsedNumber = it->value.toDouble(&ok); | 229 int parsedNumber = it->value.toInt(&ok); |
| 232 if ((!parsedNumber && !ok) || std::isnan(parsedNumber)) | 230 if (!ok) |
| 233 return defaultValue; | 231 return defaultValue; |
| 234 if (parsedNumber < min || max <= min) | 232 if (parsedNumber < min || max <= min) |
| 235 return min; | 233 return min; |
| 236 if (parsedNumber > max) | 234 if (parsedNumber > max) |
| 237 return max; | 235 return max; |
| 238 // FIXME: Seems strange to cast a double to int and then convert back to a f loat. Why is this a good idea? | 236 return parsedNumber; |
| 239 return static_cast<int>(parsedNumber); | |
|
Jens Widell
2015/01/28 12:29:55
Due to this cast, changing the return type from 'f
| |
| 240 } | 237 } |
| 241 | 238 |
| 242 void WindowFeatures::parseDialogFeatures(const String& string, DialogFeaturesMap & map) | 239 void WindowFeatures::parseDialogFeatures(const String& string, DialogFeaturesMap & map) |
| 243 { | 240 { |
| 244 Vector<String> vector; | 241 Vector<String> vector; |
| 245 string.split(';', vector); | 242 string.split(';', vector); |
| 246 size_t size = vector.size(); | 243 size_t size = vector.size(); |
| 247 for (size_t i = 0; i < size; ++i) { | 244 for (size_t i = 0; i < size; ++i) { |
| 248 const String& featureString = vector[i]; | 245 const String& featureString = vector[i]; |
| 249 | 246 |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 261 if (separatorPosition != kNotFound) { | 258 if (separatorPosition != kNotFound) { |
| 262 value = featureString.substring(separatorPosition + 1).stripWhiteSpa ce().lower(); | 259 value = featureString.substring(separatorPosition + 1).stripWhiteSpa ce().lower(); |
| 263 value = value.left(value.find(' ')); | 260 value = value.left(value.find(' ')); |
| 264 } | 261 } |
| 265 | 262 |
| 266 map.set(key, value); | 263 map.set(key, value); |
| 267 } | 264 } |
| 268 } | 265 } |
| 269 | 266 |
| 270 } // namespace blink | 267 } // namespace blink |
| OLD | NEW |