| // Copyright 2016 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 "chrome/browser/plugins/flash_temporary_permission_tracker.h" |
| |
| #include <utility> |
| |
| #include "base/stl_util.h" |
| #include "chrome/browser/plugins/flash_temporary_permission_tracker_factory.h" |
| #include "chrome/browser/profiles/profile.h" |
| #include "content/public/browser/browser_thread.h" |
| #include "content/public/browser/navigation_handle.h" |
| #include "content/public/browser/plugin_service.h" |
| #include "content/public/browser/render_frame_host.h" |
| #include "content/public/browser/web_contents.h" |
| #include "content/public/browser/web_contents_observer.h" |
| #include "ui/base/page_transition_types.h" |
| |
| class FlashTemporaryPermissionTracker::GrantObserver |
| : content::WebContentsObserver { |
| public: |
| GrantObserver(content::WebContents* web_contents, |
| const GURL& origin, |
| FlashTemporaryPermissionTracker* owner); |
| |
| const GURL& origin() { return origin_; } |
| |
| private: |
| // content::WebContentsObserver |
| void WebContentsDestroyed() override; |
| |
| GURL origin_; |
| FlashTemporaryPermissionTracker* owner_; |
| |
| DISALLOW_COPY_AND_ASSIGN(GrantObserver); |
| }; |
| |
| // static |
| scoped_refptr<FlashTemporaryPermissionTracker> |
| FlashTemporaryPermissionTracker::Get(Profile* profile) { |
| return FlashTemporaryPermissionTrackerFactory::GetForProfile(profile); |
| } |
| |
| FlashTemporaryPermissionTracker::FlashTemporaryPermissionTracker( |
| Profile* profile) |
| : profile_(profile) {} |
| |
| FlashTemporaryPermissionTracker::~FlashTemporaryPermissionTracker() {} |
| |
| bool FlashTemporaryPermissionTracker::IsFlashEnabled(const GURL& url) { |
| base::AutoLock lock(granted_origins_lock_); |
| return base::ContainsKey(granted_origins_, url.GetOrigin()); |
| } |
| |
| void FlashTemporaryPermissionTracker::FlashEnabledForWebContents( |
| content::WebContents* web_contents) { |
| DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| GURL origin = web_contents->GetLastCommittedURL().GetOrigin(); |
| { |
| base::AutoLock lock(granted_origins_lock_); |
| granted_origins_.insert(std::make_pair( |
| origin, std::make_unique<GrantObserver>(web_contents, origin, this))); |
| } |
| content::PluginService::GetInstance()->PurgePluginListCache(profile_, false); |
| } |
| |
| void FlashTemporaryPermissionTracker::RevokeAccess(GrantObserver* observer) { |
| DCHECK(observer); |
| { |
| base::AutoLock lock(granted_origins_lock_); |
| auto range = granted_origins_.equal_range(observer->origin()); |
| for (auto it = range.first; it != range.second;) { |
| if (it->second.get() == observer) { |
| it = granted_origins_.erase(it); |
| break; |
| } |
| } |
| } |
| content::PluginService::GetInstance()->PurgePluginListCache(profile_, false); |
| } |
| |
| void FlashTemporaryPermissionTracker::ShutdownOnUIThread() { |
| DCHECK(granted_origins_.empty()); |
| } |
| |
| FlashTemporaryPermissionTracker::GrantObserver::GrantObserver( |
| content::WebContents* web_contents, |
| const GURL& origin, |
| FlashTemporaryPermissionTracker* owner) |
| : content::WebContentsObserver(web_contents), |
| origin_(origin), |
| owner_(owner) {} |
| |
| void FlashTemporaryPermissionTracker::GrantObserver::WebContentsDestroyed() { |
| owner_->RevokeAccess(this); |
| } |