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

Side by Side Diff: content/browser/tab_contents/tab_contents.cc

Issue 8760024: Cross-process postMessage (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: New patch, still not quite done Created 9 years 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 (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 "content/browser/tab_contents/tab_contents.h" 5 #include "content/browser/tab_contents/tab_contents.h"
6 6
7 #include <cmath> 7 #include <cmath>
8 8
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/metrics/histogram.h" 10 #include "base/metrics/histogram.h"
11 #include "base/metrics/stats_counters.h" 11 #include "base/metrics/stats_counters.h"
12 #include "base/string16.h" 12 #include "base/string16.h"
13 #include "base/string_util.h" 13 #include "base/string_util.h"
14 #include "base/time.h" 14 #include "base/time.h"
15 #include "base/utf_string_conversions.h" 15 #include "base/utf_string_conversions.h"
16 #include "content/browser/browser_context.h" 16 #include "content/browser/browser_context.h"
17 #include "content/browser/browsing_instance_frame_id.h"
17 #include "content/browser/child_process_security_policy.h" 18 #include "content/browser/child_process_security_policy.h"
18 #include "content/browser/debugger/devtools_manager_impl.h" 19 #include "content/browser/debugger/devtools_manager_impl.h"
19 #include "content/browser/download/download_manager.h" 20 #include "content/browser/download/download_manager.h"
20 #include "content/browser/download/download_stats.h" 21 #include "content/browser/download/download_stats.h"
22 #include "content/browser/frame_map.h"
21 #include "content/browser/host_zoom_map.h" 23 #include "content/browser/host_zoom_map.h"
22 #include "content/browser/in_process_webkit/session_storage_namespace.h" 24 #include "content/browser/in_process_webkit/session_storage_namespace.h"
23 #include "content/browser/intents/intents_host_impl.h" 25 #include "content/browser/intents/intents_host_impl.h"
24 #include "content/browser/load_from_memory_cache_details.h" 26 #include "content/browser/load_from_memory_cache_details.h"
25 #include "content/browser/load_notification_details.h" 27 #include "content/browser/load_notification_details.h"
26 #include "content/browser/renderer_host/render_process_host_impl.h" 28 #include "content/browser/renderer_host/render_process_host_impl.h"
27 #include "content/browser/renderer_host/render_view_host.h" 29 #include "content/browser/renderer_host/render_view_host.h"
28 #include "content/browser/renderer_host/render_widget_host_view.h" 30 #include "content/browser/renderer_host/render_widget_host_view.h"
29 #include "content/browser/renderer_host/resource_dispatcher_host.h" 31 #include "content/browser/renderer_host/resource_dispatcher_host.h"
30 #include "content/browser/renderer_host/resource_request_details.h" 32 #include "content/browser/renderer_host/resource_request_details.h"
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
160 params->current_history_list_offset = controller.last_committed_entry_index(); 162 params->current_history_list_offset = controller.last_committed_entry_index();
161 params->current_history_list_length = controller.entry_count(); 163 params->current_history_list_length = controller.entry_count();
162 params->url = entry.url(); 164 params->url = entry.url();
163 params->referrer = entry.referrer(); 165 params->referrer = entry.referrer();
164 params->transition = entry.transition_type(); 166 params->transition = entry.transition_type();
165 params->state = entry.content_state(); 167 params->state = entry.content_state();
166 params->navigation_type = 168 params->navigation_type =
167 GetNavigationType(controller.browser_context(), entry, reload_type); 169 GetNavigationType(controller.browser_context(), entry, reload_type);
168 params->request_time = base::Time::Now(); 170 params->request_time = base::Time::Now();
169 params->extra_headers = entry.extra_headers(); 171 params->extra_headers = entry.extra_headers();
172 params->opener_browsing_instance_frame_id =
173 entry.opener_browsing_instance_frame_id();
170 params->transferred_request_child_id = 174 params->transferred_request_child_id =
171 entry.transferred_global_request_id().child_id; 175 entry.transferred_global_request_id().child_id;
172 params->transferred_request_request_id = 176 params->transferred_request_request_id =
173 entry.transferred_global_request_id().request_id; 177 entry.transferred_global_request_id().request_id;
174 178
175 if (delegate) 179 if (delegate)
176 delegate->AddNavigationHeaders(params->url, &params->extra_headers); 180 delegate->AddNavigationHeaders(params->url, &params->extra_headers);
177 } 181 }
178 182
179 } // namespace 183 } // namespace
(...skipping 30 matching lines...) Expand all
210 #endif 214 #endif
211 is_showing_before_unload_dialog_(false), 215 is_showing_before_unload_dialog_(false),
212 opener_web_ui_type_(WebUI::kNoWebUI), 216 opener_web_ui_type_(WebUI::kNoWebUI),
213 closed_by_user_gesture_(false), 217 closed_by_user_gesture_(false),
214 minimum_zoom_percent_( 218 minimum_zoom_percent_(
215 static_cast<int>(content::kMinimumZoomFactor * 100)), 219 static_cast<int>(content::kMinimumZoomFactor * 100)),
216 maximum_zoom_percent_( 220 maximum_zoom_percent_(
217 static_cast<int>(content::kMaximumZoomFactor * 100)), 221 static_cast<int>(content::kMaximumZoomFactor * 100)),
218 temporary_zoom_settings_(false), 222 temporary_zoom_settings_(false),
219 content_restrictions_(0), 223 content_restrictions_(0),
220 view_type_(content::VIEW_TYPE_TAB_CONTENTS) { 224 view_type_(content::VIEW_TYPE_TAB_CONTENTS),
225 browsing_instance_frame_(
226 browser_context->frame_mapper().AllocateNewTopLevelFrameId()) {
221 render_manager_.Init(browser_context, site_instance, routing_id); 227 render_manager_.Init(browser_context, site_instance, routing_id);
222 228
229 // TODO(supersat): This is a hack and should be removed.
230 if (routing_id > 0) {
231 browser_context->frame_mapper().UpdateFrame(
232 browsing_instance_frame_, render_view_host()->process()->GetID(),
233 routing_id, -1 /* We don't know the frame id yet */);
234 }
235
223 // We have the initial size of the view be based on the size of the passed in 236 // We have the initial size of the view be based on the size of the passed in
224 // tab contents (normally a tab from the same window). 237 // tab contents (normally a tab from the same window).
225 view_->CreateView(base_tab_contents ? 238 view_->CreateView(base_tab_contents ?
226 base_tab_contents->view()->GetContainerSize() : gfx::Size()); 239 base_tab_contents->view()->GetContainerSize() : gfx::Size());
227 240
228 #if defined(ENABLE_JAVA_BRIDGE) 241 #if defined(ENABLE_JAVA_BRIDGE)
229 java_bridge_dispatcher_host_manager_.reset( 242 java_bridge_dispatcher_host_manager_.reset(
230 new JavaBridgeDispatcherHostManager(this)); 243 new JavaBridgeDispatcherHostManager(this));
231 #endif 244 #endif
232 } 245 }
(...skipping 23 matching lines...) Expand all
256 host->view()->WillWmDestroy(); 269 host->view()->WillWmDestroy();
257 } 270 }
258 #endif 271 #endif
259 272
260 // OnCloseStarted isn't called in unit tests. 273 // OnCloseStarted isn't called in unit tests.
261 if (!tab_close_start_time_.is_null()) { 274 if (!tab_close_start_time_.is_null()) {
262 UMA_HISTOGRAM_TIMES("Tab.Close", 275 UMA_HISTOGRAM_TIMES("Tab.Close",
263 base::TimeTicks::Now() - tab_close_start_time_); 276 base::TimeTicks::Now() - tab_close_start_time_);
264 } 277 }
265 278
279 // Remove the top-level frame from the frame mapper
280 browser_context()->frame_mapper().RemoveFrame(browsing_instance_frame_);
281 // TODO(supersat): This should probably remove the proxy on the other side
282 delete browsing_instance_frame_;
283
266 FOR_EACH_OBSERVER(TabContentsObserver, observers_, TabContentsDestroyed()); 284 FOR_EACH_OBSERVER(TabContentsObserver, observers_, TabContentsDestroyed());
267 285
268 set_delegate(NULL); 286 set_delegate(NULL);
269 } 287 }
270 288
271 // TODO(cbentzel): Either remove the debugging code, or rename to SetDelegate. 289 // TODO(cbentzel): Either remove the debugging code, or rename to SetDelegate.
272 void TabContents::set_delegate(TabContentsDelegate* delegate) { 290 void TabContents::set_delegate(TabContentsDelegate* delegate) {
273 if (delegate == delegate_) 291 if (delegate == delegate_)
274 return; 292 return;
275 if (delegate_) 293 if (delegate_)
(...skipping 1023 matching lines...) Expand 10 before | Expand all | Expand 10 after
1299 // page. 1317 // page.
1300 UpdateTargetURL(details.entry->page_id(), GURL()); 1318 UpdateTargetURL(details.entry->page_id(), GURL());
1301 } 1319 }
1302 1320
1303 if (!details.is_in_page) { 1321 if (!details.is_in_page) {
1304 // Once the main frame is navigated, we're no longer considered to have 1322 // Once the main frame is navigated, we're no longer considered to have
1305 // displayed insecure content. 1323 // displayed insecure content.
1306 displayed_insecure_content_ = false; 1324 displayed_insecure_content_ = false;
1307 } 1325 }
1308 1326
1327 DLOG(WARNING) << "DidNavigateMainFramePostCommit: " <<
1328 params.url << ", " << params.frame_id;
1329 content::FrameMap& mapper = browser_context()->frame_mapper();
1330 mapper.UpdateFrame(browsing_instance_frame_,
1331 render_view_host()->process()->GetID(),
1332 render_view_host()->routing_id(),
1333 params.frame_id);
1334
1309 // Notify observers about navigation. 1335 // Notify observers about navigation.
1310 FOR_EACH_OBSERVER(TabContentsObserver, observers_, 1336 FOR_EACH_OBSERVER(TabContentsObserver, observers_,
1311 DidNavigateMainFrame(details, params)); 1337 DidNavigateMainFrame(details, params));
1312 } 1338 }
1313 1339
1314 void TabContents::DidNavigateAnyFramePostCommit( 1340 void TabContents::DidNavigateAnyFramePostCommit(
1315 RenderViewHost* render_view_host, 1341 RenderViewHost* render_view_host,
1316 const content::LoadCommittedDetails& details, 1342 const content::LoadCommittedDetails& details,
1317 const ViewHostMsg_FrameNavigate_Params& params) { 1343 const ViewHostMsg_FrameNavigate_Params& params) {
1318 // If we navigate, reset JavaScript state. This does nothing to prevent 1344 // If we navigate, reset JavaScript state. This does nothing to prevent
1319 // a malicious script from spamming messages, since the script could just 1345 // a malicious script from spamming messages, since the script could just
1320 // reload the page to stop blocking. 1346 // reload the page to stop blocking.
1321 if (dialog_creator_) { 1347 if (dialog_creator_) {
1322 dialog_creator_->ResetJavaScriptState(this); 1348 dialog_creator_->ResetJavaScriptState(this);
1323 dialog_creator_ = NULL; 1349 dialog_creator_ = NULL;
1324 } 1350 }
1325 1351
1352 // TODO(supersat): Logging for debugging purposes only.
1353 DLOG(WARNING) << "DidNavigateAnyFramePostCommit: "
1354 << "bifi = " << browsing_instance_frame_->id()
1355 << ", process id = " << render_view_host->process()->GetID()
1356 << ", rvh route = " << render_view_host->routing_id()
1357 << ", frame_id = " << params.frame_id << ", url = " <<
1358 params.url;
1326 // Notify observers about navigation. 1359 // Notify observers about navigation.
1327 FOR_EACH_OBSERVER(TabContentsObserver, observers_, 1360 FOR_EACH_OBSERVER(TabContentsObserver, observers_,
1328 DidNavigateAnyFrame(details, params)); 1361 DidNavigateAnyFrame(details, params));
1329 } 1362 }
1330 1363
1331 void TabContents::UpdateMaxPageIDIfNecessary(SiteInstance* site_instance, 1364 void TabContents::UpdateMaxPageIDIfNecessary(SiteInstance* site_instance,
1332 RenderViewHost* rvh) { 1365 RenderViewHost* rvh) {
1333 // If we are creating a RVH for a restored controller, then we might 1366 // If we are creating a RVH for a restored controller, then we might
1334 // have more page IDs than the SiteInstance's current max page ID. We must 1367 // have more page IDs than the SiteInstance's current max page ID. We must
1335 // make sure that the max page ID is larger than any restored page ID. 1368 // make sure that the max page ID is larger than any restored page ID.
(...skipping 401 matching lines...) Expand 10 before | Expand all | Expand 10 after
1737 int32 page_id) { 1770 int32 page_id) {
1738 content::NotificationService::current()->Notify( 1771 content::NotificationService::current()->Notify(
1739 content::NOTIFICATION_LOAD_COMPLETED_MAIN_FRAME, 1772 content::NOTIFICATION_LOAD_COMPLETED_MAIN_FRAME,
1740 content::Source<TabContents>(this), 1773 content::Source<TabContents>(this),
1741 content::Details<int>(&page_id)); 1774 content::Details<int>(&page_id));
1742 } 1775 }
1743 1776
1744 void TabContents::RequestOpenURL(const GURL& url, 1777 void TabContents::RequestOpenURL(const GURL& url,
1745 const content::Referrer& referrer, 1778 const content::Referrer& referrer,
1746 WindowOpenDisposition disposition, 1779 WindowOpenDisposition disposition,
1747 int64 source_frame_id) { 1780 int64 source_frame_id,
1781 int64 opener_browsing_instance_frame_id) {
1748 // Delegate to RequestTransferURL because this is just the generic 1782 // Delegate to RequestTransferURL because this is just the generic
1749 // case where |old_request_id| is empty. 1783 // case where |old_request_id| is empty.
1750 RequestTransferURL(url, referrer, disposition, source_frame_id, 1784 RequestTransferURL(url, referrer, disposition, source_frame_id,
1751 GlobalRequestID()); 1785 opener_browsing_instance_frame_id, GlobalRequestID());
1752 } 1786 }
1753 1787
1754 void TabContents::RequestTransferURL(const GURL& url, 1788 void TabContents::RequestTransferURL(const GURL& url,
1755 const content::Referrer& referrer, 1789 const content::Referrer& referrer,
1756 WindowOpenDisposition disposition, 1790 WindowOpenDisposition disposition,
1757 int64 source_frame_id, 1791 int64 source_frame_id,
1792 int64 opener_browsing_instance_frame_id,
1758 const GlobalRequestID& old_request_id) { 1793 const GlobalRequestID& old_request_id) {
1759 TabContents* new_contents = NULL; 1794 TabContents* new_contents = NULL;
1760 content::PageTransition transition_type = content::PAGE_TRANSITION_LINK; 1795 content::PageTransition transition_type = content::PAGE_TRANSITION_LINK;
1761 if (render_manager_.web_ui()) { 1796 if (render_manager_.web_ui()) {
1762 // When we're a Web UI, it will provide a page transition type for us (this 1797 // When we're a Web UI, it will provide a page transition type for us (this
1763 // is so the new tab page can specify AUTO_BOOKMARK for automatically 1798 // is so the new tab page can specify AUTO_BOOKMARK for automatically
1764 // generated suggestions). 1799 // generated suggestions).
1765 // 1800 //
1766 // Note also that we hide the referrer for Web UI pages. We don't really 1801 // Note also that we hide the referrer for Web UI pages. We don't really
1767 // want web sites to see a referrer of "chrome://blah" (and some 1802 // want web sites to see a referrer of "chrome://blah" (and some
1768 // chrome: URLs might have search terms or other stuff we don't want to 1803 // chrome: URLs might have search terms or other stuff we don't want to
1769 // send to the site), so we send no referrer. 1804 // send to the site), so we send no referrer.
1770 OpenURLParams params(url, content::Referrer(), disposition, 1805 OpenURLParams params(url, content::Referrer(), disposition,
1771 render_manager_.web_ui()->link_transition_type(), 1806 render_manager_.web_ui()->link_transition_type(),
1772 false /* is_renderer_initiated */); 1807 false /* is_renderer_initiated */);
1773 params.transferred_global_request_id = old_request_id; 1808 params.transferred_global_request_id = old_request_id;
1774 new_contents = OpenURL(params); 1809 new_contents = OpenURL(params);
1775 transition_type = render_manager_.web_ui()->link_transition_type(); 1810 transition_type = render_manager_.web_ui()->link_transition_type();
1776 } else { 1811 } else {
1777 OpenURLParams params(url, referrer, disposition, 1812 OpenURLParams params(url, referrer, disposition,
1778 content::PAGE_TRANSITION_LINK, true /* is_renderer_initiated */); 1813 content::PAGE_TRANSITION_LINK, true /* is_renderer_initiated */,
1814 opener_browsing_instance_frame_id);
1779 params.transferred_global_request_id = old_request_id; 1815 params.transferred_global_request_id = old_request_id;
1780 new_contents = OpenURL(params); 1816 new_contents = OpenURL(params);
1781 } 1817 }
1782 if (new_contents) { 1818 if (new_contents) {
1783 // Notify observers. 1819 // Notify observers.
1784 FOR_EACH_OBSERVER(TabContentsObserver, observers_, 1820 FOR_EACH_OBSERVER(TabContentsObserver, observers_,
1785 DidOpenRequestedURL(new_contents, 1821 DidOpenRequestedURL(new_contents,
1786 url, 1822 url,
1787 referrer, 1823 referrer,
1788 disposition, 1824 disposition,
(...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after
2068 RenderWidgetHostView* rwh_view = view()->CreateViewForWidget(rvh); 2104 RenderWidgetHostView* rwh_view = view()->CreateViewForWidget(rvh);
2069 // Can be NULL during tests. 2105 // Can be NULL during tests.
2070 if (rwh_view) 2106 if (rwh_view)
2071 rwh_view->SetSize(view()->GetContainerSize()); 2107 rwh_view->SetSize(view()->GetContainerSize());
2072 } 2108 }
2073 2109
2074 bool TabContents::GotResponseToLockMouseRequest(bool allowed) { 2110 bool TabContents::GotResponseToLockMouseRequest(bool allowed) {
2075 return render_view_host() ? 2111 return render_view_host() ?
2076 render_view_host()->GotResponseToLockMouseRequest(allowed) : false; 2112 render_view_host()->GotResponseToLockMouseRequest(allowed) : false;
2077 } 2113 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698