12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "android_webview/browser/aw_contents_client_bridge_base.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/browser_thread.h" 85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/browser/render_frame_host.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_contents.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using content::BrowserThread; 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using content::WebContents; 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace android_webview { 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const void* kAwContentsClientBridgeBase = &kAwContentsClientBridgeBase; 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This class is invented so that the UserData registry that we inject the 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// AwContentsClientBridgeBase object does not own and destroy it. 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class UserData : public base::SupportsUserData::Data { 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static AwContentsClientBridgeBase* GetContents( 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::WebContents* web_contents) { 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!web_contents) 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UserData* data = reinterpret_cast<UserData*>( 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents->GetUserData(kAwContentsClientBridgeBase)); 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return data ? data->contents_ : NULL; 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) explicit UserData(AwContentsClientBridgeBase* ptr) : contents_(ptr) {} 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AwContentsClientBridgeBase* contents_; 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(UserData); 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AwContentsClientBridgeBase::Associate( 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* web_contents, 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AwContentsClientBridgeBase* handler) { 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents->SetUserData(kAwContentsClientBridgeBase, 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new UserData(handler)); 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid AwContentsClientBridgeBase::Disassociate( 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci WebContents* web_contents) { 521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci web_contents->RemoveUserData(kAwContentsClientBridgeBase); 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AwContentsClientBridgeBase* AwContentsClientBridgeBase::FromWebContents( 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* web_contents) { 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return UserData::GetContents(web_contents); 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AwContentsClientBridgeBase* AwContentsClientBridgeBase::FromID( 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int render_process_id, 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int render_frame_id) { 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::RenderFrameHost* rfh = 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::RenderFrameHost::FromID(render_process_id, render_frame_id); 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::WebContents* web_contents = 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::WebContents::FromRenderFrameHost(rfh); 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return UserData::GetContents(web_contents); 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AwContentsClientBridgeBase::~AwContentsClientBridgeBase() { 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace android_webview 77