| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
| 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) | 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) |
| 4 * (C) 2001 Dirk Mueller (mueller@kde.org) | 4 * (C) 2001 Dirk Mueller (mueller@kde.org) |
| 5 * (C) 2006 Alexey Proskuryakov (ap@webkit.org) | 5 * (C) 2006 Alexey Proskuryakov (ap@webkit.org) |
| 6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2011, 2012 Apple Inc. All r
ights reserved. | 6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2011, 2012 Apple Inc. All r
ights reserved. |
| 7 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t
orchmobile.com/) | 7 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t
orchmobile.com/) |
| 8 * Copyright (C) 2008, 2009, 2011, 2012 Google Inc. All rights reserved. | 8 * Copyright (C) 2008, 2009, 2011, 2012 Google Inc. All rights reserved. |
| 9 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies) | 9 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies) |
| 10 * Copyright (C) Research In Motion Limited 2010-2011. All rights reserved. | 10 * Copyright (C) Research In Motion Limited 2010-2011. All rights reserved. |
| (...skipping 1220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1231 return Range::create(this, rangeCompliantPosition, rangeCompliantPosition); | 1231 return Range::create(this, rangeCompliantPosition, rangeCompliantPosition); |
| 1232 } | 1232 } |
| 1233 | 1233 |
| 1234 /* | 1234 /* |
| 1235 * Performs three operations: | 1235 * Performs three operations: |
| 1236 * 1. Convert control characters to spaces | 1236 * 1. Convert control characters to spaces |
| 1237 * 2. Trim leading and trailing spaces | 1237 * 2. Trim leading and trailing spaces |
| 1238 * 3. Collapse internal whitespace. | 1238 * 3. Collapse internal whitespace. |
| 1239 */ | 1239 */ |
| 1240 template <typename CharacterType> | 1240 template <typename CharacterType> |
| 1241 static inline StringWithDirection canonicalizedTitle(Document* document, const S
tringWithDirection& titleWithDirection) | 1241 static inline String canonicalizedTitle(Document* document, const String& title) |
| 1242 { | 1242 { |
| 1243 const String& title = titleWithDirection.string(); | |
| 1244 const CharacterType* characters = title.getCharacters<CharacterType>(); | 1243 const CharacterType* characters = title.getCharacters<CharacterType>(); |
| 1245 unsigned length = title.length(); | 1244 unsigned length = title.length(); |
| 1246 unsigned i; | 1245 unsigned i; |
| 1247 | 1246 |
| 1248 StringBuffer<CharacterType> buffer(length); | 1247 StringBuffer<CharacterType> buffer(length); |
| 1249 unsigned builderIndex = 0; | 1248 unsigned builderIndex = 0; |
| 1250 | 1249 |
| 1251 // Skip leading spaces and leading characters that would convert to spaces | 1250 // Skip leading spaces and leading characters that would convert to spaces |
| 1252 for (i = 0; i < length; ++i) { | 1251 for (i = 0; i < length; ++i) { |
| 1253 CharacterType c = characters[i]; | 1252 CharacterType c = characters[i]; |
| 1254 if (!(c <= 0x20 || c == 0x7F)) | 1253 if (!(c <= 0x20 || c == 0x7F)) |
| 1255 break; | 1254 break; |
| 1256 } | 1255 } |
| 1257 | 1256 |
| 1258 if (i == length) | 1257 if (i == length) |
| 1259 return StringWithDirection(); | 1258 return String(); |
| 1260 | 1259 |
| 1261 // Replace control characters with spaces, and backslashes with currency sym
bols, and collapse whitespace. | 1260 // Replace control characters with spaces, and backslashes with currency sym
bols, and collapse whitespace. |
| 1262 bool previousCharWasWS = false; | 1261 bool previousCharWasWS = false; |
| 1263 for (; i < length; ++i) { | 1262 for (; i < length; ++i) { |
| 1264 CharacterType c = characters[i]; | 1263 CharacterType c = characters[i]; |
| 1265 if (c <= 0x20 || c == 0x7F || (WTF::Unicode::category(c) & (WTF::Unicode
::Separator_Line | WTF::Unicode::Separator_Paragraph))) { | 1264 if (c <= 0x20 || c == 0x7F || (WTF::Unicode::category(c) & (WTF::Unicode
::Separator_Line | WTF::Unicode::Separator_Paragraph))) { |
| 1266 if (previousCharWasWS) | 1265 if (previousCharWasWS) |
| 1267 continue; | 1266 continue; |
| 1268 buffer[builderIndex++] = ' '; | 1267 buffer[builderIndex++] = ' '; |
| 1269 previousCharWasWS = true; | 1268 previousCharWasWS = true; |
| 1270 } else { | 1269 } else { |
| 1271 buffer[builderIndex++] = c; | 1270 buffer[builderIndex++] = c; |
| 1272 previousCharWasWS = false; | 1271 previousCharWasWS = false; |
| 1273 } | 1272 } |
| 1274 } | 1273 } |
| 1275 | 1274 |
| 1276 // Strip trailing spaces | 1275 // Strip trailing spaces |
| 1277 while (builderIndex > 0) { | 1276 while (builderIndex > 0) { |
| 1278 --builderIndex; | 1277 --builderIndex; |
| 1279 if (buffer[builderIndex] != ' ') | 1278 if (buffer[builderIndex] != ' ') |
| 1280 break; | 1279 break; |
| 1281 } | 1280 } |
| 1282 | 1281 |
| 1283 if (!builderIndex && buffer[builderIndex] == ' ') | 1282 if (!builderIndex && buffer[builderIndex] == ' ') |
| 1284 return StringWithDirection(); | 1283 return String(); |
| 1285 | 1284 |
| 1286 buffer.shrink(builderIndex + 1); | 1285 buffer.shrink(builderIndex + 1); |
| 1287 | 1286 |
| 1288 // Replace the backslashes with currency symbols if the encoding requires it
. | 1287 // Replace the backslashes with currency symbols if the encoding requires it
. |
| 1289 document->displayBufferModifiedByEncoding(buffer.characters(), buffer.length
()); | 1288 document->displayBufferModifiedByEncoding(buffer.characters(), buffer.length
()); |
| 1290 | 1289 |
| 1291 return StringWithDirection(String::adopt(buffer), titleWithDirection.directi
on()); | 1290 return String::adopt(buffer); |
| 1292 } | 1291 } |
| 1293 | 1292 |
| 1294 void Document::updateTitle(const StringWithDirection& title) | 1293 void Document::updateTitle(const String& title) |
| 1295 { | 1294 { |
| 1296 if (m_rawTitle == title) | 1295 if (m_rawTitle == title) |
| 1297 return; | 1296 return; |
| 1298 | 1297 |
| 1299 m_rawTitle = title; | 1298 m_rawTitle = title; |
| 1300 | 1299 |
| 1301 StringWithDirection oldTitle = m_title; | 1300 String oldTitle = m_title; |
| 1302 if (m_rawTitle.string().isEmpty()) | 1301 if (m_rawTitle.isEmpty()) |
| 1303 m_title = StringWithDirection(); | 1302 m_title = String(); |
| 1304 else { | 1303 else if (m_rawTitle.is8Bit()) |
| 1305 if (m_rawTitle.string().is8Bit()) | 1304 m_title = canonicalizedTitle<LChar>(this, m_rawTitle); |
| 1306 m_title = canonicalizedTitle<LChar>(this, m_rawTitle); | 1305 else |
| 1307 else | 1306 m_title = canonicalizedTitle<UChar>(this, m_rawTitle); |
| 1308 m_title = canonicalizedTitle<UChar>(this, m_rawTitle); | |
| 1309 } | |
| 1310 | 1307 |
| 1311 if (!m_frame || oldTitle == m_title) | 1308 if (!m_frame || oldTitle == m_title) |
| 1312 return; | 1309 return; |
| 1313 m_frame->loader()->history()->setCurrentItemTitle(m_title); | 1310 m_frame->loader()->history()->setCurrentItemTitle(m_title); |
| 1314 m_frame->loader()->client()->dispatchDidReceiveTitle(m_title); | 1311 m_frame->loader()->client()->dispatchDidReceiveTitle(m_title); |
| 1315 } | 1312 } |
| 1316 | 1313 |
| 1317 void Document::setTitle(const String& title) | 1314 void Document::setTitle(const String& title) |
| 1318 { | 1315 { |
| 1319 // Title set by JavaScript -- overrides any title elements. | 1316 // Title set by JavaScript -- overrides any title elements. |
| 1320 m_titleSetExplicitly = true; | 1317 m_titleSetExplicitly = true; |
| 1321 if (!isHTMLDocument() && !isXHTMLDocument()) | 1318 if (!isHTMLDocument() && !isXHTMLDocument()) |
| 1322 m_titleElement = 0; | 1319 m_titleElement = 0; |
| 1323 else if (!m_titleElement) { | 1320 else if (!m_titleElement) { |
| 1324 if (HTMLElement* headElement = head()) { | 1321 if (HTMLElement* headElement = head()) { |
| 1325 m_titleElement = createElement(titleTag, false); | 1322 m_titleElement = createElement(titleTag, false); |
| 1326 headElement->appendChild(m_titleElement); | 1323 headElement->appendChild(m_titleElement); |
| 1327 } | 1324 } |
| 1328 } | 1325 } |
| 1329 | 1326 |
| 1330 // The DOM API has no method of specifying direction, so assume LTR. | 1327 updateTitle(title); |
| 1331 updateTitle(StringWithDirection(title, LTR)); | |
| 1332 | 1328 |
| 1333 if (m_titleElement) { | 1329 if (m_titleElement) { |
| 1334 ASSERT(isHTMLTitleElement(m_titleElement.get())); | 1330 ASSERT(isHTMLTitleElement(m_titleElement.get())); |
| 1335 if (isHTMLTitleElement(m_titleElement.get())) | 1331 if (isHTMLTitleElement(m_titleElement.get())) |
| 1336 toHTMLTitleElement(m_titleElement.get())->setText(title); | 1332 toHTMLTitleElement(m_titleElement.get())->setText(title); |
| 1337 } | 1333 } |
| 1338 } | 1334 } |
| 1339 | 1335 |
| 1340 void Document::setTitleElement(const StringWithDirection& title, Element* titleE
lement) | 1336 void Document::setTitleElement(const String& title, Element* titleElement) |
| 1341 { | 1337 { |
| 1342 if (titleElement != m_titleElement) { | 1338 if (titleElement != m_titleElement) { |
| 1343 if (m_titleElement || m_titleSetExplicitly) | 1339 if (m_titleElement || m_titleSetExplicitly) |
| 1344 // Only allow the first title element to change the title -- others
have no effect. | 1340 // Only allow the first title element to change the title -- others
have no effect. |
| 1345 return; | 1341 return; |
| 1346 m_titleElement = titleElement; | 1342 m_titleElement = titleElement; |
| 1347 } | 1343 } |
| 1348 | 1344 |
| 1349 updateTitle(title); | 1345 updateTitle(title); |
| 1350 } | 1346 } |
| 1351 | 1347 |
| 1352 void Document::removeTitle(Element* titleElement) | 1348 void Document::removeTitle(Element* titleElement) |
| 1353 { | 1349 { |
| 1354 if (m_titleElement != titleElement) | 1350 if (m_titleElement != titleElement) |
| 1355 return; | 1351 return; |
| 1356 | 1352 |
| 1357 m_titleElement = 0; | 1353 m_titleElement = 0; |
| 1358 m_titleSetExplicitly = false; | 1354 m_titleSetExplicitly = false; |
| 1359 | 1355 |
| 1356 // FIXME: This is broken for SVG. |
| 1360 // Update title based on first title element in the head, if one exists. | 1357 // Update title based on first title element in the head, if one exists. |
| 1361 if (HTMLElement* headElement = head()) { | 1358 if (HTMLElement* headElement = head()) { |
| 1362 for (Node* e = headElement->firstChild(); e; e = e->nextSibling()) { | 1359 for (Element* element = headElement->firstElementChild(); element; eleme
nt = element->nextElementSibling()) { |
| 1363 if (isHTMLTitleElement(e)) { | 1360 if (!isHTMLTitleElement(element)) |
| 1364 HTMLTitleElement* titleElement = toHTMLTitleElement(e); | 1361 continue; |
| 1365 setTitleElement(titleElement->textWithDirection(), titleElement)
; | 1362 HTMLTitleElement* title = toHTMLTitleElement(element); |
| 1366 break; | 1363 setTitleElement(title->text(), title); |
| 1367 } | 1364 break; |
| 1368 } | 1365 } |
| 1369 } | 1366 } |
| 1370 | 1367 |
| 1371 if (!m_titleElement) | 1368 if (!m_titleElement) |
| 1372 updateTitle(StringWithDirection()); | 1369 updateTitle(String()); |
| 1373 } | 1370 } |
| 1374 | 1371 |
| 1375 PageVisibilityState Document::visibilityState() const | 1372 PageVisibilityState Document::visibilityState() const |
| 1376 { | 1373 { |
| 1377 // The visibility of the document is inherited from the visibility of the | 1374 // The visibility of the document is inherited from the visibility of the |
| 1378 // page. If there is no page associated with the document, we will assume | 1375 // page. If there is no page associated with the document, we will assume |
| 1379 // that the page is hidden, as specified by the spec: | 1376 // that the page is hidden, as specified by the spec: |
| 1380 // http://dvcs.w3.org/hg/webperf/raw-file/tip/specs/PageVisibility/Overview.
html#dom-document-hidden | 1377 // http://dvcs.w3.org/hg/webperf/raw-file/tip/specs/PageVisibility/Overview.
html#dom-document-hidden |
| 1381 if (!m_frame || !m_frame->page()) | 1378 if (!m_frame || !m_frame->page()) |
| 1382 return PageVisibilityStateHidden; | 1379 return PageVisibilityStateHidden; |
| (...skipping 3859 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5242 { | 5239 { |
| 5243 return DocumentLifecycleNotifier::create(this); | 5240 return DocumentLifecycleNotifier::create(this); |
| 5244 } | 5241 } |
| 5245 | 5242 |
| 5246 DocumentLifecycleNotifier* Document::lifecycleNotifier() | 5243 DocumentLifecycleNotifier* Document::lifecycleNotifier() |
| 5247 { | 5244 { |
| 5248 return static_cast<DocumentLifecycleNotifier*>(ScriptExecutionContext::lifec
ycleNotifier()); | 5245 return static_cast<DocumentLifecycleNotifier*>(ScriptExecutionContext::lifec
ycleNotifier()); |
| 5249 } | 5246 } |
| 5250 | 5247 |
| 5251 } // namespace WebCore | 5248 } // namespace WebCore |
| OLD | NEW |