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

Side by Side Diff: extensions/browser/guest_view/extension_view/extension_view_guest.cc

Issue 873933002: Add <extensionview> (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Initial Created 5 years, 11 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
(Empty)
1 // Copyright 2015 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 "extensions/browser/guest_view/extension_view/extension_view_guest.h"
6
7 #include "base/metrics/user_metrics.h"
8 #include "content/public/browser/render_process_host.h"
9 #include "content/public/common/result_codes.h"
10 #include "extensions/browser/api/extensions_api_client.h"
11 #include "extensions/browser/guest_view/extension_view/extension_view_constants. h"
12 #include "extensions/common/constants.h"
13 #include "extensions/common/extension_messages.h"
14 #include "extensions/strings/grit/extensions_strings.h"
15
16 using content::WebContents;
17 using namespace extensions::core_api;
18
19 namespace extensions {
20
21 // static
22 const char ExtensionViewGuest::Type[] = "extensionview";
23
24 ExtensionViewGuest::ExtensionViewGuest(content::WebContents* owner_web_contents,
25 int guest_instance_id)
26 : GuestView<ExtensionViewGuest>(owner_web_contents, guest_instance_id),
27 extension_view_guest_delegate_(
28 extensions::ExtensionsAPIClient::Get()
29 ->CreateExtensionViewGuestDelegate(this)) {
30 }
31
32 ExtensionViewGuest::~ExtensionViewGuest() {
33 }
34
35 // static
36 extensions::GuestViewBase* ExtensionViewGuest::Create(
37 content::WebContents* owner_web_contents,
38 int guest_instance_id) {
39 return new ExtensionViewGuest(owner_web_contents, guest_instance_id);
40 }
41
42 void ExtensionViewGuest::NavigateGuest(const std::string& src,
43 bool force_navigation) {
44 if (src.empty())
45 return;
46
47 GURL url(src);
48 if (!force_navigation && (url == view_page_))
49 return;
50
51 web_contents()->GetRenderProcessHost()->FilterURL(false, &url);
52 web_contents()->GetController().LoadURL(url, content::Referrer(),
53 ui::PAGE_TRANSITION_AUTO_TOPLEVEL,
54 std::string());
55
56 view_page_ = url;
57 }
58
59 // GuestViewBase implementation.
60 void ExtensionViewGuest::CreateWebContents(
61 const base::DictionaryValue& create_params,
62 const WebContentsCreatedCallback& callback) {
63 content::SiteInstance* view_site_instance =
64 content::SiteInstance::CreateForURL(browser_context(), GetOwnerSiteURL());
Fady Samuel 2015/01/26 12:52:02 This doesn't seem right. I think you want to use t
apacible 2015/01/26 22:12:33 Done.
65
66 WebContents::CreateParams params(browser_context(), view_site_instance);
67 params.guest_delegate = this;
68 callback.Run(WebContents::Create(params));
69 }
70
71 void ExtensionViewGuest::DidAttachToEmbedder() {
72 ApplySrc(*attach_params());
73 }
74
75 void ExtensionViewGuest::DidInitialize(
76 const base::DictionaryValue& create_params) {
77 if (extension_view_guest_delegate_)
78 extension_view_guest_delegate_->DidInitialize();
79 }
80
81 const char* ExtensionViewGuest::GetAPINamespace() const {
82 return extensionview::kAPINamespace;
83 }
84
85 int ExtensionViewGuest::GetTaskPrefix() const {
86 return IDS_EXTENSION_TASK_MANAGER_EXTENSIONVIEW_TAG_PREFIX;
87 }
88
89 // ExtensionFunctionDispatcher::Delegate implementation.
90 content::WebContents* ExtensionViewGuest::GetAssociatedWebContents() const {
91 return web_contents();
92 }
93
94 // content::WebContentsDelegate implementation.
95 content::WebContents* ExtensionViewGuest::OpenURLFromTab(
96 content::WebContents* source,
97 const content::OpenURLParams& params) {
98 if (!extension_view_guest_delegate_)
99 return NULL;
Fady Samuel 2015/01/26 12:52:02 nit: use nullptr
apacible 2015/01/26 22:12:33 I cleaned up this class and end up removing the We
100 return extension_view_guest_delegate_->OpenURLInNewTab(params);
101 }
102
103 bool ExtensionViewGuest::HandleContextMenu(
104 const content::ContextMenuParams& params) {
105 if (!extension_view_guest_delegate_)
106 return false;
107
108 return extension_view_guest_delegate_->HandleContextMenu(params);
109 }
110
111 bool ExtensionViewGuest::ShouldCreateWebContents(
112 content::WebContents* web_contents,
113 int route_id,
114 int main_frame_route_id,
115 WindowContainerType window_container_type,
116 const base::string16& frame_name,
117 const GURL& target_url,
118 const std::string& partition_id,
119 content::SessionStorageNamespace* session_storage_namespace) {
120 if (extension_view_guest_delegate_) {
121 extension_view_guest_delegate_->OpenURLInNewTab(content::OpenURLParams(
122 target_url, content::Referrer(), NEW_FOREGROUND_TAB,
123 ui::PAGE_TRANSITION_LINK, false));
124 }
125 return false;
126 }
127
128 // content::WebContentsObserver implementation.
129 void ExtensionViewGuest::DidNavigateMainFrame(
130 const content::LoadCommittedDetails& details,
131 const content::FrameNavigateParams& params) {
132 if (attached() && (params.url.GetOrigin() != view_page_.GetOrigin())) {
Fady Samuel 2015/01/26 12:52:02 Wow, what's going on here? You're killing the gues
apacible 2015/01/26 22:12:33 I wanted the guest to stay on the same origin, but
133 web_contents()->GetRenderProcessHost()->Shutdown(
134 content::RESULT_CODE_KILLED_BAD_MESSAGE, false /* wait */);
135 }
136 }
137
138 bool ExtensionViewGuest::OnMessageReceived(const IPC::Message& message) {
139 bool handled = true;
140 IPC_BEGIN_MESSAGE_MAP(ExtensionViewGuest, message)
141 IPC_MESSAGE_HANDLER(ExtensionHostMsg_Request, OnRequest)
142 IPC_MESSAGE_UNHANDLED(handled = false)
143 IPC_END_MESSAGE_MAP()
144 return handled;
145 }
146
147 // Private
148 void ExtensionViewGuest::OnRequest(
149 const ExtensionHostMsg_Request_Params& params) {
150 extension_function_dispatcher_->Dispatch(params,
151 web_contents()->GetRenderViewHost());
152 }
153
154 void ExtensionViewGuest::ApplySrc(const base::DictionaryValue& params) {
155 std::string src;
156 params.GetString(extensionview::kAttributeSrc, &src);
157 NavigateGuest(src, false /* force_navigation */);
158 }
159
160 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698