Home | History | Annotate | Download | only in media
      1 // Copyright 2013 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 "chrome/browser/media/desktop_streams_registry.h"
      6 
      7 #include "base/base64.h"
      8 #include "base/location.h"
      9 #include "base/time/time.h"
     10 #include "content/public/browser/browser_thread.h"
     11 #include "crypto/random.h"
     12 
     13 namespace {
     14 
     15 const int kStreamIdLengthBytes = 16;
     16 
     17 const int kApprovedStreamTimeToLiveSeconds = 10;
     18 
     19 std::string GenerateRandomStreamId() {
     20   char buffer[kStreamIdLengthBytes];
     21   crypto::RandBytes(buffer, arraysize(buffer));
     22   std::string result;
     23   base::Base64Encode(base::StringPiece(buffer, arraysize(buffer)),
     24                      &result);
     25   return result;
     26 }
     27 
     28 }  // namespace
     29 
     30 DesktopStreamsRegistry::DesktopStreamsRegistry() {}
     31 DesktopStreamsRegistry::~DesktopStreamsRegistry() {}
     32 
     33 std::string DesktopStreamsRegistry::RegisterStream(
     34     int render_process_id,
     35     int render_view_id,
     36     const GURL& origin,
     37     const content::DesktopMediaID& source,
     38     const std::string& extension_name) {
     39   DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
     40 
     41   std::string id = GenerateRandomStreamId();
     42   ApprovedDesktopMediaStream& stream = approved_streams_[id];
     43   stream.render_process_id = render_process_id;
     44   stream.render_view_id = render_view_id;
     45   stream.origin = origin;
     46   stream.source = source;
     47   stream.extension_name = extension_name;
     48 
     49   content::BrowserThread::PostDelayedTask(
     50       content::BrowserThread::UI, FROM_HERE,
     51       base::Bind(&DesktopStreamsRegistry::CleanupStream,
     52                  base::Unretained(this), id),
     53       base::TimeDelta::FromSeconds(kApprovedStreamTimeToLiveSeconds));
     54 
     55   return id;
     56 }
     57 
     58 content::DesktopMediaID DesktopStreamsRegistry::RequestMediaForStreamId(
     59     const std::string& id,
     60     int render_process_id,
     61     int render_view_id,
     62     const GURL& origin,
     63     std::string* extension_name) {
     64   DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
     65 
     66   StreamsMap::iterator it = approved_streams_.find(id);
     67 
     68   // Verify that if there is a request with the specified ID it was created for
     69   // the same origin and the same renderer.
     70   if (it == approved_streams_.end() ||
     71       render_process_id != it->second.render_process_id ||
     72       render_view_id != it->second.render_view_id ||
     73       origin != it->second.origin) {
     74     return content::DesktopMediaID();
     75   }
     76 
     77   content::DesktopMediaID result = it->second.source;
     78   *extension_name = it->second.extension_name;
     79   approved_streams_.erase(it);
     80   return result;
     81 }
     82 
     83 void DesktopStreamsRegistry::CleanupStream(const std::string& id) {
     84   DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
     85   approved_streams_.erase(id);
     86 }
     87 
     88 DesktopStreamsRegistry::ApprovedDesktopMediaStream::ApprovedDesktopMediaStream()
     89     : render_process_id(-1), render_view_id(-1) {}
     90