Index: content/browser/shared_worker/shared_worker_instance.cc |
diff --git a/content/common/gpu/media/exynos_v4l2_video_device.cc b/content/browser/shared_worker/shared_worker_instance.cc |
similarity index 10% |
copy from content/common/gpu/media/exynos_v4l2_video_device.cc |
copy to content/browser/shared_worker/shared_worker_instance.cc |
index ef40cf0e6854e4a7a9b90aa24d038bfb60977432..a55dd918152761871ea6aa06de5f4e7c0ce82ed7 100644 |
--- a/content/common/gpu/media/exynos_v4l2_video_device.cc |
+++ b/content/browser/shared_worker/shared_worker_instance.cc |
@@ -1,117 +1,101 @@ |
// Copyright 2014 The Chromium Authors. All rights reserved. |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
-// |
-#include <fcntl.h> |
-#include <linux/videodev2.h> |
-#include <poll.h> |
-#include <sys/eventfd.h> |
-#include <sys/ioctl.h> |
-#include <sys/mman.h> |
- |
-#include "base/debug/trace_event.h" |
-#include "base/posix/eintr_wrapper.h" |
-#include "content/common/gpu/media/exynos_v4l2_video_device.h" |
-namespace content { |
+#include "content/browser/shared_worker/shared_worker_instance.h" |
-namespace { |
-const char kDevice[] = "/dev/mfc-dec"; |
-} |
+#include "base/logging.h" |
+#include "content/browser/worker_host/worker_document_set.h" |
-ExynosV4L2Device::ExynosV4L2Device() |
- : device_fd_(-1), device_poll_interrupt_fd_(-1) {} |
+namespace content { |
-ExynosV4L2Device::~ExynosV4L2Device() { |
- if (device_poll_interrupt_fd_ != -1) { |
- close(device_poll_interrupt_fd_); |
- device_poll_interrupt_fd_ = -1; |
- } |
- if (device_fd_ != -1) { |
- close(device_fd_); |
- device_fd_ = -1; |
- } |
+SharedWorkerInstance::SharedWorkerInstance( |
+ const GURL& url, |
+ const base::string16& name, |
+ const base::string16& content_security_policy, |
+ blink::WebContentSecurityPolicyType security_policy_type, |
+ ResourceContext* resource_context, |
+ const WorkerStoragePartition& partition) |
+ : url_(url), |
+ closed_(false), |
+ name_(name), |
+ content_security_policy_(content_security_policy), |
+ security_policy_type_(security_policy_type), |
+ worker_document_set_(new WorkerDocumentSet()), |
+ resource_context_(resource_context), |
+ partition_(partition), |
+ load_failed_(false) { |
+ DCHECK(resource_context_); |
} |
-int ExynosV4L2Device::Ioctl(int request, void* arg) { |
- return ioctl(device_fd_, request, arg); |
+SharedWorkerInstance::~SharedWorkerInstance() { |
} |
-bool ExynosV4L2Device::Poll(bool poll_device, bool* event_pending) { |
- struct pollfd pollfds[2]; |
- nfds_t nfds; |
- int pollfd = -1; |
- |
- pollfds[0].fd = device_poll_interrupt_fd_; |
- pollfds[0].events = POLLIN | POLLERR; |
- nfds = 1; |
- |
- if (poll_device) { |
- DVLOG(3) << "Poll(): adding device fd to poll() set"; |
- pollfds[nfds].fd = device_fd_; |
- pollfds[nfds].events = POLLIN | POLLOUT | POLLERR | POLLPRI; |
- pollfd = nfds; |
- nfds++; |
- } |
- |
- if (HANDLE_EINTR(poll(pollfds, nfds, -1)) == -1) { |
- DPLOG(ERROR) << "poll() failed"; |
- return false; |
+void SharedWorkerInstance::SetMessagePortID( |
+ SharedWorkerMessageFilter* filter, |
+ int route_id, |
+ int message_port_id) { |
+ for (FilterList::iterator i = filters_.begin(); i != filters_.end(); ++i) { |
+ if (i->filter() == filter && i->route_id() == route_id) { |
+ i->set_message_port_id(message_port_id); |
+ return; |
+ } |
} |
- *event_pending = (pollfd != -1 && pollfds[pollfd].revents & POLLPRI); |
- return true; |
} |
-void* ExynosV4L2Device::Mmap(void* addr, |
- unsigned int len, |
- int prot, |
- int flags, |
- unsigned int offset) { |
- return mmap(addr, len, prot, flags, device_fd_, offset); |
-} |
+bool SharedWorkerInstance::Matches(const GURL& match_url, |
+ const base::string16& match_name, |
+ const WorkerStoragePartition& partition, |
+ ResourceContext* resource_context) const { |
+ // Only match open shared workers. |
+ if (closed_) |
+ return false; |
-void ExynosV4L2Device::Munmap(void* addr, unsigned int len) { |
- munmap(addr, len); |
-} |
+ // ResourceContext equivalence is being used as a proxy to ensure we only |
+ // matched shared workers within the same BrowserContext. |
+ if (resource_context_ != resource_context) |
+ return false; |
-bool ExynosV4L2Device::SetDevicePollInterrupt() { |
- DVLOG(3) << "SetDevicePollInterrupt()"; |
+ // We must be in the same storage partition otherwise sharing will violate |
+ // isolation. |
+ if (!partition_.Equals(partition)) |
+ return false; |
- const uint64 buf = 1; |
- if (HANDLE_EINTR(write(device_poll_interrupt_fd_, &buf, sizeof(buf))) == -1) { |
+ if (url_.GetOrigin() != match_url.GetOrigin()) |
return false; |
- } |
- return true; |
-} |
-bool ExynosV4L2Device::ClearDevicePollInterrupt() { |
- DVLOG(3) << "ClearDevicePollInterrupt()"; |
+ if (name_.empty() && match_name.empty()) |
+ return url_ == match_url; |
- uint64 buf; |
- if (HANDLE_EINTR(read(device_poll_interrupt_fd_, &buf, sizeof(buf))) == -1) { |
- if (errno == EAGAIN) { |
- // No interrupt flag set, and we're reading nonblocking. Not an error. |
- return true; |
- } else { |
- DPLOG(ERROR) << "ClearDevicePollInterrupt(): read() failed"; |
- return false; |
- } |
+ return name_ == match_name; |
+} |
+ |
+void SharedWorkerInstance::AddFilter(SharedWorkerMessageFilter* filter, |
+ int route_id) { |
+ CHECK(filter); |
+ if (!HasFilter(filter, route_id)) { |
+ FilterInfo info(filter, route_id); |
+ filters_.push_back(info); |
} |
- return true; |
} |
-bool ExynosV4L2Device::Initialize() { |
- DVLOG(2) << "Initialize(): opening device: " << kDevice; |
- // Open the video device. |
- device_fd_ = HANDLE_EINTR(open(kDevice, O_RDWR | O_NONBLOCK | O_CLOEXEC)); |
- if (device_fd_ == -1) { |
- return false; |
+void SharedWorkerInstance::RemoveFilters(SharedWorkerMessageFilter* filter) { |
+ for (FilterList::iterator i = filters_.begin(); i != filters_.end();) { |
+ if (i->filter() == filter) |
+ i = filters_.erase(i); |
+ else |
+ ++i; |
} |
+} |
- device_poll_interrupt_fd_ = eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); |
- if (device_poll_interrupt_fd_ == -1) { |
- return false; |
+bool SharedWorkerInstance::HasFilter(SharedWorkerMessageFilter* filter, |
+ int route_id) const { |
+ for (FilterList::const_iterator i = filters_.begin(); i != filters_.end(); |
+ ++i) { |
+ if (i->filter() == filter && i->route_id() == route_id) |
+ return true; |
} |
- return true; |
+ return false; |
} |
-} // namespace content |
+ |
+} // namespace content |