OLD | NEW |
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 "chrome/renderer/render_view.h" | 5 #include "chrome/renderer/render_view.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <cmath> | 8 #include <cmath> |
9 #include <string> | 9 #include <string> |
10 #include <vector> | 10 #include <vector> |
(...skipping 569 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
580 pending_app_icon_requests_(0), | 580 pending_app_icon_requests_(0), |
581 session_storage_namespace_id_(session_storage_namespace_id) { | 581 session_storage_namespace_id_(session_storage_namespace_id) { |
582 #if defined(OS_MACOSX) | 582 #if defined(OS_MACOSX) |
583 // On Mac, the select popups are rendered by the browser. | 583 // On Mac, the select popups are rendered by the browser. |
584 // Note that we don't do this in RenderMain otherwise this would not be called | 584 // Note that we don't do this in RenderMain otherwise this would not be called |
585 // in single-process mode. | 585 // in single-process mode. |
586 WebKit::WebView::setUseExternalPopupMenus(true); | 586 WebKit::WebView::setUseExternalPopupMenus(true); |
587 #endif | 587 #endif |
588 | 588 |
589 ClearBlockedContentSettings(); | 589 ClearBlockedContentSettings(); |
590 if (CommandLine::ForCurrentProcess()->HasSwitch( | |
591 switches::kEnableClientSidePhishingDetection)) { | |
592 phishing_delegate_.reset( | |
593 new safe_browsing::PhishingClassifierDelegate(this, NULL)); | |
594 RenderThread* thread = RenderThread::current(); | |
595 if (thread && thread->phishing_scorer()) { | |
596 phishing_delegate_->SetPhishingScorer(thread->phishing_scorer()); | |
597 } | |
598 } | |
599 | 590 |
600 routing_id_ = routing_id; | 591 routing_id_ = routing_id; |
601 if (opener_id != MSG_ROUTING_NONE) | 592 if (opener_id != MSG_ROUTING_NONE) |
602 opener_id_ = opener_id; | 593 opener_id_ = opener_id; |
603 | 594 |
604 if (counter) { | 595 if (counter) { |
605 shared_popup_counter_ = counter; | 596 shared_popup_counter_ = counter; |
606 shared_popup_counter_->data++; | 597 shared_popup_counter_->data++; |
607 decrement_shared_popup_at_destruction_ = true; | 598 decrement_shared_popup_at_destruction_ = true; |
608 } else { | 599 } else { |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
650 audio_message_filter_ = new AudioMessageFilter(routing_id_); | 641 audio_message_filter_ = new AudioMessageFilter(routing_id_); |
651 render_thread_->AddFilter(audio_message_filter_); | 642 render_thread_->AddFilter(audio_message_filter_); |
652 | 643 |
653 PageClickTracker* page_click_tracker = new PageClickTracker(this); | 644 PageClickTracker* page_click_tracker = new PageClickTracker(this); |
654 // Note that the order of insertion of the listeners is important. | 645 // Note that the order of insertion of the listeners is important. |
655 // The password_autocomplete_manager takes the first shot at processing the | 646 // The password_autocomplete_manager takes the first shot at processing the |
656 // notification and can stop the propagation. | 647 // notification and can stop the propagation. |
657 page_click_tracker->AddListener(password_autofill_manager); | 648 page_click_tracker->AddListener(password_autofill_manager); |
658 page_click_tracker->AddListener(autofill_agent); | 649 page_click_tracker->AddListener(autofill_agent); |
659 new TranslateHelper(this); | 650 new TranslateHelper(this); |
| 651 |
| 652 if (CommandLine::ForCurrentProcess()->HasSwitch( |
| 653 switches::kEnableClientSidePhishingDetection)) { |
| 654 new safe_browsing::PhishingClassifierDelegate(this, NULL); |
| 655 } |
660 } | 656 } |
661 | 657 |
662 RenderView::~RenderView() { | 658 RenderView::~RenderView() { |
663 if (decrement_shared_popup_at_destruction_) | 659 if (decrement_shared_popup_at_destruction_) |
664 shared_popup_counter_->data--; | 660 shared_popup_counter_->data--; |
665 | 661 |
666 // If file chooser is still waiting for answer, dispatch empty answer. | 662 // If file chooser is still waiting for answer, dispatch empty answer. |
667 while (!file_chooser_completions_.empty()) { | 663 while (!file_chooser_completions_.empty()) { |
668 if (file_chooser_completions_.front()->completion) { | 664 if (file_chooser_completions_.front()->completion) { |
669 file_chooser_completions_.front()->completion->didChooseFile( | 665 file_chooser_completions_.front()->completion->didChooseFile( |
(...skipping 11 matching lines...) Expand all Loading... |
681 while (!fake_plugin_window_handles_.empty()) { | 677 while (!fake_plugin_window_handles_.empty()) { |
682 // Make sure no NULL plugin window handles were inserted into this list. | 678 // Make sure no NULL plugin window handles were inserted into this list. |
683 DCHECK(*fake_plugin_window_handles_.begin()); | 679 DCHECK(*fake_plugin_window_handles_.begin()); |
684 // DestroyFakePluginWindowHandle modifies fake_plugin_window_handles_. | 680 // DestroyFakePluginWindowHandle modifies fake_plugin_window_handles_. |
685 DestroyFakePluginWindowHandle(*fake_plugin_window_handles_.begin()); | 681 DestroyFakePluginWindowHandle(*fake_plugin_window_handles_.begin()); |
686 } | 682 } |
687 #endif | 683 #endif |
688 | 684 |
689 render_thread_->RemoveFilter(audio_message_filter_); | 685 render_thread_->RemoveFilter(audio_message_filter_); |
690 | 686 |
691 // Tell the PhishingClassifierDelegate that the view is going away. | |
692 if (phishing_delegate_.get()) | |
693 phishing_delegate_->CancelPendingClassification(); | |
694 | |
695 #ifndef NDEBUG | 687 #ifndef NDEBUG |
696 // Make sure we are no longer referenced by the ViewMap. | 688 // Make sure we are no longer referenced by the ViewMap. |
697 ViewMap* views = g_view_map.Pointer(); | 689 ViewMap* views = g_view_map.Pointer(); |
698 for (ViewMap::iterator it = views->begin(); it != views->end(); ++it) | 690 for (ViewMap::iterator it = views->begin(); it != views->end(); ++it) |
699 DCHECK_NE(this, it->second) << "Failed to call Close?"; | 691 DCHECK_NE(this, it->second) << "Failed to call Close?"; |
700 #endif | 692 #endif |
701 | 693 |
702 FOR_EACH_OBSERVER(RenderViewObserver, observers_, set_render_view(NULL)); | 694 FOR_EACH_OBSERVER(RenderViewObserver, observers_, set_render_view(NULL)); |
703 FOR_EACH_OBSERVER(RenderViewObserver, observers_, OnDestruct()); | 695 FOR_EACH_OBSERVER(RenderViewObserver, observers_, OnDestruct()); |
704 } | 696 } |
(...skipping 537 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1242 } | 1234 } |
1243 | 1235 |
1244 // Generate the thumbnail here if the in-browser thumbnailing isn't | 1236 // Generate the thumbnail here if the in-browser thumbnailing isn't |
1245 // enabled. TODO(satorux): Remove this and related code once | 1237 // enabled. TODO(satorux): Remove this and related code once |
1246 // crbug.com/65936 is complete. | 1238 // crbug.com/65936 is complete. |
1247 if (!CommandLine::ForCurrentProcess()->HasSwitch( | 1239 if (!CommandLine::ForCurrentProcess()->HasSwitch( |
1248 switches::kEnableInBrowserThumbnailing)) { | 1240 switches::kEnableInBrowserThumbnailing)) { |
1249 OnCaptureThumbnail(); | 1241 OnCaptureThumbnail(); |
1250 } | 1242 } |
1251 | 1243 |
1252 if (phishing_delegate_.get()) | 1244 FOR_EACH_OBSERVER(RenderViewObserver, observers_, PageCaptured(contents)); |
1253 phishing_delegate_->FinishedLoad(&contents); | |
1254 } | 1245 } |
1255 | 1246 |
1256 void RenderView::CaptureText(WebFrame* frame, string16* contents) { | 1247 void RenderView::CaptureText(WebFrame* frame, string16* contents) { |
1257 contents->clear(); | 1248 contents->clear(); |
1258 if (!frame) | 1249 if (!frame) |
1259 return; | 1250 return; |
1260 | 1251 |
1261 #ifdef TIME_TEXT_RETRIEVAL | 1252 #ifdef TIME_TEXT_RETRIEVAL |
1262 double begin = time_util::GetHighResolutionTimeNow(); | 1253 double begin = time_util::GetHighResolutionTimeNow(); |
1263 #endif | 1254 #endif |
(...skipping 1412 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2676 | 2667 |
2677 // NOTE: initial_pos_ may still have its default values at this point, but | 2668 // NOTE: initial_pos_ may still have its default values at this point, but |
2678 // that's okay. It'll be ignored if disposition is not NEW_POPUP, or the | 2669 // that's okay. It'll be ignored if disposition is not NEW_POPUP, or the |
2679 // browser process will impose a default position otherwise. | 2670 // browser process will impose a default position otherwise. |
2680 Send(new ViewHostMsg_ShowView(opener_id_, routing_id_, | 2671 Send(new ViewHostMsg_ShowView(opener_id_, routing_id_, |
2681 NavigationPolicyToDisposition(policy), initial_pos_, | 2672 NavigationPolicyToDisposition(policy), initial_pos_, |
2682 opened_by_user_gesture_)); | 2673 opened_by_user_gesture_)); |
2683 SetPendingWindowRect(initial_pos_); | 2674 SetPendingWindowRect(initial_pos_); |
2684 } | 2675 } |
2685 | 2676 |
2686 void RenderView::closeWidgetSoon() { | |
2687 // Same for the phishing classifier. | |
2688 if (phishing_delegate_.get()) | |
2689 phishing_delegate_->CancelPendingClassification(); | |
2690 | |
2691 if (script_can_close_) | |
2692 RenderWidget::closeWidgetSoon(); | |
2693 } | |
2694 | |
2695 void RenderView::runModal() { | 2677 void RenderView::runModal() { |
2696 DCHECK(did_show_) << "should already have shown the view"; | 2678 DCHECK(did_show_) << "should already have shown the view"; |
2697 | 2679 |
2698 // We must keep WebKit's shared timer running in this case in order to allow | 2680 // We must keep WebKit's shared timer running in this case in order to allow |
2699 // showModalDialog to function properly. | 2681 // showModalDialog to function properly. |
2700 // | 2682 // |
2701 // TODO(darin): WebKit should really be smarter about suppressing events and | 2683 // TODO(darin): WebKit should really be smarter about suppressing events and |
2702 // timers so that we do not need to manage the shared timer in such a heavy | 2684 // timers so that we do not need to manage the shared timer in such a heavy |
2703 // handed manner. | 2685 // handed manner. |
2704 // | 2686 // |
(...skipping 580 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3285 NavigationGestureUser : NavigationGestureAuto; | 3267 NavigationGestureUser : NavigationGestureAuto; |
3286 | 3268 |
3287 // Make sure redirect tracking state is clear for the new load. | 3269 // Make sure redirect tracking state is clear for the new load. |
3288 completed_client_redirect_src_ = GURL(); | 3270 completed_client_redirect_src_ = GURL(); |
3289 } else if (frame->parent()->isLoading()) { | 3271 } else if (frame->parent()->isLoading()) { |
3290 // Take note of AUTO_SUBFRAME loads here, so that we can know how to | 3272 // Take note of AUTO_SUBFRAME loads here, so that we can know how to |
3291 // load an error page. See didFailProvisionalLoad. | 3273 // load an error page. See didFailProvisionalLoad. |
3292 navigation_state->set_transition_type(PageTransition::AUTO_SUBFRAME); | 3274 navigation_state->set_transition_type(PageTransition::AUTO_SUBFRAME); |
3293 } | 3275 } |
3294 | 3276 |
| 3277 FOR_EACH_OBSERVER( |
| 3278 RenderViewObserver, observers_, DidStartProvisionalLoad(frame)); |
| 3279 |
3295 Send(new ViewHostMsg_DidStartProvisionalLoadForFrame( | 3280 Send(new ViewHostMsg_DidStartProvisionalLoadForFrame( |
3296 routing_id_, frame->identifier(), is_top_most, ds->request().url())); | 3281 routing_id_, frame->identifier(), is_top_most, ds->request().url())); |
3297 } | 3282 } |
3298 | 3283 |
3299 void RenderView::didReceiveServerRedirectForProvisionalLoad(WebFrame* frame) { | 3284 void RenderView::didReceiveServerRedirectForProvisionalLoad(WebFrame* frame) { |
3300 if (frame->parent()) | 3285 if (frame->parent()) |
3301 return; | 3286 return; |
3302 // Received a redirect on the main frame. | 3287 // Received a redirect on the main frame. |
3303 WebDataSource* data_source = frame->provisionalDataSource(); | 3288 WebDataSource* data_source = frame->provisionalDataSource(); |
3304 if (!data_source) { | 3289 if (!data_source) { |
(...skipping 15 matching lines...) Expand all Loading... |
3320 // | 3305 // |
3321 // Note: It is important this notification occur before DidStopLoading so the | 3306 // Note: It is important this notification occur before DidStopLoading so the |
3322 // SSL manager can react to the provisional load failure before being | 3307 // SSL manager can react to the provisional load failure before being |
3323 // notified the load stopped. | 3308 // notified the load stopped. |
3324 // | 3309 // |
3325 WebDataSource* ds = frame->provisionalDataSource(); | 3310 WebDataSource* ds = frame->provisionalDataSource(); |
3326 DCHECK(ds); | 3311 DCHECK(ds); |
3327 | 3312 |
3328 const WebURLRequest& failed_request = ds->request(); | 3313 const WebURLRequest& failed_request = ds->request(); |
3329 | 3314 |
| 3315 FOR_EACH_OBSERVER( |
| 3316 RenderViewObserver, observers_, DidFailProvisionalLoad(frame, error)); |
| 3317 |
3330 bool show_repost_interstitial = | 3318 bool show_repost_interstitial = |
3331 (error.reason == net::ERR_CACHE_MISS && | 3319 (error.reason == net::ERR_CACHE_MISS && |
3332 EqualsASCII(failed_request.httpMethod(), "POST")); | 3320 EqualsASCII(failed_request.httpMethod(), "POST")); |
3333 Send(new ViewHostMsg_DidFailProvisionalLoadWithError( | 3321 Send(new ViewHostMsg_DidFailProvisionalLoadWithError( |
3334 routing_id_, frame->identifier(), !frame->parent(), error.reason, | 3322 routing_id_, frame->identifier(), !frame->parent(), error.reason, |
3335 error.unreachableURL, show_repost_interstitial)); | 3323 error.unreachableURL, show_repost_interstitial)); |
3336 | 3324 |
3337 // Don't display an error page if this is simply a cancelled load. Aside | 3325 // Don't display an error page if this is simply a cancelled load. Aside |
3338 // from being dumb, WebCore doesn't expect it and it will cause a crash. | 3326 // from being dumb, WebCore doesn't expect it and it will cause a crash. |
3339 if (error.reason == net::ERR_ABORTED) | 3327 if (error.reason == net::ERR_ABORTED) |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3405 | 3393 |
3406 navigation_state->set_commit_load_time(Time::Now()); | 3394 navigation_state->set_commit_load_time(Time::Now()); |
3407 if (is_new_navigation) { | 3395 if (is_new_navigation) { |
3408 // When we perform a new navigation, we need to update the last committed | 3396 // When we perform a new navigation, we need to update the last committed |
3409 // session history entry with state for the page we are leaving. | 3397 // session history entry with state for the page we are leaving. |
3410 UpdateSessionHistory(frame); | 3398 UpdateSessionHistory(frame); |
3411 | 3399 |
3412 // We bump our Page ID to correspond with the new session history entry. | 3400 // We bump our Page ID to correspond with the new session history entry. |
3413 page_id_ = next_page_id_++; | 3401 page_id_ = next_page_id_++; |
3414 | 3402 |
3415 // Let the phishing classifier decide whether to cancel classification. | |
3416 if (phishing_delegate_.get()) | |
3417 phishing_delegate_->CommittedLoadInFrame(frame); | |
3418 | |
3419 // Advance our offset in session history, applying the length limit. There | 3403 // Advance our offset in session history, applying the length limit. There |
3420 // is now no forward history. | 3404 // is now no forward history. |
3421 history_list_offset_++; | 3405 history_list_offset_++; |
3422 if (history_list_offset_ >= chrome::kMaxSessionHistoryEntries) | 3406 if (history_list_offset_ >= chrome::kMaxSessionHistoryEntries) |
3423 history_list_offset_ = chrome::kMaxSessionHistoryEntries - 1; | 3407 history_list_offset_ = chrome::kMaxSessionHistoryEntries - 1; |
3424 history_list_length_ = history_list_offset_ + 1; | 3408 history_list_length_ = history_list_offset_ + 1; |
3425 | 3409 |
3426 MessageLoop::current()->PostDelayedTask( | 3410 MessageLoop::current()->PostDelayedTask( |
3427 FROM_HERE, | 3411 FROM_HERE, |
3428 page_info_method_factory_.NewRunnableMethod( | 3412 page_info_method_factory_.NewRunnableMethod( |
(...skipping 14 matching lines...) Expand all Loading... |
3443 navigation_state->pending_page_id() != page_id_ && | 3427 navigation_state->pending_page_id() != page_id_ && |
3444 !navigation_state->request_committed()) { | 3428 !navigation_state->request_committed()) { |
3445 // This is a successful session history navigation! | 3429 // This is a successful session history navigation! |
3446 UpdateSessionHistory(frame); | 3430 UpdateSessionHistory(frame); |
3447 page_id_ = navigation_state->pending_page_id(); | 3431 page_id_ = navigation_state->pending_page_id(); |
3448 | 3432 |
3449 history_list_offset_ = navigation_state->pending_history_list_offset(); | 3433 history_list_offset_ = navigation_state->pending_history_list_offset(); |
3450 } | 3434 } |
3451 } | 3435 } |
3452 | 3436 |
| 3437 FOR_EACH_OBSERVER(RenderViewObserver, observers_, |
| 3438 DidCommitProvisionalLoad(frame, is_new_navigation)); |
| 3439 |
3453 // Remember that we've already processed this request, so we don't update | 3440 // Remember that we've already processed this request, so we don't update |
3454 // the session history again. We do this regardless of whether this is | 3441 // the session history again. We do this regardless of whether this is |
3455 // a session history navigation, because if we attempted a session history | 3442 // a session history navigation, because if we attempted a session history |
3456 // navigation without valid HistoryItem state, WebCore will think it is a | 3443 // navigation without valid HistoryItem state, WebCore will think it is a |
3457 // new navigation. | 3444 // new navigation. |
3458 navigation_state->set_request_committed(true); | 3445 navigation_state->set_request_committed(true); |
3459 | 3446 |
3460 UpdateURL(frame); | 3447 UpdateURL(frame); |
3461 | 3448 |
3462 // If this committed load was initiated by a client redirect, we're | 3449 // If this committed load was initiated by a client redirect, we're |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3517 } | 3504 } |
3518 | 3505 |
3519 void RenderView::didFinishDocumentLoad(WebFrame* frame) { | 3506 void RenderView::didFinishDocumentLoad(WebFrame* frame) { |
3520 WebDataSource* ds = frame->dataSource(); | 3507 WebDataSource* ds = frame->dataSource(); |
3521 NavigationState* navigation_state = NavigationState::FromDataSource(ds); | 3508 NavigationState* navigation_state = NavigationState::FromDataSource(ds); |
3522 DCHECK(navigation_state); | 3509 DCHECK(navigation_state); |
3523 navigation_state->set_finish_document_load_time(Time::Now()); | 3510 navigation_state->set_finish_document_load_time(Time::Now()); |
3524 | 3511 |
3525 Send(new ViewHostMsg_DocumentLoadedInFrame(routing_id_, frame->identifier())); | 3512 Send(new ViewHostMsg_DocumentLoadedInFrame(routing_id_, frame->identifier())); |
3526 | 3513 |
3527 FOR_EACH_OBSERVER( | 3514 FOR_EACH_OBSERVER(RenderViewObserver, observers_, |
3528 RenderViewObserver, observers_, DidFinishDocumentLoad(frame)); | 3515 DidFinishDocumentLoad(frame)); |
3529 | 3516 |
3530 // Check whether we have new encoding name. | 3517 // Check whether we have new encoding name. |
3531 UpdateEncoding(frame, frame->view()->pageEncoding().utf8()); | 3518 UpdateEncoding(frame, frame->view()->pageEncoding().utf8()); |
3532 | 3519 |
3533 if (RenderThread::current()) { // Will be NULL during unit tests. | 3520 if (RenderThread::current()) { // Will be NULL during unit tests. |
3534 RenderThread::current()->user_script_slave()->InjectScripts( | 3521 RenderThread::current()->user_script_slave()->InjectScripts( |
3535 frame, UserScript::DOCUMENT_END); | 3522 frame, UserScript::DOCUMENT_END); |
3536 } | 3523 } |
3537 | 3524 |
3538 // InjectScripts() can end up creating a new NavigationState if it triggers a | 3525 // InjectScripts() can end up creating a new NavigationState if it triggers a |
(...skipping 20 matching lines...) Expand all Loading... |
3559 } | 3546 } |
3560 | 3547 |
3561 void RenderView::didHandleOnloadEvents(WebFrame* frame) { | 3548 void RenderView::didHandleOnloadEvents(WebFrame* frame) { |
3562 if (webview()->mainFrame() == frame) { | 3549 if (webview()->mainFrame() == frame) { |
3563 Send(new ViewHostMsg_DocumentOnLoadCompletedInMainFrame(routing_id_, | 3550 Send(new ViewHostMsg_DocumentOnLoadCompletedInMainFrame(routing_id_, |
3564 page_id_)); | 3551 page_id_)); |
3565 } | 3552 } |
3566 } | 3553 } |
3567 | 3554 |
3568 void RenderView::didFailLoad(WebFrame* frame, const WebURLError& error) { | 3555 void RenderView::didFailLoad(WebFrame* frame, const WebURLError& error) { |
3569 // Ignore | 3556 FOR_EACH_OBSERVER(RenderViewObserver, observers_, DidFailLoad(frame, error)); |
3570 } | 3557 } |
3571 | 3558 |
3572 void RenderView::didFinishLoad(WebFrame* frame) { | 3559 void RenderView::didFinishLoad(WebFrame* frame) { |
3573 WebDataSource* ds = frame->dataSource(); | 3560 WebDataSource* ds = frame->dataSource(); |
3574 NavigationState* navigation_state = NavigationState::FromDataSource(ds); | 3561 NavigationState* navigation_state = NavigationState::FromDataSource(ds); |
3575 DCHECK(navigation_state); | 3562 DCHECK(navigation_state); |
3576 navigation_state->set_finish_load_time(Time::Now()); | 3563 navigation_state->set_finish_load_time(Time::Now()); |
3577 navigation_state->user_script_idle_scheduler()->DidFinishLoad(); | 3564 navigation_state->user_script_idle_scheduler()->DidFinishLoad(); |
3578 | 3565 |
3579 FOR_EACH_OBSERVER(RenderViewObserver, observers_, DidFinishLoad(frame)); | 3566 FOR_EACH_OBSERVER(RenderViewObserver, observers_, DidFinishLoad(frame)); |
(...skipping 2202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5782 } | 5769 } |
5783 } | 5770 } |
5784 | 5771 |
5785 void RenderView::OnContextMenuClosed( | 5772 void RenderView::OnContextMenuClosed( |
5786 const webkit_glue::CustomContextMenuContext& custom_context) { | 5773 const webkit_glue::CustomContextMenuContext& custom_context) { |
5787 if (custom_context.is_pepper_menu) | 5774 if (custom_context.is_pepper_menu) |
5788 pepper_delegate_.OnContextMenuClosed(custom_context); | 5775 pepper_delegate_.OnContextMenuClosed(custom_context); |
5789 else | 5776 else |
5790 context_menu_node_.reset(); | 5777 context_menu_node_.reset(); |
5791 } | 5778 } |
OLD | NEW |