1// Copyright 2014 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "content/browser/shared_worker/worker_document_set.h" 6 7#include "base/logging.h" 8 9namespace content { 10 11WorkerDocumentSet::WorkerDocumentSet() { 12} 13 14void WorkerDocumentSet::Add(BrowserMessageFilter* parent, 15 unsigned long long document_id, 16 int render_process_id, 17 int render_frame_id) { 18 DocumentInfo info(parent, document_id, render_process_id, render_frame_id); 19 document_set_.insert(info); 20} 21 22bool WorkerDocumentSet::Contains(BrowserMessageFilter* parent, 23 unsigned long long document_id) const { 24 for (DocumentInfoSet::const_iterator i = document_set_.begin(); 25 i != document_set_.end(); ++i) { 26 if (i->filter() == parent && i->document_id() == document_id) 27 return true; 28 } 29 return false; 30} 31 32bool WorkerDocumentSet::ContainsExternalRenderer( 33 int worker_process_id) const { 34 for (DocumentInfoSet::const_iterator i = document_set_.begin(); 35 i != document_set_.end(); ++i) { 36 if (i->render_process_id() != worker_process_id) 37 return true; 38 } 39 return false; 40} 41 42void WorkerDocumentSet::Remove(BrowserMessageFilter* parent, 43 unsigned long long document_id) { 44 for (DocumentInfoSet::iterator i = document_set_.begin(); 45 i != document_set_.end(); i++) { 46 if (i->filter() == parent && i->document_id() == document_id) { 47 document_set_.erase(i); 48 break; 49 } 50 } 51 // Should not be duplicate copies in the document set. 52 DCHECK(!Contains(parent, document_id)); 53} 54 55void WorkerDocumentSet::RemoveAll(BrowserMessageFilter* parent) { 56 for (DocumentInfoSet::iterator i = document_set_.begin(); 57 i != document_set_.end();) { 58 59 // Note this idiom is somewhat tricky - calling document_set_.erase(iter) 60 // invalidates any iterators that point to the element being removed, so 61 // bump the iterator beyond the item being removed before calling erase. 62 if (i->filter() == parent) { 63 DocumentInfoSet::iterator item_to_delete = i++; 64 document_set_.erase(item_to_delete); 65 } else { 66 ++i; 67 } 68 } 69} 70 71WorkerDocumentSet::DocumentInfo::DocumentInfo( 72 BrowserMessageFilter* filter, unsigned long long document_id, 73 int render_process_id, int render_frame_id) 74 : filter_(filter), 75 document_id_(document_id), 76 render_process_id_(render_process_id), 77 render_frame_id_(render_frame_id) { 78} 79 80WorkerDocumentSet::~WorkerDocumentSet() { 81} 82 83} // namespace content 84