| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2010 Google Inc. All rights reserved. | 2 * Copyright (C) 2010 Google 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 are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 180 void ExternalPopupMenu::didChangeSelection(int index) | 180 void ExternalPopupMenu::didChangeSelection(int index) |
| 181 { | 181 { |
| 182 } | 182 } |
| 183 | 183 |
| 184 void ExternalPopupMenu::didAcceptIndex(int index) | 184 void ExternalPopupMenu::didAcceptIndex(int index) |
| 185 { | 185 { |
| 186 // Calling methods on the HTMLSelectElement might lead to this object being | 186 // Calling methods on the HTMLSelectElement might lead to this object being |
| 187 // derefed. This ensures it does not get deleted while we are running this | 187 // derefed. This ensures it does not get deleted while we are running this |
| 188 // method. | 188 // method. |
| 189 int popupMenuItemIndex = toPopupMenuItemIndex(index, *m_ownerElement); | 189 int popupMenuItemIndex = toPopupMenuItemIndex(index, *m_ownerElement); |
| 190 RawPtr<ExternalPopupMenu> guard(this); | |
| 191 | 190 |
| 192 if (m_ownerElement) { | 191 if (m_ownerElement) { |
| 193 m_ownerElement->popupDidHide(); | 192 m_ownerElement->popupDidHide(); |
| 194 m_ownerElement->valueChanged(popupMenuItemIndex); | 193 m_ownerElement->valueChanged(popupMenuItemIndex); |
| 195 } | 194 } |
| 196 m_webExternalPopupMenu = 0; | 195 m_webExternalPopupMenu = 0; |
| 197 } | 196 } |
| 198 | 197 |
| 199 void ExternalPopupMenu::didAcceptIndices(const WebVector<int>& indices) | 198 void ExternalPopupMenu::didAcceptIndices(const WebVector<int>& indices) |
| 200 { | 199 { |
| 201 if (!m_ownerElement) { | 200 if (!m_ownerElement) { |
| 202 m_webExternalPopupMenu = 0; | 201 m_webExternalPopupMenu = 0; |
| 203 return; | 202 return; |
| 204 } | 203 } |
| 205 | 204 |
| 206 // Calling methods on the HTMLSelectElement might lead to this object being | |
| 207 // derefed. This ensures it does not get deleted while we are running this | |
| 208 // method. | |
| 209 RawPtr<ExternalPopupMenu> protect(this); | |
| 210 RawPtr<HTMLSelectElement> ownerElement(m_ownerElement.get()); | 205 RawPtr<HTMLSelectElement> ownerElement(m_ownerElement.get()); |
| 211 ownerElement->popupDidHide(); | 206 ownerElement->popupDidHide(); |
| 212 | 207 |
| 213 if (indices.size() == 0) { | 208 if (indices.size() == 0) { |
| 214 ownerElement->valueChanged(static_cast<unsigned>(-1)); | 209 ownerElement->valueChanged(static_cast<unsigned>(-1)); |
| 215 } else { | 210 } else { |
| 216 for (size_t i = 0; i < indices.size(); ++i) | 211 for (size_t i = 0; i < indices.size(); ++i) |
| 217 ownerElement->listBoxSelectItem(toPopupMenuItemIndex(indices[i], *ow
nerElement), (i > 0), false, (i == indices.size() - 1)); | 212 ownerElement->listBoxSelectItem(toPopupMenuItemIndex(indices[i], *ow
nerElement), (i > 0), false, (i == indices.size() - 1)); |
| 218 } | 213 } |
| 219 | 214 |
| 220 m_webExternalPopupMenu = 0; | 215 m_webExternalPopupMenu = 0; |
| 221 } | 216 } |
| 222 | 217 |
| 223 void ExternalPopupMenu::didCancel() | 218 void ExternalPopupMenu::didCancel() |
| 224 { | 219 { |
| 225 // See comment in didAcceptIndex on why we need this. | |
| 226 RawPtr<ExternalPopupMenu> guard(this); | |
| 227 | |
| 228 if (m_ownerElement) | 220 if (m_ownerElement) |
| 229 m_ownerElement->popupDidHide(); | 221 m_ownerElement->popupDidHide(); |
| 230 m_webExternalPopupMenu = 0; | 222 m_webExternalPopupMenu = 0; |
| 231 } | 223 } |
| 232 | 224 |
| 233 void ExternalPopupMenu::getPopupMenuInfo(WebPopupMenuInfo& info, HTMLSelectEleme
nt& ownerElement) | 225 void ExternalPopupMenu::getPopupMenuInfo(WebPopupMenuInfo& info, HTMLSelectEleme
nt& ownerElement) |
| 234 { | 226 { |
| 235 const HeapVector<Member<HTMLElement>>& listItems = ownerElement.listItems(); | 227 const HeapVector<Member<HTMLElement>>& listItems = ownerElement.listItems(); |
| 236 size_t itemCount = listItems.size(); | 228 size_t itemCount = listItems.size(); |
| 237 size_t count = 0; | 229 size_t count = 0; |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 298 if (ownerElement.itemIsDisplayNone(*items[i])) | 290 if (ownerElement.itemIsDisplayNone(*items[i])) |
| 299 continue; | 291 continue; |
| 300 if (popupMenuItemIndex == i) | 292 if (popupMenuItemIndex == i) |
| 301 return indexTracker; | 293 return indexTracker; |
| 302 ++indexTracker; | 294 ++indexTracker; |
| 303 } | 295 } |
| 304 return -1; | 296 return -1; |
| 305 } | 297 } |
| 306 | 298 |
| 307 } // namespace blink | 299 } // namespace blink |
| OLD | NEW |