Home | History | Annotate | Download | only in worker_host
      1 // Copyright (c) 2009 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/worker_host/worker_document_set.h"
      6 
      7 #include "base/logging.h"
      8 
      9 namespace content {
     10 
     11 WorkerDocumentSet::WorkerDocumentSet() {
     12 }
     13 
     14 void 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 
     22 bool 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 
     32 bool 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 
     42 void 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 
     55 void 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 
     71 WorkerDocumentSet::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 
     80 WorkerDocumentSet::~WorkerDocumentSet() {
     81 }
     82 
     83 }  // namespace content
     84