Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (C) 2008 Apple Inc. All Rights Reserved. | 2 * Copyright (C) 2008 Apple Inc. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
| 6 * are met: | 6 * are met: |
| 7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
| 8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
| 9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
| 10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 120 | 120 |
| 121 return m_storageMap->getItem(key); | 121 return m_storageMap->getItem(key); |
| 122 } | 122 } |
| 123 | 123 |
| 124 void StorageAreaImpl::setItem(const String& key, const String& value, ExceptionC ode& ec, Frame* frame) | 124 void StorageAreaImpl::setItem(const String& key, const String& value, ExceptionC ode& ec, Frame* frame) |
| 125 { | 125 { |
| 126 ASSERT(!m_isShutdown); | 126 ASSERT(!m_isShutdown); |
| 127 ASSERT(!value.isNull()); | 127 ASSERT(!value.isNull()); |
| 128 blockUntilImportComplete(); | 128 blockUntilImportComplete(); |
| 129 | 129 |
| 130 if (frame->page()->settings()->privateBrowsingEnabled()) { | 130 if (frame && frame->page()->settings()->privateBrowsingEnabled()) { |
| 131 ec = QUOTA_EXCEEDED_ERR; | 131 ec = QUOTA_EXCEEDED_ERR; |
| 132 return; | 132 return; |
| 133 } | 133 } |
| 134 | 134 |
| 135 // FIXME: For LocalStorage where a disk quota will be enforced, here is wher e we need to do quota checking. | 135 // FIXME: For LocalStorage where a disk quota will be enforced, here is wher e we need to do quota checking. |
| 136 // If we decide to enforce a memory quota for SessionStorage, this is where we'd do that, also. | 136 // If we decide to enforce a memory quota for SessionStorage, this is where we'd do that, also. |
| 137 // if (<over quota>) { | 137 // if (<over quota>) { |
| 138 // ec = QUOTA_EXCEEDED_ERR; | 138 // ec = QUOTA_EXCEEDED_ERR; |
| 139 // return; | 139 // return; |
| 140 // } | 140 // } |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 151 m_storageAreaSync->scheduleItemForSync(key, value); | 151 m_storageAreaSync->scheduleItemForSync(key, value); |
| 152 dispatchStorageEvent(key, oldValue, value, frame); | 152 dispatchStorageEvent(key, oldValue, value, frame); |
| 153 } | 153 } |
| 154 } | 154 } |
| 155 | 155 |
| 156 void StorageAreaImpl::removeItem(const String& key, Frame* frame) | 156 void StorageAreaImpl::removeItem(const String& key, Frame* frame) |
| 157 { | 157 { |
| 158 ASSERT(!m_isShutdown); | 158 ASSERT(!m_isShutdown); |
| 159 blockUntilImportComplete(); | 159 blockUntilImportComplete(); |
| 160 | 160 |
| 161 if (frame->page()->settings()->privateBrowsingEnabled()) | 161 if (frame && frame->page()->settings()->privateBrowsingEnabled()) |
| 162 return; | 162 return; |
| 163 | 163 |
| 164 String oldValue; | 164 String oldValue; |
| 165 RefPtr<StorageMap> newMap = m_storageMap->removeItem(key, oldValue); | 165 RefPtr<StorageMap> newMap = m_storageMap->removeItem(key, oldValue); |
| 166 if (newMap) | 166 if (newMap) |
| 167 m_storageMap = newMap.release(); | 167 m_storageMap = newMap.release(); |
| 168 | 168 |
| 169 // Only notify the client if an item was actually removed | 169 // Only notify the client if an item was actually removed |
| 170 if (!oldValue.isNull()) { | 170 if (!oldValue.isNull()) { |
| 171 if (m_storageAreaSync) | 171 if (m_storageAreaSync) |
| 172 m_storageAreaSync->scheduleItemForSync(key, String()); | 172 m_storageAreaSync->scheduleItemForSync(key, String()); |
| 173 dispatchStorageEvent(key, oldValue, String(), frame); | 173 dispatchStorageEvent(key, oldValue, String(), frame); |
| 174 } | 174 } |
| 175 } | 175 } |
| 176 | 176 |
| 177 void StorageAreaImpl::clear(Frame* frame) | 177 void StorageAreaImpl::clear(Frame* frame) |
| 178 { | 178 { |
| 179 ASSERT(!m_isShutdown); | 179 ASSERT(!m_isShutdown); |
| 180 blockUntilImportComplete(); | 180 blockUntilImportComplete(); |
| 181 | 181 |
| 182 if (frame->page()->settings()->privateBrowsingEnabled()) | 182 if (frame && frame->page()->settings()->privateBrowsingEnabled()) |
| 183 return; | 183 return; |
| 184 | 184 |
| 185 m_storageMap = StorageMap::create(); | 185 m_storageMap = StorageMap::create(); |
| 186 | 186 |
| 187 if (m_storageAreaSync) | 187 if (m_storageAreaSync) |
| 188 m_storageAreaSync->scheduleClear(); | 188 m_storageAreaSync->scheduleClear(); |
| 189 dispatchStorageEvent(String(), String(), String(), frame); | 189 dispatchStorageEvent(String(), String(), String(), frame); |
| 190 } | 190 } |
| 191 | 191 |
| 192 bool StorageAreaImpl::contains(const String& key) const | 192 bool StorageAreaImpl::contains(const String& key) const |
| (...skipping 30 matching lines...) Expand all Loading... | |
| 223 if (m_storageAreaSync) | 223 if (m_storageAreaSync) |
| 224 m_storageAreaSync->blockUntilImportComplete(); | 224 m_storageAreaSync->blockUntilImportComplete(); |
| 225 } | 225 } |
| 226 | 226 |
| 227 void StorageAreaImpl::dispatchStorageEvent(const String& key, const String& oldV alue, const String& newValue, Frame* sourceFrame) | 227 void StorageAreaImpl::dispatchStorageEvent(const String& key, const String& oldV alue, const String& newValue, Frame* sourceFrame) |
| 228 { | 228 { |
| 229 // We need to copy all relevant frames from every page to a vector since sen ding the event to one frame might mutate the frame tree | 229 // We need to copy all relevant frames from every page to a vector since sen ding the event to one frame might mutate the frame tree |
| 230 // of any given page in the group or mutate the page group itself. | 230 // of any given page in the group or mutate the page group itself. |
| 231 Vector<RefPtr<Frame> > frames; | 231 Vector<RefPtr<Frame> > frames; |
| 232 | 232 |
| 233 // TODO(jorlow): Make this work! | |
| 234 if (!sourceFrame) | |
| 235 return; | |
|
michaeln
2009/07/14 19:02:05
I realize this is temporary only until you resolve
jorlow
2009/07/14 19:12:50
Sure. Might as well.
| |
| 236 | |
| 233 // FIXME: When can this occur? | 237 // FIXME: When can this occur? |
| 234 Page* page = sourceFrame->page(); | 238 Page* page = sourceFrame->page(); |
| 235 if (!page) | 239 if (!page) |
|
michaeln
2009/07/14 19:02:05
while your here... ditto for this test
jorlow
2009/07/14 19:12:50
k
| |
| 236 return; | 240 return; |
| 237 | 241 |
| 238 if (m_storageType == SessionStorage) { | 242 if (m_storageType == SessionStorage) { |
| 239 // Send events only to our page. | 243 // Send events only to our page. |
| 240 for (Frame* frame = page->mainFrame(); frame; frame = frame->tree()->tra verseNext()) { | 244 for (Frame* frame = page->mainFrame(); frame; frame = frame->tree()->tra verseNext()) { |
| 241 if (frame->document()->securityOrigin()->equal(securityOrigin())) | 245 if (frame->document()->securityOrigin()->equal(securityOrigin())) |
| 242 frames.append(frame); | 246 frames.append(frame); |
| 243 } | 247 } |
| 244 | 248 |
| 245 for (unsigned i = 0; i < frames.size(); ++i) | 249 for (unsigned i = 0; i < frames.size(); ++i) |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 257 | 261 |
| 258 for (unsigned i = 0; i < frames.size(); ++i) | 262 for (unsigned i = 0; i < frames.size(); ++i) |
| 259 frames[i]->document()->dispatchWindowEvent(StorageEvent::create(even tNames().storageEvent, key, oldValue, newValue, sourceFrame->document()->documen tURI(), sourceFrame->domWindow(), frames[i]->domWindow()->localStorage())); | 263 frames[i]->document()->dispatchWindowEvent(StorageEvent::create(even tNames().storageEvent, key, oldValue, newValue, sourceFrame->document()->documen tURI(), sourceFrame->domWindow(), frames[i]->domWindow()->localStorage())); |
| 260 } | 264 } |
| 261 } | 265 } |
| 262 | 266 |
| 263 } | 267 } |
| 264 | 268 |
| 265 #endif // ENABLE(DOM_STORAGE) | 269 #endif // ENABLE(DOM_STORAGE) |
| 266 | 270 |
| OLD | NEW |