1// Copyright (c) 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 "android_webview/browser/aw_contents_client_bridge_base.h" 6 7#include "content/public/browser/browser_thread.h" 8#include "content/public/browser/render_frame_host.h" 9#include "content/public/browser/web_contents.h" 10 11using content::BrowserThread; 12using content::WebContents; 13 14namespace android_webview { 15 16namespace { 17 18const void* kAwContentsClientBridgeBase = &kAwContentsClientBridgeBase; 19 20// This class is invented so that the UserData registry that we inject the 21// AwContentsClientBridgeBase object does not own and destroy it. 22class UserData : public base::SupportsUserData::Data { 23 public: 24 static AwContentsClientBridgeBase* GetContents( 25 content::WebContents* web_contents) { 26 if (!web_contents) 27 return NULL; 28 UserData* data = reinterpret_cast<UserData*>( 29 web_contents->GetUserData(kAwContentsClientBridgeBase)); 30 return data ? data->contents_ : NULL; 31 } 32 33 explicit UserData(AwContentsClientBridgeBase* ptr) : contents_(ptr) {} 34 private: 35 AwContentsClientBridgeBase* contents_; 36 37 DISALLOW_COPY_AND_ASSIGN(UserData); 38}; 39 40} // namespace 41 42// static 43void AwContentsClientBridgeBase::Associate( 44 WebContents* web_contents, 45 AwContentsClientBridgeBase* handler) { 46 web_contents->SetUserData(kAwContentsClientBridgeBase, 47 new UserData(handler)); 48} 49 50void AwContentsClientBridgeBase::Disassociate( 51 WebContents* web_contents) { 52 web_contents->RemoveUserData(kAwContentsClientBridgeBase); 53} 54 55// static 56AwContentsClientBridgeBase* AwContentsClientBridgeBase::FromWebContents( 57 WebContents* web_contents) { 58 return UserData::GetContents(web_contents); 59} 60 61// static 62AwContentsClientBridgeBase* AwContentsClientBridgeBase::FromID( 63 int render_process_id, 64 int render_frame_id) { 65 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 66 content::RenderFrameHost* rfh = 67 content::RenderFrameHost::FromID(render_process_id, render_frame_id); 68 content::WebContents* web_contents = 69 content::WebContents::FromRenderFrameHost(rfh); 70 return UserData::GetContents(web_contents); 71} 72 73AwContentsClientBridgeBase::~AwContentsClientBridgeBase() { 74} 75 76} // namespace android_webview 77