Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(59)

Side by Side Diff: chrome/browser/guest_view/guest_view_base.cc

Issue 272573005: <webview>: Move NewWindow API to chrome (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@guestview_manager_rename
Patch Set: Cleanup and fix tests Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/guest_view/guest_view_base.h" 5 #include "chrome/browser/guest_view/guest_view_base.h"
6 6
7 #include "base/lazy_instance.h" 7 #include "base/lazy_instance.h"
8 #include "chrome/browser/guest_view/ad_view/ad_view_guest.h" 8 #include "chrome/browser/guest_view/ad_view/ad_view_guest.h"
9 #include "chrome/browser/guest_view/guest_view_constants.h" 9 #include "chrome/browser/guest_view/guest_view_constants.h"
10 #include "chrome/browser/guest_view/guest_view_manager.h" 10 #include "chrome/browser/guest_view/guest_view_manager.h"
(...skipping 22 matching lines...) Expand all
33 } 33 }
34 34
35 GuestViewBase::Event::~Event() { 35 GuestViewBase::Event::~Event() {
36 } 36 }
37 37
38 scoped_ptr<base::DictionaryValue> GuestViewBase::Event::GetArguments() { 38 scoped_ptr<base::DictionaryValue> GuestViewBase::Event::GetArguments() {
39 return args_.Pass(); 39 return args_.Pass();
40 } 40 }
41 41
42 GuestViewBase::GuestViewBase(WebContents* guest_web_contents, 42 GuestViewBase::GuestViewBase(WebContents* guest_web_contents,
43 const std::string& embedder_extension_id, 43 const std::string& embedder_extension_id)
44 const base::WeakPtr<GuestViewBase>& opener)
45 : guest_web_contents_(guest_web_contents), 44 : guest_web_contents_(guest_web_contents),
46 embedder_web_contents_(NULL), 45 embedder_web_contents_(NULL),
47 embedder_extension_id_(embedder_extension_id), 46 embedder_extension_id_(embedder_extension_id),
48 embedder_render_process_id_(0), 47 embedder_render_process_id_(0),
49 browser_context_(guest_web_contents->GetBrowserContext()), 48 browser_context_(guest_web_contents->GetBrowserContext()),
50 guest_instance_id_(guest_web_contents->GetEmbeddedInstanceID()), 49 guest_instance_id_(guest_web_contents->GetEmbeddedInstanceID()),
51 view_instance_id_(guestview::kInstanceIDNone), 50 view_instance_id_(guestview::kInstanceIDNone),
52 opener_(opener),
53 weak_ptr_factory_(this) { 51 weak_ptr_factory_(this) {
54 webcontents_guestview_map.Get().insert( 52 webcontents_guestview_map.Get().insert(
55 std::make_pair(guest_web_contents, this)); 53 std::make_pair(guest_web_contents, this));
56 GuestViewManager::FromBrowserContext(browser_context_)-> 54 GuestViewManager::FromBrowserContext(browser_context_)->
57 AddGuest(guest_instance_id_, guest_web_contents); 55 AddGuest(guest_instance_id_, guest_web_contents);
58 } 56 }
59 57
60 // static 58 // static
61 GuestViewBase* GuestViewBase::Create( 59 GuestViewBase* GuestViewBase::Create(
62 WebContents* guest_web_contents, 60 WebContents* guest_web_contents,
63 const std::string& embedder_extension_id, 61 const std::string& embedder_extension_id,
64 const std::string& view_type, 62 const std::string& view_type) {
65 const base::WeakPtr<GuestViewBase>& opener) {
66 if (view_type == "webview") { 63 if (view_type == "webview") {
67 return new WebViewGuest(guest_web_contents, embedder_extension_id, opener); 64 return new WebViewGuest(guest_web_contents, embedder_extension_id);
68 } else if (view_type == "adview") { 65 } else if (view_type == "adview") {
69 return new AdViewGuest(guest_web_contents, embedder_extension_id); 66 return new AdViewGuest(guest_web_contents, embedder_extension_id);
70 } 67 }
71 NOTREACHED(); 68 NOTREACHED();
72 return NULL; 69 return NULL;
73 } 70 }
74 71
75 // static 72 // static
76 GuestViewBase* GuestViewBase::FromWebContents(WebContents* web_contents) { 73 GuestViewBase* GuestViewBase::FromWebContents(WebContents* web_contents) {
77 WebContentsGuestViewMap* guest_map = webcontents_guestview_map.Pointer(); 74 WebContentsGuestViewMap* guest_map = webcontents_guestview_map.Pointer();
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
141 base::WeakPtr<GuestViewBase> GuestViewBase::AsWeakPtr() { 138 base::WeakPtr<GuestViewBase> GuestViewBase::AsWeakPtr() {
142 return weak_ptr_factory_.GetWeakPtr(); 139 return weak_ptr_factory_.GetWeakPtr();
143 } 140 }
144 141
145 void GuestViewBase::Attach(content::WebContents* embedder_web_contents, 142 void GuestViewBase::Attach(content::WebContents* embedder_web_contents,
146 const base::DictionaryValue& args) { 143 const base::DictionaryValue& args) {
147 embedder_web_contents_ = embedder_web_contents; 144 embedder_web_contents_ = embedder_web_contents;
148 embedder_render_process_id_ = 145 embedder_render_process_id_ =
149 embedder_web_contents->GetRenderProcessHost()->GetID(); 146 embedder_web_contents->GetRenderProcessHost()->GetID();
150 args.GetInteger(guestview::kParameterInstanceId, &view_instance_id_); 147 args.GetInteger(guestview::kParameterInstanceId, &view_instance_id_);
151 148 extra_params_.reset(args.DeepCopy());
152 std::pair<int, int> key(embedder_render_process_id_, guest_instance_id_);
153 149
154 // GuestViewBase::Attach is called prior to initialization (and initial 150 // GuestViewBase::Attach is called prior to initialization (and initial
155 // navigation) of the guest in the content layer in order to permit mapping 151 // navigation) of the guest in the content layer in order to permit mapping
156 // the necessary associations between the <*view> element and its guest. This 152 // the necessary associations between the <*view> element and its guest. This
157 // is needed by the <webview> WebRequest API to allow intercepting resource 153 // is needed by the <webview> WebRequest API to allow intercepting resource
158 // requests during navigation. However, queued events should be fired after 154 // requests during navigation. However, queued events should be fired after
159 // content layer initialization in order to ensure that load events (such as 155 // content layer initialization in order to ensure that load events (such as
160 // 'loadstop') fire in embedder after the contentWindow is available. 156 // 'loadstop') fire in embedder after the contentWindow is available.
161 if (!in_extension()) 157 if (!in_extension())
162 return; 158 return;
163 159
164 base::MessageLoop::current()->PostTask( 160 base::MessageLoop::current()->PostTask(
165 FROM_HERE, 161 FROM_HERE,
166 base::Bind(&GuestViewBase::SendQueuedEvents, 162 base::Bind(&GuestViewBase::SendQueuedEvents,
167 weak_ptr_factory_.GetWeakPtr())); 163 weak_ptr_factory_.GetWeakPtr()));
168 } 164 }
169 165
170 WebContents* GuestViewBase::GetOpener() const { 166 void GuestViewBase::Destroy() {
171 if (!opener_) 167 destruction_callback_.Run(guest_web_contents());
lazyboy 2014/05/12 23:00:20 Will destruction_callback_ be always set? Prefer a
Fady Samuel 2014/05/13 18:59:02 Done.
172 return NULL; 168 delete guest_web_contents();
173 return opener_->guest_web_contents();
174 } 169 }
175 170
176 void GuestViewBase::SetOpener(WebContents* web_contents) { 171
177 GuestViewBase* guest = FromWebContents(web_contents); 172 void GuestViewBase::SetOpener(GuestViewBase* guest) {
178 if (guest && guest->IsViewType(GetViewType())) { 173 if (guest && guest->IsViewType(GetViewType())) {
179 opener_ = guest->AsWeakPtr(); 174 opener_ = guest->AsWeakPtr();
180 return; 175 return;
181 } 176 }
182 opener_ = base::WeakPtr<GuestViewBase>(); 177 opener_ = base::WeakPtr<GuestViewBase>();
183 } 178 }
184 179
180 void GuestViewBase::RegisterDestructionCallback(
181 const DestructionCallback& callback) {
182 destruction_callback_ = callback;
183 }
184
185 GuestViewBase::~GuestViewBase() { 185 GuestViewBase::~GuestViewBase() {
186 std::pair<int, int> key(embedder_render_process_id_, guest_instance_id_); 186 std::pair<int, int> key(embedder_render_process_id_, guest_instance_id_);
187 187
188 webcontents_guestview_map.Get().erase(guest_web_contents()); 188 webcontents_guestview_map.Get().erase(guest_web_contents());
189 189
190 GuestViewManager::FromBrowserContext(browser_context_)-> 190 GuestViewManager::FromBrowserContext(browser_context_)->
191 RemoveGuest(guest_instance_id_); 191 RemoveGuest(guest_instance_id_);
192 192
193 pending_events_.clear(); 193 pending_events_.clear();
194 } 194 }
(...skipping 24 matching lines...) Expand all
219 embedder_extension_id_, 219 embedder_extension_id_,
220 event->name(), 220 event->name(),
221 args.Pass(), 221 args.Pass(),
222 extensions::EventRouter::USER_GESTURE_UNKNOWN, 222 extensions::EventRouter::USER_GESTURE_UNKNOWN,
223 info); 223 info);
224 } 224 }
225 225
226 void GuestViewBase::SendQueuedEvents() { 226 void GuestViewBase::SendQueuedEvents() {
227 if (!attached()) 227 if (!attached())
228 return; 228 return;
229
230 while (!pending_events_.empty()) { 229 while (!pending_events_.empty()) {
231 linked_ptr<Event> event_ptr = pending_events_.front(); 230 linked_ptr<Event> event_ptr = pending_events_.front();
232 pending_events_.pop_front(); 231 pending_events_.pop_front();
233 DispatchEvent(event_ptr.release()); 232 DispatchEvent(event_ptr.release());
234 } 233 }
235 } 234 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698